# 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_.tar.gz` - env: `backups/gotosocial_env_.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 '' --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/ ```