- PVSM.RU - https://www.pvsm.ru -
За выходные поднял «свой Dropbox/Google Drive» на Raspberry Pi 5 через Docker-compose: Nextcloud + PostgreSQL + Redis + Nginx Proxy Manager + автокрон. Бонусом — SMTP-уведомления, капча на регистрации и аккуратный config.php. Ключевой инсайт: даже без специфических знаний это реально, если уметь правильно «разговаривать» с ИИ и копипастить команды не глядя в дебри мануалов.
Контроль над данными. Фотографии, рабочие схемы и документы живут у вас, а не «где-то в облаке».
Скорость и цена. RPi 5 + SSD — это дешево/сердито и очень быстро.
ИИ как «второй мозг». LLM снимает барьер входа: вместо «нужно разбираться в DevOps» — вы формулируете задачу и итеративно доводите конфиг до ума.
Nextcloud 32+ с внешней БД (PostgreSQL 17), кэшем и блокировками на Redis.
TLS-сертификат через Nginx Proxy Manager (автообновление).
Фоновый cron, аккуратные тома, изолированная сеть, healthcheck’и.
Рабочую почту (SMTP) для уведомлений/регистрации и готовность к hCaptcha/reCaptcha.
Чеклист бэкапов и минимальную «обвязку» производительности (APCu/OPcache).
Raspberry Pi 5 (4–8 ГБ, лучше 8 ГБ) + нормальный блок питания.
NVMe/SSD (USB 3.2) на 500 ГБ–2 ТБ. Карта microSD — только под систему.
Роутер с пробросом 80/443 (или любой внешний для обратного прокси — не обязательно).
Домен (например, cloud.example.com [2]).
Обновляем систему и ставим Docker/Compose:
sudo apt update && sudo apt upgrade -y
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
# Docker Compose v2 обычно ставится вместе с docker-ce (как docker compose)
docker --version && docker compose version
Сеть: два сегмента — backend-network (всё приватно) и proxy-network (только NPM).
Тома: разнесены каталоги html/, config/, data/, custom_apps/ — удобно для бэкапов/миграций.
Сервисы:
nextcloud-app (Apache + PHP),
nextcloud-cron (только /cron.sh [3]),
nextcloud_db (Postgres 17),
redis-cache (Redis),
nginx-proxy-manager (обратный прокси + Let's Encrypt).
Создайте рядом с docker-compose.yml:
# Домен
NEXTCLOUD_DOMAIN=cloud.example.com
# БД
POSTGRES_DB=nextcloud
POSTGRES_USER=nc_user
POSTGRES_PASSWORD=change_me_strong
# Почта (пример)
SMTP_HOST=smtp.yourmail.com
SMTP_PORT=587
SMTP_USER=noreply@yourmail.com
SMTP_PASSWORD=change_me_strong
SMTP_SECURE=tls # tls (587) или ssl (465)
# Таймзона
TZ=Europe/Berlin
version: "3.9"
networks:
backend-network:
driver: bridge
proxy-network:
driver: bridge
volumes:
nextcloud_html:
nextcloud_data:
nextcloud_config:
nextcloud_apps:
postgres_data:
redis_data:
npm_data:
npm_letsencrypt:
services:
nextcloud-app:
image: nextcloud:stable
restart: unless-stopped
depends_on:
- nextcloud_db
- redis-cache
environment:
- TZ=${TZ}
- POSTGRES_HOST=nextcloud_db
- POSTGRES_DB=${POSTGRES_DB}
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
# Для первой инициализации можно указать админа:
# - NEXTCLOUD_ADMIN_USER=admin
# - NEXTCLOUD_ADMIN_PASSWORD=change_me_strong
# (или создать через веб-мастер)
- PHP_MEMORY_LIMIT=1024M
- PHP_UPLOAD_LIMIT=10240M
volumes:
- nextcloud_html:/var/www/html
- nextcloud_data:/var/www/html/data
- nextcloud_config:/var/www/html/config
- nextcloud_apps:/var/www/html/custom_apps
# Пользовательский php.ini для правки output_buffering и т.п.
- ./php-custom.ini:/usr/local/etc/php/conf.d/zzz-custom.ini:ro
networks:
- backend-network
nextcloud-cron:
image: nextcloud:stable
restart: unless-stopped
depends_on:
- nextcloud-app
entrypoint: /cron.sh
volumes:
- nextcloud_html:/var/www/html
- nextcloud_data:/var/www/html/data
- nextcloud_config:/var/www/html/config
- nextcloud_apps:/var/www/html/custom_apps
networks:
- backend-network
nextcloud_db:
image: postgres:17-bookworm
restart: unless-stopped
environment:
- TZ=${TZ}
- POSTGRES_DB=${POSTGRES_DB}
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- backend-network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 10
redis-cache:
image: redis:alpine
restart: unless-stopped
command: ["redis-server", "--appendonly", "yes"]
volumes:
- redis_data:/data
networks:
- backend-network
nginx-proxy-manager:
image: jc21/nginx-proxy-manager:latest
restart: unless-stopped
ports:
- "80:80"
- "81:81" # веб-панель NPM
- "443:443"
environment:
- TZ=${TZ}
volumes:
- npm_data:/data
- npm_letsencrypt:/etc/letsencrypt
networks:
- proxy-network
- backend-network
Создайте минимальный php-custom.ini:
; /usr/local/etc/php/conf.d/zzz-custom.ini
output_buffering=0
opcache.enable=1
opcache.enable_cli=1
apc.enable_cli=1
Запускаем:
docker compose up -d
DNS: A-запись cloud.example.com [2] → на внешний IP (вашего дома/ВПС).
Откройте http://<ваш-ip>:81, создайте админа NPM, добавьте Proxy Host:
Domain Names: cloud.example.com [2]
Scheme: http, Forward Hostname/IP: nextcloud-app, Forward Port: 80
Включите Websockets, Cache Assets,
Во вкладке SSL — «Request a new SSL Certificate» → Let’s Encrypt → Force SSL + HTTP/2.
Проверьте https://cloud.example.com [4].
Пройдите мастер, либо задайте NEXTCLOUD_ADMIN_* в .env.
В Settings → Administration → Basic settings выставьте cron и убедитесь, что «Cron» выбран.
Включите Redis/APCu в config.php (генерируется автоматически, дополним вручную).
<?php
$CONFIG = [
'overwrite.cli.url' => 'https://cloud.example.com',
'overwritehost' => 'cloud.example.com',
'overwriteprotocol' => 'https',
'trusted_domains' => [
'cloud.example.com',
],
'memcache.local' => 'OCMemcacheAPCu',
'memcache.locking' => 'OCMemcacheRedis',
'redis' => [
'host' => 'redis-cache',
'port' => 6379,
],
'logtimezone' => 'Europe/Berlin',
'default_phone_region' => 'DE',
];
⚠️ Не коммитьте
config.phpс паролями/секретами; держите бэкап отдельно.
Через Settings → Administration → Basic settings → Email server:
Send mode: SMTP
Encryption: TLS (587) или SSL (465)
From address: noreply@yourmail.com [5]
Authentication: login/pass из .env
Проверка:
docker exec -u www-data nextcloud-app php occ config:system:set mail_smtpmode --value="smtp"
docker exec -u www-data nextcloud-app php occ config:system:set mail_smtphost --value="${SMTP_HOST}"
docker exec -u www-data nextcloud-app php occ config:system:set mail_smtpport --value="${SMTP_PORT}"
docker exec -u www-data nextcloud-app php occ config:system:set mail_smtpsecure --value="${SMTP_SECURE}"
docker exec -u www-data nextcloud-app php occ config:system:set mail_smtpauth --value="1"
docker exec -u www-data nextcloud-app php occ config:system:set mail_smtpname --value="${SMTP_USER}"
docker exec -u www-data nextcloud-app php occ config:system:set mail_smtppassword --value="${SMTP_PASSWORD}"
Анти-спам на регистрации. Установите приложение Registration и подключите hCaptcha/reCaptcha (в панели Registration появятся поля ключей). Ключи берём у провайдера капчи, добавляем в настройки приложения.
1) output_buffering ругается в логах.
Решение — наш php-custom.ini с output_buffering=0 (см. выше) + перезапуск контейнера.
2) Медленные превью и поиск.
Включите предгенерацию превью по крону и full-text search при необходимости.
docker exec -u www-data nextcloud-app php occ preview:generate-all
# Поиск: установить нужный app из Маркета, выбрать движок (e.g. Tesseract/Elastic)
3) Файловые блокировки и гонки.
Только Redis для memcache.locking. Не используйте file-locking на FS.
4) Прокси и «кривые» URL.
Правильные overwritehost/overwriteprotocol/overwrite.cli.url в config.php лечат 90% редирект-боли.
5) SMTP 587 vs 465.
TLS (587) чаще «заводится» на домашних сетях; SSL (465) — «в лоб и сразу SSL». Если что-то не шлётся — смотрим логи Nextcloud и провайдера почты.
Раз в день:
# БД
docker exec nextcloud_db pg_dump -U ${POSTGRES_USER} ${POSTGRES_DB}
| gzip > ~/backups/nextcloud_$(date +%F).sql.gz
# Важные тома
sudo tar -czf ~/backups/nc_html_$(date +%F).tar.gz /var/lib/docker/volumes/nextcloud_html/_data
sudo tar -czf ~/backups/nc_config_$(date +%F).tar.gz /var/lib/docker/volumes/nextcloud_config/_data
sudo tar -czf ~/backups/nc_data_$(date +%F).tar.gz /var/lib/docker/volumes/nextcloud_data/_data
sudo tar -czf ~/backups/nc_apps_$(date +%F).tar.gz /var/lib/docker/volumes/nextcloud_apps/_data
Храните минимум три ротации офф-сайт (облако/другая машина).
2FA для админов + «App Passwords» для клиентов.
Автообновления контейнеров по расписанию (watchtower или ручная проверка раз в неделю).
Fail2ban на уровне роутера/VPS (если есть SSH/панель наружу).
Разделённые сети Docker (как в compose) и минимум открытых портов.
Уменьшите «атаку грубой силы»: капча + лимиты в NPM.
ИКТ-магии тут нет — весь «джедайизм» в формулировках:
«Сгенерируй docker-compose.yml для Nextcloud + Postgres 17 + Redis на ARM (RPi 5). Отдельный сервис для /cron.sh [3], два docker-network (backend/proxy), тома для html/config/data/custom_apps. Добавь NPM как обратный прокси».
«Покажи минимальный php.ini, чтобы убрать предупреждение output_buffering и включить OPcache/APCu».
«Дай команды occ для SMTP (TLS:587) и проверь логи».
«Почему редиректит на HTTP? Посмотри на overwrite* и trusted_domains — дай минимальный config.php».
ИИ не заменяет документацию, но сильно сокращает цикл «проблема → гипотеза → фикс», особенно на Raspberry Pi с ARM-образами.
DNS: cloud.example.com [2] → внешний IP.
docker compose up -d (все контейнеры healthy).
NPM: Proxy Host → сертификат Let’s Encrypt → Force SSL.
Мастер установки Nextcloud → админ.
config.php: trusted_domains, overwrite*, Redis/APCu.
SMTP: тест письма, регистрация/восстановление.
Крон: режим «Cron» включён, nextcloud-cron работает.
Бэкапы: скрипты/крон готовы.
2FA, капча, лимиты.
Пробный аплоад 5–10 ГБ, шаринг ссылки, мобильные клиенты.
# Логи Nextcloud
docker exec -u www-data nextcloud-app bash -lc 'tail -n 200 /var/www/html/data/nextcloud.log'
# Обновление приложений
docker exec -u www-data nextcloud-app php occ app:update --all
# Ремонт после «падения электричества»
docker exec -u www-data nextcloud-app php occ maintenance:repair
# Перестроить индексы (иногда ускоряет)
docker exec -u www-data nextcloud-app php occ db:add-missing-indices
Object-storage для холодных файлов (S3-совместимый бэкенд).
Отдельный
Мониторинг (Prometheus + cAdvisor + Grafana) и синтетические health-checks.
Автоматизация бэкапов (borg/restic + off-site).
Расширенная полнотекстовая индексация (Elastic/OpenSearch).
Домашний Nextcloud на RPi 5 — это не «проект на месяц», а реально пара вечеров, если подходить прагматично: взять готовые образы, собрать docker-compose, доверить рутину ИИ и не усложнять, где не нужно.
Вы получаете свой приватный облачный диск, быстрый предпросмотр фото/видео, общие папки семьи/команды и взрослые «энтерпрайз-штуки» вроде SSO/2FA/капчи — без абонплаты и с контролем за данными.
Автор: ArtEngineering
Источник [6]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/hranenie-danny-h/436186
Ссылки в тексте:
[1] VPS: https://www.reg.ru/?rlink=reflink-717
[2] cloud.example.com: http://cloud.example.com
[3] cron.sh: http://cron.sh
[4] https://cloud.example.com: https://cloud.example.com
[5] noreply@yourmail.com: mailto:noreply@yourmail.com
[6] Источник: https://habr.com/ru/articles/964936/?utm_source=habrahabr&utm_medium=rss&utm_campaign=964936
Нажмите здесь для печати.