Posted at

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などでは入っていない場合もあるようなので、下記のようにインストールしてください。


centos

$ sudo yum -y install crontabs



ファイヤーウォール管理ソフト:ufw

下記のコマンドでインストールしてください。


ubuntu

$ sudo apt -y install ufw


*centos系はこちらを参照ください。<参考>ufwをcentosにインストール


2,crontabへの登録

これを実行する事により、サーバが再起動した場合も自動的に再実行されます。

下記のコマンドを実行してください。

$ sudo crontab -e

コマンドを実行すると編集画面が表示されますので、下記の行を追加し保存してください。


crontab

@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

新規ファイル内容は下記としてください


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に回数などの制限があるようです。