From 872cf2a5ce049c4fcceaea865c865f756f567485 Mon Sep 17 00:00:00 2001 From: "nikita.hohlov" Date: Sat, 5 Sep 2026 07:13:50 -0300 Subject: [PATCH] feat: tailscale sidecar for the hado stack only (shields-up), app/scheduler/worker share its netns Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01BCrwHHnGCB5XH968Nxokqw --- docker-compose.prod.yml | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index d385894..3558b5f 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -2,24 +2,48 @@ # 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 — сайдкар: в тейлнете только этот стек (app/scheduler/worker сидят в его netns), +# хост и остальные сервисы не затронуты. --shields-up: нода ничего не принимает из тейлнета, +# только ходит наружу (в Home Assistant); входящее в hado идёт исключительно через Caddy. +# Первый запуск без ключа: ссылка на логин — в `docker compose logs tailscale`. 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: build: ./core image: hado-app restart: unless-stopped - ports: - - "127.0.0.1:8091:8080" + network_mode: service:tailscale env_file: ./core/.env environment: # serversideup: миграции и кеши при старте — только здесь, чтобы не гонять их из трёх контейнеров AUTORUN_ENABLED: "true" depends_on: + tailscale: + condition: service_started postgres: condition: service_healthy scheduler: image: hado-app restart: unless-stopped + network_mode: service:tailscale command: ["php", "/var/www/html/artisan", "schedule:work"] healthcheck: { disable: true } # healthcheck образа стучится в nginx, которого тут нет env_file: ./core/.env @@ -30,6 +54,7 @@ services: worker: image: hado-app restart: unless-stopped + network_mode: service:tailscale command: ["php", "/var/www/html/artisan", "queue:work", "--tries=3", "--sleep=1"] healthcheck: { disable: true } env_file: ./core/.env @@ -54,3 +79,4 @@ services: volumes: pg_data: + ts_state: