下記の内容を参考に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