Своё облако Nextcloud на VPS: Docker, HTTPS и честно про диск
Nextcloud на VPS — это своя синхронизация файлов, календари, контакты и совместные документы без стороннего облака. С Docker Compose, MariaDB, Redis и Caddy для автоматического HTTPS он поднимается примерно за 20 минут. Подвох в диске: у VPS-тарифов небольшие NVMe-диски, поэтому используйте Nextcloud для синхронизации и работы с документами, а объёмные данные храните в другом месте.
Что понадобится
- VPS. Drive (2 vCPU, 4 ГБ RAM, 20 ГБ NVMe, $15 в месяц) — разумный старт для семьи или небольшой команды. На Pulse с 2 ГБ Nextcloud работает для одного-двух пользователей, но почти без запаса. Если добавляете Nextcloud Office (Collabora), берите Forge или Titan: сервер документов сам по себе хочет гигабайт и больше.
- Домен или поддомен (например,
cloud.example.com) с A-записью на IP сервера. - Docker на Ubuntu 24.04 или Debian 12 (см. Docker на VPS).
Про диск
У самого большого VPS, Titan, 30 ГБ, и несколько гигабайт из них займут система и образы Docker. Этого хватает на документы, календари и контакты небольшой команды, а синхронизация фото с телефонов заполнит его за несколько месяцев. На видеоархив или фото за много лет — нет. Для них либо подключите внешнее хранилище (шаг 6), либо переходите на выделенный сервер с терабайтами NVMe. Не знаете, какой размер нужен? Смотрите Как выбрать тариф VPS.
1. Файрвол и Docker
apt update && apt install -y ufw
ufw allow 22/tcp && ufw allow 80/tcp && ufw allow 443/tcp && ufw allow 443/udp
ufw enable
curl -fsSL https://get.docker.com | sh
2. Секреты
mkdir -p /opt/nextcloud && cd /opt/nextcloud
cat > .env <<EOF
DOMAIN=cloud.example.com
DB_PASSWORD=$(openssl rand -hex 16)
DB_ROOT_PASSWORD=$(openssl rand -hex 16)
ADMIN_PASSWORD=$(openssl rand -hex 12)
EOF
chmod 600 .env && cat .env
Запишите ADMIN_PASSWORD: это пароль пользователя admin.
3. docker-compose.yml
/opt/nextcloud/docker-compose.yml:
services:
db:
image: mariadb:11.4
restart: unless-stopped
command: --transaction-isolation=READ-COMMITTED
environment:
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MARIADB_DATABASE: nextcloud
MARIADB_USER: nextcloud
MARIADB_PASSWORD: ${DB_PASSWORD}
volumes:
- db:/var/lib/mysql
redis:
image: redis:7-alpine
restart: unless-stopped
app:
image: nextcloud:stable
restart: unless-stopped
depends_on: [db, redis]
environment:
MYSQL_HOST: db
MYSQL_DATABASE: nextcloud
MYSQL_USER: nextcloud
MYSQL_PASSWORD: ${DB_PASSWORD}
REDIS_HOST: redis
NEXTCLOUD_ADMIN_USER: admin
NEXTCLOUD_ADMIN_PASSWORD: ${ADMIN_PASSWORD}
NEXTCLOUD_TRUSTED_DOMAINS: ${DOMAIN}
OVERWRITEPROTOCOL: https
OVERWRITECLIURL: https://${DOMAIN}
TRUSTED_PROXIES: 172.16.0.0/12
PHP_UPLOAD_LIMIT: 2G
PHP_MEMORY_LIMIT: 512M
volumes:
- nextcloud:/var/www/html
cron:
image: nextcloud:stable
restart: unless-stopped
entrypoint: /cron.sh
depends_on: [app]
volumes:
- nextcloud:/var/www/html
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
volumes:
db:
nextcloud:
caddy_data:
4. Caddyfile
/opt/nextcloud/Caddyfile (замените домен):
cloud.example.com {
header Strict-Transport-Security "max-age=15552000"
redir /.well-known/carddav /remote.php/dav 301
redir /.well-known/caldav /remote.php/dav 301
reverse_proxy app:80
}
5. Запуск
cd /opt/nextcloud
docker compose up -d
docker compose logs -f app
docker compose exec -u www-data app php occ background:cron
При первом запуске Nextcloud устанавливается, это минута-две. Затем войдите на https://cloud.example.com как admin.
6. Держите диск под контролем
docker compose exec -u www-data app php occ config:system:set trashbin_retention_obligation --value="auto, 30"
docker compose exec -u www-data app php occ config:system:set versions_retention_obligation --value="auto, 30"
docker compose exec -u www-data app php occ user:setting alice files quota "5 GB"
docker compose exec -u www-data app php occ app:enable files_external
Удалённые файлы и старые версии хранятся не дольше 30 дней, а у каждого пользователя есть квота. Приложение External storage монтирует как папку S3-совместимое хранилище, SFTP или WebDAV на другой машине, и объёмные данные вообще не попадают на диск VPS. Свободное место проверяйте командой df -h /.
Частые ошибки
- «Access through untrusted domain». Вы открыли сервер по IP или по другому имени. Заходите по домену из
.env. - Не загружаются большие файлы. Увеличьте
PHP_UPLOAD_LIMITи выполнитеdocker compose up -d. - Пропуск мажорных версий. Nextcloud обновляется только на одну мажорную версию за раз. Запускайте
docker compose pull && docker compose up -dрегулярно, а не раз в год. - Бэкапы — ваша задача.
docker compose exec -T db sh -c 'mariadb-dump -u root -p"$MARIADB_ROOT_PASSWORD" nextcloud' > nextcloud.sqlплюс томnextcloud, с копированием за пределы сервера.
Хотите автоматизировать что-то вокруг своего облака? Смотрите n8n на VPS.