chore: project cleanup and docs update
All checks were successful
CI/CD / syntax-check (push) Successful in 1m29s
CI/CD / deploy (push) Successful in 16m39s

- Remove Syncthing mention from authelia comment in docker-compose
- Fix backup.sh.j2 comment: hourly → every 6 hours
- Update CLAUDE.md: add docs update rule, fix backup schedule note
- Update STATUS.md: dash.csrx.ru fixed, PTR pending, backup schedule, mail hostnames
- Update BACKLOG.md: mark DNS/PTR/backup-schedule done, add SnappyMail domain task
- Update DECISIONS.md: fix backup section (no --storage-class COLD, correct schedule)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
jack 2026-03-23 17:00:35 +07:00
parent 634d50c25d
commit 207e1dcff0
6 changed files with 32 additions and 41 deletions

View file

@ -17,9 +17,10 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
## Правила работы ## Правила работы
1. **Только через CI/CD** — никогда не фикси что-либо вручную на сервере. Внеси изменение, закоммить, запуши → CI/CD сам задеплоит. Потом проверь результат. 1. **Только через CI/CD** — никогда не фикси что-либо вручную на сервере. Внеси изменение, закоммить, запуши → CI/CD сам задеплоит. Потом проверь результат.
2. **Syncthing удалён** — не предлагай его вернуть, не упоминай как отсутствующий сервис. 2. **Syncthing удалён навсегда** — не упоминать, не предлагать вернуть.
3. **Секреты** — все в `inventory/group_vars/all/vault.yml` с префиксом `vault_`. В `main.yml` только алиасы `"{{ vault_* }}"`. Никаких plaintext секретов. 3. **Секреты** — все в `inventory/group_vars/all/vault.yml` с префиксом `vault_`. В `main.yml` только алиасы `"{{ vault_* }}"`. Никаких plaintext секретов.
4. **Синтаксис-чек перед коммитом**`ansible-playbook playbooks/deploy.yml --syntax-check`. 4. **Синтаксис-чек перед коммитом**`ansible-playbook playbooks/deploy.yml --syntax-check`.
5. **Обновляй доки** — после каждого изменения обновляй `docs/STATUS.md`, `docs/BACKLOG.md` или `docs/DECISIONS.md`.
--- ---
@ -80,7 +81,7 @@ ansible-playbook playbooks/deploy.yml --tags backup
- `docker` — Docker CE + Compose plugin - `docker` — Docker CE + Compose plugin
- `services` — основной стек (templates → `/opt/services/`, docker compose up) - `services` — основной стек (templates → `/opt/services/`, docker compose up)
- `tools` — tools-стек (templates → `/opt/tools/`, docker compose up) - `tools` — tools-стек (templates → `/opt/tools/`, docker compose up)
- `backup`hourly backup script → S3 cold (`visual-backup/data/`) - `backup`backup каждые 6 часов → S3 (`visual-backup/data/`), только для main-сервера
**Шаблоны → файлы на сервере:** **Шаблоны → файлы на сервере:**
- `roles/services/templates/docker-compose.yml.j2``/opt/services/docker-compose.yml` - `roles/services/templates/docker-compose.yml.j2``/opt/services/docker-compose.yml`

View file

