diff --git a/README.md b/README.md index 71b5305..718ba28 100644 --- a/README.md +++ b/README.md @@ -65,11 +65,55 @@ ## Прод +Стек прод-версии — `docker-compose.prod.yml`: caddy (статика панели + reverse-proxy +`/api`), API-сервер, Postgres 16. Миграции применяются при старте контейнера +сервера автоматически. + +### Первый перенос на сервер + ```sh -make prod # web dist + docker-compose.prod.yml -# панель и API на одном origin: http://localhost:8081 (caddy: статика + /api → server) +git clone && cd live-testing-tool +npm ci +make prod # сборка панели + up -d --build ``` +Панель и API на одном origin: `http://:8081` (caddy: статика + `/api → server`). +Первый зарегистрированный через панель аккаунт — обычный пользователь; +проекты создаёт каждый сам, публичные ссылки выдаются на проект и репорт. + +### Настройки (`.env` рядом с compose-файлом) + +| Переменная | По умолчанию | Назначение | +|---|---|---| +| `POSTGRES_PASSWORD` | `ltt` | пароль БД (меняйте на проде) | +| `HTTP_PORT` | `8081` | порт панели на хосте | +| `HTTPS_PORT` | `8443` | порт HTTPS на хосте | +| `SITE_ADDRESS` | `:80` | адрес сайта для caddy | + +Домен + автоматический HTTPS (caddy сам выпустит сертификат): + +```sh +# .env +SITE_ADDRESS=bugtrail.example.com +HTTP_PORT=80 +HTTPS_PORT=443 +``` + +Для расширения в настройках указать URL сервера = адрес панели +(`https://bugtrail.example.com`), войти и выбрать проект по умолчанию. + +### Обновление + +```sh +git pull +make prod # пересоберёт панель и контейнеры, накатит миграции +``` + +Данные живут в volume `postgres_data` (БД) и каталоге `./data` (файлы +скриншотов/видео) — их достаточно для бэкапа: `docker compose -f +docker-compose.prod.yml exec postgres pg_dump -U ltt ltt > dump.sql` плюс +копия `./data`. + ## Ссылки и доступ - PK — UUIDv7; публичные ссылки — случайные 128-битные токены (`/p/`, `/r/`). diff --git a/deploy/Caddyfile b/deploy/Caddyfile index 1f73dce..b381455 100644 --- a/deploy/Caddyfile +++ b/deploy/Caddyfile @@ -1,4 +1,4 @@ -:80 { +{$SITE_ADDRESS} { handle /api/* { reverse_proxy server:8000 } diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index ad48d81..a5e5f90 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -1,11 +1,17 @@ # Production stack: caddy (static panel + /api proxy) + server + postgres. # Build the web panel first: npm run build -w @ltt/web +# +# Values come from .env next to this file (all optional): +# POSTGRES_PASSWORD — db password (default: ltt) +# HTTP_PORT — host port for the panel (default: 8081) +# SITE_ADDRESS — Caddy site address; set to a DNS name for +# automatic HTTPS (default: :80) services: postgres: image: postgres:16-alpine environment: POSTGRES_USER: ltt - POSTGRES_PASSWORD: ltt + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-ltt} POSTGRES_DB: ltt volumes: - postgres_data:/var/lib/postgresql/data @@ -18,7 +24,7 @@ server: build: ./server environment: - DATABASE_URL: postgresql+asyncpg://ltt:ltt@postgres:5432/ltt + DATABASE_URL: postgresql+asyncpg://ltt:${POSTGRES_PASSWORD:-ltt}@postgres:5432/ltt FILES_DIR: /srv/data/files depends_on: postgres: @@ -28,15 +34,20 @@ caddy: image: caddy:2-alpine + environment: + SITE_ADDRESS: ${SITE_ADDRESS:-:80} ports: - - "8081:80" # panel + API on http://host:8081 + - "${HTTP_PORT:-8081}:80" + - "${HTTPS_PORT:-8443}:443" volumes: - ./deploy/Caddyfile:/etc/caddy/Caddyfile:ro - ./packages/web/dist:/srv/web:ro - caddy_data:/data + - caddy_config:/config depends_on: - server volumes: postgres_data: - caddy_data: \ No newline at end of file + caddy_data: + caddy_config: \ No newline at end of file