TrueNAS 의 Plugin 을 이용해서 설치한 NextCloud 에 Reverse Proxy 적용하기

사실, 타오나스를 하나 따로 운용하고 있어서 별도의 파일관리 앱은 설치하지 않으려고 했는데, 근질근질한 걸 참다참다 정신을 차려보니 이미 설치를 끝낸 상태였다. 시험삼아 아이패드의 사진을 동기화 시켰는데, 생각보다 성능이 잘 나와서 어쩔까 고민을 하고 있다. 하긴, J1900 과 E3 1265L… 못해도 두 체급은 넘게 차이가 날 테니, 파일 스테이션에 비해 NextCloud 쪽이 무겁다 해도 더 빠를 수 밖에 없긴 하다.

설치하고 난 뒤에 접속 해 보면… 안 된다. 신뢰할 수 있는 도메인을 통해서만 접속할 수 있기 때문이다. 그러니 일단 무조건 쉘로 접속해서 설정 파일을 살짝 마사지 해 줘야 한다.

먼저 NextCloud 가 설치된 Jail 의 IP 를 확인해야 한다. 그 다음, NextCloud 가 설치된 폴더로 이동해서 설정 파일을 에디터로 연다.

# cd /usr/local/www/nextcloud/config
# ee config.php 

스크롤을 조금만 내려보면…

  'trusted_domains' =>
  array (
    0 => 'localhost',
    1 => '192.168.0.3',
    2 => '192.168.0.6',
  ),

trusted_domains 라는 항목이 있는데, 거기에 아까 확인 해 둔 Jail 의 IP 를 넣어준다. 저기 “2 =>” 가 내가 추가한 항목이다. 저장하고 다시 접속해본다. 아마 그냥 해도 될 텐데, 혹시 안된다면 NginX 를 재시작.

이제 저 IP 로 접속하면 SSL 설정이 제대로 되어 있지 않을 때의 화면 – 정확하게는 인증서가 잘 못 되어 있을 때 – 이 나온다. 에러를 무시하면 어떻게든 접속 할 수 있다. 참고로 초기 Admin 패스워드는 Plugin 항목에서 Post Install Notes 를 클릭하면 확인할 수 있다.

그러니 초기 Admin 패스워드는 건드리지 않는 편이 좋습니다.

이제 어떻게든 접속은 할 수 있다. 하지만 이대로 사용하는 것은 무리다.

심화과정

문제는 Plugins 을 통해서 설치한 NextCloud 는 외부 IP 에 바로 매핑해서 사용하는 것을 전제로 설정되어 있어서, 이 상태로는 내 서버에서 사용할 수 없다. 내 서버는 리버스 프록시가 적용되어 있고 인증서 또한 리버스 프록시 서버에 다 들어있기 때문에, NextCloud 를 구동하는 NginX 의 SSL 설정을 지우고 NextCloud 의 SSL 설정도 리버스 프록시에 대응하도록 변경해야 한다.

작업 순서는 이렇다.

  1. 도메인 등록 대행 업체의 Domain 설정에서 CNAME 을 이용해서 Sub Domain 을 추가.
  2. 리버스 프록시 서버의 NginX 에 NextCloud 의 설정을 추가.
  3. Certbot 을 이용해서 인증서에 서브도메인 설정을 갱신.
  4. NextCloud 를 구동하고 있는 NginX 의 설정 파일에서 SSL 관련 부분을 제거.
  5. NextCloud 에 새로운 서브도메인 설정을 추가.

하지마루요~

서브도메인 등록

CNAME 항목에 서브 도메인을 등록한다. ‘나는 이런 도메인을 쓸 거다.’ 라고 적으면, 도메인 등록 대행 업체의 DNS 서버가 부지런히 전파해 준다.

Reverse Proxy Server 설정

리버스 프록서 서버에 새로운 서브도메인의 설정을 해 줘야 한다. 나는 이전에 해 두었던 블로그 서버의 설정을 고대로 복사해서 서브도메인만 변경해주었다.

리버스 프록시 서버의 쉘을 열어서…

# cd /usr/local/etc/nginx/domains 
# cp site_wordpress.conf site_nextcloud.conf
# ee site_nextcloud.conf

원래 있던 설정파일 – wordpress – 을 새로운 이름 – nextcloud – 으로 복사하고, 에디터로 열어서 NextCloud 를 구동하는 Jail 의 IP 주소와 사용 할 서브도메인으로 바꿨다. client_max_body_size 도 적당한 용량으로 설정한다. 메가바이트면 M, 기가바이트면 G 를 붙여준다.

