Google Drive и Dropbox удобны ровно до тех пор, пока не упрётесь в лимит тарифа, не столкнётесь с блокировкой аккаунта без объяснения причин или не задумаетесь, где физически лежат файлы клиентов. Для бизнеса, который и так держит сервер, домен и почту у себя, файловое хранилище на чужих серверах — последнее слабое звено. Nextcloud закрывает эту задачу: синхронизация файлов, шаринг по ссылке, календарь и контакты — всё на вашем сервере, без ежемесячной платы за терабайты.

Чем плохи Google Drive и Dropbox для бизнеса

  • Тариф растёт вместе с объёмом. Цена за хранилище кусается уже на паре терабайт, а масштабировать её нельзя — только платить за следующий уровень тарифа целиком, даже если нужно на 20% больше места.
  • Файлы клиентов — на чужом сервере. Договоры, сканы документов, бухгалтерия сотрудников физически хранятся в дата-центре другой компании, часто за рубежом. Для данных, которые не должны покидать периметр компании, это готовый повод для отказа на любой проверке безопасности.
  • Блокировка аккаунта — не ваше решение. Автоматическая система модерации Google может заблокировать аккаунт за один подозрительный файл — и доступ к остальным терабайтам данных пропадёт вместе с ним, пока не разберётся поддержка.
  • Совместное редактирование — по сути слежка за активностью. Метаданные о том, кто, когда и что открывал, анализируются платформой в маркетинговых целях — это часть модели монетизации бесплатных и части платных тарифов.

Что даёт Nextcloud

Nextcloud — open-source платформа для хранения и синхронизации файлов, которую можно развернуть на любом VPS. По функциям она закрывает 90% того, ради чего обычно держат Google Drive или Dropbox:

  • Синхронизация файлов между компьютером, телефоном и веб-интерфейсом
  • Шаринг по ссылке с паролем и сроком действия
  • Календарь и контакты с синхронизацией по CalDAV/CardDAV (заменяет Google Calendar)
  • Доступ по WebDAV — можно подключить как сетевой диск в проводнике Windows или Finder
  • Совместное редактирование документов через встроенную интеграцию с OnlyOffice или Collabora (по желанию, отдельный контейнер)

Установка на сервер

Разворачиваю на Podman, а не на Docker — он запускает контейнеры без демона и без root по умолчанию, поэтому даже если в самом Nextcloud или его зависимостях найдётся уязвимость, у процесса внутри контейнера физически не будет прав что-то сломать в системе. Подробнее о том, почему это разумный выбор по умолчанию, — в статье Alpine vs Debian для контейнеров.

1. Требования

Для 5–10 пользователей и несотен гигабайт данных хватит VPS с 2 ГБ RAM и 2 vCPU. Нужен Podman версии 4.4 или новее — в ней появился Quadlet, генератор systemd-юнитов из декларативных файлов, на котором дальше всё и держится.

2. Отдельный пользователь для сервиса

Контейнеры Nextcloud запускаются без root, от имени отдельного системного пользователя:

sudo useradd -r -m -s /usr/bin/bash nextcloud
sudo loginctl enable-linger nextcloud

enable-linger — обязательный шаг: без него systemd остановит все контейнеры пользователя сразу после того, как закончится его последняя сессия, даже если вы просто отключитесь по SSH.

Дальше все команды — от имени этого пользователя:

sudo -u nextcloud -i
mkdir -p ~/.config/containers/systemd

3. Пароль базы данных как секрет Podman

Вместо пароля в переменной окружения открытым текстом — секрет Podman:

printf 'замените-на-свой-пароль' | podman secret create nc_db_password -

4. Quadlet-юниты

Сеть — ~/.config/containers/systemd/nextcloud.network:

[Network]

Тома — ~/.config/containers/systemd/nextcloud-db.volume и nextcloud-data.volume:

[Volume]

База данных — ~/.config/containers/systemd/nextcloud-db.container:

[Unit]
Description=MariaDB для Nextcloud

[Container]
Image=docker.io/library/mariadb:11
ContainerName=nextcloud-db
Network=nextcloud.network
Volume=nextcloud-db.volume:/var/lib/mysql:Z
Secret=nc_db_password,type=env,target=MYSQL_PASSWORD
Environment=MYSQL_DATABASE=nextcloud
Environment=MYSQL_USER=nextcloud
Environment=MYSQL_RANDOM_ROOT_PASSWORD=yes

[Service]
Restart=always

[Install]
WantedBy=default.target

Само приложение — ~/.config/containers/systemd/nextcloud-app.container:

[Unit]
Description=Nextcloud
After=nextcloud-db.service
Requires=nextcloud-db.service

[Container]
Image=docker.io/library/nextcloud:apache
ContainerName=nextcloud-app
Network=nextcloud.network
Volume=nextcloud-data.volume:/var/www/html:Z
PublishPort=127.0.0.1:8080:80
Secret=nc_db_password,type=env,target=MYSQL_PASSWORD
Environment=MYSQL_HOST=nextcloud-db
Environment=MYSQL_DATABASE=nextcloud
Environment=MYSQL_USER=nextcloud
Environment=NEXTCLOUD_TRUSTED_DOMAINS=cloud.вашдомен.ру

