Установка nextcloud на домашний сервер через docker с ssh-туннелем до VPS для удалённого доступа.

Задача: установка nextcloud на домашний локальный сервер через docker compose с установкой ssh-туннелем до VPS для доступа к nextcloud из интернета.

Шаги:

1) Создать docker compose файл

2) Установить нужные docker контейнеры

3) Проверить что все работает локально

4) Создать поддомен для удалённого доступа

5) Настроить nginx на удаленном сервере

6) Получаем SSL-сертификат

7) Открыть нужные порты на VPS

8) Создаем ssh-туннель

9) Написать службу systemd которая будет поддерживать постоянный ssh-туннель до сервера

Реализация:

1) Создать docker compose файл

mkdir -p ~/nextcloud && cd ~/nextcloud
vim docker-compose.yml

docker-compose.yml:

version: '3.7' 

services: 
 db: 
   image: mariadb 
   command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW 
   restart: always 
   volumes: 
     - db:/var/lib/mysql 
   environment: 
     - MYSQL_ROOT_PASSWORD=yourRootPassword 
     - MYSQL_PASSWORD=yourUserPassword 
     - MYSQL_DATABASE=nextcloud 
     - MYSQL_USER=nextcloud 

 app: 
   image: nextcloud 
   ports: 
     - 8082:80 
   links: 
     - db 
   volumes: 
     - nextcloud:/var/www/html 
   restart: always 
   environment: 
     - MYSQL_PASSWORD=yourUserPassword 
     - MYSQL_DATABASE=nextcloud 
     - MYSQL_USER=nextcloud 
     - MYSQL_HOST=db 

volumes: 
 db: 
 nextcloud:

Не забыть поменять yourRootPassword, yourUserPassword.

2) Установить нужные docker контейнеры

docker-compose up -d

3) Проверить что все работает локально

Заходим на http://[ip-локального-сервера]:8082 и убеждаемся, что все работает на локально.

4) Создать поддомен для удалённого доступа

Нужно создать DNS-запись у регистратора домена. Пусть это будет nextcloud.bernd32.xyz. В cloudflare это делается так: cloudflare.com -> DNS -> Add record -> name: nextcloud -> ip: [ip_сервера] -> type: A

5) Настроить nginx на удаленном сервере

sudoedit /etc/nginx/sites-available/nextcloud.bernd32.xyz

Файл должен выглядеть примерно так:

server {
       #listen [::]:80;
       server_name nextcloud.bernd32.xyz;
       access_log /var/log/nginx/nextcloud/access.log;

   location / {
       proxy_pass http://localhost:8084;
       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;
   }

Создаем симлинк конфига:

sudo ln -s /etc/nginx/sites-available/nextcloud.bernd32.xyz /etc/nginx/sites-enabled/

6) Получаем SSL-сертификат

sudo certbot --nginx -d nextcloud.bernd32.xyz
sudo systemctl reload nginx

7) Открыть нужные порты на VPS

sudo ufw allow 8082
sudo ufw allow 8084

8) Создаем ssh-туннель

/usr/bin/ssh -i <путь/до/ssh/ключа> -p 53333 -R 8084:localhost:8082 root@<VPS-IP> -NTC  -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes

Заходим на https://nextcloud.bernd32.xyz и убеждаемся что все работает.

9) Написать службу systemd которая будет поддерживать постоянный ssh-туннель до сервера

sudo vim /etc/systemd/system/nextcloud-ssh-tunnel.service
[Unit]
Description=Persistent SSH Tunnel for nextcloud  
After=network.target
 
[Service]
Restart=on-failure
RestartSec=5
ExecStart=/usr/bin/ssh -i <путь/до/ssh/ключа> -p 53333 -R 8084:localhost:8082 root@<VPS-IP> -NTC  -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes
 
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl start nextcloud-ssh-tunnel.service
sudo systemctl enable nextcloud-ssh-tunnel.service

В случае возникновения ошибки “Bad Request Your browser sent a request that this server could not understand. Apache/2.4.57 (Debian) Server at 172.19.0.3 Port 80” можно попробовать отредачить конфигурационный файл nextcloud в контейнере:

docker cp id_контейнера:/var/www/html/config/config.php ./config.php
vim ./config.php

Добавляем туда:

'trusted_proxies' => ['172.19.0.3', 'YOUR_VPS_IP'], //  172.19.0.3 внутренний айпи докера
'overwriteprotocol' => 'https',
'overwritehost' => 'nextcloud.bernd32.xyz',
'overwritecondaddr' => '^YOUR_VPS_IP$', // VPS IP

После копируем файл обратно в контейнер:

docker cp ./config.php app:/var/www/html/config/config.php

В случае возникновения каких-то проблемы логи смотреть через команду

docker logs -f айди_контейнера