Compare commits

...

4 Commits

Author SHA1 Message Date
cd69aec83e Update .env.production.example 2026-10-22 11:09:44 +05:00
0c1ba0d8d6 Update docker-compose.prod.yml 2026-10-22 11:09:42 +05:00
425b9012a3 Delete Caddyfile 2026-10-22 11:09:40 +05:00
45bfe1bee0 Update README.md 2026-10-22 11:09:38 +05:00
4 changed files with 16 additions and 37 deletions

View File

@ -3,10 +3,12 @@
COMPOSE_PROJECT_NAME=patrol
COMPOSE_FILE=docker-compose.yml:docker-compose.prod.yml
# Адрес сервиса. Без своего домена — sslip.io: IP 203.0.113.10 → 203-0-113-10.sslip.io
SITE_ADDRESS=<ip-через-дефисы>.sslip.io
WEBSITE_URL=https://<ip-через-дефисы>.sslip.io
COOKIE_SECURE=true
# Адрес, по которому открывают сервис (для redirect_uri Aspans ID). Пока http по IP и порту,
# потом — https-адрес прокси, который поставят перед сервером.
WEB_PORT=8090
WEBSITE_URL=http://<ip-сервера>:8090
# true — когда сервис откроют по HTTPS
COOKIE_SECURE=false
POSTGRES_DB=patrol
POSTGRES_USER=patrol
@ -38,4 +40,4 @@ KAFKA_PASSWORD=
VITE_TILE_URL=/tiles/styles/basic-preview/256/{z}/{x}/{y}.png
UCHET_KZ_TOKEN=
NOMINATIM_EMAIL=<email для User-Agent Nominatim>
NOMINATIM_EMAIL=

View File

@ -36,15 +36,15 @@ docker compose up -d --build
## Сервер
Без своего домена сервис открывается по `https://<ip-через-дефисы>.sslip.io`: sslip.io указывает на IP из имени, Caddy сам получает сертификат Let's Encrypt. HTTPS обязателен для телефонов охранников: без него браузер не даёт геолокацию и не включает офлайн-режим PWA.
Сервис отдаётся по http на `WEB_PORT` (8090). HTTPS делает прокси перед сервером. Пока его нет, на телефонах охранников не работают геолокация и офлайн-режим PWA: браузеры дают их только по HTTPS.
1. Проверить сервер (только читает): `ssh user@IP 'bash -s' < scripts/server-check.sh`. Нужно: Docker с `docker compose` v2, свободные 80 и 443 (и открытые в файрволе), от 2 ГБ RAM (сборка фронта), от 10 ГБ свободного места плюс место под фото и видео.
1. Нужен `docker compose` v2 (не старый `docker-compose` 1.x). Проверка сервера, только чтение: `ssh user@IP 'bash -s' < scripts/server-check.sh`.
2. Склонировать репозиторий, `cp .env.production.example .env`, заполнить.
3. Карту на сервере **не собирать**: скопировать готовый файл — `scp tiles/kazakhstan.mbtiles user@IP:<папка проекта>/tiles/` (~0,5 ГБ). Сборка planetiler требует ~4 ГБ RAM и качает исходные данные.
3. Карту на сервере **не собирать**: скопировать готовый файл `tiles/kazakhstan.mbtiles` (~0,5 ГБ) в `tiles/` проекта. Сборка planetiler требует ~4 ГБ RAM и качает исходные данные.
4. `docker compose up -d --build` (`COMPOSE_FILE` из `.env` сам подключит `docker-compose.prod.yml`).
5. В Aspans ID у клиента `patrol` разрешить redirect_uri `https://<ip-через-дефисы>.sslip.io/auth/sso/callback`.
5. В Aspans ID у клиента `patrol` разрешить redirect_uri `${WEBSITE_URL}/auth/sso/callback`.
Наружу открыты только 80 и 443 (Caddy). База слушает 127.0.0.1, api, tiles и s3 доступны только внутри docker.
Наружу открыт только web на `WEB_PORT`. База слушает 127.0.0.1, api, tiles и s3 доступны только внутри docker.
## Порты

View File

@ -1,25 +1,8 @@
# Сервер: поверх docker-compose.yml (без override). В .env сервера:
# COMPOSE_FILE=docker-compose.yml:docker-compose.prod.yml
# Наружу открыт только Caddy (80 и 443): он сам получает сертификат Let's Encrypt для SITE_ADDRESS
# и проксирует всё на web. База слушает только 127.0.0.1, api/tiles/s3 — только внутри docker.
# Наружу открыт только web на WEB_PORT (http). HTTPS делает прокси на другом сервере.
# База слушает только 127.0.0.1, api/tiles/s3 — только внутри docker.
services:
caddy:
image: caddy:2.10-alpine
container_name: patrol_caddy
restart: unless-stopped
depends_on:
- web
web:
ports:
- "80:80"
- "443:443"
- "443:443/udp"
environment:
SITE_ADDRESS: ${SITE_ADDRESS}
volumes:
- ./docker/Caddyfile:/etc/caddy/Caddyfile:ro
- patrol_caddy_data:/data
- patrol_caddy_config:/config
volumes:
patrol_caddy_data:
patrol_caddy_config:
- "${WEB_BIND:-0.0.0.0}:${WEB_PORT}:80"

View File

@ -1,6 +0,0 @@
# SITE_ADDRESS — имя сервера, например 203-0-113-10.sslip.io (sslip.io указывает на IP из имени).
# Caddy сам получает и продлевает сертификат Let's Encrypt и перенаправляет http → https.
{$SITE_ADDRESS} {
encode zstd gzip
reverse_proxy web:80
}