# Контейнер 101 (nextcloud): Nextcloud, PostgreSQL, Redis Подробное описание LXC-контейнера **101** на Proxmox (192.168.1.101): облачное хранилище Nextcloud за NPM (https://cloud.katykhin.ru), PostgreSQL 16, Redis для кэша и блокировок, внешнее хранилище «Игры». --- ## Общие сведения - **Хостнейм:** nextcloud - **IP:** 192.168.1.101/24 - **ОС:** Debian 12 (bookworm) - **Ресурсы:** 2 core, 3 GB RAM (из [архитектуры](../architecture/architecture.md)) - **Доступ:** с Proxmox — `pct exec 101 -- bash` или по SSH на 192.168.1.101, если настроен. Диск контейнера: ~10 GB, занято ~3.8 GB. Основной объём данных — в смонтированных каталогах хоста: `/mnt/nextcloud-data/` (приложение + БД) и `/mnt/nextcloud-extra/` (внешнее хранилище «Игры», порядка нескольких TB). Следить за местом на корне и за логами (см. раздел «Логи» и TODO). --- ## Доступ и логины - **Debian (CT 101):** логин `root` (пароль — в менеджере паролей или как настраивал при установке). - **Nextcloud (веб):** https://cloud.katykhin.ru (через NPM). Логины пользователей — учётные записи Nextcloud (в т.ч. админ); пароли в менеджере паролей или задаются при первом входе. --- ## Сервисы (Docker Compose) Один проект: `/opt/nextcloud/docker-compose.yml`. Сеть: **nextcloud_default** (bridge). | Сервис | Образ | Порты (хост) | Назначение | |-----------|--------------------|--------------|------------| | nextcloud | nextcloud:latest | 8080→80 | Nextcloud (Apache), доступ по https://cloud.katykhin.ru через NPM | | db | postgres:16 | — | PostgreSQL 16, БД nextcloud | | redis | redis:7-alpine | — | Redis (кэш, блокировки), appendonly | --- ## 1. Nextcloud **Образ:** `nextcloud:latest` (на момент проверки — Nextcloud 32.0.6). **Порты:** 8080 (хост) → 80 (контейнер). Снаружи доступ только через NPM: https://cloud.katykhin.ru → proxy на 192.168.1.101:8080. **Тома:** - `/mnt/nextcloud-data/html` → `/var/www/html` (код, `config/`, `data/`, приложения). - `/mnt/nextcloud-extra` → `/mnt/nextcloud-extra` (внутри контейнера; используется для внешнего хранилища «Игры»). - `/opt/nextcloud/php-uploads.ini` → `/usr/local/etc/php/conf.d/zz-uploads.ini` (лимиты загрузки). **Переменные окружения (compose):** - `NEXTCLOUD_TRUSTED_DOMAINS`: cloud.katykhin.ru 192.168.1.101 - `OVERWRITEPROTOCOL`, `OVERWRITEHOST`, `OVERWRITECLIURL`: https и cloud.katykhin.ru - `REDIS_HOST`: redis - `POSTGRES_*`: хост db, БД nextcloud, пользователь и пароль БД (в compose заданы `nextcloud` / `nextcloud`; в `config.php` приложения может быть другой пользователь БД, заданный при установке). **Конфиг приложения:** `/var/www/html/config/config.php` (внутри контейнера; на хосте путь — `/mnt/nextcloud-data/html/config/config.php`). В нём: trusted_domains, overwrite*, redis, datadirectory (`/var/www/html/data`), dbtype pgsql, dbhost/dbname/dbuser/dbpassword, instanceid, passwordsalt, secret и др. Редактировать при необходимости через `occ config:system:set` или правку файла с последующим перезапуском контейнера. **PHP (загрузки):** `/opt/nextcloud/php-uploads.ini` на хосте: - `upload_max_filesize = 64G`, `post_max_size = 64G` - `memory_limit = 2G`, `max_execution_time = 7200`, `max_input_time = 7200` - `upload_max_chunk_size` задаётся в config.php (67108864). **Внешнее хранилище:** В Nextcloud настроено локальное внешнее хранилище «Игры» (Local): точка монтирования в интерфейсе — «/Игры», каталог на диске — `/mnt/nextcloud-extra/games`. Данные лежат на хосте в `/mnt/nextcloud-extra/` (в т.ч. каталог `games`); объём порядка нескольких TB. **Команды:** ```bash docker exec nextcloud-nextcloud-1 php /var/www/html/occ status docker exec nextcloud-nextcloud-1 php /var/www/html/occ config:list system docker exec nextcloud-nextcloud-1 php /var/www/html/occ files_external:list docker logs nextcloud-nextcloud-1 docker restart nextcloud-nextcloud-1 ``` Обновление приложения (если нужно): через `occ upgrade` или официальную инструкцию Nextcloud; перед этим — бэкап данных и БД. --- ## 2. PostgreSQL (db) **Образ:** postgres:16. **Том:** `/mnt/nextcloud-data/pgdata` → `/var/lib/postgresql/data`. **Переменные:** `POSTGRES_DB=nextcloud`, `POSTGRES_USER=nextcloud`, `POSTGRES_PASSWORD=nextcloud` (в compose; приложение может подключаться под другим пользователем из config.php). **Healthcheck:** `pg_isready -U nextcloud`. Подключение к БД с хоста CT 101 (для администрирования): ```bash docker exec -it nextcloud-db-1 psql -U nextcloud -d nextcloud ``` --- ## 3. Redis **Образ:** redis:7-alpine. **Команда:** `redis-server --appendonly yes`. **Том:** анонимный Docker volume (данные Redis в `/var/lib/docker/volumes/...` на хосте CT 101). Используется Nextcloud для memcache.distributed и memcache.locking; пароль не задан (доступ только внутри сети контейнеров). --- ## Порты | Порт | Сервис | Примечание | |------|----------|------------| | 8080 | Nextcloud| HTTP внутри LAN; снаружи доступ через NPM (HTTPS cloud.katykhin.ru). | PostgreSQL и Redis не проброшены на хост — доступ только из сети nextcloud_default. --- ## Логи и ротация - **Базовая политика LXC:** в контейнере настроен logrotate `/etc/logrotate.d/homelab-lxc.conf` — 14 дней, 50 MB, 5 архивов (системные логи в `/var/log`). Подробнее: [Logrotate — базовая политика homelab](../maintenance/logrotate/README.md). - **Nextcloud:** основной лог приложения — `/var/www/html/data/nextcloud.log` (в контейнере; на хосте — `/mnt/nextcloud-data/html/data/nextcloud.log`). На момент проверки файл уже порядка **сотен MB**. Встроенной ротации по размеру/времени в Nextcloud нет; в контейнере и на хосте **logrotate для этого файла не настроен** — риск разрастания и заполнения раздела (см. TODO). - **PostgreSQL:** логи по умолчанию в stdout (видны через `docker logs nextcloud-db-1`). Отдельного файлового лога и logrotate не проверялось. - **Docker:** вывод контейнеров — `docker logs`. Ротация логов Docker (json-file) зависит от настроек демона; при необходимости задать max-size/max-file в `/etc/docker/daemon.json`. Рекомендуется добавить правило logrotate для `nextcloud.log` (по размеру или по дням) и при необходимости ограничить уровень логирования в Nextcloud. --- ## Запуск и обновление Рабочий каталог: `/opt/nextcloud/`. ```bash cd /opt/nextcloud docker compose up -d docker compose ps docker compose logs -f nextcloud ``` Перед обновлением образов — сделать бэкап БД и каталога данных: - БД: `docker exec nextcloud-db-1 pg_dump -U nextcloud nextcloud` - Данные: `/mnt/nextcloud-data/html` (в т.ч. `config/`, `data/`), при необходимости `/mnt/nextcloud-extra`. --- ## Уязвимости и риски 1. **Пароли в compose:** В `docker-compose.yml` заданы `POSTGRES_PASSWORD: nextcloud` и те же учётные данные в блоке nextcloud. Файл лежит на сервере; не коммитить в публичный репозиторий. При необходимости вынести секреты в `.env`. 2. **Пароль БД в config.php:** В `config/config.php` хранится пароль подключения к PostgreSQL (и другие секреты). Права на файл должны ограничивать чтение (владелец www-data, режим 640 или строже). 3. **Nextcloud доступ по 8080:** Порт 8080 открыт на 0.0.0.0 внутри CT 101. Доступ из интернета только через NPM (HTTPS). Убедиться, что на роутере/фаерволе не пробрасывается 8080 на 192.168.1.101. 4. **Redis без пароля:** Приемлемо, так как Redis не проброшен наружу и доступен только контейнерам в одной сети. При добавлении других стеков в тот же Docker-сеть — учитывать, что Redis доступен без аутентификации. 5. **Логи:** Отсутствие ротации для `nextcloud.log` может привести к заполнению диска (см. TODO). 6. **Квота и внешнее хранилище «Игры»:** после переноса данных с SSD на HDD и смены пути внешнего хранилища (`/mnt/nextcloud-extra/games`) в БД могли остаться старые записи `storage` и кэша (oc_storages/oc_filecache) для прежнего пути. Это приводит к завышенному «Использовано» и постоянному статусу «Ожидается» у «Игры». При будущих переносах хранилища важно очищать устаревшие storages и запускать пересканирование (occ files:scan и files_external:scan), чтобы квота считалась корректно. --- ## TODO по контейнеру 101 - [x] **Базовая политика logrotate:** для системных логов настроена (homelab-lxc.conf — 14 дней, 50 MB, 5 архивов). См. [Logrotate — базовая политика homelab](../maintenance/logrotate/README.md). - [ ] **Ротация nextcloud.log:** Настроить logrotate для `/mnt/nextcloud-data/html/data/nextcloud.log` (или пути на хосте CT 101): ротация по размеру (например 100–200 MB) или по дням, сжатие, ограничение числа копий. Либо включить в Nextcloud логирование в syslog и ротировать его. - [ ] **Уровень логирования:** В Nextcloud при необходимости снизить уровень лога (loglevel) в config.php или через `occ config:system:set loglevel --value 1` (1 = только ошибки), чтобы уменьшить рост лога. - [ ] **Резервное копирование:** Регулярный бэкап: - дамп PostgreSQL (данные в `/mnt/nextcloud-data/pgdata`, сейчас ~2.3 GB); - каталог `/mnt/nextcloud-data/html` (код, `config/`, `data/` — сейчас ~2.3 GB); - при необходимости внешнее хранилище `/mnt/nextcloud-extra` (в т.ч. `games` — сейчас ~5.9 TB). Проверить, что бэкап включает конфиг и что восстановление из дампа и данных проверено. - [ ] **Мониторинг диска:** Следить за занятостью корня контейнера и раздела, на котором лежат `/mnt/nextcloud-data` и `/mnt/nextcloud-extra`. При необходимости — алерты при достижении порога (например 85%). - [ ] **Trusted domains:** В config.php на момент проверки указан только `cloud.katykhin.ru`. В compose задан также `192.168.1.101` — при необходимости доступа по IP добавить его в trusted_domains через `occ config:system:set trusted_domains 1 --value 192.168.1.101` (индексы по необходимости скорректировать). - [ ] **Cron Nextcloud:** Убедиться, что фоновые задачи выполняются (режим cron или AJAX). Проверить: `docker exec nextcloud-nextcloud-1 php /var/www/html/occ background:job:list` или настройки в разделе «Основные» веб-интерфейса. При использовании cron на хосте — добавить задачу вида `*/5 * * * * docker exec nextcloud-nextcloud-1 php /var/www/html/cron.php`. --- ## Связь с другими документами - [Архитектура и подключение](../architecture/architecture.md) — таблица контейнеров, домен cloud.katykhin.ru, NPM. - [Контейнер 100](container-100.md) — NPM, через который открыт доступ к Nextcloud по HTTPS.