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

14 KiB
Raw Blame History

Контейнер 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 (из архитектуры)
  • Доступ: с 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.

Команды:

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 (для администрирования):

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.
  • 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/.

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

  • Базовая политика logrotate: для системных логов настроена (homelab-lxc.conf — 14 дней, 50 MB, 5 архивов). См. Logrotate — базовая политика homelab.
  • Ротация nextcloud.log: Настроить logrotate для /mnt/nextcloud-data/html/data/nextcloud.log (или пути на хосте CT 101): ротация по размеру (например 100200 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.

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