はじめに
無料でHTTPSを立てたかったので、立て方をここに残します。(備忘録)
やり方
用意するもの
下記のものがインストールされたlinux
サーバ
・npm
<参考>Ubuntuに最新のNode.jsを難なくインストールする
・docker
and docker-compose
<参考>Ubuntu に docker と docker-compose を入れる
・domain
<参考>freenomでドメインの取得
手順
1,domain
の設定
用意したlinux
サーバのグローバルIPを設定してあげます。
私のはさくらインターネット
で購入したので下記のようなイメージで設定しました。
2,各種インストール
httpサーバソフト:http-server
下記のコマンドでインストールしてください。
$ sudo npm install -g http-server
ジョブ管理ソフト:cron
ubuntu等の場合は最初から入っているかと思いますが、centosなどでは入っていない場合もあるようなので、下記のようにインストールしてください。
$ sudo yum -y install crontabs
ファイヤーウォール管理ソフト:ufw
下記のコマンドでインストールしてください。
$ sudo apt -y install ufw
*centos系はこちらを参照ください。<参考>ufwをcentosにインストール
2,crontab
への登録
これを実行する事により、サーバが再起動した場合も自動的に再実行されます。
下記のコマンドを実行してください。
$ sudo crontab -e
コマンドを実行すると編集画面が表示されますので、下記の行を追加し保存してください。
@reboot sudo ufw allow 80;sudo ufw allow 443
@reboot sudo http-server /{対象フォルダ} &
*{対象フォルダ}はhttpサーバで表示するindex.html
などが存在するフォルダを指定してください。
3,docker-compose.yml
の作成
下記のコマンドを実行し、ファイル編集を開始してください。(例ではEditorをnano
で利用しています)
$ sudo nano docker-compose.yml
新規ファイル内容は下記としてください
version: "3"
services:
https-portal:
image: steveltn/https-portal:1
ports:
- 80:80
- 443:443
environment:
DOMAINS: '{ドメイン名} -> http://dockerhost:8080'
STAGE: production
volumes:
- ./org-chimata-ssl-certs:/var/lib/https-portal
restart: always
*{ドメイン名}は用意されているドメイン名を利用ください。
4,docker-compose.yml
の実行
最初に念の為、ファイヤーウォールに穴を開けます。
$ sudo ufw allow 80;sudo ufw allow 443
http-server
を立ち上げます
$ sudo http-server /{対象フォルダ} &
下記のコマンドでhttps-portal
を起動
$ sudo docker-compose up -d
これで、正常に立ち上がるはずです。
問題がある場合
まずもってログを確認していただいたほうが良いかと思います。
dockerのログの見方
1,下記のコマンドでdocker
のコンテナIDを取得
$ sudo docker ps
> CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
> {コンテナID} steveltn/https-portal:1 "/init" 2 days ago Up 2 days 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp {user name}_https-portal_1
2,下記のコマンドでコンテナのログを取得
$ sudo docker logs {コンテナID}
そして、エラーっぽいところの行をコピーしてググる!!
他の可能性
可能性としては…
・http-server
は2回目以降は別ポートで起動します。→多重起動していないか確認
・http-server
が立ち上がっているか?→curl
などでget
して確認
・ネットワーク全体で80/443
PORTは許可されているか?→外部からtelnet
などで確認
・STAGE: production
で何度も作成していないか?→Let's Encrypt
に回数などの制限があるようです。