Vaultwarden делит один Postgres-процесс с netrunner-backend

Убирает собственный контейнер db — вместо своего Postgres подключается
внешней сетью (netrunner_grid, external: true) к netrunner-db из
netrunner-backend/docker-compose.prod.yml, в отдельной базе/юзере
(VW_DB_*, был DB_*). Экономит ресурсы на VPS, где раньше крутились бы
два отдельных Postgres-процесса. Добавляет пошаговый ранбук переноса
существующих данных со старого SQLite-инстанса (scripts/migrate-vaultwarden.md,
через checkpoint WAL + pgloader data-only на уже созданную diesel-схему).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-09 16:37:48 +07:00
parent e68f885ac8
commit 049d38a2b9
3 changed files with 184 additions and 50 deletions
+28 -44
View File
@@ -1,45 +1,31 @@
# =====================================================================
# netrunner-data — сервисы хранения данных, вынесенные в отдельный от
# основного control-plane стек: сейчас только Vaultwarden (личный/командный
# менеджер паролей) + его собственный Postgres.
# менеджер паролей).
#
# Раньше Vaultwarden жил на проде голым файлом (~/vaultwarden-data/docker-compose.yml)
# без git/CI, с захардкоженными в файле секретами и на SQLite (./data/db.sqlite3).
# Здесь: секреты — только через .env (сам .env НЕ в git, см. .gitignore; на
# деплое собирается из GitHub Actions secrets, см. .github/workflows/deploy.yml),
# БД — Postgres вместо SQLite.
# деплое собирается из GitHub Actions/Gitea Actions secrets, см.
# .github/workflows/deploy.yml), БД — Postgres вместо SQLite.
#
# ВАЖНО про переход на Postgres: Vaultwarden сам не мигрирует данные из уже
# существующего ./data/db.sqlite3 в Postgres при простой смене DATABASE_URL —
# это отдельная, аккуратная операция (см. официальный вики Vaultwarden,
# "Backing up your vault" + миграция бэкенда), а не просто "поднять новый
# сервис". Перед первым запуском этого compose поверх УЖЕ ЖИВОГО инстанса с
# реальными данными пользователей — сначала сделать полный бэкап текущей
# ./data (включая attachments и rsa-ключи), затем мигрировать содержимое
# db.sqlite3 в Postgres, и только потом переключать DATABASE_URL. Поднимать
# этот compose "как есть" поверх существующих данных без миграции = Vaultwarden
# просто заведёт новую пустую БД в Postgres, старые данные останутся
# нетронутыми в volume, но перестанут быть видны приложению.
# ВАЖНО: своего Postgres-контейнера здесь больше нет — Vaultwarden делит один
# и тот же Postgres-процесс с netrunner-backend (сервис `db`/контейнер
# `netrunner-db` из netrunner-backend/docker-compose.prod.yml), просто в
# отдельной базе (vaultwarden) с собственным пользователем. Оба compose-стека
# должны быть подняты на одном VPS и слиты в общую внешнюю сеть
# `netrunner_grid` (см. миграцию в scripts/migrate-vaultwarden.md — там же и
# однократная команда CREATE DATABASE/CREATE USER на этом общем Postgres).
#
# ВАЖНО про переход со старого SQLite-инстанса: Vaultwarden сам не мигрирует
# данные из ./data/db.sqlite3 в Postgres при простой смене DATABASE_URL — это
# отдельная, аккуратная операция через pgloader (см. scripts/migrate-vaultwarden.md),
# а не просто "поднять новый сервис". Поднимать этот compose "как есть" поверх
# старых данных без миграции = Vaultwarden просто заведёт новую пустую БД в
# Postgres, старые данные останутся нетронутыми в ./data, но перестанут быть
# видны приложению.
# =====================================================================
services:
db:
image: postgres:16-alpine
container_name: netrunner-data-db
restart: unless-stopped
environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: ${DB_NAME:-vaultwarden}
volumes:
- netrunner_data_db:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USER} -d ${DB_NAME:-vaultwarden}"]
interval: 5s
timeout: 5s
retries: 5
networks:
- netrunner_data
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
@@ -51,9 +37,10 @@ services:
- LOG_LEVEL=${VAULTWARDEN_LOG_LEVEL:-info}
- ROCKET_PORT=8081
- WEBSOCKET_ENABLED=true
# postgresql:// вместо файла-заглушки sqlite — сам образ vaultwarden/server
# уже собран со всеми тремя бэкендами, отдельный тег не нужен.
- DATABASE_URL=postgresql://${DB_USER}:${DB_PASSWORD}@db:5432/${DB_NAME:-vaultwarden}
# Общий Postgres-процесс с netrunner-backend (контейнер netrunner-db,
# см. шапку файла) — отдельная база и юзер, не переиспользуем DB_USER/
# DB_PASSWORD бэкенда.
- DATABASE_URL=postgresql://${VW_DB_USER}:${VW_DB_PASSWORD}@netrunner-db:5432/${VW_DB_NAME:-vaultwarden}
- SMTP_HOST=${SMTP_HOST}
- SMTP_FROM=${SMTP_FROM}
- SMTP_PORT=${SMTP_PORT:-465}
@@ -66,15 +53,12 @@ services:
- ./data:/data
ports:
- "127.0.0.1:8081:8081"
depends_on:
db:
condition: service_healthy
networks:
- netrunner_data
- netrunner_grid
networks:
netrunner_data:
driver: bridge
volumes:
netrunner_data_db:
# external: этот стек не поднимает Postgres сам — сеть уже создана
# netrunner-backend/docker-compose.prod.yml (там же живёт netrunner-db).
# Поднимать backend-стек первым.
netrunner_grid:
external: true