# ===================================================================== # 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: