Перейти к содержанию

Резервное копирование и восстановление БД

Автоматические бэкапы

MySQL PROD: ежедневный бэкап в 00:00 UTC, путь /backup/mysql/ на 10.99.87.62. PostgreSQL: ежедневный бэкап в 01:00 UTC, путь /backup/postgres/ на 10.99.87.249, retention 14 дней.


MySQL PROD (10.99.87.62)

Создание бэкапа

# Создать дамп и скачать локально
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
./scripts/ssh-internal.sh 10.99.87.62 \
  "docker exec vpn-db mysqldump -uvpn -p'$(см. Vaultwarden  Databases)' \
    --single-transaction --quick --routines vpn" \
  | gzip > shiva_backup_${TIMESTAMP}.sql.gz

echo "Бэкап создан: shiva_backup_${TIMESTAMP}.sql.gz ($(du -sh shiva_backup_${TIMESTAMP}.sql.gz | cut -f1))"

Заменить PASSWORD на пароль из Vaultwarden → Databases → MySQL PROD (пользователь vpn).

Флаги дампа: - --single-transaction — консистентный снимок без блокировок (InnoDB) - --quick — не загружает всю таблицу в память - --routines — включает хранимые процедуры

Восстановление из бэкапа

# 1. Скопировать бэкап на сервер MySQL
scp -o "ProxyJump root@212.70.189.60:2255" \
  -i ~/.ssh/id_ed25519_shivavpn \
  shiva_backup_TIMESTAMP.sql.gz root@10.99.87.62:/tmp/

# 2. Подключиться к серверу и восстановить
./scripts/ssh-internal.sh 10.99.87.62

# На сервере:
gunzip /tmp/shiva_backup_TIMESTAMP.sql.gz

# Восстановить в существующую БД
docker exec -i vpn-db mysql -uvpn -p'$(см. Vaultwarden → Databases)' vpn < /tmp/shiva_backup_TIMESTAMP.sql

# Или через root для восстановления в новую БД:
docker exec -i vpn-db mysql -uroot -p'ROOT_PASSWORD' -e "CREATE DATABASE IF NOT EXISTS vpn_restore"
docker exec -i vpn-db mysql -uroot -p'ROOT_PASSWORD' vpn_restore < /tmp/shiva_backup_TIMESTAMP.sql

Пароли

  • Пользователь vpn / пароль: Vaultwarden → Databases → MySQL PROD
  • Пользователь root / пароль: Vaultwarden → Databases → MySQL PROD (root)

Проверка бэкапа

# Проверить размер и структуру дампа
gunzip -c shiva_backup_TIMESTAMP.sql.gz | head -50
gunzip -c shiva_backup_TIMESTAMP.sql.gz | grep "^CREATE TABLE" | wc -l

MySQL DEV (10.99.87.61)

Аналогично PROD, но: - Пароль: Vaultwarden → Databases → MySQL DEV - Подключение: ./scripts/ssh-internal.sh 10.99.87.61


PostgreSQL автоматические бэкапы (10.99.87.249)

Автоматические бэкапы настроены на 10.99.87.249.

Параметр Значение
Скрипт /opt/scripts/backup-postgres.sh
Cron ежедневно 01:00 UTC
Retention 14 дней
Путь /backup/postgres/ на 10.99.87.249
Off-site rsync → 10.99.87.62:/backup/postgres-offsite/ (02:00 UTC)
SSH-ключ /root/.ssh/id_ed25519_backup на 10.99.87.249

Базы данных:

База Сервис Размер
vpnconfig VPN Config Service ~230MB
keycloak Keycloak ~26MB
remnawave Remnawave ~76KB

Ручной дамп PostgreSQL

VCS PostgreSQL содержит оперативные данные (sync, online sessions, traffic). При потере — восстанавливается из MySQL через fill_configs.

# Дамп PostgreSQL
./scripts/ssh-internal.sh 10.99.87.249 \
  "docker exec vpn-config-postgres pg_dump -U vpnconfig vpnconfig" \
  | gzip > vcs_backup_$(date +%Y%m%d).sql.gz

После восстановления PostgreSQL:

# Перезагрузить серверы из MySQL
curl -X POST http://10.99.87.249:8000/api/v1/sync/mysql-servers -H "X-API-Key: KEY"


Vaultwarden (SQLite, 10.99.87.76)

Vaultwarden настроен на автоматический бэкап — база db.sqlite3 копируется ежедневно.

Ручной бэкап

# Скачать базу Vaultwarden локально
./scripts/ssh-internal.sh 10.99.87.76 "cat /opt/vaultwarden/db.sqlite3" \
  > vaultwarden_backup_$(date +%Y%m%d).sqlite3

# Или через scp
scp -o "ProxyJump root@212.70.189.60:2255" \
  -i ~/.ssh/id_ed25519_shivavpn \
  root@10.99.87.76:/opt/vaultwarden/db.sqlite3 \
  ./vaultwarden_backup_$(date +%Y%m%d).sqlite3

Восстановление Vaultwarden

# Остановить контейнер, заменить базу, запустить
./scripts/ssh-internal.sh 10.99.87.76 "docker stop vaultwarden"
# Скопировать бэкап на сервер (scp)
./scripts/ssh-internal.sh 10.99.87.76 "cp /tmp/db_backup.sqlite3 /opt/vaultwarden/db.sqlite3"
./scripts/ssh-internal.sh 10.99.87.76 "docker start vaultwarden"

Потеря Vaultwarden = потеря всех паролей

Делать бэкап перед любыми операциями с сервером 10.99.87.76.


Что не бэкапируется автоматически

Данные Где хранятся Критичность
Redis (сессии) 10.99.87.249 Средняя — сессии восстанавливаются при логине
Grafana дашборды 10.99.87.5 Средняя — можно воссоздать
Prometheus TSDB 10.99.87.5 Низкая — исторические данные
Ansible vault В репозитории Низкая — зашифрован в git
Nginx конфиги 212.70.189.60 Средняя — есть в Ansible

Ссылки