Перейти до вмісту
VPS і сервери · 8 хв

Власна хмара 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.

Замовити Drive

Власна хмара Nextcloud на VPS: Docker, HTTPS і чесно про диск · dedisrv