Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BCrwHHnGCB5XH968Nxokqw
83 lines
3.4 KiB
YAML
83 lines
3.4 KiB
YAML
# Прод на ishiki: hado живёт рядом с прокси sekai, порт только на loopback —
|
||
# Caddy (network_mode: host) ходит в 127.0.0.1:8091, наружу порт закрыт (см. deploy/Caddyfile.snippet).
|
||
# Один env на всё: core/.env — его читают и контейнеры (env_file), и сам compose (--env-file) для postgres.
|
||
# Запуск: docker compose --env-file core/.env -f docker-compose.prod.yml up -d --build
|
||
#
|
||
# Tailscale — сайдкар в netns приложения: в тейлнете только этот стек, хост и остальные
|
||
# сервисы не затронуты. Владелец netns — app (самый стабильный), tailscale/scheduler/worker
|
||
# садятся к нему: рестарт tailscale не роняет сайт. Контейнер крутит голый tailscaled,
|
||
# логин — один раз руками: `docker compose exec tailscale tailscale up --hostname=hado --accept-dns=false`
|
||
# (печатает ссылку, ждёт; состояние в volume, дальше поднимается сам).
|
||
# Из тейлнета hado доступен как http://<ts-ip>:8080 (агент Мия → /mcp); X-Remote-User с тейлнета
|
||
# ядро не принимает — только от Caddy (HADO_TRUSTED_PROXIES), так что подделать SSO оттуда нельзя.
|
||
services:
|
||
app:
|
||
build: ./core
|
||
image: hado-app
|
||
restart: unless-stopped
|
||
ports:
|
||
- "127.0.0.1:8091:8080"
|
||
env_file: ./core/.env
|
||
environment:
|
||
# serversideup: миграции и кеши при старте — только здесь, чтобы не гонять их из трёх контейнеров
|
||
AUTORUN_ENABLED: "true"
|
||
depends_on:
|
||
postgres:
|
||
condition: service_healthy
|
||
|
||
tailscale:
|
||
image: tailscale/tailscale:stable
|
||
restart: unless-stopped
|
||
network_mode: service:app
|
||
command: ["tailscaled", "--state=/var/lib/tailscale/tailscaled.state", "--socket=/var/run/tailscale/tailscaled.sock"]
|
||
volumes:
|
||
- ts_state:/var/lib/tailscale
|
||
devices:
|
||
- /dev/net/tun
|
||
cap_add:
|
||
- net_admin
|
||
depends_on:
|
||
app:
|
||
condition: service_started
|
||
|
||
scheduler:
|
||
image: hado-app
|
||
restart: unless-stopped
|
||
network_mode: service:app
|
||
command: ["php", "/var/www/html/artisan", "schedule:work"]
|
||
healthcheck: { disable: true } # healthcheck образа стучится в nginx, которого тут нет
|
||
env_file: ./core/.env
|
||
depends_on:
|
||
app:
|
||
condition: service_healthy
|
||
|
||
worker:
|
||
image: hado-app
|
||
restart: unless-stopped
|
||
network_mode: service:app
|
||
command: ["php", "/var/www/html/artisan", "queue:work", "--tries=3", "--sleep=1"]
|
||
healthcheck: { disable: true }
|
||
env_file: ./core/.env
|
||
depends_on:
|
||
app:
|
||
condition: service_healthy
|
||
|
||
postgres:
|
||
image: postgres:17
|
||
restart: unless-stopped
|
||
environment:
|
||
POSTGRES_DB: ${DB_DATABASE:-hado}
|
||
POSTGRES_USER: ${DB_USERNAME:-hado}
|
||
POSTGRES_PASSWORD: ${DB_PASSWORD:?set DB_PASSWORD in .env next to this file}
|
||
volumes:
|
||
- pg_data:/var/lib/postgresql/data
|
||
healthcheck:
|
||
test: ["CMD-SHELL", "pg_isready -U ${DB_USERNAME:-hado} -d ${DB_DATABASE:-hado}"]
|
||
interval: 5s
|
||
timeout: 3s
|
||
retries: 10
|
||
|
||
volumes:
|
||
pg_data:
|
||
ts_state:
|