Добавить docs/services/vm-205/nextcloud.md
This commit is contained in:
parent
45feb5823d
commit
2566f3003b
425
docs/services/vm-205/nextcloud.md
Normal file
425
docs/services/vm-205/nextcloud.md
Normal file
@ -0,0 +1,425 @@
|
||||
# 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
|
||||
```
|
||||
Loading…
Reference in New Issue
Block a user