
За выходные поднял «свой 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 (или любой внешний VPS для обратного прокси — не обязательно).
Домен (например,
cloud.example.com).
Обновляем систему и ставим 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),nextcloud_db(Postgres 17),redis-cache(Redis),nginx-proxy-manager(обратный прокси + Let's Encrypt).
Файл .env (секреты — здесь)
Создайте рядом с 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
docker-compose.yml
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
Подружим домен и TLS
DNS: A-запись
cloud.example.com→ на внешний IP (вашего дома/ВПС).Откройте
http://<ваш-ip>:81, создайте админа NPM, добавьте Proxy Host:Domain Names:
cloud.example.comScheme:
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.
Первичная настройка Nextcloud
Пройдите мастер, либо задайте
NEXTCLOUD_ADMIN_*в.env.В Settings → Administration → Basic settings выставьте cron и убедитесь, что «Cron» выбран.
Включите Redis/APCu в
config.php(генерируется автоматически, дополним вручную).
Базовый config.php (фрагмент)
<?php
$CONFIG = [
'overwrite.cli.url' => 'https://cloud.example.com',
'overwritehost' => 'cloud.example.com',
'overwriteprotocol' => 'https',
'trusted_domains' => [
'cloud.example.com',
],
'memcache.local' => '\OC\Memcache\APCu',
'memcache.locking' => '\OC\Memcache\Redis',
'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.comAuthentication: 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
Храните минимум три ротации офф-сайт (облако/другая машина).
Безопасность по принципу «5 минут — 80% пользы»
2FA для админов + «App Passwords» для клиентов.
Автообновления контейнеров по расписанию (watchtower или ручная проверка раз в неделю).
Fail2ban на уровне роутера/VPS (если есть SSH/панель наружу).
Разделённые сети Docker (как в compose) и минимум открытых портов.
Уменьшите «атаку грубой силы»: капча + лимиты в NPM.
Как именно помог ИИ (и как попросить его правильно)
ИКТ-магии тут нет — весь «джедайизм» в формулировках:
«Сгенерируй
docker-compose.ymlдля Nextcloud + Postgres 17 + Redis на ARM (RPi 5). Отдельный сервис для/cron.sh, два 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→ внешний 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-совместимый бэкенд).
Отдельный VPS как публичный прокси, а RPi оставить в ЛАН за WireGuard.
Мониторинг (Prometheus + cAdvisor + Grafana) и синтетические health-checks.
Автоматизация бэкапов (borg/restic + off-site).
Расширенная полнотекстовая индексация (Elastic/OpenSearch).



Итоги
Домашний Nextcloud на RPi 5 — это не «проект на месяц», а реально пара вечеров, если подходить прагматично: взять готовые образы, собрать docker-compose, доверить рутину ИИ и не усложнять, где не нужно.
Вы получаете свой приватный облачный диск, быстрый предпросмотр фото/видео, общие папки семьи/команды и взрослые «энтерпрайз-штуки» вроде SSO/2FA/капчи — без абонплаты и с контролем за данными.