# Контейнер 103 (Gitea): Gitea, PostgreSQL, act_runner, CouchDB (Obsidian), Vaultwarden, Homepage, Wallos Подробное описание LXC-контейнера **103** на Proxmox (192.168.1.103): Git-сервер Gitea с Actions (runner), база PostgreSQL, CouchDB для синхронизации Obsidian (домен obsidian.katykhin.ru), менеджер паролей Vaultwarden, а также дашборд Homepage и Wallos (перенесены с контейнера 100). --- ## Общие сведения - **Хостнейм:** 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** — отдельный контейнер, данные в `/opt/docker/couchdb/`. 3. **Vaultwarden (compose)** — в `/opt/docker/vaultwarden/`: менеджер паролей Vaultwarden (совместим с клиентами Bitwarden). 4. **Homepage + dockerproxy (compose)** — в `/opt/docker/homepage/`: дашборд сервисов. 5. **Wallos (compose)** — в `/opt/docker/wallos/`: учёт подписок. | Контейнер | Образ | Порты (хост) | Назначение | |-----------------|--------------------------|------------------|------------| | 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 | | homepage | ghcr.io/gethomepage/homepage:latest | 4000→3000 | Дашборд сервисов (home.katykhin.ru, доступ только из LAN и VPN через NPM) | | dockerproxy | ghcr.io/tecnativa/docker-socket-proxy:latest | 2375/tcp | Прокси к Docker API для Homepage (read-only) | | wallos | bellamy/wallos:latest | 8282→80 | Учёт подписок (wallos.katykhin.ru, доступ только из LAN и VPN через NPM) | --- ## 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//*.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. 6. **Homepage и Wallos по доменам:** `home.katykhin.ru` и `wallos.katykhin.ru` публикуются через NPM на CT 100, но в proxy-конфигах Access List (через `allow/deny`) ограничивает доступ только подсетями LAN (192.168.1.0/24) и VPN (10.10.99.0/24); из интернета без VPN домены недоступны. --- ## 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, home.katykhin.ru, wallos.katykhin.ru), схема сети. - [Контейнер 100 (nginx)](container-100.md) — NPM и AdGuard; через NPM проксируются git.katykhin.ru, obsidian.katykhin.ru, vault.katykhin.ru, home.katykhin.ru и wallos.katykhin.ru.