266 lines
19 KiB
Markdown
266 lines
19 KiB
Markdown
# Контейнер 103 (Gitea): Gitea, PostgreSQL, act_runner, CouchDB (Obsidian), Vaultwarden
|
||
|
||
Подробное описание LXC-контейнера **103** на Proxmox (192.168.1.103): Git-сервер Gitea с Actions (runner), база PostgreSQL, CouchDB для синхронизации Obsidian (домен obsidian.katykhin.ru).
|
||
|
||
---
|
||
|
||
## Общие сведения
|
||
|
||
- **Хостнейм:** gitea
|
||
- **IP:** 192.168.1.103/24
|
||
- **ОС:** Debian 12 (bookworm)
|
||
- **Ресурсы:** 1 core, 2 GB RAM (из [архитектуры](../architecture/architecture.md))
|
||
- **Доступ:** с Proxmox — `pct exec 103 -- bash` или `ssh` на 192.168.1.103, если настроен.
|
||
|
||
Диск контейнера: 15 GB, занято ~2.6 GB. Основной объём — данные Docker (образы, тома Gitea, PostgreSQL, CouchDB). Следить за местом и логами (см. раздел «Логи и ротация» и TODO).
|
||
|
||
---
|
||
|
||
## Доступ и логины
|
||
|
||
- **Debian (CT 103):** логин `root` (пароль — в менеджере паролей или как настраивал при установке).
|
||
- **Gitea (веб):** http://192.168.1.103:3000 (или через NPM по домену git.katykhin.ru, если настроен). Учётные записи — пользователи Gitea. Репозитории могут иметь origin на Gitea; при необходимости пуш в GitHub — отдельный remote (например `github`), команда вида `git push github main`.
|
||
- **CouchDB (Obsidian sync):** http://192.168.1.103:5984. Админ (пользователь **obsidian**) и пароль заданы в `/opt/docker/couchdb/local.d/local.ini` (секция `[admins]`); клиент Obsidian подключается по URL и своим учётным данным.
|
||
- **Vaultwarden (менеджер паролей):** http://192.168.1.103:8280 (только LAN, без домена). Админ-доступ по токену `ADMIN_TOKEN` из `/opt/docker/vaultwarden/.env` (файл только на сервере, не коммитить).
|
||
|
||
---
|
||
|
||
## Сервисы (Docker)
|
||
|
||
Три набора сервисов:
|
||
|
||
1. **Gitea (compose)** — в `/opt/gitea/`: Gitea, PostgreSQL, act_runner. Сеть **gitea_default**.
|
||
2. **CouchDB** — запущен отдельным контейнером (без compose в репозитории), данные в `/opt/docker/couchdb/`.
|
||
3. **Vaultwarden (compose)** — в `/opt/docker/vaultwarden/`: менеджер паролей Vaultwarden (совместим с клиентами Bitwarden).
|
||
|
||
| Контейнер | Образ | Порты (хост) | Назначение |
|
||
|-----------------|--------------------------|------------------|------------|
|
||
| gitea | gitea:1.25 | 3000, 2222 | Git-сервер, веб, SSH для Git |
|
||
| gitea-db-1 | postgres:16-alpine | — | БД Gitea |
|
||
| gitea-runner-1 | gitea/act_runner:latest | — | Gitea Actions (CI) |
|
||
| couchdb | couchdb:3 | 5984 | Бэкенд синхронизации Obsidian (obsidian.katykhin.ru) |
|
||
| vaultwarden | vaultwarden/server:latest | 8280 | Менеджер паролей Vaultwarden (Bitwarden-совместимый), доступ из LAN |
|
||
|
||
---
|
||
|
||
## 1. Gitea (сервер)
|
||
|
||
**Каталог:** `/opt/gitea/`
|
||
**Compose:** `docker-compose.yml`. Запуск: `cd /opt/gitea && docker compose up -d`.
|
||
|
||
**Порты:** 3000 (HTTP), 2222 (SSH для git clone по SSH).
|
||
**Тома:**
|
||
- `gitea-data` (volume) → `/data` (внутри: `git/repositories`, `gitea/` — конфиг, логи, сессии, аватары, вложения, indexers, LFS, Actions logs/artifacts).
|
||
- `gitea-postgres` → данные PostgreSQL.
|
||
- `runner-data` → данные act_runner.
|
||
|
||
**Переменные окружения (compose):**
|
||
- База: `GITEA__database__*` (postgres, db:5432, user/passwd `gitea`).
|
||
- Сервер: `GITEA__server__DOMAIN`, `ROOT_URL` = 192.168.1.103:3000, `SSH_PORT` = 2222.
|
||
- Runner: `GITEA_RUNNER_REGISTRATION_TOKEN` из файла `.env` (не коммитить).
|
||
|
||
**Конфиг приложения:** внутри тома `gitea-data`, путь в контейнере `/data/gitea/conf/app.ini`. На хосте: `/var/lib/docker/volumes/gitea_gitea-data/_data/gitea/conf/app.ini`.
|
||
В нём: репозитории в `/data/git/repositories`, БД postgres (db:5432), LFS, сессии (file), логи в `/data/gitea/log`, `MODE = console` (логи в stdout → Docker). OFFLINE_MODE = true. INTERNAL_TOKEN и LFS_JWT_SECRET заданы в app.ini.
|
||
|
||
**Команды:**
|
||
```bash
|
||
cd /opt/gitea && docker compose up -d
|
||
docker logs gitea
|
||
docker exec gitea ls -la /data/gitea/conf
|
||
```
|
||
|
||
---
|
||
|
||
## 2. PostgreSQL (Gitea)
|
||
|
||
**Образ:** postgres:16-alpine.
|
||
**Том:** `gitea-postgres` → `/var/lib/postgresql/data`.
|
||
**Переменные:** POSTGRES_USER/POSTGRES_PASSWORD/POSTGRES_DB = gitea (заданы в compose).
|
||
Healthcheck: pg_isready. Зависимость: Gitea ждёт здоровой БД.
|
||
|
||
**Команды:**
|
||
```bash
|
||
docker exec gitea-db-1 pg_isready -U gitea
|
||
docker exec gitea-db-1 psql -U gitea -d gitea -c '\\dt'
|
||
```
|
||
|
||
---
|
||
|
||
## 3. Gitea act_runner (Actions)
|
||
|
||
**Образ:** gitea/act_runner:latest.
|
||
**Тома:** `runner-data` → `/data`; `/var/run/docker.sock` → сокет Docker (для запуска job-контейнеров).
|
||
**Переменные:** GITEA_INSTANCE_URL=http://server:3000, GITEA_RUNNER_REGISTRATION_TOKEN из `.env`, GITEA_RUNNER_NAME=gitea-103-runner, GITEA_RUNNER_LABELS=docker:docker://alpine:latest.
|
||
|
||
Регистрация runner выполняется при первом запуске по токену из Gitea (Администрирование → Actions → Runners). Токен хранится в `/opt/gitea/.env`.
|
||
|
||
**Команды:**
|
||
```bash
|
||
docker logs gitea-runner-1
|
||
docker restart gitea-runner-1
|
||
```
|
||
|
||
---
|
||
|
||
## 4. CouchDB (Obsidian sync)
|
||
|
||
**Образ:** couchdb:3.
|
||
**Порты:** 5984 (хост) → 5984 (контейнер).
|
||
**Тома (binds):**
|
||
- `/opt/docker/couchdb/data` → `/opt/couchdb/data`
|
||
- `/opt/docker/couchdb/local.d` → `/opt/couchdb/etc/local.d`
|
||
|
||
Контейнер запущен вручную (не из compose в `/opt/gitea`), политика перезапуска `unless-stopped`. После перезагрузки CT Docker поднимает контейнер автоматически.
|
||
|
||
**Конфигурация на хосте:**
|
||
- `/opt/docker/couchdb/local.d/docker.ini` — базовая секция [couchdb], uuid.
|
||
- `/opt/docker/couchdb/local.d/local.ini` — [httpd] enable_cors; [cors] origins=*, credentials, methods, headers; [admins] — пользователь (имя **obsidian**) и хэш пароля (pbkdf2). Пароль админа CouchDB хранится в этом файле; не коммитить и не светить в документации.
|
||
|
||
**Смена пароля CouchDB:** через API CouchDB (PUT /_node/_local/_config/admins/obsidian) или пересоздание контейнера с новыми переменными/конфигом. После смены — `docker restart couchdb`.
|
||
**CORS:** сейчас origins=* — приемлемо в пределах домашней сети. При выводе доступа через NPM (obsidian.katykhin.ru) можно ограничить origins до конкретного домена.
|
||
|
||
**Данные:** БД Obsidian (vault) в `/opt/docker/couchdb/data` (шарды, _dbs.couch, _nodes.couch). Размер порядка десятков MB.
|
||
|
||
**Доступ:** Снаружи — http://192.168.1.103:5984. Через NPM: obsidian.katykhin.ru → proxy на 192.168.1.103:5984 (если настроен). Клиент Obsidian Sync подключается к CouchDB по URL и своим учётным данным.
|
||
|
||
**Команды:**
|
||
```bash
|
||
docker logs couchdb
|
||
docker restart couchdb
|
||
curl -s http://192.168.1.103:5984/
|
||
```
|
||
|
||
**Рекомендация:** Оформить запуск CouchDB в отдельный `docker-compose.yml` в `/opt/docker/couchdb/` для воспроизводимости и документирования (см. TODO).
|
||
|
||
---
|
||
|
||
## 5. Vaultwarden (менеджер паролей)
|
||
|
||
**Назначение:** self-hosted менеджер паролей (совместим с официальными клиентами Bitwarden) для хранения всех кредов (Proxmox, контейнеры, БД, API-ключи и т.д.).
|
||
|
||
**Каталог:** `/opt/docker/vaultwarden/`
|
||
**Compose:** `docker-compose.yml`. Запуск/обновление:
|
||
|
||
```bash
|
||
cd /opt/docker/vaultwarden
|
||
docker compose pull
|
||
docker compose up -d
|
||
```
|
||
|
||
**Образ:** `vaultwarden/server:latest`.
|
||
|
||
**Порты:**
|
||
- 8280 (хост) → 80 (контейнер).
|
||
|
||
**Доступ в локальной сети:** с любого устройства в LAN (192.168.1.x) Vaultwarden уже доступен по адресу **`http://192.168.1.103:8280`** — дополнительная настройка не нужна. Клиенты Bitwarden на домашних устройствах можно настроить на этот URL.
|
||
|
||
**Доступ по домену (опционально):** если нужен **https://vault.katykhin.ru** и из LAN, и по VPN, в NPM (контейнер 100) настраивают:
|
||
- **Proxy Host:** `vault.katykhin.ru` → upstream `192.168.1.103:8280`, включить SSL (Let's Encrypt или custom).
|
||
- **Access List:** создать список, разрешающий только подсети **192.168.1.0/24** (LAN) и **10.10.99.0/24** (WireGuard VPN); для всех остальных — отказ. Эту access list привязать к proxy host `vault.katykhin.ru`. Тогда с интернета без VPN доступ к домену будет закрыт; из дома и по VPN — открыт.
|
||
- В compose Vaultwarden при использовании домена задать `DOMAIN=https://vault.katykhin.ru` и перезапустить контейнер.
|
||
|
||
**Тома:**
|
||
- `/opt/docker/vaultwarden/data` → `/data` (все данные Vaultwarden: база, вложения, и т.п.).
|
||
|
||
**Переменные окружения (compose):**
|
||
- `WEBSOCKET_ENABLED=true` — включает поддержку веб-сокетов.
|
||
- `SIGNUPS_ALLOWED=false` — запрещает свободную регистрацию; пользователей создаёт админ.
|
||
- `INVITATIONS_ALLOWED=true` — разрешает приглашения.
|
||
- `DOMAIN=http://192.168.1.103:8280` — базовый URL (для LAN; при выдаче наружу поменять на `https://<домен>`).
|
||
- `ROCKET_PORT=80`, `ROCKET_ADDRESS=0.0.0.0` — HTTP-сервер внутри контейнера.
|
||
- `TZ=Europe/Moscow` — часовой пояс.
|
||
|
||
**Файл `.env` (секреты):**
|
||
|
||
- Путь: `/opt/docker/vaultwarden/.env`.
|
||
- В нём как минимум задаётся `ADMIN_TOKEN=<случайный токен>` для доступа к админке.
|
||
- Файл создаётся на хосте (права `600`), **не коммитить** в репозиторий и не копировать в открытые места.
|
||
|
||
**Проверка работы:**
|
||
|
||
```bash
|
||
docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Ports}}' | grep vaultwarden
|
||
curl -s http://127.0.0.1:8280/ | head -c 200
|
||
```
|
||
|
||
После этого интерфейс открывается по **`http://192.168.1.103:8280`** из домашней сети. Клиенты Bitwarden (ПК, телефон в LAN) настраивают на этот URL — сервис уже открыт в локальной сети без NPM. Если позже добавить домен в NPM (см. выше), в клиентах можно перейти на `https://vault.katykhin.ru`.
|
||
|
||
---
|
||
|
||
## Порты (сводка на хосте)
|
||
|
||
| Порт | Сервис / примечание |
|
||
|-------|----------------------------|
|
||
| 3000 | Gitea (веб) |
|
||
| 2222 | Gitea (SSH для git) |
|
||
| 5984 | CouchDB (Obsidian sync) |
|
||
| 8280 | Vaultwarden (менеджер паролей, HTTP по IP из LAN) |
|
||
|
||
---
|
||
|
||
## Логи и ротация
|
||
|
||
- **Gitea:** в app.ini задано `MODE = console`, `ROOT_PATH = /data/gitea/log`. Логи идут в stdout и попадают в драйвер Docker **json-file** без ограничения размера и количества файлов — со временем каталог `/var/lib/docker/containers/<id>/*.log` может разрастаться (см. TODO).
|
||
- **PostgreSQL:** логи в stdout контейнера, то же хранилище Docker.
|
||
- **act_runner:** логи в stdout.
|
||
- **CouchDB:** логи в stdout.
|
||
|
||
**Системный logrotate** в CT затрагивает только стандартные сервисы (apt, dpkg, btmp, wtmp и т.д.). Отдельных правил для Docker или Gitea нет. Ротация логов контейнеров не настроена — задаётся через `docker-compose` (logging driver options: max-size, max-file) или через `/etc/docker/daemon.json` (default).
|
||
|
||
**Риск:** при активном использовании Gitea и Actions логи контейнеров могут заполнить диск. Нужно включить ограничение размера логов Docker (см. TODO).
|
||
|
||
---
|
||
|
||
## Запуск и порядок поднятия
|
||
|
||
1. **Gitea (compose):**
|
||
`cd /opt/gitea && docker compose up -d`
|
||
Порядок: db → server (healthcheck) → runner.
|
||
|
||
2. **CouchDB:** уже запущен отдельным контейнером. Если после перезагрузки контейнер не поднялся:
|
||
```bash
|
||
docker run -d --name couchdb --restart unless-stopped \
|
||
-p 5984:5984 \
|
||
-v /opt/docker/couchdb/data:/opt/couchdb/data \
|
||
-v /opt/docker/couchdb/local.d:/opt/couchdb/etc/local.d \
|
||
couchdb:3
|
||
```
|
||
(Параметры приведены по текущему inspect; предпочтительно перейти на compose в `/opt/docker/couchdb/`.)
|
||
|
||
После смены конфига Gitea (app.ini): перезапуск контейнера — `docker restart gitea`. После смены пароля/пользователя в CouchDB local.ini — `docker restart couchdb`.
|
||
|
||
---
|
||
|
||
## Уязвимости и риски
|
||
|
||
1. **Пароли в конфигах:** В `docker-compose.yml` (Gitea) заданы пароль БД и креды Gitea (gitea/gitea). Файл лежит только на сервере; не помещать в публичный репозиторий. То же для `/opt/gitea/.env` (GITEA_RUNNER_REGISTRATION_TOKEN).
|
||
2. **Пароль админа CouchDB** хранится в `/opt/docker/couchdb/local.d/local.ini` (секция [admins]). Ограничить права на каталог (например chmod 700 local.d, владелец root).
|
||
3. **Gitea и CouchDB по IP:** Доступ по 192.168.1.103:3000 и :5984 из LAN. Если нужен доступ снаружи — только через NPM (HTTPS, домены git.katykhin.ru, obsidian.katykhin.ru) и не пробрасывать порты 3000/5984 напрямую в интернет.
|
||
4. **Логи Docker:** Ротация не настроена — возможен рост логов и заполнение диска (см. TODO).
|
||
5. **CouchDB CORS:** В конфиге включены CORS с origins = * и credentials = true. Достаточно для Obsidian; при расширении использования оценить ограничение origins.
|
||
|
||
---
|
||
|
||
## TODO по контейнеру 103
|
||
|
||
- [ ] **Логи Docker:** Включить ограничение размера логов для контейнеров: в `docker-compose.yml` (Gitea) добавить для сервисов `logging: driver: json-file options: max-size: "50m" max-file: "3"` или задать default в `/etc/docker/daemon.json` и перезапустить Docker. После этого перезапустить контейнеры.
|
||
- [ ] **CouchDB compose:** Создать `/opt/docker/couchdb/docker-compose.yml` с текущими томами и портами, перейти на `docker compose up -d` вместо ручного `docker run`, зафиксировать в документации.
|
||
- [ ] **Домены и NPM:** При необходимости настроить в NPM proxy для git.katykhin.ru → 192.168.1.103:3000 и obsidian.katykhin.ru → 192.168.1.103:5984, выпустить SSL (certbot + deploy в NPM). В Gitea при использовании домена обновить ROOT_URL и DOMAIN в compose/app.ini.
|
||
- [ ] **Мониторинг диска:** Следить за местом на корне (df -h). При желании — оповещение при заполнении выше порога (например 80%).
|
||
- [ ] **Резервное копирование:** Регулярный бэкап критичных данных (оценка размеров на момент документации):
|
||
- **`/var/lib/docker/volumes/gitea_gitea-data`** — репозитории, конфиг Gitea, логи, сессии, вложения, LFS, Actions (артефакты/логи). Размер: git ~25 MB, gitea (всё остальное) ~сотни MB в зависимости от репо и логов. Бэкапить весь volume или минимум `_data/git`, `_data/gitea/conf`, `_data/gitea/sessions`, при необходимости `_data/gitea/attachments`, `_data/gitea/actions_*`.
|
||
- **`/var/lib/docker/volumes/gitea_gitea-postgres`** — БД Gitea. Размер ~71 MB. Для консистентного бэкапа — дамп через `pg_dump` (см. ниже).
|
||
- **`/var/lib/docker/volumes/gitea_runner-data`** — данные runner (~8 KB). По желанию.
|
||
- **`/opt/gitea`** — docker-compose.yml, .env (секреты). ~12 KB. Обязательно; .env не коммитить.
|
||
- **`/opt/docker/couchdb/data`** — данные CouchDB (Obsidian). ~56 MB.
|
||
- **`/opt/docker/couchdb/local.d`** — конфиги CouchDB (в т.ч. admins). ~12 KB. Обязательно; не светить в открытом доступе.
|
||
|
||
Рекомендуемый способ для PostgreSQL: `docker exec gitea-db-1 pg_dump -U gitea gitea > backup_gitea_$(date +%Y%m%d).sql` и сохранять дамп вне контейнера. Для Gitea data — копирование тома или `tar` по каталогам с остановкой записи (при возможности кратко приостановить Gitea или делать бэкап в момент минимальной активности).
|
||
|
||
---
|
||
|
||
## Связь с другими документами
|
||
|
||
- [Архитектура и подключение](../architecture/architecture.md) — таблица контейнеров, домены (в т.ч. obsidian.katykhin.ru), схема сети.
|
||
- [Контейнер 100 (nginx)](container-100.md) — NPM, через который при необходимости проксируются git.katykhin.ru и obsidian.katykhin.ru.
|