Docs/docs/services/vm-205/nextcloud.md

425 lines
17 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.

# Nextcloud Hub 26 — Сервер Olimp (nc.zailon.ru)
| Параметр | Значение |
|----------|----------|
| **Домен** | `nc.zailon.ru` (проксируется через NPM) |
| **Контейнер/Хост** | LXC на Proxmox |
| **Порт внутри** | `80/443` (Nginx) |
| **Версия Nextcloud** | 33.0.3.2 (Hub 26 Winter) |
| **PHP** | 8.3.22 (FPM) |
| **БД** | MariaDB 10.11.11 (socket) |
| **Кэш** | APCu (local) + Redis (locking) |
| **Хранилище** | `/mnt/cloud/data` (отдельный диск) |
- [🤖 Роль Ansible](../../ansible/roles/nextcloud.md) *(заглушка на будущее)*
## 📋 Описание
Полнофункциональное облачное хранилище с поддержкой файлов, календарей, контактов, заметок и мультимедиа. Развёрнуто вручную на Debian 12 с Nginx + PHP-FPM. Проксируется через Nginx Proxy Manager (NPM) для получения SSL-сертификатов Let's Encrypt.
### Особенности текущей установки:
**Безопасность**: самоподписанные сертификаты внутри контейнера + Let's Encrypt на уровне NPM
**Производительность**: Redis для блокировок, APCu для локального кэша, OPcache включён
**Масштабируемость**: данные вынесены на отдельный диск `/mnt/cloud`
**Автономность**: cron через системный демон, не через веб
**Память**: добавлен swap 2 ГБ для стабильности при пиковых нагрузках
## 🗂️ Структура файлов
```text
/
├── etc/
│ ├── nginx/
│ │ ├── sites-enabled/
│ │ │ └── nextcloud.conf # Основной конфиг Nginx для Nextcloud
│ │ └── ssl/
│ │ ├── cert.pem # Самоподписанный сертификат (для NPM)
│ │ └── cert.key # Приватный ключ
│ ├── php/8.3/fpm/pool.d/
│ │ └── www.conf # Настройки пула PHP-FPM
│ └── letsencrypt/ # НЕ используется внутри контейнера
├── var/
│ ├── www/nextcloud/ # Ядро Nextcloud
│ │ ├── config/config.php # Основной конфиг приложения
│ │ ├── apps/ # Установленные приложения
│ │ └── data/ -> /mnt/cloud/data # Ссылка на внешнее хранилище
│ └── log/
│ ├── nginx/
│ └── apache2/ # Не используется, но установлен
├── mnt/
│ └── cloud/
│ ├── data/ # Пользовательские файлы, БД превью, логи
│ └── (другие сервисы) # Общие данные для медиа-сервисов
└── run/
└── php/
└── php8.3-fpm.sock # Socket для связи Nginx ↔ PHP
## ⚙️ Установка и настройка (ручная)
### Шаг 1: Подготовка системы
```bash
# Обновление пакетов
apt update && apt upgrade -y
# Установка базовых зависимостей
apt install -y nginx php8.3-fpm php8.3-cli php8.3-mysql \
php8.3-gd php8.3-imagick php8.3-redis php8.3-apcu \
php8.3-curl php8.3-mbstring php8.3-xml php8.3-zip \
php8.3-intl php8.3-bcmath php8.3-gmp mariadb-server redis-server
# Настройка прав для PHP-FPM
usermod -a -G www-data redis
systemctl enable --now nginx php8.3-fpm mariadb redis-server
### Шаг 2: Настройка базы данных
```bash
# Создание БД и пользователя
mysql -u root -p <<EOF
CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost';
FLUSH PRIVILEGES;
EXIT;
EOF
### Шаг 3: Установка Nextcloud
```bash
# Скачивание и распаковка
cd /tmp
wget https://download.nextcloud.com/server/releases/latest.tar.bz2
tar -xjf latest.tar.bz2 -C /var/www/
chown -R www-data:www-data /var/www/nextcloud
# Создание директории данных
mkdir -p /mnt/cloud/data
chown -R www-data:www-data /mnt/cloud/data
### Шаг 4: Конфигурация Nginx
Создай файл `/etc/nginx/sites-enabled/nextcloud.conf`:
```nginx
server {
listen 80;
listen 443 ssl;
server_name nc.zailon.ru;
if ($scheme = 'http') {
return 301 https://nc.zailon.ru;
}
# SSL-сертификаты (самоподписанные для проксирования через NPM)
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/cert.key;
root /var/www/nextcloud;
# HSTS для безопасности
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
client_max_body_size 10G;
fastcgi_buffers 64 4K;
# Редиректы для CalDAV, CardDAV, WebDAV
rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;
rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;
rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;
index index.php;
error_page 403 = /core/templates/403.php;
error_page 404 = /core/templates/404.php;
# Защита системных файлов
location ~ ^/(data|config|\.ht|db_structure\.xml|README) {
deny all;
}
# Well-known URLs для автоконфигурации клиентов
location ^~ /.well-known {
location = /.well-known/carddav { return 301 /remote.php/dav/; }
location = /.well-known/caldav { return 301 /remote.php/dav/; }
location = /.well-known/webfinger { return 301 /index.php/.well-known/webfinger; }
location = /.well-known/nodeinfo { return 301 /index.php/.well-known/nodeinfo; }
location ^~ /.well-known{ return 301 /index.php/$uri; }
try_files $uri $uri/ =404;
}
# Основной обработчик запросов
location / {
rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;
rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;
try_files $uri $uri/ index.php;
}
# PHP-FPM обработчик
location ~ ^(.+?\.php)(/.*)?$ {
try_files $1 = 404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$1;
fastcgi_param PATH_INFO $2;
fastcgi_param HTTPS on;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
# Кэширование статики
location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
expires modified +30d;
access_log off;
}
}
### Шаг 5: Генерация самоподписанных сертификатов (для NPM)
```bash
mkdir -p /etc/nginx/ssl
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
-keyout /etc/nginx/ssl/cert.key \
-out /etc/nginx/ssl/cert.pem \
-subj "/CN=nc.zailon.ru"
chmod 600 /etc/nginx/ssl/cert.key
### Шаг 6: Настройка PHP 8.3-FPM
Отредактируй `/etc/php/8.3/fpm/pool.d/www.conf`:
```bash
user = www-data
group = www-data
listen = /run/php/php8.3-fpm.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
### Шаг 7: Первоначальная настройка Nextcloud
```bash
# Запуск мастера установки через occ
sudo -u www-data php /var/www/nextcloud/occ maintenance:install \
--database="mysql" \
--database-name="nextcloud" \
--database-user="nextcloud" \
--database-pass="StrongPassword123!" \
--database-host="localhost:/run/mysqld/mysqld.sock" \
--admin-user="admin" \
--admin-pass="AdminStrongPass123!" \
--data-dir="/mnt/cloud/data"
# Настройка крон-задач
crontab -u www-data -e
# Добавь строку:
# */5 * * * * php -f /var/www/nextcloud/cron.php
### Шаг 8: Настройка Nginx Proxy Manager (внешний сервер)
В интерфейсе NPM создай Proxy Host:
- **Domain Names**: `nc.zailon.ru`
- **Scheme**: `https`
- **Forward Hostname/IP**: `192.168.1.205` (IP контейнера Olimp)
- **Forward Port**: `443`
- **SSL**: ✅ Request a new SSL Certificate (Let's Encrypt)
- **Force SSL**: ✅
- **HTTP/2 Support**: ✅
## ⚙️ Конфигурация Nextcloud (config.php)
Ключевые параметры из `/var/www/nextcloud/config/config.php`:
```php
$CONFIG = array (
'instanceid' => 'nc-nextcloud-202605',
'trusted_domains' => array ('nc.zailon.ru', '192.168.1.205'),
'datadirectory' => '/mnt/cloud/data',
'dbtype' => 'mysql',
'dbhost' => 'localhost:/run/mysqld/mysqld.sock',
'memcache.local' => '\\OC\\Memcache\\APCu',
'memcache.locking' => '\\OC\\Memcache\\Redis',
'redis' => array ('host' => 'localhost', 'port' => 6379),
'overwrite.cli.url' => 'https://nc.zailon.ru',
'loglevel' => 2,
'logfile' => '/mnt/cloud/data/nextcloud.log',
'enable_previews' => true,
'preview_max_x' => 2048,
'preview_max_y' => 2048,
'preview_max_memory' => 256,
);
## 🔄 Обновление Nextcloud
### Через встроенный updater (рекомендуется)
```bash
# Включаем режим обслуживания
sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --on
# Запуск обновления
cd /var/www/nextcloud/updater
sudo -u www-data php updater.phar
# После обновления
sudo -u www-data php /var/www/nextcloud/occ upgrade
sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --off
### Ручное обновление (если updater не работает)
```bash
# Бэкап
tar -czf /root/nextcloud-backup-$(date +%F).tar.gz /var/www/nextcloud
mysqldump nextcloud > /root/nextcloud-db-$(date +%F).sql
# Скачивание новой версии
cd /tmp
wget https://download.nextcloud.com/server/releases/nextcloud-X.Y.Z.tar.bz2
tar -xjf nextcloud-X.Y.Z.tar.bz2
rsync -av nextcloud/ /var/www/nextcloud/ --exclude='config/' --exclude='data/'
# Обновление БД
sudo -u www-data php /var/www/nextcloud/occ upgrade
## 🧰 Полезные команды
### Управление сервисами
```bash
# Перезапуск стека
systemctl reload nginx
systemctl reload php8.3-fpm
systemctl restart mariadb
# Проверка статусов
systemctl status nginx php8.3-fpm mariadb redis-server
### Nextcloud CLI (occ)
```bash
# Проверка статуса
sudo -u www-data php /var/www/nextcloud/occ status
# Режим обслуживания
sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --on
sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --off
# Сканирование файлов
sudo -u www-data php /var/www/nextcloud/occ files:scan --all
# Проверка целостности
sudo -u www-data php /var/www/nextcloud/occ integrity:check-core
# Обновление приложений
sudo -u www-data php /var/www/nextcloud/occ app:update --all
### База данных
```bash
# Подключение к БД
mysql -u nextcloud -p nextcloud
# Размер БД
mysql -e "SELECT table_schema AS 'DB', ROUND(SUM(data_length+index_length)/1024/1024,2) AS 'MB' FROM information_schema.tables WHERE table_schema='nextcloud' GROUP BY table_schema;"
# Оптимизация таблиц
mysqlcheck -u root -p --optimize --all-databases
### Логи и мониторинг
```bash
# Логи Nextcloud
tail -f /mnt/cloud/data/nextcloud.log | grep -E '"level":3|"level":4'
# Логи Nginx
tail -f /var/log/nginx/error.log
# Использование ресурсов
htop
df -h / /mnt/cloud
free -h
## 🚨 Решение проблем
| Проблема | Причина | Решение |
|----------|---------|---------|
| `502 Bad Gateway` | PHP-FPM не отвечает | `systemctl status php8.3-fpm`, проверить сокет `/run/php/php8.3-fpm.sock` |
| `Maintenance mode enabled` | Забыли выключить после обновления | `sudo -u www-data php occ maintenance:mode --off` |
| `Could not decrypt session data` | Смена секретного ключа | Очистить куки в браузере, перелогиниться |
| `Превью не генерируются` | Нет прав на appdata | `chown -R www-data:www-data /mnt/cloud/data/appdata_*` |
| `Cron не работает` | Ошибка в crontab | Проверить `crontab -l -u www-data`, убедиться что пользователь `www-data` может выполнять `php` |
| `SSL ошибка в браузере` | Самоподписанный сертификат внутри | Довериться сертификату в браузере или настроить NPM правильно |
| `Память заканчивается` | Мало RAM + нет swap | Добавить swap: `fallocate -l 2G /swapfile && chmod 600 /swapfile && mkswap /swapfile && swapon /swapfile` |
## 🔐 Безопасность
### Настройки для продакшена
✅ **Reverse Proxy**: Все запросы идут через NPM с Let's Encrypt, внутри контейнера — самоподписанные сертификаты
✅ **Защита файлов**: В Nginx запрещён доступ к `config/`, `data/`, `.ht*`
✅ **HSTS**: Заголовок `Strict-Transport-Security` включён
✅ **PHP-FPM**: Работает от пользователя `www-data`, не от root
✅ **БД**: Доступ только через socket, не по TCP
✅ **Redis**: Слушает только `127.0.0.1`, без пароля (локальная сеть)
✅ **Cron**: Запускается от `www-data`, не через веб-интерфейс
### Дополнительные меры
```bash
# Ограничить доступ к admin.php
# В nginx.conf добавить:
location ~ ^/(admin|settings) {
allow 192.168.1.0/24;
deny all;
}
# Включить двухфакторную аутентификацию
sudo -u www-data php /var/www/nextcloud/occ twofactorauth:enable totp
# Регулярные бэкапы (пример cron)
0 3 * * * /root/scripts/backup-nextcloud.sh
## 🤖 БЛОК ДЛЯ ИИ
```text
[AI INSTRUCTION BLOCK — DO NOT REMOVE]
Server: Olimp (Nextcloud LXC)
Domain: nc.zailon.ru (proxied via NPM)
Stack: Debian 12, Nginx 1.22, PHP 8.3-FPM, MariaDB 10.11, Redis 7
Paths:
- Webroot: /var/www/nextcloud
- Data: /mnt/cloud/data
- Nginx config: /etc/nginx/sites-enabled/nextcloud.conf
- PHP-FPM pool: /etc/php/8.3/fpm/pool.d/www.conf
- Nextcloud config: /var/www/nextcloud/config/config.php
Services:
- nginx (active, ports 80/443)
- php8.3-fpm (active, socket /run/php/php8.3-fpm.sock)
- mariadb (active, socket /run/mysqld/mysqld.sock)
- redis-server (active, port 6379 localhost)
Cron: */5 * * * * php -f /var/www/nextcloud/cron.php (user: www-data)
SSL: Self-signed inside container (/etc/nginx/ssl/), Let's Encrypt via NPM externally
Key configs:
- memcache.local: APCu
- memcache.locking: Redis
- dbtype: mysql (socket)
- loglevel: 2 (warnings)
- overwrite.cli.url: https://nc.zailon.ru
Troubleshooting tips:
- If 502: check php8.3-fpm status and socket permissions
- If maintenance mode stuck: occ maintenance:mode --off
- If preview issues: chown www-data:www-data /mnt/cloud/data/appdata_*
- If cron fails: verify www-data crontab and php CLI path
Update procedure:
1. maintenance:mode --on
2. Run updater.phar or manual rsync
3. occ upgrade
4. maintenance:mode --off
5. Clear caches if needed
Security notes:
- Never expose port 443 directly, always via NPM
- Keep PHP 8.3+ for Nextcloud 34+ compatibility
- Regular backups of /mnt/cloud/data and DB dump
- Monitor /mnt/cloud/data/nextcloud.log for level 3/4 errors
```