# 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. На машине оператора ```bash # 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`: ```yaml 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$$..." ``` Сгенерировать нужные значения: ```bash # 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)))" ``` Затем зашифровать файл: ```bash # Создать файл с паролем 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` установить: ```yaml domain_base: "csrx.ru" # уже стоит, изменить если нужно ``` --- ## Шаг 4 — Первый запуск (от root) ```bash # Создаёт пользователя deploy, устанавливает sudo ansible-playbook playbooks/bootstrap.yml -u root ``` --- ## Шаг 5 — Деплой ```bash ansible-playbook playbooks/deploy.yml ``` Устанавливает Docker, настраивает UFW/fail2ban (открывает 22, 80, 443), поднимает все контейнеры. Traefik автоматически получит TLS-сертификаты при первом обращении к каждому домену. --- ## Проверка ```bash # На сервере 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 --- ## Обновление ```bash ansible-playbook playbooks/deploy.yml ``` Идемпотентно — можно запускать сколько угодно раз.