Теперь на Pi нужны только docker-compose.yml и .env — без репозитория, сборки и файла ключа. - docker-compose.yml: pull_policy: always (образы тянутся из реестра, сборка не запускается); ключ туннеля больше не монтируется томом — берётся из .env (TUNNEL_KEY_B64, base64); у VPS_TUNNEL_HOST убран :? (ломал бы buildx bake на ПК, где переменная не задана) — проверка обязательности перенесена в tunnel.sh (рантайм). - deploy/tunnel/tunnel.sh: приватный ключ из TUNNEL_KEY_B64 (base64) с фолбэком на смонтированный /key/id_tunnel (для dev/test, где репозиторий на хосте). - .env.example: TUNNEL_KEY_B64 + как сгенерировать base64 (Git Bash / PowerShell). - deploy/pi/README: полный поток «голый Pi → 2 файла»: Docker, curl compose+.env из Gitea, up; обновление, автозапуск, бэкап как опция. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
76 lines
4.6 KiB
YAML
76 lines
4.6 KiB
YAML
# ─────────────────────────────────────────────────────────────────────────────
|
||
# ПРОД на Raspberry Pi (forbiddenstars.ru) — единый compose: приложение + туннель.
|
||
# На Pi нужны только ДВА файла: этот docker-compose.yml и .env. Репозиторий, сборка и
|
||
# файл ключа не нужны: образы тянутся из реестра (pull_policy: always), а приватный ключ
|
||
# туннеля лежит в .env (TUNNEL_KEY_B64, base64). build: оставлен для сборки/пуша на ПК
|
||
# (scripts/build-push.*) — на Pi он не используется.
|
||
#
|
||
# Запуск/обновление: docker compose up -d (сам тянет свежие образы)
|
||
# Логи: docker compose logs -f app (или: ... tunnel)
|
||
# Остановка: docker compose down (данные в томах сохраняются)
|
||
# Бэкап/restore: scripts/backup.sh / scripts/restore.sh
|
||
#
|
||
# Контейнер ВСЕГДА production: APP_ENV форсится здесь и игнорирует значение из .env.
|
||
# Порты на хост НЕ публикуются — наружу приложение выставляет только сервис tunnel
|
||
# (SSH reverse-туннель к VPS). Из LAN/localhost оно недоступно.
|
||
# ─────────────────────────────────────────────────────────────────────────────
|
||
services:
|
||
app:
|
||
build: .
|
||
# Образ из реестра (Gitea): собирается под arm64 на ПК (scripts/build-push.sh) и тянется
|
||
# на Pi через `docker compose pull`. build: оставлен как локальный фолбэк (сборка на Pi).
|
||
image: ${IMAGE_REGISTRY:-gitea.arseniev.info/notbigghost}/forbidden-stars:${IMAGE_TAG:-latest}
|
||
pull_policy: always # на Pi всегда тянем образ из реестра (без сборки)
|
||
restart: unless-stopped
|
||
init: true # PID 1 пробрасывает сигналы → корректный SIGTERM
|
||
stop_grace_period: 30s # время на чек-пойнт WAL SQLite перед остановкой
|
||
env_file:
|
||
- .env # единый источник настроек/секретов всего приложения
|
||
environment:
|
||
APP_ENV: production # прод обособлен: игнорируем APP_ENV из .env
|
||
volumes:
|
||
- db-data:/data # БД SQLite + WAL-сайдкары
|
||
- uploads-data:/data/uploads # медиа партий
|
||
- achievements-data:/data/achievements # определения титулов (файлы)
|
||
healthcheck:
|
||
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/api/health')"]
|
||
interval: 30s
|
||
timeout: 5s
|
||
retries: 3
|
||
start_period: 40s
|
||
mem_limit: ${APP_MEM_LIMIT:-512m} # лимиты под Pi; переопределяются в .env
|
||
cpus: ${APP_CPUS:-1.5}
|
||
security_opt:
|
||
- no-new-privileges:true
|
||
logging:
|
||
driver: json-file
|
||
options:
|
||
max-size: "10m"
|
||
max-file: "5"
|
||
|
||
# SSH reverse-туннель: VPS:${VPS_TUNNEL_PORT:-9000} → app:8000 (домен forbiddenstars.ru).
|
||
# Приватный ключ — в .env как TUNNEL_KEY_B64 (base64); pubkey — в authorized_keys у tunnel@VPS.
|
||
tunnel:
|
||
build: ./deploy/tunnel
|
||
image: ${IMAGE_REGISTRY:-gitea.arseniev.info/notbigghost}/forbidden-stars-tunnel:${IMAGE_TAG:-latest}
|
||
pull_policy: always
|
||
restart: unless-stopped
|
||
init: true
|
||
depends_on:
|
||
app:
|
||
condition: service_healthy
|
||
environment:
|
||
VPS_TUNNEL_HOST: ${VPS_TUNNEL_HOST} # обязателен; tunnel.sh упадёт с ошибкой, если пуст
|
||
VPS_TUNNEL_USER: ${VPS_TUNNEL_USER:-tunnel}
|
||
VPS_TUNNEL_PORT: ${VPS_TUNNEL_PORT:-9000} # прод-слот (forbiddenstars.ru)
|
||
UPSTREAM: app:8000
|
||
TUNNEL_KEY_B64: ${TUNNEL_KEY_B64:-} # приватный ключ туннеля (base64), из .env
|
||
mem_limit: 64m
|
||
security_opt:
|
||
- no-new-privileges:true
|
||
|
||
volumes:
|
||
db-data:
|
||
uploads-data:
|
||
achievements-data:
|