@ -1,30 +1,19 @@
# Бэклог задач # Бэклог задач
> Задачи по приоритету. Обновляй этот файл при добавлении/завершении задач. > Задачи по приоритету. Обновляй этот файл при добавлении/завершении задач.
> Последнее обновление: 2026-03-22 > Последнее обновление: 2026-03-23
--- ---
## 🔴 Критично (сделать как можно скорее) ## 🔴 Критично (сделать как можно скорее)
- [ ] **rDNS (PTR-запись) для 85.193.83.9** в панели Timeweb - [ ] **Настроить домен csrx.ru в SnappyMail** (admin панель → Domains)
Установить: `85.193.83.9 → mx.csrx.ru` IMAP: `mailserver`, порт 993, SSL
Без PTR Gmail/Yandex будут отклонять или помечать наши письма как спам. SMTP: `mailserver`, порт 587, STARTTLS, с авторизацией
Путь: Timeweb → Cloud VPS → tools-сервер → Сеть → Обратная DNS-запись Без этого вход в mail.csrx.ru невозможен.
- [ ] **Обновить DNS в Cloudflare** после деплоя:
- Удалить старую A `mail` → 85.193.83.9 (DNS-only)
- Добавить A `mx` → 85.193.83.9 (DNS-only, orange cloud OFF)
- Изменить MX запись: `csrx.ru MX 10 mx.csrx.ru.`
- Обновить SPF: `v=spf1 mx -all`
- Обновить DMARC: `v=DMARC1; p=quarantine; rua=mailto:admin@csrx.ru; ...`
- Добавить CNAME `autoconfig``mx.csrx.ru`
- Добавить CNAME `autodiscover``mx.csrx.ru`
- A `mail` → 87.249.49.32 (proxied, уже есть — оставить)
A `dash``87.249.49.32` (proxied). Grafana сейчас недоступна по домену.
- [ ] **Бэкап tools-сервера** - [ ] **Бэкап tools-сервера**
Добавить в `roles/backup/` или создать отдельный скрипт для tools-сервера: Добавить скрипт для tools-сервера (роль backup не подключена к tools.yml):
- outline-db (PostgreSQL dump) - outline-db (PostgreSQL dump)
- n8n_data (Docker volume) - n8n_data (Docker volume)
- mailserver/config (DKIM ключи, аккаунты) - mailserver/config (DKIM ключи, аккаунты)
@ -89,6 +78,9 @@
## ✅ Сделано ## ✅ Сделано
- [x] PTR-запись 85.193.83.9 → mx.csrx.ru (настроена в Timeweb, ожидает propagation 3-24ч)
- [x] DNS Cloudflare: MX→mx, SPF `-all`, DMARC `p=quarantine`, DKIM, autoconfig/autodiscover, A dash/mail/mx
- [x] Бэкап изменён с hourly на каждые 6 часов (00:00, 06:00, 12:00, 18:00)
- [x] Traefik с wildcard TLS через Cloudflare DNS-01 - [x] Traefik с wildcard TLS через Cloudflare DNS-01
- [x] Vaultwarden (менеджер паролей) - [x] Vaultwarden (менеджер паролей)
- [x] Forgejo + CI/CD через Forgejo Actions - [x] Forgejo + CI/CD через Forgejo Actions
@ -96,16 +88,13 @@
- [x] Outline wiki с email magic link авторизацией - [x] Outline wiki с email magic link авторизацией
- [x] n8n автоматизация - [x] n8n автоматизация
- [x] docker-mailserver (Postfix + Dovecot), аккаунты: noreply, admin, jack - [x] docker-mailserver (Postfix + Dovecot), аккаунты: noreply, admin, jack
- [x] SnappyMail вебмейл, переименован на mail.csrx.ru (было webmail.csrx.ru) - [x] SnappyMail вебмейл на mail.csrx.ru
- [x] docker-mailserver переименован на mx.csrx.ru (было mail.csrx.ru) - [x] docker-mailserver на mx.csrx.ru (было mail.csrx.ru)
- [x] Certbot авторотация сертификата (cron 2x/день + deploy-hook для перезагрузки Postfix/Dovecot) - [x] Certbot авторотация сертификата (cron 2x/день + deploy-hook)
- [x] DMARC ужесточён до p=quarantine (было p=none) - [x] DMARC p=quarantine, SPF -all, DKIM
- [x] SPF ужесточён до -all (было ~all)
- [x] DKIM/SPF/DMARC DNS-записи для почты
- [x] Мониторинг (Prometheus + Grafana + Loki + AlertManager) - [x] Мониторинг (Prometheus + Grafana + Loki + AlertManager)
- [x] CrowdSec IDS + fail2ban - [x] CrowdSec IDS + fail2ban
- [x] Authelia 2FA SSO - [x] Authelia 2FA SSO
- [x] Uptime Kuma статус-страница - [x] Uptime Kuma статус-страница
- [x] Бэкап каждый час → S3 cold `data/`, 7 дней хранения - [x] Удаление Syncthing
- [x] Удаление Syncthing (домен, firewall правила, образ, переменные) - [x] cloudflare_zone_id перенесён в vault
- [x] cloudflare_zone_id перенесён из main.yml в vault

