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

Комментарии (2)


  1. M_AJ
    10.11.2025 13:32

    RPi 5 + SSD — это дешево/сердито и очень быстро

    RPi 5 сейчас стоит сравнимо с китайскими неттопами на Intel N100, идущими уже в корпусе, с блоком питания, 16Гб памяти и слотом под SSD, без необходимости покупать Argon NEO еще за $40.


  1. Lev3250
    10.11.2025 13:32

    Настройка nextclod вся документирова-передокументирована для любых платформ. Если совсем лень, можно поднять AIO одним композ файлом и потом в веб интерфейсе всё докликать мышкой.

    Автоматизация бекапов - это задача не на потом! Это то, без чего нельзя двигаться дальше даже под дулом пистолета. Потому что это будет откладываться на потом, фоточки будут складываться, юзер радоваться... Пока ssd не уйдёт в вальхаллу вместе со всеми фоточками/видосиками котиков