
За выходные поднял «свой 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/капчи — без абонплаты и с контролем за данными.