View file

@ -72,11 +72,11 @@
**Конфиг:** SSL_TYPE=letsencrypt через certbot с Cloudflare DNS-01. DKIM через opendkim. **Конфиг:** SSL_TYPE=letsencrypt через certbot с Cloudflare DNS-01. DKIM через opendkim.
**Альтернативы:** Mailgun/SendGrid (только отправка, без приёма), Maddy (менее зрелый). **Альтернативы:** Mailgun/SendGrid (только отправка, без приёма), Maddy (менее зрелый).
### Бэкап в Timeweb S3 cold ### Бэкап в Timeweb S3
**Дата:** 2026-03 **Дата:** 2026-03
**Решение:** Hourly backup → S3 cold storage `visual-backup/data/`, 7 дней хранения. **Решение:** Backup каждые 6 часов (00/06/12/18) → S3 `visual-backup/data/`, 7 дней хранения.
**Причина:** Дешевле горячего хранилища, бэкапы не нужны быстро — приемлемая задержка восстановления. **Причина:** 6 часов = баланс между частотой и нагрузкой на сервер. Тип хранилища COLD задаётся на уровне бакета в Timeweb, не через параметр `--storage-class` (Timeweb S3 не поддерживает этот параметр).
**Команда:** `aws s3 cp ... --storage-class COLD` **Формат архива:** единый `main_data_YYYY-MM-DD_HH-MM.tar.gz` с `data/databases/` и `data/volumes/`.
### SnappyMail вместо Roundcube ### SnappyMail вместо Roundcube
**Дата:** 2026-03 **Дата:** 2026-03

View file

