Files
homelab-docs/docs/containers/container-103.md

15 KiB
Raw Blame History

Контейнер 103 (Gitea): Gitea, PostgreSQL, act_runner, CouchDB (Obsidian)

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

Сервисы (Docker)

Два независимых набора сервисов:

  1. Gitea (compose) — в /opt/gitea/: Gitea, PostgreSQL, act_runner. Сеть gitea_default.
  2. CouchDB — запущен отдельным контейнером (без compose в репозитории), данные в /opt/docker/couchdb/.
Контейнер Образ Порты (хост) Назначение
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)

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).


Порты (сводка на хосте)

Порт Сервис / примечание
3000 Gitea (веб)
2222 Gitea (SSH для git)
5984 CouchDB (Obsidian sync)

Логи и ротация

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


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