mirror of
https://gitverse.ru/kpa39l/gotosocial.git
synced 2026-09-29 09:55:10 +00:00
openspec: change deploy-gotosocial — развертывание GoToSocial (compose+config+backup+docs)
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
schema: spec-driven
|
||||
created: 2026-09-06
|
||||
@@ -0,0 +1,145 @@
|
||||
# Design — Deploy GoToSocial
|
||||
|
||||
## Архитектура
|
||||
|
||||
```
|
||||
Internet
|
||||
│ 443
|
||||
▼
|
||||
vps02 87.242.100.206 (Caddy 2, host net)
|
||||
social.dedinit.ru ──► reverse_proxy 10.8.0.2:8080
|
||||
│ WireGuard 10.8.0.0/24
|
||||
▼
|
||||
bigbox 10.8.0.2
|
||||
┌──────────────────────────────────────┐
|
||||
│ docker: gotosocial (v0.22.1) │
|
||||
│ config.yaml (host=social.dedinit.ru, │
|
||||
│ account-domain=dedinit.ru) │
|
||||
│ volumes: data/ (sqlite.db + storage) │
|
||||
│ metrics :8080/metrics (OTEL→prom) │
|
||||
│ logs: json → promtail → Loki │
|
||||
│ backup.sh → backups/ → Я.Диск │
|
||||
└──────────────────────────────────────┘
|
||||
```
|
||||
|
||||
- GtS живёт на bigbox (10.8.0.2), как остальные сервисы
|
||||
- Caddy на vps02 проксирует `social.dedinit.ru` → `10.8.0.2:8080` (через WG)
|
||||
- Split-domain: аккаунты `@user@dedinit.ru`, сервер на `social.dedinit.ru`
|
||||
- Apex (`dedinit.ru` на Jino, 81.177.135.38) получает .well-known редиректы
|
||||
|
||||
## Файлы
|
||||
|
||||
### /opt/gotosocial/docker-compose.yml
|
||||
|
||||
```yaml
|
||||
services:
|
||||
gotosocial:
|
||||
image: superseriousbusiness/gotosocial:v0.22.1
|
||||
container_name: gotosocial
|
||||
restart: unless-stopped
|
||||
env_file:
|
||||
- .env
|
||||
ports:
|
||||
- "8080:8080"
|
||||
volumes:
|
||||
- ./data:/gotosocial/storage
|
||||
- ./config.yaml:/gotosocial/config.yaml:ro
|
||||
```
|
||||
|
||||
- Порт 8080 (внутри и наружу); проброс на bigbox-интерфейс или в WG-подсеть
|
||||
- `config.yaml` монтируется read-only
|
||||
- Пароль SMTP и секреты — из `.env` (переменные `GTS_*` приоритетнее config.yaml)
|
||||
|
||||
### /opt/gotosocial/config.yaml (ключевое)
|
||||
|
||||
```yaml
|
||||
host: "social.dedinit.ru"
|
||||
account-domain: "dedinit.ru"
|
||||
protocol: "https"
|
||||
bind-address: "0.0.0.0"
|
||||
port: 8080
|
||||
trusted-proxies:
|
||||
- "10.8.0.2" # Caddy (bigbox) — через WG от vps02
|
||||
|
||||
instance-account-domain: "dedinit.ru"
|
||||
instance-expose-peers: true # опционально
|
||||
instance-expose-suspended: false
|
||||
|
||||
# SQLite
|
||||
db-type: "sqlite"
|
||||
db-address: "/gotosocial/storage/sqlite.db"
|
||||
storage-local-base-path: "/gotosocial/storage/media"
|
||||
|
||||
# SMTP (smtp.jino.ru)
|
||||
smtp-host: "smtp.jino.ru"
|
||||
smtp-port: 587
|
||||
smtp-username: "social@dedinit.ru"
|
||||
smtp-password: "${GTS_SMTP_PASSWORD}"
|
||||
smtp-from: "social@dedinit.ru"
|
||||
|
||||
# Метрики
|
||||
metrics-enabled: true
|
||||
metrics-auth-enabled: false # защитим на уровне прокси при необходимости
|
||||
|
||||
# Логи
|
||||
log-level: "info"
|
||||
log-format: "json"
|
||||
log-timestamp-format: "2006-01-02T15:04:05.000Z07:00"
|
||||
```
|
||||
|
||||
### /opt/gotosocial/.env (в git исключён)
|
||||
|
||||
```bash
|
||||
GTS_SMTP_PASSWORD='fF@4guOf9spE2#8$'
|
||||
# любые другие секреты
|
||||
```
|
||||
|
||||
### /opt/gotosocial/backup.sh
|
||||
|
||||
- `VACUUM INTO` / `sqlite3 .backup` для consistent SQLite
|
||||
- tar.gz: `data/` (sqlite + storage/media) в `backups/gotosocial_<ts>.tar.gz`
|
||||
- env: `backups/gotosocial_env_<ts>.tar.gz`
|
||||
- копия на `/mnt/yandex-disk/backup/gotosocial-backups/`
|
||||
- ротация: локально 7 дней, ЯД 30 дней
|
||||
- проверка mountpoint ЯД, exit != 0 при ошибке
|
||||
|
||||
### /opt/gotosocial/README.md
|
||||
|
||||
- Порт-маппинги, структура, команды, бэкап/восстановление, обновление
|
||||
|
||||
## Применение
|
||||
|
||||
```bash
|
||||
# bigbox
|
||||
cd /opt/gotosocial
|
||||
docker compose up -d
|
||||
docker logs -f gotosocial
|
||||
|
||||
# создание пользователя (после первого старта)
|
||||
docker compose exec gotosocial gotosocial admin account create \
|
||||
--username estorozhenko --email kpa39l@yandex.ru \
|
||||
--password '<pass>' --confirmation
|
||||
|
||||
# vps02 — Caddyfile
|
||||
# добавить блок social.dedinit.ru { reverse_proxy 10.8.0.2:8080 }
|
||||
docker exec caddy caddy reload --config /etc/caddy/Caddyfile
|
||||
|
||||
# apex dedinit.ru — добавить .well-known редиректы на Jino
|
||||
```
|
||||
|
||||
## Откат (Rollback)
|
||||
|
||||
1. `docker compose down` на bigbox — сервис остановлен
|
||||
2. Удалить блок из Caddyfile на vps02, `caddy reload`
|
||||
3. Удалить/откатить .well-known редиректы на apex
|
||||
4. Данные (data/) не удаляются — можно перезапустить
|
||||
|
||||
## Проверка
|
||||
|
||||
```bash
|
||||
curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:8080/ # 200
|
||||
curl -s http://127.0.0.1:8080/metrics | grep -E 'go_goroutines|gin_|bun_' # метрики
|
||||
echo | openssl s_client -connect social.dedinit.ru:443 2>/dev/null | openssl x509 -noout -dates
|
||||
curl -s 'https://social.dedinit.ru/.well-known/webfinger?resource=acct:estorozhenko@dedinit.ru'
|
||||
bash /opt/gotosocial/backup.sh && ls -lh /opt/gotosocial/backups/
|
||||
```
|
||||
@@ -0,0 +1,31 @@
|
||||
# Deploy GoToSocial на social.dedinit.ru
|
||||
|
||||
## Why
|
||||
|
||||
Нужна собственная федиверсная нода ActivityPub (GoToSocial) на личном домене dedinit.ru — «нода для обычных людей». Хостинг: сервис на bigbox в Docker, реверс-прокси — Caddy на vps02 (social.dedinit.ru → 87.242.100.206). Split-domain: аккаунты `@user@dedinit.ru`, сервер на social.dedinit.ru. Медиа — локально, бэкапы — SQLite consistent + медиа на Яндекс.Диск.
|
||||
|
||||
## What Changes
|
||||
|
||||
- Развернуть GoToSocial (последний стабильный релиз, фиксированный тег) в Docker на bigbox в `/opt/gotosocial`
|
||||
- База: **SQLite** (файл `data/sqlite.db`), медиа: локальная папка `data/storage`, монтируется в контейнер
|
||||
- **Split-domain**: `host: social.dedinit.ru`, `account-domain: dedinit.ru` (юзеры `@user@dedinit.ru`)
|
||||
- На apex dedinit.ru (Jino, статический хостинг) добавить .well-known/webfinger, nodeinfo, host-meta редиректы на `https://social.dedinit.ru/...`
|
||||
- Конфиг GtS: `config.yaml` (в git), секреты: `.env` (в git исключён)
|
||||
- SMTP: `smtp.jino.ru:587` STARTTLS, логин `social@dedinit.ru` (для писем GtS)
|
||||
- Caddy на vps02: блок `social.dedinit.ru { reverse_proxy 10.8.0.2:<port> }`
|
||||
- Бэкап: скрипт `backup.sh` — SQLite consistent (`VACUUM INTO`) + медиа, локально 7 дней + Яндекс.Диск 30 дней (ротация)
|
||||
- Метрики: `metrics-enabled: true` + OTEL prometheus экспортёр; логи: `log-format: json` → promtail → Loki
|
||||
- Git: источник истины gitverse.ru (kpa39l/gotosocial), gitea.nixg.ru — pull-mirror
|
||||
- Мониторинг бэкапов и дашборд Grafana — **post-MVP** (после запуска и настройки импорта из Telegram)
|
||||
- **BREAKING**: нет (новый сервис, ничего не заменяет)
|
||||
|
||||
## Capabilities
|
||||
|
||||
- **New**: `gotosocial-deploy` — работоспособный инстанс GtS (compose, config, split-domain, SMTP, бэкап, метрики)
|
||||
- **New**: `gotosocial-backup` — consistent бэкап SQLite + медиа, локально + Яндекс.Диск, ротация
|
||||
|
||||
## Out of Scope (отложено на post-MVP)
|
||||
|
||||
- Дашборд Grafana для GtS и бэкапов
|
||||
- Мониторинг бэкапов (интеграция с Prometheus/node_exporter)
|
||||
- Импорт из Telegram
|
||||
@@ -0,0 +1,47 @@
|
||||
# GoToSocial Backup — Delta Spec
|
||||
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: Consistent бэкап SQLite + медиа
|
||||
|
||||
- **MUST**: Скрипт `/opt/gotosocial/backup.sh` создаёт consistent-бэкап SQLite через `VACUUM INTO` (или `sqlite3 .backup`) — не просто копию файла
|
||||
- **MUST**: Бэкап включает медиа из `data/storage` (локальные файлы)
|
||||
- **MUST**: Архив собирается в `/opt/gotosocial/backups/` с именем `gotosocial_<YYYYMMDD_HHMMSS>.tar.gz`
|
||||
- **MUST**: Секреты (`.env`) бэкапятся отдельным архивом (`.env` в git исключён)
|
||||
- **SHOULD**: Remote-медиа не бэкапится (пере-фетчится) — по официальной рекомендации
|
||||
|
||||
#### Scenario: Создание архива
|
||||
- GIVEN запущен `bash /opt/gotosocial/backup.sh`, WHEN проверить, THEN файл `gotosocial_<ts>.tar.gz` создан и непустой
|
||||
- GIVEN архив создан, WHEN `tar tzf <архив>`, THEN содержит `data/sqlite.db` и файлы медиа
|
||||
|
||||
### Requirement: Копия на Яндекс.Диск
|
||||
|
||||
- **MUST**: Бэкап копируется в `/mnt/yandex-disk/backup/gotosocial-backups/` (mount Яндекс.Диска)
|
||||
- **MUST**: Если Яндекс.Диск не примонтирован — скрипт сообщает об ошибке и завершается с ненулевым кодом
|
||||
- **SHOULD**: Копия второго архива (env) также на ЯД
|
||||
|
||||
#### Scenario: Копия на ЯД
|
||||
- GIVEN Яндекс.Диск примонтирован, WHEN скрипт отработал, THEN файл присутствует на `/mnt/yandex-disk/backup/gotosocial-backups/`
|
||||
- GIVEN диск НЕ примонтирован, WHEN скрипт, THEN exit code != 0 и сообщение об ошибке
|
||||
|
||||
### Requirement: Ротация бэкапов
|
||||
|
||||
- **MUST**: Локально хранится 7 дней (`find -mtime +7 -delete`)
|
||||
- **MUST**: На Яндекс.Диске хранится 30 дней (`find -mtime +30 -delete`)
|
||||
- **SHOULD**: Ротация применяется только к файлам `gotosocial_*`
|
||||
|
||||
#### Scenario: Ротация
|
||||
- GIVEN бэкап старше 7 дней локально, WHEN ротация, THEN файл удалён
|
||||
- GIVEN бэкап старше 30 дней на ЯД, WHEN ротация, THEN файл удалён
|
||||
|
||||
### Requirement: Автоматический запуск (cron/systemd)
|
||||
|
||||
- **SHOULD**: Бэкап запускается по расписанию (cron/systemd timer) — например ежедневно
|
||||
- **SHOULD**: Запуск тихий при успехе (без шума), сообщает только при ошибке
|
||||
|
||||
#### Scenario: Запуск по расписанию
|
||||
- GIVEN настроен таймер/cron, WHEN время запуска, THEN бэкап создан (файл с сегодняшней датой)
|
||||
|
||||
## MODIFIED Requirements
|
||||
|
||||
(нет)
|
||||
@@ -0,0 +1,73 @@
|
||||
# GoToSocial Deploy — Delta Spec
|
||||
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: Инстанс GoToSocial работает в Docker на bigbox
|
||||
|
||||
- **MUST**: Сервис GoToSocial запускается как Docker-контейнер из `/opt/gotosocial` через `docker compose`
|
||||
- **MUST**: Используется образ с фиксированным тегом последнего стабильного релиза (например `superseriousbusiness/gotosocial:v0.22.1`)
|
||||
- **MUST**: Контейнер имеет volume для данных: `data/sqlite.db` (SQLite) и `data/storage` (медиа)
|
||||
- **MUST**: Приложение слушает порт внутри контейнера, проброшенный наружу (например `8080:8080`)
|
||||
- **SHOULD**: Рестарт контейнера настроен (`restart: unless-stopped`)
|
||||
|
||||
#### Scenario: Контейнер запущен
|
||||
- GIVEN контейнер запущен, WHEN `docker ps`, THEN контейнер `gotosocial` в статусе Up
|
||||
- GIVEN сервис работает, WHEN `curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:<port>/`, THEN HTTP 200
|
||||
|
||||
### Requirement: Split-domain — host social.dedinit.ru, account-domain dedinit.ru
|
||||
|
||||
- **MUST**: В `config.yaml`: `host: social.dedinit.ru`, `account-domain: dedinit.ru`, `protocol: https`
|
||||
- **MUST**: Не менять `host`/`account-domain` после первого запуска (необратимо)
|
||||
- **MUST**: На apex `dedinit.ru` (Jino) добавлены редиректы:
|
||||
- `/.well-known/webfinger` → `https://social.dedinit.ru/.well-known/webfinger`
|
||||
- `/.well-known/nodeinfo` → `https://social.dedinit.ru/.well-known/nodeinfo`
|
||||
- `/.well-known/host-meta` → `https://social.dedinit.ru/.well-known/host-meta`
|
||||
- **SHOULD**: Проверить редиректы после публикации на apex
|
||||
|
||||
#### Scenario: Webfinger резолвится
|
||||
- GIVEN инстанс запущен, WHEN `curl -s -H 'Accept: application/json' 'https://social.dedinit.ru/.well-known/webfinger?resource=acct:estorozhenko@dedinit.ru'`, THEN JSON с actor
|
||||
- GIVEN apex настроен, WHEN `curl -s -o /dev/null -w '%{http_code}' -L 'https://dedinit.ru/.well-known/webfinger?resource=acct:estorozhenko@dedinit.ru'`, THEN 200 после редиректа
|
||||
|
||||
### Requirement: TLS через Caddy на vps02
|
||||
|
||||
- **MUST**: Caddy (vps02, host net) имеет блок `social.dedinit.ru { reverse_proxy 10.8.0.2:<port> }`
|
||||
- **MUST**: Caddy выпускает Let's Encrypt сертификат для social.dedinit.ru автоматически
|
||||
- **MUST**: GtS доверяет прокси: в `config.yaml` `trusted-proxies` включает IP/подсеть Caddy (например `10.8.0.2`)
|
||||
- **SHOULD**: Header `Host` и `X-Forwarded-Proto` передаются в GtS
|
||||
|
||||
#### Scenario: HTTPS работает
|
||||
- GIVEN Caddy настроен, WHEN `curl -s -o /dev/null -w '%{http_code}' https://social.dedinit.ru/`, THEN 200
|
||||
- GIVEN сертификат, WHEN `echo | openssl s_client -connect social.dedinit.ru:443 2>/dev/null | openssl x509 -noout -dates`, THEN даты валидны
|
||||
|
||||
### Requirement: SMTP-отправка писем
|
||||
|
||||
- **MUST**: `config.yaml` содержит SMTP: `smtp.jino.ru:587`, STARTTLS, логин `social@dedinit.ru` (пароль из `.env`)
|
||||
- **MUST**: Письма (подтверждение email, уведомления) отправляются через SMTP-сервер
|
||||
- **SHOULD**: Проверка отправки тестового письма
|
||||
|
||||
#### Scenario: Отправка письма
|
||||
- GIVEN SMTP настроен, WHEN администратор инициирует отправку (например создание пользователя / тест), THEN письмо доставлено на указанный адрес
|
||||
- GIVEN неверный пароль SMTP, WHEN отправка, THEN в логах GtS ошибка аутентификации (не тихий fail)
|
||||
|
||||
### Requirement: Метрики Prometheus
|
||||
|
||||
- **MUST**: В `config.yaml`: `metrics-enabled: true`
|
||||
- **MUST**: Переменные окружения `OTEL_METRICS_PRODUCERS=prometheus`, `OTEL_METRICS_EXPORTER=prometheus`
|
||||
- **MUST**: Эндпоинт `/metrics` отдаёт метрики в формате Prometheus (Go runtime, Gin HTTP, Bun DB)
|
||||
- **SHOULD**: Prometheus на bigbox скрейпит `127.0.0.1:<port>/metrics` (добавлен job)
|
||||
|
||||
#### Scenario: Эндпоинт метрик
|
||||
- GIVEN GtS запущен, WHEN `curl -s http://127.0.0.1:<port>/metrics | head`, THEN вывод содержит `go_goroutines`, `gin_`, `bun_` префиксы
|
||||
- GIVEN Prometheus настроен, WHEN `curl http://127.0.0.1:9090/api/v1/targets`, THEN job `gotosocial` в статусе UP
|
||||
|
||||
### Requirement: Логи в JSON для сбора
|
||||
|
||||
- **MUST**: `config.yaml`: `log-format: json` (для Promtail/Loki)
|
||||
- **SHOULD**: Promtail собирает docker-логи контейнера `gotosocial` (label `container=gotosocial` / job `gotosocial`)
|
||||
|
||||
#### Scenario: Логи в JSON
|
||||
- GIVEN контейнер пишет логи, WHEN `docker logs gotosocial | head`, THEN строки в JSON-формате
|
||||
|
||||
## MODIFIED Requirements
|
||||
|
||||
(нет)
|
||||
@@ -0,0 +1,67 @@
|
||||
# Tasks — Deploy GoToSocial
|
||||
|
||||
## 1. Базовая структура проекта
|
||||
|
||||
- [ ] Создан `/opt/gotosocial` с docker-compose.yml, config.yaml, .env, backup.sh, README.md
|
||||
- [ ] Проверка: `ls -la /opt/gotosocial` содержит файлы
|
||||
|
||||
## 2. Конфигурация GoToSocial
|
||||
|
||||
- [ ] config.yaml: host=social.dedinit.ru, account-domain=dedinit.ru, protocol=https, port=8080, trusted-proxies=[10.8.0.2]
|
||||
- [ ] База SQLite: `db-type: sqlite`, `db-address` в volume
|
||||
- [ ] SMTP: smtp.jino.ru:587, social@dedinit.ru, пароль из .env
|
||||
- [ ] Метрики: `metrics-enabled: true` + OTEL prometheus env
|
||||
- [ ] Логи: `log-format: json`
|
||||
- [ ] Проверка: `docker compose config` успешен, ключи на месте
|
||||
|
||||
## 3. docker-compose.yml
|
||||
|
||||
- [ ] Образ `superseriousbusiness/gotosocial:v0.22.1` (фиксированный тег), restart unless-stopped
|
||||
- [ ] ports: 8080:8080, volumes: ./data, ./config.yaml:ro, env_file: .env
|
||||
- [ ] Проверка: `docker compose config --quiet`
|
||||
|
||||
## 4. .env
|
||||
|
||||
- [ ] Создан .env с `GTS_SMTP_PASSWORD` (и др. секретами), в .gitignore
|
||||
- [ ] Проверка: `.env` не виден в git (`git check-ignore .env`)
|
||||
|
||||
## 5. Запуск и создание админа
|
||||
|
||||
- [ ] `docker compose up -d` — контейнер Up
|
||||
- [ ] `curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:8080/` → 200
|
||||
- [ ] Админ: `gotosocial admin account create --username estorozhenko --email kpa39l@yandex.ru --confirmation`
|
||||
- [ ] Проверка: `docker compose exec gotosocial gotosocial admin account promote --username estorozhenko` (или через CLI)
|
||||
|
||||
## 6. Реверс-прокси Caddy на vps02
|
||||
|
||||
- [ ] Caddyfile: `social.dedinit.ru { reverse_proxy 10.8.0.2:8080 }`, caddy reload
|
||||
- [ ] Проверка: `curl https://social.dedinit.ru/` → 200, сертификат LE
|
||||
|
||||
## 7. Split-domain: .well-known на apex
|
||||
|
||||
- [ ] На dedinit.ru (Jino) добавлены редиректы webfinger/nodeinfo/host-meta → social.dedinit.ru
|
||||
- [ ] Проверка: `curl -sL 'https://dedinit.ru/.well-known/webfinger?resource=acct:estorozhenko@dedinit.ru'` → 200 JSON
|
||||
|
||||
## 8. Метрики/логи
|
||||
|
||||
- [ ] `/metrics` отдаёт метрики
|
||||
- [ ] Prometheus job `gotosocial` (scrape 127.0.0.1:8080) — если включено в стек
|
||||
- [ ] Promtail собирает docker-логи gotosocial
|
||||
- [ ] Проверка: `curl http://127.0.0.1:9090/api/v1/targets` → gotosocial UP
|
||||
|
||||
## 9. Бэкап
|
||||
|
||||
- [ ] `backup.sh`: SQLite VACUUM INTO + медиа, tar.gz, ротация 7/30 дней, копия на ЯД
|
||||
- [ ] Проверка: `bash backup.sh` → архив создан, на ЯД есть, exit 0
|
||||
- [ ] Расписание (cron/systemd timer) — ежедневно, тихо
|
||||
|
||||
## 10. Документация
|
||||
|
||||
- [ ] README.md: порты, структура, бэкап/восстановление, обновление
|
||||
- [ ] Проверка: README содержит порт-маппинг и команды
|
||||
|
||||
## Отложено (post-MVP)
|
||||
|
||||
- [ ] Дашборд Grafana (GtS + бэкапы)
|
||||
- [ ] Мониторинг бэкапов
|
||||
- [ ] Импорт из Telegram
|
||||
@@ -0,0 +1,27 @@
|
||||
schema: spec-driven
|
||||
|
||||
context: |
|
||||
Сервис: GoToSocial (федиверсная нода ActivityPub) на bigbox в Docker.
|
||||
Домен: social.dedinit.ru (A → 87.242.100.206 = vps02), split-domain: account-domain=dedinit.ru (юзеры @user@dedinit.ru), .well-known/webfinger·nodeinfo·host-meta редиректы на apex (Jino, доступ к файлам есть).
|
||||
Хостинг: bigbox (10.8.0.2, WG 10.8.0.0/24) — сам сервис; vps02 (87.242.100.206, Caddy 2, host net) — реверс-прокси; рестарт сервисов — только извне (SSH sudo).
|
||||
SSH: vps02 = estorozhenko@87.242.100.206, ключ /mnt/yandex-disk/.ssh_box/cloudruVPS; bigbox = локально.
|
||||
База: SQLite (файл /opt/gotosocial/data/sqlite.db). Медиа: локально /opt/gotosocial/data/storage, монтируется в контейнер.
|
||||
SMTP: smtp.jino.ru:587 STARTTLS, логин social@dedinit.ru, аутентификация — для писем GtS.
|
||||
Секреты: .env в /opt/gotosocial (в git исключён). Конфиг GtS: config.yaml.
|
||||
Бэкап: SQLite consistent (VACUUM INTO / sqlite3 .backup) + медиа; локально 7 дней + Яндекс.Диск (mount /mnt/yandex-disk/backup/gotosocial-backups/) 30 дней.
|
||||
Мониторинг: Prometheus на bigbox (127.0.0.1:9090, host net), Grafana :3001 (grafana.nixg.ru), Loki :3100 + promtail; метрики GtS: metrics-enabled + OTEL prometheus; логи: log-format json → promtail job.
|
||||
Git: источник истины gitverse.ru (kpa39l), gitea.nixg.ru — pull-mirror (8h). Коммиты — маленькие, по изменениям.
|
||||
Версии: последний стабильный релиз GtS, фиксированный тег в compose, обновление вручную.
|
||||
|
||||
rules:
|
||||
proposal:
|
||||
- Указывать затронутые сервисы и порты
|
||||
- Включать план отката (rollback)
|
||||
specs:
|
||||
- Требования в формате MUST/SHOULD/MAY
|
||||
- Сценарии проверки: GIVEN/WHEN/THEN с конкретными командами верификации (systemctl status, curl, docker ps)
|
||||
design:
|
||||
- Указывать конкретные файлы конфигов и юнитов
|
||||
- Включать команды применения и проверки
|
||||
tasks:
|
||||
- Каждая задача — проверяемый шаг с командой верификации
|
||||
Reference in New Issue
Block a user