npm http-server とDockerで無料HTTPS化

#はじめに
無料でHTTPSを立てたかったので、立て方をここに残します。(備忘録)

#やり方

用意するもの

下記のものがインストールされたlinuxサーバ
npm
<参考>Ubuntuに最新のNode.jsを難なくインストールする
docker and docker-compose
<参考>Ubuntu に docker と docker-compose を入れる
domain
<参考>freenomでドメインの取得

手順

1,domainの設定

用意したlinuxサーバのグローバルIPを設定してあげます。
私のはさくらインターネットで購入したので下記のようなイメージで設定しました。
スクリーンショット 2019-08-18 3.49.14.png

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/443PORTは許可されているか?→外部からtelnetなどで確認
STAGE: productionで何度も作成していないか?→Let's Encryptに回数などの制限があるようです。