chore(deploy): leave database backups to external tools
The app no longer dumps Postgres, restores it, or checks copies in CI. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
1 parent
978f03b8f8
commit
dfc72b1d69
13 files changed
+16
-300
No files matched your search
+2
-2
@@ -23,8 +23,8 @@ Pipu Music — self-hosted музыкальный сервис (веб + Android
|
||||
| [testing.md](testing.md) | Стратегия тестирования |
|
||||
| [ci-cd.md](ci-cd.md) | Gitea Actions: проверки и релиз по тегу |
|
||||
| [install-guide.md](install-guide.md) | **Пошагово:** установка сервера на домен с HTTPS, подключение веба и Android |
|
||||
| [admin-guide.md](admin-guide.md) | **Администратору:** пользователи, хранилища, очередь, волна, обновления, бэкапы, диагностика |
|
||||
| [deployment.md](deployment.md) | Справочник по развёртыванию: сервисы, каталоги, переменные, бэкапы |
|
||||
| [admin-guide.md](admin-guide.md) | **Администратору:** пользователи, хранилища, очередь, волна, обновления, диагностика |
|
||||
| [deployment.md](deployment.md) | Справочник по развёртыванию: сервисы, каталоги, переменные |
|
||||
| [conventions.md](conventions.md) | Соглашения по коду, git, версиям |
|
||||
| [roadmap.md](roadmap.md) | Этапы разработки и критерии готовности |
|
||||
|
||||
|
||||
+6
-21
@@ -1,7 +1,7 @@
|
||||
# Руководство администратора
|
||||
|
||||
Повседневная работа с сервером после установки ([install-guide.md](install-guide.md)): пользователи, музыка,
|
||||
очередь на добавление, «Моя волна», обновления, бэкапы и диагностика. Все команды — из каталога
|
||||
очередь на добавление, «Моя волна», обновления и диагностика. Все команды — из каталога
|
||||
`/opt/pipu-music/deploy`. Справочник по сервисам и переменным — [deployment.md](deployment.md).
|
||||
|
||||
## 1. Первый вход
|
||||
@@ -90,7 +90,7 @@
|
||||
./update.sh
|
||||
```
|
||||
|
||||
Скрипт делает копию базы, переключается на последний релиз, собирает образы, перезапускает сервисы и ждёт
|
||||
Скрипт переключается на последний релиз, собирает образы, перезапускает сервисы и ждёт
|
||||
готовности; миграции применяются при старте api. Конкретная версия — `./update.sh v1.0.0`; откат на старую версию
|
||||
требует `PIPU_ALLOW_DOWNGRADE=1` (миграции не откатываются — сначала проверьте совместимость). Перед обновлением
|
||||
прочитайте заметки к релизу на странице релизов Gitea.
|
||||
@@ -99,33 +99,18 @@ Android-приложение обновляется само: при запус
|
||||
Раздать приложение — ссылка `https://<ваш-домен>/android` (без входа): кнопка «Скачать APK» последнего релиза,
|
||||
адрес сервера для копирования и короткая инструкция; та же страница — внизу экрана входа и в меню профиля.
|
||||
|
||||
## 7. Бэкапы и восстановление
|
||||
|
||||
- Каждую ночь (`BACKUP_HOUR`, по умолчанию 3:30 UTC) контейнер `backup` делает копию базы в
|
||||
`/srv/pipu/backups/daily` (14 последних) и раз в неделю — в `weekly` (8 последних).
|
||||
- Раз в неделю копия **проверяется восстановлением** во временную базу. Результат:
|
||||
`docker compose logs backup | tail`; при ошибке в логе — «ПРОВЕРКА НЕ ПРОЙДЕНА».
|
||||
- Копия сейчас: `docker compose run --rm backup once`.
|
||||
- Восстановление: `./restore.sh` — список копий, `./restore.sh daily/<файл>` — восстановить. Прежняя база
|
||||
остаётся рядом как `pipu_before_restore_<время>`; убедившись, что всё в порядке, удалите её:
|
||||
`docker compose exec postgres dropdb -U pipu pipu_before_restore_<время>`.
|
||||
- В копию входит всё, что нельзя пересоздать: пользователи, история, лайки, состояние плеера, очередь на добавление,
|
||||
результаты аудиоанализа и модели волны. Поиск, обложки и транскоды восстанавливаются сами.
|
||||
- **Сама музыка не бэкапится** приложением — это ваш диск или NFS. Каталог бэкапов тоже лежит на сервере:
|
||||
копируйте `/srv/pipu/backups` на другую машину, например `rsync` по cron.
|
||||
|
||||
## 8. Наблюдение
|
||||
## 7. Наблюдение
|
||||
|
||||
| Что | Как |
|
||||
|---|---|
|
||||
| Сервер жив и готов | `curl -s https://music.example.com/readyz` → все зависимости `ok` |
|
||||
| Состояние сервисов | `docker compose ps` |
|
||||
| Логи | `docker compose logs -f --tail=100 api` (или `recommender`, `analyzer`, `storage-agent`, `backup`) |
|
||||
| Место на диске | `df -h /srv/pipu`; больше всего занимают `cache/transcode` (чистится сам) и `backups` |
|
||||
| Логи | `docker compose logs -f --tail=100 api` (или `recommender`, `analyzer`, `storage-agent`) |
|
||||
| Место на диске | `df -h /srv/pipu`; больше всего занимает `cache/transcode` (чистится сам) |
|
||||
| Версия | `grep PIPU_VERSION .env`, `GET /api/v1/server-info`; Android — внизу вкладки «Профиль» |
|
||||
| Нагрузка | `tests/load/smoke.js` — см. [testing.md](testing.md#нагрузочный-smoke) |
|
||||
|
||||
## 9. Частые ситуации
|
||||
## 8. Частые ситуации
|
||||
|
||||
| Ситуация | Что делать |
|
||||
|---|---|
|
||||
|
||||
+1
-1
@@ -77,7 +77,7 @@ jobs:
|
||||
- **изменения** — коммиты (Conventional Commits) с прошлого тега по разделам «Новое», «Исправления»,
|
||||
«Сборка и CI» и т. д., отдельно — несовместимые (`feat!:`); для финального релиза отсчёт от прошлого
|
||||
финального, а не от последнего `-rc`; ссылка на полный diff;
|
||||
- **обновление сервера** — бэкап, `./update.sh vX.Y.Z`, проверка версии; **установка APK** и проверка SHA-256.
|
||||
- **обновление сервера** — `./update.sh vX.Y.Z`, проверка версии; **установка APK** и проверка SHA-256.
|
||||
|
||||
Job `android`: Android SDK, `expo prebuild`, `./gradlew assembleRelease --build-cache` (только arm64-v8a), подпись `apksigner`,
|
||||
затем `release.mjs android success <apk>` прикладывает APK и `.sha256` и меняет статус. При любом сбое —
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
├── models/ # модели Essentia (скачиваются при первом старте analyzer)
|
||||
├── updates/ # кэш APK релизов
|
||||
├── uploads/ # staging очереди на добавление (размер ≈ лимит очереди, по умолчанию 10 ГБ)
|
||||
├── backups/
|
||||
└── caddy/ # сертификаты Let's Encrypt (если используется compose.tls.yaml)
|
||||
```
|
||||
|
||||
@@ -95,27 +94,6 @@
|
||||
|
||||
Пошаговая установка на домен — [install-guide.md](install-guide.md).
|
||||
|
||||
## Бэкапы
|
||||
|
||||
- Контейнер `backup` (`deploy/backup.sh loop`): каждый день в `BACKUP_HOUR`:30 UTC (по умолчанию 3:30) —
|
||||
`pg_dump -Fc` → `/srv/pipu/backups/daily/`, хранится `BACKUP_KEEP_DAILY` = 14 последних; первая копия за неделю
|
||||
копируется в `weekly/` (`BACKUP_KEEP_WEEKLY` = 8). Рядом с копией — `*.counts`: число строк в каждой таблице.
|
||||
- Раз в неделю копия **проверяется восстановлением**: разворачивается во временную базу `pipu_verify`, сверяются
|
||||
таблицы и число строк, база удаляется; время последней успешной проверки — `backups/.last-verify`, ошибки —
|
||||
в `docker compose logs backup` («ПРОВЕРКА НЕ ПРОЙДЕНА»). Тот же цикл копия → проверка → восстановление
|
||||
выполняется в CI (`ci / db`) на базе после сквозного сценария.
|
||||
- `update.sh` перед обновлением делает внеочередную копию.
|
||||
- Вручную: `docker compose run --rm backup once` — копия сейчас; `docker compose run --rm backup verify /backups/daily/<файл>`.
|
||||
- Восстановление: `./restore.sh` — список копий, `./restore.sh daily/pipu-….dump` — останавливает api, рекомендации и
|
||||
анализ, проверяет копию, переименовывает текущую базу в `pipu_before_restore_<время>` (страховка; удалить —
|
||||
`docker compose exec postgres dropdb -U pipu <имя>`), восстанавливает и запускает сервисы; поиск переиндексируется
|
||||
при старте api. Redis (сессии волны, очереди) не восстанавливается — пользователи просто начнут новую волну.
|
||||
- Копии лежат на том же сервере: для защиты от потери диска синхронизируйте `/srv/pipu/backups` на другую машину
|
||||
(например, `rclone sync` или `rsync` по cron).
|
||||
- Meilisearch, кэши и модели **не бэкапятся** — восстанавливаются (`reindex`, повторный транскод / анализ).
|
||||
- Признаки анализа хранятся в Postgres — после восстановления из бэкапа повторный многочасовой анализ не нужен.
|
||||
- Сама музыка — на NFS, вне зоны ответственности приложения.
|
||||
|
||||
## Обновление
|
||||
|
||||
```bash
|
||||
|
||||
+2
-17
@@ -304,7 +304,7 @@ curl -s https://music.example.com/readyz
|
||||
|
||||
---
|
||||
|
||||
## 11. Обновление, бэкапы, удаление
|
||||
## 11. Обновление и удаление
|
||||
|
||||
Обновление до последнего релиза:
|
||||
|
||||
@@ -314,22 +314,7 @@ cd /opt/pipu-music/deploy && ./update.sh
|
||||
|
||||
Конкретная версия или откат: `./update.sh v0.2.0`. Скрипт делает `git fetch`, переключается на тег,
|
||||
пересобирает образы и перезапускает сервисы; старые образы удаляются. Миграции БД применяются
|
||||
автоматически при старте API.
|
||||
|
||||
Бэкапы базы делаются сами: каждую ночь в `/srv/pipu/backups`, раз в неделю копия проверяется восстановлением,
|
||||
перед каждым `update.sh` — внеочередная копия. Всё остальное восстанавливается само — см.
|
||||
[deployment.md](deployment.md#бэкапы). Копия сейчас и восстановление:
|
||||
|
||||
```bash
|
||||
cd /opt/pipu-music/deploy && docker compose run --rm backup once
|
||||
```
|
||||
|
||||
```bash
|
||||
cd /opt/pipu-music/deploy && ./restore.sh
|
||||
```
|
||||
|
||||
Без аргумента `restore.sh` показывает список копий; с именем файла (`./restore.sh daily/pipu-20261020-033000.dump`)
|
||||
восстанавливает базу, сохранив прежнюю рядом.
|
||||
автоматически при старте API. Копии базы и музыки приложение не делает.
|
||||
|
||||
Остановить сервис, сохранив данные:
|
||||
|
||||
|
||||
+3
-5
@@ -53,11 +53,9 @@
|
||||
критерий проверяется по метрикам версий в админке («Библиотека → Моя волна») и NDCG в `model_versions`.
|
||||
|
||||
## M7 — Стабилизация (v1.0)
|
||||
- Нагрузочный smoke, бэкапы и восстановление (проверено), документация администратора,
|
||||
доступность, полировка анимаций, багфиксы.
|
||||
- **Состояние:** v1.0 — бэкапы с еженедельной проверкой восстановления (и цикл копия → проверка → восстановление
|
||||
в CI), [руководство администратора](admin-guide.md), аудит доступности WCAG 2.1 AA, k6-smoke
|
||||
(`tests/load/smoke.js`, запускается вручную на сервере перед релизом).
|
||||
- Нагрузочный smoke, документация администратора, доступность, полировка анимаций, багфиксы.
|
||||
- **Состояние:** v1.0 — [руководство администратора](admin-guide.md), аудит доступности WCAG 2.1 AA, k6-smoke
|
||||
(`tests/load/smoke.js`, запускается вручную на сервере перед релизом). Копии базы и музыки — внешними средствами.
|
||||
|
||||
## Дальше (идеи)
|
||||
- Плейлисты, волна по исполнителю / треку, ежедневные подборки, тексты песен, Chromecast / DLNA,
|
||||
|
||||
Reference in new issue
Block a user