deploy: bind postgres/redis to loopback instead of 0.0.0.0

Both are only used inside the compose network (services reach them by name,
postgres:5432 / redis:6379). Publishing on 0.0.0.0 exposed them to the
internet — Docker's DNAT rules bypass ufw, so the ports were reachable
despite the firewall having no allow rule for them. Bind the published
ports to 127.0.0.1 so external access requires an SSH tunnel.
This commit is contained in:
2026-07-25 22:15:41 +03:00
parent ca54fe84d1
commit ec006fe020

View File

@@ -14,8 +14,11 @@ services:
POSTGRES_USER: ${POSTGRES_USER:-vidconf} POSTGRES_USER: ${POSTGRES_USER:-vidconf}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-vidconf} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-vidconf}
POSTGRES_DB: ${POSTGRES_DB:-vidconf} POSTGRES_DB: ${POSTGRES_DB:-vidconf}
# Публикуем ТОЛЬКО на loopback: postgres нужен внутри compose-сети
# (backend/worker обращаются по имени `postgres:5432`). Доступ снаружи —
# через SSH-туннель. Публикация на 0.0.0.0 открывала БД в интернет.
ports: ports:
- "5432:5432" - "127.0.0.1:5432:5432"
volumes: volumes:
- postgres_data:/var/lib/postgresql/data - postgres_data:/var/lib/postgresql/data
healthcheck: healthcheck:
@@ -29,8 +32,12 @@ services:
redis: redis:
image: redis:7 image: redis:7
restart: unless-stopped restart: unless-stopped
# Публикуем ТОЛЬКО на loopback: redis используется исключительно внутри
# compose-сети (backend/worker/livekit/egress по имени `redis:6379`).
# Публикация на 0.0.0.0 без пароля = открытый redis в интернет — вектор
# cron/replication-RCE (см. .forcc/deploy/SESSION2-FINDINGS.md).
ports: ports:
- "6379:6379" - "127.0.0.1:6379:6379"
volumes: volumes:
- redis_data:/data - redis_data:/data
healthcheck: healthcheck: