ermek6
@ermek6
::Живу с удовольствием::

Как правильно в docker-compose для Nextcloud подружить nginx и certbot?

Друзья, здравствуйте!

Преамбула: 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?
  • Вопрос задан
  • 1471 просмотр
Пригласить эксперта
Ответы на вопрос 1
vasilyevmn
@vasilyevmn
DevOps
Вот тут есть варианты.
https://github.com/ONLYOFFICE/docker-onlyoffice-ne...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы