Docker 29.x does not create DNAT rules for containers only on internal networks. Add a non-internal 'front' network that outline and n8n join alongside their internal networks, enabling host port binding to work. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> |
||
|---|---|---|
| .claude | ||
| .forgejo/workflows | ||
| docs | ||
| inventory | ||
| playbooks | ||
| roles | ||
| .gitignore | ||
| ansible.cfg | ||
| CLAUDE.md | ||
| dns-zone.zone | ||
| README.md | ||
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— Vaultwardenhttps://git.csrx.ru— Forgejo (первичная настройка через веб)https://plane.csrx.ru— Planehttps://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
Идемпотентно — можно запускать сколько угодно раз.