Друзья, здравствуйте!
Преамбула: Ubuntu Server 20.04.2
Достался в стародавние времена в подарок
HP Proliant MicroServer G7, на который была навешена Ubuntu Server со следующими сервисами: Plex Media Server, Transmission, OwnCloud, Samba. Все это добро крутилось на дисках, общей ёмкостью 2Tb.
Однако сначала диск, на котором крутилось облако, а в скоре и диск, на котором крутился медиа сервер, приказали долго жить.
Прикупил я себе 4x2TB диска. LVM'ом соединил 2 последовательно (Plex, Transmission, Samba) и 2 паралельно (Nextcloud). Воткнул любимую Ubuntu Server, и начал настраивать
Из софта на хост установил:
- Файловый менеджер mc
- git для получения реп
- vim как текстовый редактор
- wakeonlan что бы будить основную машинку, когда не дома
- Docker для остальных служб
Остальные сервисы решил засунуть в docker-compose файлы - соблазнила меня изоляция контейнеров и возможность быстрой и прозрачной миграции.
C transmission проблем нет. Все работает по инструкции
version: "2.1"
services:
transmission:
image: ghcr.io/linuxserver/transmission
container_name: transmission
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Almaty
- TRANSMISSION_WEB_HOME=/combustion-release/
- USER=trs
- PASS=*******
volumes:
- /media/torrents/data:/config
- /media/torrents/downloads:/downloads
- /media/torrents/watch:/watch
ports:
- 9091:9091
- 51413:51413
- 51413:51413/udp
restart: always
Утащил облачный сервис
docker-onlyoffice-nextcloud с GitHub.
docker-compose up -d
, и все за работало.
Правда очень медленно.
Прикрутил postgres, redis. Стало гораздо лучше
Именованые тома заменил на относительные пути - надо что бы данные лежали на конкретном диске.
version: '3'
services:
db:
container_name: pg-server
image: "postgres:12.5"
restart: always
environment:
POSTGRES_PASSWORD: *******
POSTGRES_USER: app_user
POSTGRES_DB: cloud_db
volumes:
- ./data/pgdb:/var/lib/postgresql/data
redis:
container_name: redis-server
image: redis:6.2.0-alpine
restart: always
app:
container_name: app-server
image: nextcloud:fpm
restart: always
expose:
- '80'
- '9000'
volumes:
- ./data/app:/var/www/html
environment:
REDIS_HOST: redis-server
onlyoffice-document-server:
container_name: onlyoffice-document-server
image: onlyoffice/documentserver:latest
restart: always
expose:
- '80'
- '443'
volumes:
- ./data/document_data:/var/www/onlyoffice/Data
- ./data/document_log:/var/log/onlyoffice
nginx:
container_name: nginx-server
image: nginx:1.15-alpine
restart: always
ports:
- 80:80
- 443:443
volumes:
- ./data/certbot/conf:/etc/nginx/certs
- ./data/certbot/www:/var/www/certbot
- ./nginx.conf:/etc/nginx/nginx.conf
- ./data/app:/var/www/html
certbot:
container_name: certbot-server
image: certbot/certbot
volumes:
- ./data/certbot/conf:/etc/letsencrypt
- ./data/certbot/www:/var/www/certbot
- ./data/certbot/logs:/var/log/letsencrypt
Про certbot - чуть позже
Ну и для полного счастья захотелось мне шифрования.
На старой конфе все поднялось без проблем. Поскольку стоял Apache для хостов, то при установке, certbot увидел конфигурацию, сам настроил его, получил сертификаты, настроил задачу на их обновление.
Тут же оказалось все чуточку сложнее.
Нашел статейку о том,
как подружить nginx с Let's Encrypt. Попробовал - сработало.
Однако при переносе оказалось, что при обращении на
/.well-known/acme-challenge/
сервер выплевывает ошибку 403.
Посмотрел по логам nginx-server - запрос есть, ответ 403.
Посмотрел по логам app-server - запрос есть, ответ 403.
т.е. nginx перенаправляет запрос по этому пути на Nextcloud, хотя мне бы хотелось, что бы просто отправлялась статика из папки контейнера
/var/www/certbot
Сейчас конфигурация такая:
# user www-data;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
upstream backend {
server app-server:9000;
}
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 3600;
map $http_host $this_host {
"" $host;
default $http_host;
}
map $http_x_forwarded_proto $the_scheme {
default $http_x_forwarded_proto;
"" $scheme;
}
map $http_x_forwarded_host $the_host {
default $http_x_forwarded_host;
"" $this_host;
}
server {
listen 88;
location / {
root /var/www/certbot;
}
}
server {
listen 80;
# Add headers to serve security related headers
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
root /var/www/html;
client_max_body_size 10G; # 0=unlimited - set max upload size
fastcgi_buffers 128 8K;
gzip off;
index index.php;
error_page 403 /core/templates/403.php;
error_page 404 /core/templates/404.php;
location /.well-known/acme-challenge/ {
proxy_pass http://localhost:88;
allow all;
}
# rewrite ^/.well-known/carddav /remote.php/dav/ permanent;
# rewrite ^/.well-known/caldav /remote.php/dav/ permanent;
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location ~ ^/(build|tests|config|lib|3rdparty|templates|data)/ {
deny all;
}
location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
deny all;
}
location / {
rewrite ^/remote/(.*) /remote.php last;
rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;
try_files $uri $uri/ =404;
}
location ~* ^/ds-vpath/ {
rewrite /ds-vpath/(.*) /$1 break;
proxy_pass http://onlyoffice-document-server;
proxy_redirect off;
client_max_body_size 100m;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_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-Host $the_host/ds-vpath;
proxy_set_header X-Forwarded-Proto $the_scheme;
}
location ~ \.php(?:$|/) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param HTTPS off;
fastcgi_param modHeadersAvailable true; #Avoid sending the security headers twice
fastcgi_pass backend;
fastcgi_intercept_errors on;
fastcgi_read_timeout 3600;
}
# Adding the cache control header for js and css files
# Make sure it is BELOW the location ~ \.php(?:$|/) { block
location ~* \.(?:css|js)$ {
add_header Cache-Control "public, max-age=7200";
# Add headers to serve security related headers
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
# Optional: Don't log access to assets
access_log off;
}
# Optional: Don't log access to other assets
location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|swf)$ {
access_log off;
}
}
}
server {
listen 88;
location / {
root /var/www/certbot;
}
}
- только что добавил. Раньше location acme-challenge было такое:
location /.well-known/acme-challenge/ {
allow all;
root /var/www/certbot;
}
Вот это комментировал - все равно не помогает:
rewrite ^/.well-known/carddav /remote.php/dav/ permanent;
rewrite ^/.well-known/caldav /remote.php/dav/ permanent;
Собственно вопрос:
Почему же не обрабатываются файла, а пересылаются на app-server?