RedashのHTTPS対応(SSL)(Let’s Encrypt)

未分類

下記の内容を参考にRedash V8のHTTPS(SSL)対応をLet’s Encryptで行いました。

Setting up HTTPS with LetsEncrypt for Redash Docker Deployment · GitHub

Let’s Encryptで設定するためにドメインがRedashサーバーを向いていて、外部(インターネット)からアクセスできる必要があります。

ディレクトリ作成

RedashのサーバーにSSH接続してディレクトリを作成します。

$ cd /opt/redash
$ sudo su
$ mkdir nginx
$ mkdir nginx/certs
$ mkdir nginx/certs-data

nginx.confファイルの作成

nginx.confを作成します。
ドメイン名(example.redashapp.com) は変更してください。

$ vim nginx/nginx.conf
upstream redash {
    server redash:5000;
}

server {
    listen      80;
    listen [::]:80;
    server_name example.redashapp.com;

    location ^~ /ping {
        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-Proto $scheme;

        proxy_pass       http://redash;
    }

    location / {
        rewrite ^ https://$host$request_uri? permanent;
    }

    location ^~ /.well-known {
        allow all;
        root  /data/letsencrypt/;
    }
}

docker-compose.ymlの変更

バックアップ用にコピーして、nginxのportsとvolumesの設定を追加します。

$ cp docker-compose.yml docker-compose.yml.org
$ vim docker-compose.yml
  nginx:
    image: redash/nginx:latest
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - server
    links:
      - server:redash
    volumes:
      - /opt/redash/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
      - /opt/redash/nginx/certs:/etc/letsencrypt
      - /opt/redash/nginx/certs-data:/data/letsencrypt
    restart: always

Dockerコンテナの再作成

単に「docker-compose up」だとOut of memoryエラーになってしまったので、停止して再作成しました。

$ docker-compose down
$ docker-compose up -d

証明書の生成

certbotでLet’s Encryptの証明書を生成します。
ドメイン名(example.redashapp.com) を変更してから実行してください。

セキュリティグループ(AWS)などで外部からのアクセスを遮断していると失敗してしまうので注意が必要です。

$ docker run -it --rm -v /opt/redash/nginx/certs:/etc/letsencrypt -v /opt/redash/nginx/certs-data:/data/letsencrypt deliverous/certbot certonly --webroot --webroot-path=/data/letsencrypt -d example.redashapp.com

nginx.confファイルの変更

SSLの設定をnginx.confファイルに追加します。
ドメイン名(example.redashapp.com)の変更を忘れないでください。

$ vim nginx/nginx.conf
upstream redash {
    server redash:5000;
}

server {
    listen      80;
    listen [::]:80;
    server_name example.redashapp.com;

    location ^~ /ping {
        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-Proto $scheme;

        proxy_pass       http://redash;
    }

    location / {
        rewrite ^ https://$host$request_uri? permanent;
    }

    location ^~ /.well-known {
        allow all;
        root  /data/letsencrypt/;
    }
}

server {
    listen      443           ssl http2;
    listen [::]:443           ssl http2;
    server_name               example.redashapp.com;

    add_header                Strict-Transport-Security "max-age=31536000" always;

    ssl_session_cache         shared:SSL:20m;
    ssl_session_timeout       10m;

    ssl_protocols             TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers               "ECDH+AESGCM:ECDH+AES256:ECDH+AES128:!ADH:!AECDH:!MD5;";

    ssl_stapling              on;
    ssl_stapling_verify       on;
    resolver                  8.8.8.8 8.8.4.4;

    ssl_certificate           /etc/letsencrypt/live/example.redashapp.com/fullchain.pem;
    ssl_certificate_key       /etc/letsencrypt/live/example.redashapp.com/privkey.pem;
    ssl_trusted_certificate   /etc/letsencrypt/live/example.redashapp.com/chain.pem;

    access_log                /dev/stdout;
    error_log                 /dev/stderr info;

    # other configs

    location / {
        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-Proto $http_x_forwarded_proto;

        proxy_pass       http://redash;
    }
}

nginxの再起動

nginxを再起動したらHTTPSでアクセスできるようになります。

$ docker-compose restart nginx

証明書の更新

次のコマンドで証明書の更新ができます。

$ docker run -t --rm -v /opt/redash/nginx/certs:/etc/letsencrypt -v /opt/redash/nginx/certs-data:/data/letsencrypt deliverous/certbot renew --webroot --webroot-path=/data/letsencrypt
$ docker-compose kill -s HUP nginx
タイトルとURLをコピーしました