Установка Nextcloud AIO с Let's Encx

Пошаговый гайд: Установка Nextcloud AIO с Let’s Encrypt

Предварительные требования

  • Сервер с Ubuntu/Debian
  • Docker и Docker Compose установлены
  • Домен, указывающий A-записью на IP сервера
  • Порт 80 открыт на файерволе (для HTTP-01 проверки Let’s Encrypt)

Этап 1: Подготовка Nginx для валидации Let’s Encrypt

Первым делом настроим Nginx только на порт 80, чтобы certbot мог пройти HTTP-01 проверку.

1.1 Создайте временную конфигурацию Nginx

nano /etc/nginx/sites-available/yoursite.com
server {
    listen 80;
    server_name yoursite.com;

    # Корень для Let's Encrypt валидации
    root /var/www/html;
    
    location /.well-known/acme-challenge/ {
        root /var/www/html;
    }

    location / {
        return 200 "Domain is ready for Nextcloud AIO setup";
    }
}

1.2 Активируйте и проверьте

# Создайте символическую ссылку
ln -s /etc/nginx/sites-available/yoursite.com /etc/nginx/sites-enabled/yoursite.com

# Проверьте конфигурацию
nginx -t

# Перезагрузите Nginx
systemctl reload nginx

1.3 Создайте директорию для сертификатов

mkdir -p /etc/nginx/ssl/yoursite.com

Этап 2: Получение Let’s Encrypt сертификатов до установки Nextcloud

2.1 Установите certbot

apt update
apt install -y certbot

2.2 Выпустите сертификаты (варианты)

Вариант A: Certbot в ручном режиме (рекомендуется для точного контроля)

certbot certonly --webroot -w /var/www/html -d yoursite.com --non-interactive --agree-tos --email your@email.com

Вариант B: С плагином nginx (автоматически изменит конфиг)

apt install -y python3-certbot-nginx
certbot --nginx -d yoursite.com --non-interactive --agree-tos --email your@email.com

Вариант C: Если нужно и для основного домена и для www

certbot certonly --webroot -w /var/www/html -d yoursite.com -d www.yoursite.com --non-interactive --agree-tos --email your@email.com

2.3 Проверьте, что сертификаты созданы

ls -la /etc/letsencrypt/live/yoursite.com/

Этап 3: Обновление конфигурации Nginx для Nextcloud AIO

3.1 Замените конфиг на полноценный

nano /etc/nginx/sites-available/yoursite.com

Замените содержимое на:

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

# HTTP → HTTPS редирект
server {
    listen 80;
    server_name yoursite.com;

    location /.well-known/acme-challenge/ {
        root /var/www/html;
    }

    location / {
        return 301 https://$server_name$request_uri;
    }
}

# Основной HTTPS сервер
server {
    listen 443 ssl http2;
    server_name yoursite.com;

    # Let's Encrypt сертификаты
    ssl_certificate /etc/letsencrypt/live/yoursite.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yoursite.com/privkey.pem;

    # Современные настройки SSL
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;

    # Заголовки безопасности
    add_header Strict-Transport-Security "max-age=63072000" always;
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";

    # Максимальный размер загрузки
    client_max_body_size 0;
    client_body_timeout 3600s;
    client_header_timeout 3600s;

    # Проксирование к Apache Nextcloud AIO
    location / {
        proxy_pass http://127.0.0.1:11000;
        proxy_http_version 1.1;
        
        # Прокси-заголовки
        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_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Port $server_port;
        
        # WebSocket поддержка (для Talk, Notify Push)
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        
        # Таймауты
        proxy_read_timeout 3600s;
        proxy_connect_timeout 3600s;
        proxy_send_timeout 3600s;
        
        # Буферизация
        proxy_buffering off;
        proxy_request_buffering off;
    }
}

3.2 Проверьте и перезагрузите

nginx -t && systemctl reload nginx

Этап 4: Настройка Docker Compose для Nextcloud AIO

4.1 Создайте директорию и конфигурацию

mkdir -p /opt/nextcloud-aio
cd /opt/nextcloud-aio
nano docker-compose.yml
name: nextcloud-aio
services:
  nextcloud-aio-mastercontainer:
    image: ghcr.io/nextcloud-releases/all-in-one:latest
    init: true
    restart: always
    container_name: nextcloud-aio-mastercontainer
    volumes:
      - nextcloud_aio_mastercontainer:/mnt/docker-aio-config
      - /var/run/docker.sock:/var/run/docker.sock:ro
    network_mode: bridge
    ports:
      - "127.0.0.1:8080:8080"  # AIO интерфейс только локально
    environment:
      APACHE_PORT: 11000
      APACHE_IP_BINDING: 127.0.0.1

volumes:
  nextcloud_aio_mastercontainer:
    name: nextcloud_aio_mastercontainer

4.2 Запустите мастер-контейнер

docker compose up -d

4.3 Проверьте логи

docker logs nextcloud-aio-mastercontainer --tail 30

Должны увидеть:

Initial startup of Nextcloud All-in-One complete!
You should be able to open the Nextcloud AIO Interface now on port 8080 of this server!

Этап 5: Инициализация Nextcloud AIO

5.1 Подключитесь к AIO интерфейсу через SSH-туннель

С вашего локального компьютера:

ssh -L 8080:127.0.0.1:8080 root@<IP-вашего-сервера>

Откройте в браузере: https://localhost:8080

5.2 Сохраните пароль AIO

На открывшейся странице скопируйте passphrase (12 случайных слов). Это пароль для входа в панель управления AIO.

Нажмите “Open Nextcloud AIO login” и войдите.

5.3 Введите домен

  • В поле “Domain” введите: yoursite.com
  • Нажмите Submit

5.4 Дождитесь проверки домена

Теперь у вас настоящий Let’s Encrypt сертификат, и проверка должна пройти успешно с первого раза!

Если вдруг не пройдёт — используйте SKIP_DOMAIN_VALIDATION: true в docker-compose.yml.

5.5 Сохраните пароль администратора Nextcloud

После проверки появится блок с учётными данными:

Username: admin
Password: **********

Скачайте файл с паролем или скопируйте его.

5.6 Запустите контейнеры

Нажмите “Start containers” и дождитесь, пока все контейнеры перейдут в статус Running (5-15 минут).


Этап 6: Автонастройка Let’s Encrypt для автообновления

6.1 Настройте автообновление сертификатов

Создайте systemd-таймер или cron-задачу:

# Создайте скрипт для обновления
nano /usr/local/bin/renew-cert.sh
#!/bin/bash
certbot renew --quiet --post-hook "systemctl reload nginx"
chmod +x /usr/local/bin/renew-cert.sh

6.2 Добавьте в cron

crontab -e

Добавьте:

0 3 * * * /usr/local/bin/renew-cert.sh

Этап 7: Финальная проверка

7.1 Проверьте, что всё работает

# Все контейнеры должны быть Running
docker ps --filter "name=nextcloud-aio"

# Проверьте доступность
curl -I https://yoursite.com

7.2 Войдите в Nextcloud

Откройте в браузере: https://yoursite.com

Логин: admin Пароль: из шага 5.5


Восстановление пароля администратора Nextcloud (если потеряли)

docker exec -it --user www-data nextcloud-aio-nextcloud php occ user:resetpassword admin

Дополнительные рекомендации

Бэкап сертификатов

tar -czf /root/ssl-backup-$(date +%Y%m%d).tar.gz /etc/letsencrypt/

Мониторинг сертификатов

# Проверить срок действия
certbot certificates

Обновление Nextcloud AIO

Всё обновляется через AIO интерфейс автоматически, включая все контейнеры.