diff --git a/CLAUDE.md b/CLAUDE.md index 34a67c5..9ca7a54 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -17,9 +17,10 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## Правила работы 1. **Только через CI/CD** — никогда не фикси что-либо вручную на сервере. Внеси изменение, закоммить, запуши → CI/CD сам задеплоит. Потом проверь результат. -2. **Syncthing удалён** — не предлагай его вернуть, не упоминай как отсутствующий сервис. +2. **Syncthing удалён навсегда** — не упоминать, не предлагать вернуть. 3. **Секреты** — все в `inventory/group_vars/all/vault.yml` с префиксом `vault_`. В `main.yml` только алиасы `"{{ vault_* }}"`. Никаких plaintext секретов. 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 - `services` — основной стек (templates → `/opt/services/`, 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` diff --git a/docs/BACKLOG.md b/docs/BACKLOG.md index 66bdd77..273f2f4 100644 --- a/docs/BACKLOG.md +++ b/docs/BACKLOG.md @@ -1,30 +1,19 @@ # Бэклог задач > Задачи по приоритету. Обновляй этот файл при добавлении/завершении задач. -> Последнее обновление: 2026-03-22 +> Последнее обновление: 2026-03-23 --- ## 🔴 Критично (сделать как можно скорее) -- [ ] **rDNS (PTR-запись) для 85.193.83.9** в панели Timeweb - Установить: `85.193.83.9 → mx.csrx.ru` - Без PTR Gmail/Yandex будут отклонять или помечать наши письма как спам. - Путь: Timeweb → Cloud VPS → tools-сервер → Сеть → Обратная DNS-запись - -- [ ] **Обновить 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 сейчас недоступна по домену. +- [ ] **Настроить домен csrx.ru в SnappyMail** (admin панель → Domains) + IMAP: `mailserver`, порт 993, SSL + SMTP: `mailserver`, порт 587, STARTTLS, с авторизацией + Без этого вход в mail.csrx.ru невозможен. - [ ] **Бэкап tools-сервера** - Добавить в `roles/backup/` или создать отдельный скрипт для tools-сервера: + Добавить скрипт для tools-сервера (роль backup не подключена к tools.yml): - outline-db (PostgreSQL dump) - n8n_data (Docker volume) - 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] Vaultwarden (менеджер паролей) - [x] Forgejo + CI/CD через Forgejo Actions @@ -96,16 +88,13 @@ - [x] Outline wiki с email magic link авторизацией - [x] n8n автоматизация - [x] docker-mailserver (Postfix + Dovecot), аккаунты: noreply, admin, jack -- [x] SnappyMail вебмейл, переименован на mail.csrx.ru (было webmail.csrx.ru) -- [x] docker-mailserver переименован на mx.csrx.ru (было mail.csrx.ru) -- [x] Certbot авторотация сертификата (cron 2x/день + deploy-hook для перезагрузки Postfix/Dovecot) -- [x] DMARC ужесточён до p=quarantine (было p=none) -- [x] SPF ужесточён до -all (было ~all) -- [x] DKIM/SPF/DMARC DNS-записи для почты +- [x] SnappyMail вебмейл на mail.csrx.ru +- [x] docker-mailserver на mx.csrx.ru (было mail.csrx.ru) +- [x] Certbot авторотация сертификата (cron 2x/день + deploy-hook) +- [x] DMARC p=quarantine, SPF -all, DKIM - [x] Мониторинг (Prometheus + Grafana + Loki + AlertManager) - [x] CrowdSec IDS + fail2ban - [x] Authelia 2FA SSO - [x] Uptime Kuma статус-страница -- [x] Бэкап каждый час → S3 cold `data/`, 7 дней хранения -- [x] Удаление Syncthing (домен, firewall правила, образ, переменные) -- [x] cloudflare_zone_id перенесён из main.yml в vault +- [x] Удаление Syncthing +- [x] cloudflare_zone_id перенесён в vault diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md index bde0ee1..1f36fac 100644 --- a/docs/DECISIONS.md +++ b/docs/DECISIONS.md @@ -72,11 +72,11 @@ **Конфиг:** SSL_TYPE=letsencrypt через certbot с Cloudflare DNS-01. DKIM через opendkim. **Альтернативы:** Mailgun/SendGrid (только отправка, без приёма), Maddy (менее зрелый). -### Бэкап в Timeweb S3 cold +### Бэкап в Timeweb S3 **Дата:** 2026-03 -**Решение:** Hourly backup → S3 cold storage `visual-backup/data/`, 7 дней хранения. -**Причина:** Дешевле горячего хранилища, бэкапы не нужны быстро — приемлемая задержка восстановления. -**Команда:** `aws s3 cp ... --storage-class COLD` +**Решение:** Backup каждые 6 часов (00/06/12/18) → S3 `visual-backup/data/`, 7 дней хранения. +**Причина:** 6 часов = баланс между частотой и нагрузкой на сервер. Тип хранилища COLD задаётся на уровне бакета в Timeweb, не через параметр `--storage-class` (Timeweb S3 не поддерживает этот параметр). +**Формат архива:** единый `main_data_YYYY-MM-DD_HH-MM.tar.gz` с `data/databases/` и `data/volumes/`. ### SnappyMail вместо Roundcube **Дата:** 2026-03 diff --git a/docs/STATUS.md b/docs/STATUS.md index 1e38140..1158935 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -1,7 +1,7 @@ # Статус инфраструктуры > Обновляй этот файл при каждом значимом изменении. -> Последнее обновление: 2026-03-22 +> Последнее обновление: 2026-03-23 --- @@ -25,14 +25,14 @@ | Forgejo | git.csrx.ru | ✅ | Git-сервер, SSH на порту 2222 | | Forgejo Actions | — | ✅ | CI/CD runner, деплой через push в master | | Plane | plane.csrx.ru | ✅ | Управление проектами | -| Grafana | dash.csrx.ru | ✅ | Дашборды мониторинга (нет DNS-записи — нужно добавить A→87.249.49.32) | +| Grafana | dash.csrx.ru | ✅ | Дашборды мониторинга | | Prometheus | — | ✅ | Сбор метрик, 30 дней хранения | | Loki + Promtail | — | ✅ | Сбор логов | | AlertManager | — | ✅ | Алерты в Telegram | | CrowdSec | — | ✅ | IDS, банит злоумышленников | | Authelia | auth.csrx.ru | ✅ | 2FA SSO, защищает traefik dashboard и plane/god-mode | | 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) @@ -40,8 +40,8 @@ |--------|-------|--------|---------| | Outline | wiki.csrx.ru | ✅ | Wiki, аутентификация через email magic link | | n8n | n8n.csrx.ru | ✅ | Автоматизация workflow | -| docker-mailserver | mail.csrx.ru | ✅ | Postfix + Dovecot, порты 25/465/587/993 | -| SnappyMail | mail.csrx.ru | ✅ | Веб-клиент почты (ранее webmail.csrx.ru) | +| docker-mailserver | mx.csrx.ru | ✅ | Postfix + Dovecot, порты 25/465/587/993, DKIM+SPF+DMARC | +| SnappyMail | mail.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 | -| Tools-сервер не бэкапится | ⚠️ outline-db и n8n не входят в скрипт бэкапа | +| PTR-запись 85.193.83.9 → mx.csrx.ru | ⏳ Настроена в Timeweb, обновляется 3–24 ч | +| Tools-сервер не бэкапится | ⚠️ outline-db, n8n, mailserver/config не входят в бэкап | | Tools-сервер вне мониторинга | ⚠️ Prometheus не скрейпит tools-сервер | +| SnappyMail домен csrx.ru не настроен | ⚠️ Нужно в админке: IMAP mailserver:993, SMTP mailserver:587 | --- diff --git a/roles/backup/templates/backup.sh.j2 b/roles/backup/templates/backup.sh.j2 index bbd0491..9778918 100644 --- a/roles/backup/templates/backup.sh.j2 +++ b/roles/backup/templates/backup.sh.j2 @@ -5,7 +5,7 @@ # data/ # databases/ — PostgreSQL dumps (restore with psql) # 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/ set -euo pipefail diff --git a/roles/services/templates/docker-compose.yml.j2 b/roles/services/templates/docker-compose.yml.j2 index 416358a..42e075f 100644 --- a/roles/services/templates/docker-compose.yml.j2 +++ b/roles/services/templates/docker-compose.yml.j2 @@ -551,7 +551,7 @@ services: # ── Authelia: 2FA SSO portal ─────────────────────────────────────────────── - # Защищает: Traefik dashboard, Syncthing, Plane /god-mode/ + # Защищает: Traefik dashboard, Plane /god-mode/ # Вход: логин + пароль + TOTP (Google Authenticator) authelia: image: {{ authelia_image }}