@ -1,7 +1,7 @@
# Статус инфраструктуры # Статус инфраструктуры
> Обновляй этот файл при каждом значимом изменении. > Обновляй этот файл при каждом значимом изменении.
> Последнее обновление: 2026-03-22 > Последнее обновление: 2026-03-23
--- ---
@ -25,14 +25,14 @@
| Forgejo | git.csrx.ru | ✅ | Git-сервер, SSH на порту 2222 | | Forgejo | git.csrx.ru | ✅ | Git-сервер, SSH на порту 2222 |
| Forgejo Actions | — | ✅ | CI/CD runner, деплой через push в master | | Forgejo Actions | — | ✅ | CI/CD runner, деплой через push в master |
| Plane | plane.csrx.ru | ✅ | Управление проектами | | Plane | plane.csrx.ru | ✅ | Управление проектами |
| Grafana | dash.csrx.ru | ✅ | Дашборды мониторинга (нет DNS-записи — нужно добавить A→87.249.49.32) | | Grafana | dash.csrx.ru | ✅ | Дашборды мониторинга |
| Prometheus | — | ✅ | Сбор метрик, 30 дней хранения | | Prometheus | — | ✅ | Сбор метрик, 30 дней хранения |
| Loki + Promtail | — | ✅ | Сбор логов | | Loki + Promtail | — | ✅ | Сбор логов |
| AlertManager | — | ✅ | Алерты в Telegram | | AlertManager | — | ✅ | Алерты в Telegram |
| CrowdSec | — | ✅ | IDS, банит злоумышленников | | CrowdSec | — | ✅ | IDS, банит злоумышленников |
| Authelia | auth.csrx.ru | ✅ | 2FA SSO, защищает traefik dashboard и plane/god-mode | | Authelia | auth.csrx.ru | ✅ | 2FA SSO, защищает traefik dashboard и plane/god-mode |
| Uptime Kuma | status.csrx.ru | ✅ | Публичная страница статуса | | Uptime Kuma | status.csrx.ru | ✅ | Публичная страница статуса |
| Бэкап | — | ✅ | Каждый час → S3 cold `visual-backup/data/` | | Бэкап | — | ✅ | Каждые 6 часов (00/06/12/18) → S3 `visual-backup/data/`, 7 дней |
### Tools-сервер (tools, 85.193.83.9) ### Tools-сервер (tools, 85.193.83.9)
@ -40,8 +40,8 @@
|--------|-------|--------|---------| |--------|-------|--------|---------|
| Outline | wiki.csrx.ru | ✅ | Wiki, аутентификация через email magic link | | Outline | wiki.csrx.ru | ✅ | Wiki, аутентификация через email magic link |
| n8n | n8n.csrx.ru | ✅ | Автоматизация workflow | | n8n | n8n.csrx.ru | ✅ | Автоматизация workflow |
| docker-mailserver | mail.csrx.ru | ✅ | Postfix + Dovecot, порты 25/465/587/993 | | docker-mailserver | mx.csrx.ru | ✅ | Postfix + Dovecot, порты 25/465/587/993, DKIM+SPF+DMARC |
| SnappyMail | mail.csrx.ru | ✅ | Веб-клиент почты (ранее webmail.csrx.ru) | | SnappyMail | mail.csrx.ru | ✅ | Веб-клиент почты |
### Почта (@csrx.ru) ### Почта (@csrx.ru)
@ -99,9 +99,10 @@ CNAME autodiscover → mx.csrx.ru. для Outlook autodiscover
| Проблема | Статус | | Проблема | Статус |
|----------|--------| |----------|--------|
| Нет DNS-записи для `dash.csrx.ru` | ⚠️ Нужно добавить в Cloudflare вручную: A `dash` → 87.249.49.32 | | PTR-запись 85.193.83.9 → mx.csrx.ru | ⏳ Настроена в Timeweb, обновляется 324 ч |
| Tools-сервер не бэкапится | ⚠️ outline-db и n8n не входят в скрипт бэкапа | | Tools-сервер не бэкапится | ⚠️ outline-db, n8n, mailserver/config не входят в бэкап |
| Tools-сервер вне мониторинга | ⚠️ Prometheus не скрейпит tools-сервер | | Tools-сервер вне мониторинга | ⚠️ Prometheus не скрейпит tools-сервер |
| SnappyMail домен csrx.ru не настроен | ⚠️ Нужно в админке: IMAP mailserver:993, SMTP mailserver:587 |
--- ---

View file

@ -5,7 +5,7 @@
# data/ # data/
# databases/ — PostgreSQL dumps (restore with psql) # databases/ — PostgreSQL dumps (restore with psql)
# volumes/ — Docker volume contents (restore by copying) # volumes/ — Docker volume contents (restore by copying)
# Runs every hour, keeps {{ backup_retention_days }} days. # Runs every 6 hours (00:00, 06:00, 12:00, 18:00), keeps {{ backup_retention_days }} days.
# Upload to S3: s3://{{ s3_bucket }}/data/ # Upload to S3: s3://{{ s3_bucket }}/data/
set -euo pipefail set -euo pipefail

View file

@ -551,7 +551,7 @@ services:
# ── Authelia: 2FA SSO portal ─────────────────────────────────────────────── # ── Authelia: 2FA SSO portal ───────────────────────────────────────────────
# Защищает: Traefik dashboard, Syncthing, Plane /god-mode/ # Защищает: Traefik dashboard, Plane /god-mode/
# Вход: логин + пароль + TOTP (Google Authenticator) # Вход: логин + пароль + TOTP (Google Authenticator)
authelia: authelia:
image: {{ authelia_image }} image: {{ authelia_image }}