15 KiB
Контейнер 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)
Два независимых набора сервисов:
- Gitea (compose) — в
/opt/gitea/: Gitea, PostgreSQL, act_runner. Сеть gitea_default. - 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/passwdgitea). - Сервер:
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).
Запуск и порядок поднятия
-
Gitea (compose):
cd /opt/gitea && docker compose up -d
Порядок: db → server (healthcheck) → runner. -
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.
Уязвимости и риски
- Пароли в конфигах: В
docker-compose.yml(Gitea) заданы пароль БД и креды Gitea (gitea/gitea). Файл лежит только на сервере; не помещать в публичный репозиторий. То же для/opt/gitea/.env(GITEA_RUNNER_REGISTRATION_TOKEN). - Пароль админа CouchDB хранится в
/opt/docker/couchdb/local.d/local.ini(секция [admins]). Ограничить права на каталог (например chmod 700 local.d, владелец root). - Gitea и CouchDB по IP: Доступ по 192.168.1.103:3000 и :5984 из LAN. Если нужен доступ снаружи — только через NPM (HTTPS, домены git.katykhin.ru, obsidian.katykhin.ru) и не пробрасывать порты 3000/5984 напрямую в интернет.
- Логи Docker: Ротация не настроена — возможен рост логов и заполнение диска (см. TODO).
- 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 или делать бэкап в момент минимальной активности).
Связь с другими документами
- Архитектура и подключение — таблица контейнеров, домены (в т.ч. obsidian.katykhin.ru), схема сети.
- Контейнер 100 (nginx) — NPM, через который при необходимости проксируются git.katykhin.ru и obsidian.katykhin.ru.