feat: tailscale sidecar for the hado stack only (shields-up), app/scheduler/worker share its netns

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BCrwHHnGCB5XH968Nxokqw
This commit is contained in:
nikita.hohlov
2026-09-05 07:13:50 -03:00
parent 06c357ca69
commit 872cf2a5ce

View File

@@ -2,24 +2,48 @@
# Caddy (network_mode: host) ходит в 127.0.0.1:8091, наружу порт закрыт (см. deploy/Caddyfile.snippet). # Caddy (network_mode: host) ходит в 127.0.0.1:8091, наружу порт закрыт (см. deploy/Caddyfile.snippet).
# Один env на всё: core/.env — его читают и контейнеры (env_file), и сам compose (--env-file) для postgres. # Один env на всё: core/.env — его читают и контейнеры (env_file), и сам compose (--env-file) для postgres.
# Запуск: docker compose --env-file core/.env -f docker-compose.prod.yml up -d --build # Запуск: docker compose --env-file core/.env -f docker-compose.prod.yml up -d --build
#
# Tailscale — сайдкар: в тейлнете только этот стек (app/scheduler/worker сидят в его netns),
# хост и остальные сервисы не затронуты. --shields-up: нода ничего не принимает из тейлнета,
# только ходит наружу (в Home Assistant); входящее в hado идёт исключительно через Caddy.
# Первый запуск без ключа: ссылка на логин — в `docker compose logs tailscale`.
services: services:
tailscale:
image: tailscale/tailscale:stable
hostname: hado
restart: unless-stopped
environment:
TS_STATE_DIR: /var/lib/tailscale
TS_USERSPACE: "false"
TS_EXTRA_ARGS: --shields-up
volumes:
- ts_state:/var/lib/tailscale
devices:
- /dev/net/tun
cap_add:
- net_admin
ports:
- "127.0.0.1:8091:8080" # порт app: netns общий, публикует его владелец netns
app: app:
build: ./core build: ./core
image: hado-app image: hado-app
restart: unless-stopped restart: unless-stopped
ports: network_mode: service:tailscale
- "127.0.0.1:8091:8080"
env_file: ./core/.env env_file: ./core/.env
environment: environment:
# serversideup: миграции и кеши при старте — только здесь, чтобы не гонять их из трёх контейнеров # serversideup: миграции и кеши при старте — только здесь, чтобы не гонять их из трёх контейнеров
AUTORUN_ENABLED: "true" AUTORUN_ENABLED: "true"
depends_on: depends_on:
tailscale:
condition: service_started
postgres: postgres:
condition: service_healthy condition: service_healthy
scheduler: scheduler:
image: hado-app image: hado-app
restart: unless-stopped restart: unless-stopped
network_mode: service:tailscale
command: ["php", "/var/www/html/artisan", "schedule:work"] command: ["php", "/var/www/html/artisan", "schedule:work"]
healthcheck: { disable: true } # healthcheck образа стучится в nginx, которого тут нет healthcheck: { disable: true } # healthcheck образа стучится в nginx, которого тут нет
env_file: ./core/.env env_file: ./core/.env
@@ -30,6 +54,7 @@ services:
worker: worker:
image: hado-app image: hado-app
restart: unless-stopped restart: unless-stopped
network_mode: service:tailscale
command: ["php", "/var/www/html/artisan", "queue:work", "--tries=3", "--sleep=1"] command: ["php", "/var/www/html/artisan", "queue:work", "--tries=3", "--sleep=1"]
healthcheck: { disable: true } healthcheck: { disable: true }
env_file: ./core/.env env_file: ./core/.env
@@ -54,3 +79,4 @@ services:
volumes: volumes:
pg_data: pg_data:
ts_state: