Files
homelab-docs/docs/containers/container-103.md
2026-02-25 21:01:06 +03:00

19 KiB
Raw Blame History

Контейнер 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 (из архитектуры)
  • Доступ: с 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.

Команды:

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 ждёт здоровой БД.

Команды:

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.

Команды:

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 и своим учётным данным.

Команды:

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. Запуск/обновление:

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), не коммитить в репозиторий и не копировать в открытые места.

Проверка работы:

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: уже запущен отдельным контейнером. Если после перезагрузки контейнер не поднялся:

    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 или делать бэкап в момент минимальной активности).


Связь с другими документами