21 KiB
Контейнер 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 (из архитектуры)
- Доступ: с 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)
Наборы сервисов:
- Gitea (compose) — в
/opt/gitea/: Gitea, PostgreSQL, act_runner. Сеть gitea_default. - CouchDB — отдельный контейнер, данные в
/opt/docker/couchdb/. - Vaultwarden (compose) — в
/opt/docker/vaultwarden/: менеджер паролей Vaultwarden (совместим с клиентами Bitwarden). - Homepage + dockerproxy (compose) — в
/opt/docker/homepage/: дашборд сервисов. - 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/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).
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→ upstream192.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).
Запуск и порядок поднятия
-
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.
- 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 или делать бэкап в момент минимальной активности).
Связь с другими документами
- Архитектура и подключение — таблица контейнеров, домены (в т.ч. obsidian.katykhin.ru, home.katykhin.ru, wallos.katykhin.ru), схема сети.
- Контейнер 100 (nginx) — NPM и AdGuard; через NPM проксируются git.katykhin.ru, obsidian.katykhin.ru, vault.katykhin.ru, home.katykhin.ru и wallos.katykhin.ru.