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

17 KiB
Raw Blame History

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 (отдельный диск)

📋 Описание

Полнофункциональное облачное хранилище с поддержкой файлов, календарей, контактов, заметок и мультимедиа. Развёрнуто вручную на 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 ГБ для стабильности при пиковых нагрузках

🗂️ Структура файлов

/
├── 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: Подготовка системы

# Обновление пакетов
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