Parts and tools overview vibes
Parts and tools overview vibes

За выходные поднял «свой 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

  1. DNS: A-запись cloud.example.com → на внешний IP (вашего дома/ВПС).

  2. Откройте http://<ваш-ip>:81, создайте админа NPM, добавьте Proxy Host:

    • Domain Names: cloud.example.com

    • 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.

  3. Проверьте 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.com

  • 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

Храните минимум три ротации офф-сайт (облако/другая машина).


Безопасность по принципу «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-образами.


Чеклист запуска (можно распечатать)

  1. DNS: cloud.example.com → внешний IP.

  2. docker compose up -d (все контейнеры healthy).

  3. NPM: Proxy Host → сертификат Let’s Encrypt → Force SSL.

  4. Мастер установки Nextcloud → админ.

  5. config.php: trusted_domains, overwrite*, Redis/APCu.

  6. SMTP: тест письма, регистрация/восстановление.

  7. Крон: режим «Cron» включён, nextcloud-cron работает.

  8. Бэкапы: скрипты/крон готовы.

  9. 2FA, капча, лимиты.

  10. Пробный аплоад 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).


Linux SetUp
Linux SetUp
Parts overview
Parts overview
Case view
Case view

Итоги

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