No description
Find a file
jack 1c16183bf5
Some checks failed
CI/CD / syntax-check (push) Successful in 1m43s
CI/CD / deploy (push) Failing after 16m2s
fix(snappymail): set admin password explicitly via PHP after container start
The SNAPPYMAIL_ADMIN_PASSWORD env var may not apply if the container
started when data dir had wrong permissions. Now sets password directly
via RainLoop PHP API after every deploy — idempotent and reliable.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-22 20:49:35 +07:00
.claude Add Forgejo Actions CI/CD with act_runner 2026-03-21 21:28:15 +07:00
.forgejo/workflows fix: ensure SSH private key has trailing newline in CI workflow 2026-03-22 15:18:09 +07:00
docs feat(mail): rename mail→mx, webmail→mail.csrx.ru + reliability 2026-03-22 20:07:59 +07:00
inventory feat(mail): rename mail→mx, webmail→mail.csrx.ru + reliability 2026-03-22 20:07:59 +07:00
playbooks feat: add n8n, outline routes, remove syncthing, fix backup awscli 2026-03-22 06:19:39 +07:00
roles fix(snappymail): set admin password explicitly via PHP after container start 2026-03-22 20:49:35 +07:00
.gitignore chore: full project cleanup + documentation 2026-03-22 19:58:12 +07:00
ansible.cfg Initial commit 2026-03-20 19:39:26 +07:00
CLAUDE.md chore: full project cleanup + documentation 2026-03-22 19:58:12 +07:00
dns-zone.zone feat(mail): rename mail→mx, webmail→mail.csrx.ru + reliability 2026-03-22 20:07:59 +07:00
README.md Initial commit 2026-03-20 19:39:26 +07:00

Infra

Ansible + Docker инфраструктура для команды. Все сервисы доступны через HTTPS — трафик принимается напрямую на портах 80/443, TLS-сертификаты выдаются автоматически через Let's Encrypt.

Сервисы:

  • vault.csrx.ru — Vaultwarden (менеджер паролей)
  • git.csrx.ru — Forgejo (Git)
  • plane.csrx.ru — Plane (управление проектами)
  • sync.csrx.ru — Syncthing (синхронизация Obsidian)
  • traefik.csrx.ru — Traefik dashboard

Что нужно перед запуском

1. На машине оператора

# Ansible
pip install ansible

# Коллекции
ansible-galaxy collection install community.general community.docker ansible.posix

# SSH-ключ (если нет)
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519

Шаг 1 — DNS

Добавить A-записи у DNS-провайдера: каждый субдомен → 87.249.49.32.

Или wildcard (если провайдер поддерживает): *87.249.49.32.

Запись Значение
vault.csrx.ru 87.249.49.32
git.csrx.ru 87.249.49.32
plane.csrx.ru 87.249.49.32
sync.csrx.ru 87.249.49.32
traefik.csrx.ru 87.249.49.32

Шаг 2 — Заполнить секреты

Отредактировать inventory/group_vars/all.vault.yml:

vault_acme_email: "you@example.com"          # email для Let's Encrypt уведомлений

vault_vaultwarden_admin_token: "..."          # придумать длинный пароль

vault_forgejo_db_password: "..."              # придумать пароль для PostgreSQL
vault_plane_db_password: "..."                # придумать пароль для PostgreSQL
vault_plane_secret_key: "..."                 # сгенерировать: openssl rand -hex 32
vault_plane_minio_password: "..."             # придумать пароль для MinIO

# Генерировать командой: htpasswd -nb admin 'yourpassword'
# Знак $ нужно удваивать: $apr1$ → $$apr1$
vault_traefik_dashboard_htpasswd: "admin:$$apr1$$..."
vault_syncthing_basic_auth_htpasswd: "admin:$$apr1$$..."

Сгенерировать нужные значения:

# plane_secret_key
openssl rand -hex 32

# htpasswd (нужен apache2-utils или httpd-tools)
htpasswd -nb admin 'yourpassword'
# macOS без установки:
python3 -c "import crypt; print('admin:' + crypt.crypt('yourpassword', crypt.mksalt(crypt.METHOD_MD5)))"

Затем зашифровать файл:

# Создать файл с паролем vault
echo "придумать-пароль-для-vault" > ~/.vault-password-file
chmod 600 ~/.vault-password-file

# Зашифровать
ansible-vault encrypt inventory/group_vars/all.vault.yml

~/.vault-password-file — только на машине оператора, никогда не коммитить.


Шаг 3 — Указать домен

В inventory/group_vars/all.yml установить:

domain_base: "csrx.ru"   # уже стоит, изменить если нужно

Шаг 4 — Первый запуск (от root)

# Создаёт пользователя deploy, устанавливает sudo
ansible-playbook playbooks/bootstrap.yml -u root

Шаг 5 — Деплой

ansible-playbook playbooks/deploy.yml

Устанавливает Docker, настраивает UFW/fail2ban (открывает 22, 80, 443), поднимает все контейнеры. Traefik автоматически получит TLS-сертификаты при первом обращении к каждому домену.


Проверка

# На сервере
ssh deploy@87.249.49.32
docker compose -f /opt/services/docker-compose.yml ps

Все сервисы должны быть в статусе Up. Затем открыть в браузере:

  • https://vault.csrx.ru — Vaultwarden
  • https://git.csrx.ru — Forgejo (первичная настройка через веб)
  • https://plane.csrx.ru — Plane
  • https://sync.csrx.ru — Syncthing (логин/пароль из syncthing_basic_auth_htpasswd)
  • https://traefik.csrx.ru — Traefik dashboard (логин/пароль из traefik_dashboard_htpasswd)

Первичная настройка сервисов

Vaultwarden

  • Открыть https://vault.csrx.ru/admin → ввести vault_vaultwarden_admin_token
  • Создать пользователей через admin-панель (регистрация отключена)

Forgejo

  • Открыть https://git.csrx.ru → пройти wizard установки
  • Первый зарегистрированный пользователь становится администратором

Plane

  • Открыть https://plane.csrx.ru → создать workspace

Syncthing

  • Открыть https://sync.csrx.ru
  • Скопировать Device ID сервера
  • На каждом устройстве команды: добавить сервер как remote device, расшарить папку Obsidian vault

Обновление

ansible-playbook playbooks/deploy.yml

Идемпотентно — можно запускать сколько угодно раз.