Небольшой дисклеймер. Часть информации взята с virtualize.link, потому что материалы автора полезны. Проверьте источник или поставьте звезду репозиторию.
Ниже — набор практик для повышения производительности и отзывчивости Nextcloud.
Шаги оптимизации
Пошаговый план настройки:
- reverse proxy SWAG через cloudflare
- Nextcloud
- Redis
- Mariadb
- Collabora
- Notify push
- Talk high performance backend
- Whiteboard
- Imaginary
- Draw.io
- Maintenance
Замените все вхождения domain.com на ваш домен.
SWAG
- Создайте аккаунт Cloudflare и укажите его как nameserver для вашего домена.
- Создайте DNS-записи для
domain.com и *.domain.com с WAN IP вашего дома, отключите orange cloud.
- Настройте проброс
443 на ваш сервер в домашнем роутере.
- Добавьте SWAG в docker compose и запустите.
swag:
image: lscr.io/linuxserver/swag:latest
container_name: swag
cap_add:
- NET_ADMIN
environment:
- PUID=1000
- PGID=1000
- TZ=Etc/UTC
- URL=domain.com
- VALIDATION=dns
- SUBDOMAINS=wildcard
- DNSPLUGIN=cloudflare
- PROPAGATION=60
- SWAG_AUTORELOAD=true
volumes:
- /path/to/swag:/config
ports:
- 443:443
- 80:80
restart: unless-stopped
- Создайте API token Cloudflare с правами
DNS:Read, DNS:Edit для domain.com и скопируйте токен.
- Откройте
/path/to/swag/dns-conf/cloudflare.ini, удалите содержимое и вставьте:
dns_cloudflare_api_token = token
- Переименуйте
/path/to/swag/nginx/proxy-confs/nextcloud.subdomain.conf.sample в nextcloud.subdomain.conf.
- Отредактируйте
/path/to/swag/nginx/ssl.conf и раскомментируйте HSTS и все дополнительные заголовки внизу.
- Перезапустите SWAG и убедитесь, что
domain.com открывает welcome page с валидным сертификатом.
Nextcloud
nextcloud:
image: lscr.io/linuxserver/nextcloud:latest
container_name: nextcloud
environment:
- PUID=1000
- PGID=1000
- TZ=Etc/UTC
volumes:
- /path/to/nextcloud/config:/config
- /path/to/nextcloud/data:/data
restart: unless-stopped
depends_on:
- mariadb
mariadb:
image: lscr.io/linuxserver/mariadb:latest
container_name: mariadb
environment:
- PUID=1000
- PGID=1000
- TZ=Etc/UTC
- MYSQL_ROOT_PASSWORD=nextcloud_root_password
- MYSQL_DATABASE=nextcloud_db
- MYSQL_USER=nextcloud_user
- MYSQL_PASSWORD=nextcloud_password
volumes:
- /path/to/mariadb:/config
restart: unless-stopped
redis:
image: redis:alpine
container_name: redis
restart: unless-stopped
- Перейдите на
https://nextcloud.domain.com и заполните данные для Nextcloud и Mariadb.
- Выберите рекомендуемые приложения для установки.
- Выполните команды.
docker exec nextcloud occ app:disable richdocumentscode
docker exec nextcloud occ maintenance:repair --include-expensive
docker exec nextcloud occ db:add-missing-indices
docker exec -u abc nextcloud mkdir -p /config/log/nextcloud
docker exec nextcloud occ config:system:set overwrite.cli.url --value='https://nextcloud.domain.com'
docker exec nextcloud occ config:system:set memcache.local --value='\\OC\\Memcache\\APCu'
docker exec nextcloud occ config:system:set memcache.locking --value='\\OC\\Memcache\\Redis'
docker exec nextcloud occ config:system:set memcache.distributed --value='\\OC\\Memcache\\Redis'
docker exec nextcloud occ config:system:set logfile --value='/config/log/nextcloud/nextcloud.log'
docker exec nextcloud occ config:system:set trusted_proxies 0 --value='172.16.0.0/12'
docker exec nextcloud occ config:system:set trusted_proxies 1 --value='127.0.0.1'
docker exec nextcloud occ config:system:set trusted_proxies 2 --value='::1'
docker exec nextcloud occ config:system:set redis host --value='redis'
docker exec nextcloud occ config:system:set redis port --value=6379 --type=integer
docker exec nextcloud occ config:system:set loglevel --value=2 --type=integer
docker exec nextcloud occ config:system:set log_rotate_size --value=10485760 --type=integer
docker exec nextcloud occ config:system:set maintenance_window_start --value=1 --type=integer
docker exec nextcloud occ config:system:set filesystem_check_changes --value=1 --type=integer
docker exec nextcloud occ config:system:set filelocking.enabled --value=true --type=boolean
- Добавьте в
/path/to/nextcloud/config/php/www2.conf:
pm = dynamic
pm.max_children = 120
pm.start_servers = 12
pm.min_spare_servers = 6
pm.max_spare_servers = 18
- Перезапустите Nextcloud, чтобы применить изменения.
Collabora
- Добавьте Collabora в docker compose и запустите.
collabora:
image: collabora/code
container_name: collabora
environment:
- DONT_GEN_SSL_CERT=1
- aliasgroup1=https://nextcloud.domain.com
- dictionaries=en_US
- server_name=nextcloud.domain.com
- extra_params=--o:security.capabilities=false --o:ssl.enable=false --o:ssl.termination=true --o:logging.level=caution --o:net.post_allow.host[0]=.+ --o:home_mode.enable=true --o:mount_jail_tree=false --o:mount_namespaces=false --o:remote_font_config.url=https://nextcloud.domain.com/apps/richdocuments/settings/fonts.json
restart: unless-stopped
cap_add:
- SYS_CHROOT
- MKNOD
- Добавьте следующие location-блоки в
/path/to/swag/nginx/proxy-confs/nextcloud.subdomain.conf внутри server.
location ^~ /browser/ {
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app collabora;
set $upstream_port 9980;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
location ^~ /hosting/ {
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app collabora;
set $upstream_port 9980;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
location ^~ /cool/ {
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app collabora;
set $upstream_port 9980;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
docker exec nextcloud occ app:enable richdocuments
docker exec nextcloud occ config:app:set richdocuments wopi_url --value https://nextcloud.domain.com
docker exec nextcloud occ config:app:set richdocuments wopi_allowlist --value=0.0.0.0/0
docker exec nextcloud occ config:app:set richdocuments doc_format --value=ooxml
- Отключите dark mode Collabora в View > Dark Mode.
Notify Push
- Добавьте переменную окружения в Nextcloud compose и пересоздайте контейнер.
environment:
- DOCKER_MODS=linuxserver/mods:nextcloud-notify-push
- Сгенерируйте 3 секрета командой ниже и вставьте их в compose.
- Добавьте high performance backend в docker compose и запустите.
talk:
image: nextcloud/aio-talk:latest
container_name: talk
init: true
ports:
- 3478:3478/tcp
- 3478:3478/udp
environment:
- NC_DOMAIN=nextcloud.domain.com
- TALK_HOST=talk.domain.com
- TZ=Etc/UTC
- TALK_PORT=3478
- TURN_SECRET=secret
- SIGNALING_SECRET=secret
- INTERNAL_SECRET=secret
restart: unless-stopped
- Добавьте в конец
/path/to/swag/nginx/proxy-confs/nextcloud.subdomain.conf:
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name talk.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
location / {
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app talk;
set $upstream_port 8081;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
}
- Выполните команды с секретами, сгенерированными ранее.
docker exec nextcloud occ talk:signaling:add --verify https://talk.domain.com SIGNALING_SECRET
docker exec nextcloud occ talk:stun:add talk.domain.com:3478
docker exec nextcloud occ talk:turn:add --secret TURN_SECRET turn talk.domain.com:3478 udp,tcp
- По желанию пробросьте
3478 на роутере.
Whiteboard
- Сгенерируйте секрет командой и вставьте ниже.
- Добавьте Whiteboard в docker compose и запустите.
whiteboard:
image: ghcr.io/nextcloud-releases/whiteboard:release
container_name: whiteboard
environment:
- NEXTCLOUD_URL=https://nextcloud.domain.com
- STORAGE_STRATEGY=redis
- REDIS_HOST=redis
- JWT_SECRET_KEY=secret
restart: unless-stopped
- Добавьте в конец
/path/to/swag/nginx/proxy-confs/nextcloud.subdomain.conf:
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name whiteboard.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
location / {
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app whiteboard;
set $upstream_port 3002;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
}
docker exec nextcloud occ app:enable whiteboard
docker exec nextcloud occ config:app:set whiteboard collabBackendUrl --value="https://whiteboard.domain.com"
docker exec nextcloud occ config:app:set whiteboard jwt_secret_key --value="secret"
Imaginary
- Добавьте Imaginary в docker compose и запустите.
imaginary:
image: nextcloud/aio-imaginary:latest
container_name: imaginary
restart: unless-stopped
docker exec nextcloud occ config:system:set enable_previews --value=true --type=boolean
docker exec nextcloud occ config:system:set enabledPreviewProviders 0 --value='OC\\Preview\\Imaginary'
docker exec nextcloud occ config:system:set enabledPreviewProviders 1 --value='OC\\Preview\\Movie'
docker exec nextcloud occ config:system:set enabledPreviewProviders 2 --value='OC\\Preview\\MP4'
docker exec nextcloud occ config:system:set preview_imaginary_url --value='http://imaginary:9000'
Diagrams
- Добавьте draw.io в docker compose и запустите.
drawio:
image: jgraph/drawio:alpine
container_name: drawio
restart: unless-stopped
- Добавьте location-блок в
/path/to/swag/nginx/proxy-confs/nextcloud.subdomain.conf внутри server.
location ^~ /draw/ {
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app drawio;
set $upstream_port 8080;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
docker exec nextcloud occ app:enable drawio
docker exec nextcloud occ config:app:set drawio DrawioUrl --value="https://nextcloud.domain.com/draw"
Maintenance
- Раз в несколько недель вручную обновляйте образы и пересоздавайте контейнеры.
- Проверяйте
docker logs mariadb на инструкции по апгрейду.
- Выполняйте команды ниже.
docker exec nextcloud occ maintenance:repair --include-expensive
docker exec nextcloud occ db:add-missing-indices
docker exec nextcloud occ app:update --all