もし初めてVPSをご利用の場合
初期セットアップにVPSの初期セットアップ手順をまとめています。良ければご一読してみてください。
その他の利用環境について
VPSでの環境構築が大変だな、と思ったら以下の3つもご検討の価値ありです。
もし代行をご希望の方は、問い合わせフォームからお気軽にご連絡ください。
- conoHa VPSのテンプレート利用
- My Redmineのクラウドサービス利用
- 環境構築代行(お問い合わせフォームからお気軽にご連絡ください。)
VPSでRedmine環境を構築
それでは、今回のRedmineを構築する際のサーバ構成です。
docker環境の構築がまだの場合は、docker環境構築を参考にして頂ければと思います。
├── redmine
│ └── docker-compose.yml
└── ssl
└── docker-compose.yml
dockerイメージは3つ利用しています。
- Redmine
- jwilder/nginx-proxy
- jrcs/letsencrypt-nginx-proxy-companion
jwilder/nginx-proxyはリバースプロキシになります。
jrcs/letsencrypt-nginx-proxy-companion はLet’s Encryptを使ったSSL証明書の自動更新コンテナです。
どちらのイメージもLet’s EncryptでSSL化と自動更新 に詳細を説明しています。
docker-compose.yml の設定内容
具体的な設定を確認していきます。
redmine/docker-compose.yml
まずはRedmineです。
本家のdocker-compose.ymlをもとに、SSL化に必要な設定を追加していきます。
version: '3.1'
services:
redmine:
image: redmine
restart: always
ports:
- 8080:3000
environment:
REDMINE_DB_MYSQL: db
REDMINE_DB_PASSWORD: example
REDMINE_SECRET_KEY_BASE: supersecretkey
db:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: redmine
ここに以下の設定を追加します。
port → exposeへ変更
#ports:
# - 8080:3000
expose:
- 3000
リバースプロキシのフックになる環境変数の追加
ここは自分で取得したドメイン/サブドメインを設定。
またポートは上でexposeしたポート番号(今回は3000)を指定します。
environment:
VIRTUAL_HOST: ********************(techwalk.net のようなドメインを指定)
VIRTUAL_PORT: 3000
LETSENCRYPT_HOST: ********************(techwalk.net のようなドメインを指定)
LETSENCRYPT_EMAIL: ********************(info@gmai.com のようなメールアドレスを指定)
ネットワークの追加
SSL と Redmine は別yamlで起動しているため、ネットワークを追記して同一ネットワークとなるようにします。
networks:
- container-link
networks:
default:
external:
name: bridge
container-link:
name: container_network
最終的な設定は以下の通りです。
version: '3.1'
services:
redmine:
image: redmine
restart: always
#ports:
# - 8080:3000
expose:
- 3000
environment:
REDMINE_DB_MYSQL: db
REDMINE_DB_PASSWORD: example
REDMINE_SECRET_KEY_BASE: supersecretkey
VIRTUAL_HOST: ********************(techwalk.net のようなドメインを指定)
VIRTUAL_PORT: 3000
LETSENCRYPT_HOST: ********************(techwalk.net のようなドメインを指定)
LETSENCRYPT_EMAIL: ********************(info@gmai.com のようなメールアドレスを指定)
networks:
- container-link
db:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: redmine
networks:
- container-link
networks:
default:
external:
name: bridge
container-link:
name: container_network
また、「jwilder/nginx-proxy」「jrcs/letsencrypt-nginx-proxy-companion」の設定は以下の通りです。
こちらはアプリによって変える記載はありません。
version: '3.7'
services:
nginx-proxy:
image: jwilder/nginx-proxy
container_name: nginx-proxy-test
privileged: true
environment:
- "DHPARAM_GENERATION=false"
ports:
- 80:80
- 443:443
tty: true
networks:
- container-link
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- proxy:/usr/share/nginx/html
- proxy:/etc/nginx/vhost.d
- ./docker/encrypt/certs:/etc/nginx/certs:ro
# - ./conf.d/proxy.conf:/etc/nginx/conf.d/proxy.conf:ro # 設定を上書きするときはconf.d内に「.conf」拡張子で追加する
restart: always
labels:
com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true"
letsencrypt-nginx:
image: jrcs/letsencrypt-nginx-proxy-companion
container_name: letsencrypt-nginx-test
privileged: true
environment:
- NGINX_PROXY_CONTAINER=nginx-proxy-test # volume_fromを使わない時はコンテナを指定する必要がある
networks:
- container-link
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- proxy:/etc/nginx/vhost.d
- proxy:/usr/share/nginx/html
- ./docker/encrypt/certs:/etc/nginx/certs:rw
restart: always
depends_on:
- nginx-proxy
networks:
default:
external:
name: bridge
container-link:
name: container_network
volumes:
proxy:
SSL化
それでは、それぞれのフォルダ内でdoker-compose upを実行します。
redmine
まずはRedmineです。
[rocky@ redmine]$ docker-compose up
Creating redmine_db_1 ... done
Creating redmine_redmine_1 ... done
ssl
次に「jwilder/nginx-proxy」「jrcs/letsencrypt-nginx-proxy-companion」を起動します。
[rocky@ ssl]$ docker-compose up
Creating nginx-proxy-test ... done
Creating letsencrypt-nginx-test ... done
正常に動くと、以下のログが表示され、証明書の発行と次回チェックまでの待機時間が表示されます。
letsencrypt-nginx-test | [Sat Jun 25 13:03:27 UTC 2022] Using CA: https://acme-v02.api.letsencrypt.org/directory
letsencrypt-nginx-test | [Sat Jun 25 13:03:27 UTC 2022] Creating domain key
letsencrypt-nginx-test | [Sat Jun 25 13:03:28 UTC 2022] The domain key is here: /etc/acme.sh/********************/********************/********************.key
letsencrypt-nginx-test | [Sat Jun 25 13:03:28 UTC 2022] Single domain='********************'
letsencrypt-nginx-test | [Sat Jun 25 13:03:28 UTC 2022] Getting domain auth token for each domain
letsencrypt-nginx-test | [Sat Jun 25 13:03:30 UTC 2022] Getting webroot for domain='********************'
letsencrypt-nginx-test | [Sat Jun 25 13:03:30 UTC 2022] Verifying: ********************
nginx-proxy-test | nginx.1 | ******************** 52.41.228.68 - - [25/Jun/2022:13:03:31 +0000] "GET /.well-known/acme-challenge/XXXXXXXXXXXXXXXXXXXXXXXXXXXXX HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)" "-"
nginx-proxy-test | nginx.1 | ******************** 3.19.120.239 - - [25/Jun/2022:13:03:31 +0000] "GET /.well-known/acme-challenge/XXXXXXXXXXXXXXXXXXXXXXXXXXXXX HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)" "-"
nginx-proxy-test | nginx.1 | ******************** 66.133.109.36 - - [25/Jun/2022:13:03:32 +0000] "GET /.well-known/acme-challenge/XXXXXXXXXXXXXXXXXXXXXXXXXXXXX HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)" "-"
nginx-proxy-test | nginx.1 | ******************** 18.156.79.179 - - [25/Jun/2022:13:03:32 +0000] "GET /.well-known/acme-challenge/XXXXXXXXXXXXXXXXXXXXXXXXXXXXX HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)" "-"
letsencrypt-nginx-test | [Sat Jun 25 13:03:34 UTC 2022] Success
letsencrypt-nginx-test | [Sat Jun 25 13:03:34 UTC 2022] Verify finished, start to sign.
letsencrypt-nginx-test | [Sat Jun 25 13:03:34 UTC 2022] Lets finalize the order.
letsencrypt-nginx-test | [Sat Jun 25 13:03:34 UTC 2022] Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/604767096/100935554236'
letsencrypt-nginx-test | [Sat Jun 25 13:03:35 UTC 2022] Downloading cert.
letsencrypt-nginx-test | [Sat Jun 25 13:03:35 UTC 2022] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/03732059b76b0fb68cedb55d29440dff2aa9'
letsencrypt-nginx-test | [Sat Jun 25 13:03:36 UTC 2022] Cert success.
letsencrypt-nginx-test | -----BEGIN CERTIFICATE-----
letsencrypt-nginx-test | MIIGKDCCBRCgAwIBAgISA3MgWbdrD7aM7bVdKUQN/yqpMA0GCSqGSIb3DQEBCwUA
letsencrypt-nginx-test | MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
......
letsencrypt-nginx-test | Bt6WDhrIol4LiERJCrFH/7VE48QMUQpZifHC5uRS1aVqESlRtS87eIHN/mLKca6U
letsencrypt-nginx-test | faWBLtHlsSSV1Nmc4WSYVt+sAOgH3vnQuW/0t+qZ+aab5IJKI+WnlwHQuag=
letsencrypt-nginx-test | -----END CERTIFICATE-----
letsencrypt-nginx-test | [Sat Jun 25 13:03:36 UTC 2022] Your cert is in /etc/acme.sh/********************/********************/********************.cer
letsencrypt-nginx-test | [Sat Jun 25 13:03:36 UTC 2022] Your cert key is in /etc/acme.sh/********************/********************/********************.key
letsencrypt-nginx-test | [Sat Jun 25 13:03:36 UTC 2022] The intermediate CA cert is in /etc/acme.sh/********************/********************/ca.cer
letsencrypt-nginx-test | [Sat Jun 25 13:03:36 UTC 2022] And the full chain certs is there: /etc/acme.sh/********************/********************/fullchain.cer
letsencrypt-nginx-test | [Sat Jun 25 13:03:36 UTC 2022] Installing cert to:/etc/nginx/certs/********************/cert.pem
letsencrypt-nginx-test | [Sat Jun 25 13:03:36 UTC 2022] Installing CA to:/etc/nginx/certs/********************/chain.pem
letsencrypt-nginx-test | [Sat Jun 25 13:03:36 UTC 2022] Installing key to:/etc/nginx/certs/********************/key.pem
letsencrypt-nginx-test | [Sat Jun 25 13:03:36 UTC 2022] Installing full chain to:/etc/nginx/certs/********************/fullchain.pem
letsencrypt-nginx-test | Reloading nginx proxy (c19734260fee101db799873b6a2d36b39e22db13fc38633e51e7c0dfca2f3456)...
nginx-proxy-test | nginx.1 | 2022/06/25 13:03:38 [notice] 13#13: signal 1 (SIGHUP) received from 57, reconfiguring
nginx-proxy-test | nginx.1 | 2022/06/25 13:03:38 [notice] 13#13: reconfiguring
nginx-proxy-test | nginx.1 | 2022/06/25 13:03:38 [notice] 13#13: using the "epoll" event method
nginx-proxy-test | nginx.1 | 2022/06/25 13:03:38 [notice] 13#13: start worker processes
nginx-proxy-test | nginx.1 | 2022/06/25 13:03:38 [notice] 13#13: start worker process 58
nginx-proxy-test | nginx.1 | 2022/06/25 13:03:38 [notice] 47#47: gracefully shutting down
nginx-proxy-test | nginx.1 | 2022/06/25 13:03:38 [notice] 47#47: exiting
nginx-proxy-test | nginx.1 | 2022/06/25 13:03:38 [notice] 47#47: exit
letsencrypt-nginx-test | 2022/06/25 13:03:38 Generated '/etc/nginx/conf.d/default.conf' from 4 containers
nginx-proxy-test | nginx.1 | 2022/06/25 13:03:38 [notice] 13#13: signal 17 (SIGCHLD) received from 47
nginx-proxy-test | nginx.1 | 2022/06/25 13:03:38 [notice] 13#13: worker process 47 exited with code 0
nginx-proxy-test | nginx.1 | 2022/06/25 13:03:38 [notice] 13#13: signal 29 (SIGIO) received
letsencrypt-nginx-test | 2022/06/25 13:03:38 [notice] 57#57: signal process started
letsencrypt-nginx-test | Sleep for 3600s
Redmine画面
HTTPS化した証明書の確認
証明書の確認を行います。アドレスバーに鍵マークが表示され、接続が保護されていることが分かります。
また、証明書の詳細をみると、有効期限が3か月後になっており、発行者はR3となっています。
このR3はLet’sEncryptになります。
以上、となります。
ここで紹介した手順は、Redmine以外でも同じように応用可能になります。
その他の利用環境について
VPSでの環境構築が大変だな、と思ったら以下の3つもご検討の価値ありです。
- conoHa VPSのテンプレート利用
- My Redmineのクラウドサービス利用
- 環境構築代行(お問い合わせフォームからお気軽にご連絡ください。)
conoHa VPS
conoHa VPS
で3分ほど待つとRedmineサーバーの作成は完了します。
びっくりするほど簡単ですよね。
My Redmine
「My Redmine」はインターネット上でプロジェクト管理ソフトウェア「Redmine」がご利用になれるサービスです。