infra/README.md
jack a1b97f3e4b Initial commit
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 19:39:26 +07:00

168 lines
5.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
```
Идемпотентно — можно запускать сколько угодно раз.