Резервное копирование и восстановление БД¶
Автоматические бэкапы
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 |
Ссылки¶
- Среда Production — как подключиться к PROD
- Runbooks — аварийное восстановление
- Vaultwarden — менеджер паролей
- DevOps скрипты → backup-mysql.sh