Задача: установка 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 айди_контейнера