令和時代の固定IPがない自宅サーバー公開方法を考える
まぁ内容は sish を自前でホスティングしてみる という内容なんですが...
皆さんは、ローカルの開発環境や自宅サーバーを外部公開したくなった時どうしてますでしょうか?
一昔前は 固定IPが付与されるVPSを借りて VPN を貼ったりしていたと思います。
しかし最近は ngrok などに代表されるそんな事を考えなくとも、ツールを入れるだけで簡単に外部公開できるツールが出てまいりました
しかしながら開発途中ものを第三者に通信を経由するのはちょっとした抵抗があります。
また大容量のものを扱いたい場合は速度制限がかかったりして面倒になることが多いです。
ngrok みたいなを自前で運用できたら...
ツールを入れなくても簡単に公開できるようになれたら...
そんな願いを叶えてくれるのが 今回紹介する sish です
ssh トンネリングを使ったトンネリングツールになります
(思想としては serveo
に近いです)
流れとしては
PC → (SSH Tuunel) → VPS(sish) → global
といった感じになります
sish 以外にも最近だと caddy を使う事もできますが、あちらは使うユーザー数によって都度設定を変更しないといけないのと、あと必要もないのに web サーバーを建てる必要があります。
sish の場合は特に気にすることもなく、クライアント側は ssh すればいいだけなので、非常に楽ちんです。
sish は自前で運用することもできますが、してみた記事はなかったので書いてみました。
事前準備: DNSサーバーの選定
sish を使う前に大切なことは DNSサーバーの選定です
sish の証明書作成には 他の人が作った DNS認証ベース の letsencrypt 製の証明書を生成するソフトが使われれています
DNSレコードの書き換えまで自動的にやってDNS認証までオートでやってくれるすごい代物なのですが、レコードの書き換えを自動的にやる以上、APIが提供されているDNSサービスを利用しないといけません。
対応しているDNSサービスは以下になります
主要なクラウドも対応していますが、日本の さくらや ConoHa にも対応しているのが嬉しいですね。
個人用途で使うとなると、無料でAPIが叩けて国内サービスで絞り込むと ConoHa を使うのが一番いいかと思います。
ConoHa の API には tokenベースと id / password ベースの方式がありますが、 token ベースの方は一日しか持たないので、 id / password で運用しないと中長期的に運用するときには困ると思います。
事前準備: sish の設定
まずは リポジトリを clone してきてください
そして設定ファイルを書き換えていきます
DNS 設定
ここは 使うDNSサーバーに合わせて設定してください
acme:
email_account: EMAIL
certificates:
- autorestart:
- containers:
- sish
domains:
- 'test.example.com'
- '*.test.example.com'
name: test.example.com
profile: conoha
profiles:
- name: conoha
provider: conoha
sleep_time: 60
sleep_time: 120
delegated_subdomain: 'test.example.com'
provider_options:
auth_username: 'CONOHA_API_USER'
auth_password: 'CONOHA_API_PASS'
auth_tenant_id: 'CONOHA_API_TENANT_ID'
ユーザー設定
sish を使うユーザーは deploy/pubkeys/
で管理されています
ファイル名がユーザー名になります
荒削りですが GitHub 公開鍵から sish ユーザーを生成する ansible playbook を公開していますので参考にしてみてください
証明書設定
sish を独自ドメインで運用するには
証明書の兼ね合いで
sish ディレクトリーでシンボリックリンクを貼る必要があります
ln -s /etc/letsencrypt/live/<your domain>/fullchain.pem deploy/ssl/<your domain>.crt
ln -s /etc/letsencrypt/live/<your domain>/privkey.pem deploy/ssl/<your domain>.key
一瞬何をやっているのか混乱しますが、sish のコンテナ内の path に対してシンボリックリンクを貼っていると考えてもらうといいかと思います
使ってみる
docker-compose -f deploy/docker-compose.yml up
で立ち上げて証明書ができるまで待ちます
証明書が出来上がったら、準備は完了です
次にクライアント側で
ssh -p 2222 -R domain:80:localhost:3000 sish_user@test.example.com
と打てば
domain.test.example.com
にアクセスすると localhost:3000
にアクセスが来ます
お疲れさまでした
Discussion