Files
Greenlens/README.md
2026-04-03 20:02:13 +02:00

190 lines
3.7 KiB
Markdown

# GreenLens
Expo app for plant scanning, care tracking, billing, and profile management, backed by an Express API.
## App development
```bash
npm install
npm run start
```
## Backend development
The backend now targets PostgreSQL instead of SQLite.
```bash
cd server
npm install
npm run start
```
Required backend environment:
- `DATABASE_URL` or `POSTGRES_HOST` + `POSTGRES_PORT` + `POSTGRES_DB` + `POSTGRES_USER` + `POSTGRES_PASSWORD`
- `JWT_SECRET`
Optional integrations:
- `OPENAI_API_KEY`
- `REVENUECAT_WEBHOOK_SECRET`
- `PLANT_IMPORT_ADMIN_KEY`
- `MINIO_ENDPOINT`
- `MINIO_ACCESS_KEY`
- `MINIO_SECRET_KEY`
- `MINIO_BUCKET`
- `MINIO_PUBLIC_URL`
## Docker Compose
For backend-only local infrastructure use [docker-compose.yml](/abs/path/C:/Users/a931627/Documents/apps/GreenLns/docker-compose.yml).
For the production-style self-hosted stack with landing page, API, PostgreSQL, and MinIO behind an external reverse proxy use [greenlns-landing/docker-compose.yml](/abs/path/C:/Users/a931627/Documents/apps/GreenLns/greenlns-landing/docker-compose.yml).
## Server deployment
Run the commands in this section from the repo root on your server:
```bash
cd /path/to/GreenLns
```
Example:
```bash
cd /var/www/GreenLns
```
### 1. Prepare environment
```bash
cp .env.example .env
```
Then fill at least:
- `SITE_DOMAIN`
- `SITE_URL`
- `POSTGRES_PASSWORD`
- `JWT_SECRET`
- `MINIO_SECRET_KEY`
- optional: `OPENAI_API_KEY`, `REVENUECAT_*`
### 2. Start the full production stack
```bash
docker compose up --build -d
```
When you run this from the repo root, Docker Compose uses [docker-compose.yml](/abs/path/C:/Users/a931627/Documents/apps/GreenLns/docker-compose.yml).
What gets built:
- `landing` is built from `./greenlns-landing/Dockerfile`
- `api` is built from `./server/Dockerfile`
What is not built locally, but pulled as ready-made images:
- `postgres` uses `postgres:16-alpine`
- `minio` uses `minio/minio:latest`
So yes: `docker compose up --build -d` builds the landing page container and the API container, and it starts PostgreSQL as a container. PostgreSQL is not "built" from your code, it is started from the official Postgres image.
This starts:
- `landing`
- `api`
- `postgres`
- `minio`
Host ports for an external reverse proxy:
- `3000` -> `landing`
- `3003` -> `api`
- `9000` -> `minio` S3 API
- `9001` -> `minio` console
### 3. Useful server commands
Check running containers:
```bash
docker compose ps
```
Follow all logs:
```bash
docker compose logs -f
```
Follow only API logs:
```bash
docker compose logs -f api
```
Follow only landing logs:
```bash
docker compose logs -f landing
```
Restart one service:
```bash
docker compose restart api
docker compose restart landing
```
Rebuild and restart after code changes:
```bash
docker compose up --build -d
```
Stop the stack:
```bash
docker compose down
```
Stop the stack and remove volumes:
```bash
docker compose down -v
```
### 4. Health checks after deploy
```bash
curl https://greenlenspro.com/health
curl https://greenlenspro.com/
curl https://greenlenspro.com/sitemap.xml
```
### 5. Production compose file location
If you want to run the same stack from inside the landing directory instead:
```bash
cd greenlns-landing
docker compose up --build -d
```
In that case Docker Compose uses [greenlns-landing/docker-compose.yml](/abs/path/C:/Users/a931627/Documents/apps/GreenLns/greenlns-landing/docker-compose.yml).
There, too:
- `landing` is built from `greenlns-landing/Dockerfile`
- `api` is built from `../server/Dockerfile`
- `postgres` and `minio` are started from official images
## iOS TestFlight
```bash
npx eas-cli build:version:set -p ios
npx eas-cli build -p ios --profile production
npx eas-cli submit -p ios --latest
```