165 lines
14 KiB
Markdown
165 lines
14 KiB
Markdown
# Контейнер 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.
|
||
|
||
---
|
||
|
||
## Логи и ротация
|
||
|
||
- **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
|
||
|
||
- [ ] **Ротация 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.
|