[Service]
Restart=always
TimeoutStartSec=300

[Install]
WantedBy=default.target

Network= и Volume= здесь ссылаются на имена файлов юнитов, а не на объекты Podman напрямую — Quadlet сам создаёт нужную последовательность запуска. Порт публикуется только на 127.0.0.1 — как и раньше, снаружи Nextcloud доступен исключительно через reverse proxy.

5. Запуск

systemctl --user daemon-reload
systemctl --user start nextcloud-app.service
systemctl --user status nextcloud-app.service

Строка Loaded: ... generated в выводе status подтверждает, что юнит создан именно генератором Quadlet, а не руками.

6. Nginx и HTTPS

Эта часть от рантайма не зависит — запросы так же проксируются на 127.0.0.1:8080 и на этом уровне неважно, Podman там или Docker:

server {
    listen 80;
    server_name cloud.вашдомен.ру;
    client_max_body_size 10G;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 3600;
    }
}
sudo certbot --nginx -d cloud.вашдомен.ру

client_max_body_size увеличен до 10 ГБ — иначе загрузка крупных файлов оборвётся с ошибкой 413 на уровне Nginx ещё до того, как запрос дойдёт до Nextcloud.

7. Фоновые задачи через cron

Nextcloud регулярно выполняет фоновые задачи — очистку кэша превью, отправку уведомлений, проверку версий файлов. По умолчанию это пытается делать браузер посетителя при каждой загрузке страницы, что и медленно, и ненадёжно. Правильный способ — cron от имени того же пользователя:

sudo -u nextcloud crontab -e
*/5 * * * * podman exec --user www-data nextcloud-app php cron.php

Затем в Настройки → Основные → Фоновые задания переключите режим на «Cron».

Подключение устройств

  • Десктоп — приложение Nextcloud Desktop (Windows/macOS/Linux) синхронизирует выбранную папку так же, как клиент Dropbox.
  • Телефон — приложение Nextcloud из App Store/Google Play с автозагрузкой фото, как в Google Photos.
  • Сетевой диск — подключение по WebDAV-адресу https://cloud.вашдомен.ру/remote.php/dav/files/USERNAME/ без установки отдельного приложения.

Чего в Nextcloud нет — и когда это важно

Совместное редактирование документов работает через отдельный контейнер (OnlyOffice или Collabora) — это дополнительная нагрузка на сервер и по ощущениям чуть медленнее, чем Google Docs, особенно при одновременном редактировании большой таблицы несколькими людьми. Если для команды критична мгновенная синхронизация правок в духе Google Sheets на большом файле — Google Workspace здесь всё ещё сильнее. Для хранения, синхронизации и шаринга файлов — то есть для 90% повседневных задач — разницы не заметно.

Типичные ошибки

  • Забыли loginctl enable-linger. Самая частая неожиданность в rootless-контейнерах: всё работает, пока открыта SSH-сессия, и падает через пару минут после отключения — systemd останавливает все контейнеры пользователя вместе с его сессией. Если сервер не перезагружался неделями, это может «прятаться» и вылезти в самый неподходящий момент.
  • Забыли client_max_body_size в Nginx. Загрузка файлов больше 1 МБ обрывается с ошибкой 413, а в логах Nextcloud при этом чисто — смотреть нужно в логи Nginx.
  • Фоновые задачи остались в режиме AJAX. Без правильно настроенного cron превью картинок не обновляются, а уведомления приходят с опозданием на часы.
  • NEXTCLOUD_TRUSTED_DOMAINS не совпадает с реальным доменом. Nextcloud блокирует доступ с «недоверенного» домена белым экраном без внятной ошибки — частая причина паники при первом запуске.
  • Бэкапится только том с файлами, без базы данных. Файлы без базы MariaDB — это просто набор файлов без метаданных о том, кому они принадлежат и как расшарены. В бэкап обязательно должны попадать оба тома (systemd-nextcloud-db и systemd-nextcloud-data) — см. Borg Backup.

Сколько это стоит

Сам Nextcloud бесплатен и не ограничивает объём хранилища ничем, кроме места на диске сервера. Затраты — это VPS с нужным объёмом диска: 500 ГБ NVMe на большинстве провайдеров обойдётся дешевле, чем аналогичный объём в тарифах Google Workspace или Dropbox Business на команду от 5 человек, а масштабируется докупкой диска, а не переходом на следующий тарифный план целиком.

Итог

Nextcloud закрывает базовую задачу — синхронизацию и шаринг файлов — без месячной платы за терабайты и без файлов клиентов на серверах чужой юрисдикции. Разворачивается за час вместе с Nginx и HTTPS, а дальше требует внимания примерно раз в пару месяцев — на обновление версии.

Похожие материалы

Если нужно развернуть собственное файловое хранилище или перенести данные из Google Drive/Dropbox — напишите, настрою и перенесу файлы без простоя.