Files
homelab-docs/docs/containers/container-103.md
Andrey f319133cee Add notification feature to backup scripts for various services
Enhance backup scripts for Nextcloud, Gitea, Paperless, Vaultwarden, Immich, and VPS configurations by adding Telegram notifications upon completion. Include details such as backup size and objects backed up. Update backup documentation to reflect these changes and ensure clarity on backup processes and retention policies.
2026-02-27 20:42:30 +03:00

289 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Контейнер 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).
---
## Как подключиться к серверу (CT 103)
- **С хоста Proxmox (192.168.1.150):**
`pct exec 103 -- bash` — попадаете в shell контейнера 103 под root.
- **По SSH (если настроен доступ на 103):**
`ssh root@192.168.1.103`с машины, с которой настроен ключ/пароль на 103.
- **Логин в Debian:** `root`, пароль — из менеджера паролей или как задавали при установке.
После входа в CT 103 все команды (Docker, логи и т.д.) выполняются уже внутри контейнера.
---
## Доступ и логины
- **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` и перезапустить контейнер. Если оставить `DOMAIN=http://192.168.1.103:8280`, веб-вход по https://vault.katykhin.ru может не работать (запрос prelogin падает, в DevTools — «Provisional headers»).
**Тома:**
- `/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`.
**Если веб-вход по https://vault.katykhin.ru не работает (prelogin ошибка, «Provisional headers» в DevTools):** проверьте, что в compose задано `DOMAIN=https://vault.katykhin.ru`. На CT 103: `grep DOMAIN /opt/docker/vaultwarden/docker-compose.yml`. Если там `DOMAIN=http://192.168.1.103:8280`, замените на `DOMAIN=https://vault.katykhin.ru`, затем `cd /opt/docker/vaultwarden && docker compose up -d` и повторите вход.
---
## Порты (сводка на хосте)
| Порт | Сервис / примечание |
|-------|----------------------------|
| 3000 | Gitea (веб) |
| 2222 | Gitea (SSH для git) |
| 5984 | CouchDB (Obsidian sync) |
| 8280 | Vaultwarden (менеджер паролей, HTTP по IP из LAN) |
---
## Логи и ротация
- **Базовая политика LXC:** в контейнере настроен logrotate `/etc/logrotate.d/homelab-lxc.conf` — 14 дней, 50 MB, 5 архивов (системные логи в `/var/log`). Подробнее: [Logrotate — базовая политика homelab](../maintenance/logrotate/README.md).
- **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:** уже запущен отдельным контейнером. Если после перезагрузки контейнер не поднялся:
```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
- [x] **Базовая политика logrotate:** для системных логов настроена (homelab-lxc.conf — 14 дней, 50 MB, 5 архивов). См. [Logrotate — базовая политика homelab](../maintenance/logrotate/README.md).
- [ ] **Логи 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.
- [Vaultwarden и использование секретов](../vaultwarden-secrets.md) — как получать пароли и поля из Vaultwarden через CLI (bw) в скриптах.