14 KiB
Контейнер 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.101OVERWRITEPROTOCOL,OVERWRITEHOST,OVERWRITECLIURL: https и cloud.katykhin.ruREDIS_HOST: redisPOSTGRES_*: хост 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 = 64Gmemory_limit = 2G,max_execution_time = 7200,max_input_time = 7200upload_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.
Логи и ротация
- 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.
Уязвимости и риски
- Пароли в compose: В
docker-compose.ymlзаданыPOSTGRES_PASSWORD: nextcloudи те же учётные данные в блоке nextcloud. Файл лежит на сервере; не коммитить в публичный репозиторий. При необходимости вынести секреты в.env. - Пароль БД в config.php: В
config/config.phpхранится пароль подключения к PostgreSQL (и другие секреты). Права на файл должны ограничивать чтение (владелец www-data, режим 640 или строже). - Nextcloud доступ по 8080: Порт 8080 открыт на 0.0.0.0 внутри CT 101. Доступ из интернета только через NPM (HTTPS). Убедиться, что на роутере/фаерволе не пробрасывается 8080 на 192.168.1.101.
- Redis без пароля: Приемлемо, так как Redis не проброшен наружу и доступен только контейнерам в одной сети. При добавлении других стеков в тот же Docker-сеть — учитывать, что Redis доступен без аутентификации.
- Логи: Отсутствие ротации для
nextcloud.logможет привести к заполнению диска (см. TODO). - Квота и внешнее хранилище «Игры»: после переноса данных с SSD на HDD и смены пути внешнего хранилища (
/mnt/nextcloud-extra/games) в БД могли остаться старые записиstorageи кэша (oc_storages/oc_filecache) для прежнего пути. Это приводит к завышенному «Использовано» и постоянному статусу «Ожидается» у «Игры». При будущих переносах хранилища важно очищать устаревшие storages и запускать пересканирование (occ files:scan и files_external:scan), чтобы квота считалась корректно.
TODO по контейнеру 101
- Ротация 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.
Связь с другими документами
- Архитектура и подключение — таблица контейнеров, домен cloud.katykhin.ru, NPM.
- Контейнер 100 — NPM, через который открыт доступ к Nextcloud по HTTPS.