Appearance
Резервное копирование
Три слоя данных, которые нужно сохранять:
| Слой | Где живёт | Чем бэкапить |
|---|---|---|
| База данных | volume Postgres | pg_dump |
| Файлы (вложения) | volume SeaweedFS | копия каталога данных / s3-синхронизация |
| Конфигурация | env-файл, traefik/*, compose | копия файлов (секреты!) |
Поисковый индекс Meilisearch бэкапить не нужно — он полностью восстанавливается командой search:rebuild.
База данных
Полный дамп (основной механизм)
bash
docker exec orbita_onpremise_db pg_dump -U orbita orbita > backup_$(date +%Y%m%d_%H%M).sqlРекомендации:
- снимать ежедневно по cron хост-системы + обязательно перед каждым обновлением;
- сжимать (
| gzip) и уносить с сервера (s3/объектное хранилище/другой хост) — бэкап на том же диске не переживёт отказ диска; - хранить минимум 14 суточных копий и несколько недельных.
Пример cron на хосте:
bash
# /etc/cron.d/orbita-backup
30 2 * * * root docker exec orbita_onpremise_db pg_dump -U orbita orbita | gzip > /backup/orbita_$(date +\%Y\%m\%d).sql.gz && find /backup -name 'orbita_*.sql.gz' -mtime +14 -deleteФайлы (SeaweedFS)
bash
# Простой способ — копия каталога данных контейнера
docker cp orbita_onpremise_s3:/data ./backup_files_$(date +%Y%m%d)Для регулярного бэкапа удобнее монтировать volume и синхронизировать его rsync-ом/restic-ом на внешнее хранилище. Файлы иммутабельны (вложения не перезаписываются), поэтому инкрементальные бэкапы дёшевы.
Конфигурация
Сохраните вне сервера (в менеджере секретов):
- env-файл стенда — особенно
APP_KEY: без него зашифрованные данные из дампа БД не расшифровать; traefik/(включаяacme/acme.json, иначе после восстановления сертификаты будут выпускаться заново);- локальные правки compose-файлов, если они есть.
Восстановление
Порядок на чистом сервере:
- Развернуть стенд по инструкции с тем же env-файлом (тот же
APP_KEY!), но не выполнять инициализацию данных (сиды/tenant:init). - Остановить всё, кроме БД:
docker compose ... stop backend queue queue-reports scheduler reverb frontend. - Залить дамп:bash
cat backup.sql | docker exec -i orbita_onpremise_db psql -U orbita -d orbita - Восстановить файлы в volume SeaweedFS (обратный
docker cp/ rsync). - Поднять остальные сервисы, затем:bash
docker exec orbita_onpremise_backend php artisan optimize:clear docker exec orbita_onpremise_backend php artisan search:rebuild - Проверить: логин, открытие записей, скачивание старого вложения, поиск.
Репетиция восстановления
Бэкап, который ни разу не восстанавливали, — это гипотеза, а не бэкап. Прогоните восстановление на тестовой VM хотя бы раз в квартал.