server
{
        server_name cloud.minarinari.com;
        client_max_body_size 4G;

        location /
        {
                ...

                # my server
                proxy_pass http://192.168.0.6;
        }

    listen [::]:443 ssl; # managed by Certbot
    ...
}
server
{
    if ($host = cloud.minarinari.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


        listen [::]:80;
        listen 80;
        server_name cloud.minarinari.com;
    return 404; # managed by Certbot
}

저장하고 NginX 를 재시작한다.

인증서 갱신

각각 개별로 갱신하는 것이 베스트지만, 그런 거 할 줄 모른다. 그냥 전부 갱신한다.

# certbot --nginx

중간에 갱신할 도메인의 목록이 나온다. 추가한 도메인이 있는지 확인하고 엔터만 치면 전부 자동으로 된다.

NextCloud 가 구동되는 NginX 설정

NextCloud 를 구동하는 NginX 의 설정 파일에서 SSL 관련 설정을 제거해야 한다. 리버스 프록시 서버에 이미 SSL 이 돌아가고 있기 때문에, 그 하단에 물린 NextCloud 의 NginX 서버는 SSL 을 구동할 이유가 없다. 그리고 제거 안하면 웹으로는 어떻게든 동작이 되는데, 스마트폰 용 클라이언트에서는 신규 로그인 과정에서 무한 루프에 빠진다.

NextCloud 를 구동하는 Jail 의 쉘을 열어서…

# cd /usr/local/etc/nginx
# ee nginx.conf

NginX 의 설정 파일을 열어 SSL 에 관련된 부분을 제거한다. #SSL 이라고 된 부분부터 #OCSP Stapling 이라고 된 부분까지, 그 사이에 있는 구문 전부가 해당된다. 중간에 있는 client_max_body_size 도 수정해 줘야 한다.


load_module /usr/local/libexec/nginx/ngx_mail_module.so;
load_module /usr/local/libexec/nginx/ngx_stream_module.so;

user www;
worker_processes auto;

pid /var/run/nginx.pid;

events {
  use kqueue;
  worker_connections 1024;
  multi_accept on;
}
http {
...

  # Common limits
  client_max_body_size 4G; # upload size
  ...

  # SSL
  # ----------

  ssl_certificate /usr/local/etc/letsencrypt/live/truenas/fullchain.pem;
  ssl_certificate_key /usr/local/etc/letsencrypt/live/truenas/privkey.pem;
  ...

  # intermediate configuration
  ...

  # OCSP Stapling
  ssl_stapling on;
  ssl_stapling_verify on;

  ...
}

설정 파일은 하나 더 있다. 지금 작업하는 etc 폴더 아래에 conf.d 라는 폴더가 있다. 그 안에 nextcloud 설정 파일이 있다.

# cd /usr/local/etc/nginx/conf.d
# ee nextcloud.conf

마찬가지로 SSL 에 관련된 설정을 전부 지워준다.

upstream php-handler {
    server unix:/var/run/nextcloud-php-fpm.sock;
}

# Redirect to HTTPS
server {
    listen 80 default_server;
    listen [::]:80;

    location ^~ /.well-known/acme-challenge {
        # Path to the root of your installation
        root /usr/local/www/nextcloud/;
        try_files $uri $uri/ =404;
    }

    location / {
       return 301 https://$host:443$request_uri;
    }
}

server {
    listen 443 ssl http2;
    server_name _;

    # HSTS settings
    # WARNING: Only add the preload option once you read about
    # the consequences in https://hstspreload.org/. This option
    # will add the domain to a hardcoded list that is shipped
    # in all major browsers and getting removed from this list
    # could take several months.
    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains;"always;

    include conf.d/nextcloud.inc;
}

저장하고 NginX 를 재시작한다. 내부 IP 를 통해 접속해보면 HTTPS 가 제거된 것을 확인 할 수 있다. Nextcloud 설정까지 전부 끝내고 도메인을 통해 접속했을 때, “Too Many HTTP Redirects” 나 “Load cannot flow more than 20 redirections” 등의 메시지가 나온다면 이 과정에서 뭔가 잘 못 되었을 확률이 크다.

NextCloud 설정

저기 위에, 처음 NextCloud 를 설치하고 나서 IP 추가했던 작업과 거의 동일하다. 사용 할 서브도메인을 설정파일의 trusted_domains 항목에 추가한다.

# cd /usr/local/www/nextcloud/config
# ee config.php 
  'trusted_domains' =>
  array (
    0 => 'localhost',
    1 => '192.168.0.3',
    2 => '192.168.0.6',
    3 => 'cloud.minarinari.com',
  ),

여기까지 하면 웹에서는 에러 메시지 없이 적당히 이용할 수 있지만, 스마트폰 클라이언트에서는 여전히 무한루프에 빠진다. 원인은 리버스 프록시에서는 SSL 을 적용하고 있는데, 그 하단에 물린 NextCloud 와 그 서버는 HTTP 로 구동되고 있기 때문이다. 그러니, NextCloud 에게 HTTP 주소를 HTTPS 로 바꾸도록 알려줘야 한다.

위에서 열었던 config.php 의 적당한 곳에 아래 구문을 삽입한다.

  'overwriteprotocol' => 'https',
  'overwritehost' => 'cloud.minarinari.com',
  'overwrite.cli.url' => 'http://cloud.minarinari.com',

저장하고 NginX 를 재시작한다.

— 참고사이트 —

https://docs.nextcloud.com/server/19/admin_manual/configuration_server/config_sample_php_parameters.html?highlight=overwrite%20cli%20url

답글 남기기

이메일 주소는 공개되지 않습니다.