9ca6df3dfc
Раньше предполагалось, что backend и БД живут на одном хосте и делят Docker-сеть — на деле backend будет на отдельном, ещё не арендованном VPS, а Postgres стоит здесь же, рядом с Vaultwarden. Возвращает свой контейнер `db` (общий для обеих баз — vaultwarden создаётся через POSTGRES_USER/POSTGRES_DB, вторая, для backend, через новый postgres/init-backend-db.sh), публикует 5432 наружу с hostssl+TLS (postgres/pg_hba.conf, самоподписанный сертификат генерируется один раз прямо в deploy.yml). Backup-джоба (pg_dump обеих баз) тоже переехала сюда из netrunner-backend — дампить логичнее там, где физически лежат данные. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
139 lines
6.9 KiB
YAML
139 lines
6.9 KiB
YAML
# =====================================================================
|
||
# netrunner-data — VPS хранения данных: Postgres (общий для Vaultwarden И
|
||
# netrunner-backend) + Vaultwarden + периодический backup.
|
||
#
|
||
# Топология: backend живёт на ОТДЕЛЬНОМ VPS (ещё не арендован) — только
|
||
# app/redis/мониторинг, без своей БД. Postgres физически стоит здесь, рядом
|
||
# с Vaultwarden, и backend ходит сюда ПО СЕТИ (не через общий Docker-network,
|
||
# как было бы, живи они на одном хосте). Из-за этого:
|
||
# - Postgres публикует 5432 наружу (не только 127.0.0.1) — обязательно
|
||
# см. postgres/pg_hba.conf: там TLS-required (hostssl) для внешних
|
||
# подключений и временная заглушка 0.0.0.0/0 вместо реального IP
|
||
# backend-VPS (заменить, как только он будет арендован).
|
||
# - Нужен TLS-сертификат для Postgres (самоподписанный — см. ниже, шаг
|
||
# генерации перед первым запуском).
|
||
# - Firewall (ufw/iptables) на этом VPS ОБЯЗАТЕЛЬНО должен ограничивать
|
||
# 5432 конкретным IP backend-VPS — pg_hba.conf сам по себе не защита от
|
||
# сканирования порта. ВАЖНО: Docker пишет свои правила в iptables
|
||
# напрямую и может обходить обычные ufw deny-правила для
|
||
# опубликованных портов — ограничивать нужно либо через цепочку
|
||
# DOCKER-USER, либо через `ufw route`, а не просто `ufw deny 5432`.
|
||
#
|
||
# Самоподписанный TLS-сертификат (postgres/certs/server.{crt,key}) генерируется
|
||
# автоматически и один раз .gitea/.github workflows/deploy.yml при первом
|
||
# деплое (если файлов ещё нет) — руками ничего генерировать не нужно, если
|
||
# деплоите через CI. Для ручного/локального запуска — см. ту же команду
|
||
# openssl в deploy.yml.
|
||
#
|
||
# Перенос данных со старого SQLite-инстанса Vaultwarden — см.
|
||
# scripts/migrate-vaultwarden.md.
|
||
# =====================================================================
|
||
services:
|
||
db:
|
||
image: postgres:16-alpine
|
||
container_name: netrunner-db
|
||
restart: always
|
||
command:
|
||
- postgres
|
||
- -c
|
||
- ssl=on
|
||
- -c
|
||
- ssl_cert_file=/etc/postgresql-certs/server.crt
|
||
- -c
|
||
- ssl_key_file=/etc/postgresql-certs/server.key
|
||
- -c
|
||
- hba_file=/etc/postgresql/pg_hba.conf
|
||
environment:
|
||
# POSTGRES_USER/POSTGRES_DB — создают базу Vaultwarden при первой
|
||
# инициализации. Вторая база (для backend) создаётся отдельным
|
||
# init-скриптом ниже (postgres/init-backend-db.sh), т.к. официальный
|
||
# образ сам создаёт только одну базу+юзера из этих двух переменных.
|
||
POSTGRES_USER: ${VW_DB_USER}
|
||
POSTGRES_PASSWORD: ${VW_DB_PASSWORD}
|
||
POSTGRES_DB: ${VW_DB_NAME:-vaultwarden}
|
||
BACKEND_DB_USER: ${BACKEND_DB_USER}
|
||
BACKEND_DB_PASSWORD: ${BACKEND_DB_PASSWORD}
|
||
BACKEND_DB_NAME: ${BACKEND_DB_NAME:-netrunner}
|
||
volumes:
|
||
- netrunner_db_data:/var/lib/postgresql/data
|
||
- ./postgres/pg_hba.conf:/etc/postgresql/pg_hba.conf:ro
|
||
- ./postgres/certs:/etc/postgresql-certs:ro
|
||
- ./postgres/init-backend-db.sh:/docker-entrypoint-initdb.d/init-backend-db.sh:ro
|
||
ports:
|
||
# Не 127.0.0.1 — backend-VPS должен достучаться по сети. Обязательно
|
||
# firewall, см. шапку файла.
|
||
- "5432:5432"
|
||
healthcheck:
|
||
test: ["CMD-SHELL", "pg_isready -U ${VW_DB_USER} -d ${VW_DB_NAME:-vaultwarden}"]
|
||
interval: 5s
|
||
timeout: 5s
|
||
retries: 5
|
||
networks:
|
||
- netrunner_data
|
||
|
||
vaultwarden:
|
||
image: vaultwarden/server:latest
|
||
container_name: vaultwarden
|
||
restart: unless-stopped
|
||
environment:
|
||
- DOMAIN=${VAULTWARDEN_DOMAIN}
|
||
- SIGNUPS_ALLOWED=${VAULTWARDEN_SIGNUPS_ALLOWED:-false}
|
||
- ADMIN_TOKEN=${VAULTWARDEN_ADMIN_TOKEN}
|
||
- LOG_LEVEL=${VAULTWARDEN_LOG_LEVEL:-info}
|
||
- ROCKET_PORT=8081
|
||
- WEBSOCKET_ENABLED=true
|
||
# Тот же контейнер БД, что и backend, но в общей локальной Docker-сети
|
||
# (не через публичный 5432) — TLS тут не обязателен, трафик не выходит
|
||
# с хоста.
|
||
- DATABASE_URL=postgresql://${VW_DB_USER}:${VW_DB_PASSWORD}@db:5432/${VW_DB_NAME:-vaultwarden}
|
||
- SMTP_HOST=${SMTP_HOST}
|
||
- SMTP_FROM=${SMTP_FROM}
|
||
- SMTP_PORT=${SMTP_PORT:-465}
|
||
- SMTP_SECURITY=${SMTP_SECURITY:-force_tls}
|
||
- SMTP_USERNAME=${SMTP_USERNAME}
|
||
- SMTP_PASSWORD=${SMTP_PASSWORD}
|
||
volumes:
|
||
# Attachments/rsa-ключи по-прежнему на диске — Postgres тут только под
|
||
# структурированные данные (юзеры/сейфы/шифротексты записей), не под файлы.
|
||
- ./data:/data
|
||
ports:
|
||
- "127.0.0.1:8081:8081"
|
||
depends_on:
|
||
db:
|
||
condition: service_healthy
|
||
networks:
|
||
- netrunner_data
|
||
|
||
# Периодический pg_dump обеих баз (vaultwarden + backend) + опциональная
|
||
# офсайт-копия через rclone. Раньше жил в netrunner-backend, переехал сюда
|
||
# вместе с самой БД — дампить логичнее там, где физически стоит Postgres.
|
||
backup:
|
||
image: postgres:16-alpine
|
||
container_name: netrunner-data-backup
|
||
restart: always
|
||
entrypoint: ["/bin/sh", "/scripts/backup.sh"]
|
||
environment:
|
||
- DATABASE_URL=postgres://${VW_DB_USER}:${VW_DB_PASSWORD}@db:5432/${VW_DB_NAME:-vaultwarden}
|
||
- EXTRA_DATABASE_URL=postgres://${BACKEND_DB_USER}:${BACKEND_DB_PASSWORD}@db:5432/${BACKEND_DB_NAME:-netrunner}
|
||
- BACKUP_DIR=/backups
|
||
- BACKUP_INTERVAL_SEC=${BACKUP_INTERVAL_SEC:-21600}
|
||
- BACKUP_RETENTION_DAYS=${BACKUP_RETENTION_DAYS:-14}
|
||
- RCLONE_REMOTE=${RCLONE_REMOTE:-}
|
||
- RCLONE_CONFIG_CONTENT=${RCLONE_CONFIG_CONTENT:-}
|
||
volumes:
|
||
- ./scripts/backup.sh:/scripts/backup.sh:ro
|
||
- netrunner_db_backups:/backups
|
||
depends_on:
|
||
db:
|
||
condition: service_healthy
|
||
networks:
|
||
- netrunner_data
|
||
|
||
networks:
|
||
netrunner_data:
|
||
driver: bridge
|
||
|
||
volumes:
|
||
netrunner_db_data:
|
||
netrunner_db_backups:
|