めがね901の運用環境・開発環境
mgn901.iconでは、2022年よりVPSを借りてWebサービスに関する研究開発を行っている。 2024年1月からは、来たるそのVPS上でのWebサービスの運用開始に向けて、運用環境と開発環境の刷新を図っている。
めがね901の運用環境・開発環境の特長
1つのグローバルIPアドレスで複数のサービスを運用し、サービスの運用にかかるコストを圧縮している。
Dockerなどを用いてIaC(Infrastructure as Code)を徹底することで、複数のサービスをスムーズに運用している。 開発環境で運用しているWebサービスを、本番環境で運用しているサービスと同様に利用できる。
Secure Contextでないと利用できない機能をスマホからでも試すことができる。
自宅外からでも開発環境での作業を行うことができる。
運用環境・開発環境の構成(略図)
2024/6/1に運用環境と開発環境をVPNに入れたので、この図は古くなった。近いうちに図を新しくする。mgn901.icon
https://gyazo.com/77bdd91eff72271355a8376fe5ebe959
運用環境・開発環境は、NICがインターネットに直接接続されている1台のVPS(prod)と、それができないLAN内(つまり自宅)にある1台の開発環境(dev)から成る。
devと同じLANにステージング環境(stg)も追加する予定。
prodおよびdevではDockerを用いて複数のサービスを運用している。 サービスごとにコンテナを立ち上げて運用している。
グローバルIPアドレスを1つしか有していない場合でも複数のサービスを運用できるようにリバースプロキシ(proxy)を運用している。 HTTPリクエストが届くと、そのHostヘッダーの値に応じてHTTPリクエストを他のコンテナに転送する。
proxyもDockerコンテナとして運用していて、ホストの80番ポート、443番ポート宛の通信をproxyに流すように設定している。他のコンテナはホストのポートでlistenしない。
devで運用しているサービスはインターネット上からでも利用できる。
実現方法
1. prod内にvpnserverをインストールして起動する。
2. vpnserverの仮想ハブにユーザーを追加し、各ユーザーにパスワードを設定する。
code:sh
sudo vpncmd localhost:<vpnserver> /SERVER /HUB:DEFAULT /CMD UserCreate prod /GROUP:none /REALNAME:none
sudo vpncmd localhost:<vpnserver> /SERVER /HUB:DEFAULT /CMD UserPasswordSet prod
sudo vpncmd localhost:<vpnserver> /SERVER /HUB:DEFAULT /CMD UserCreate dev /GROUP:none /REALNAME:none
sudo vpncmd localhost:<vpnserver> /SERVER /HUB:DEFAULT /CMD UserPasswordSet dev
3. prodにvpnclientをインストールし、prod内のvpnserverの仮想ハブに接続する。
code:sh
sudo vpncmd localhsot /CLIENT /CMD NicCreate vpnclient0
sudo vpncmd localhost /CLIENT /CMD AccountCreate prod2vpn /SERVER:localhost:<vpnserverのポート番号> /HUB:DEFAULT /USERNAME:prod /NICNAME:vpnclient0
sudo vpncmd localhost /CLIENT /CMD AccountPasswordSet prod2vpn /TYPE:standard
sudo vpncmd localhost /CLIENT /CMD AccountStartupSet prod2vpn
sudo vpncmd localhost /CLIENT /CMD AccountConnect prod2vpn
vpn_vpnclient0という仮想NICが作成されるので、netplanなどを使ってIPアドレス(例えば192.168.30.11)を振っておく。 4. devにvpnclientをインストールし、prod内のvpnserverの仮想ハブに接続する。
code:sh
sudo vpncmd localhsot /CLIENT /CMD NicCreate vpnclient0
sudo vpncmd localhost /CLIENT /CMD AccountCreate prod2vpn /SERVER:localhost:<vpnserverのポート番号> /HUB:DEFAULT /USERNAME:prod /NICNAME vpnclient0
sudo vpncmd localhost /CLIENT /CMD AccountPasswordSet prod2vpn /TYPE:standard
sudo vpncmd localhost /CLIENT /CMD AccountStartupSet prod2vpn
sudo vpncmd localhost /CLIENT /CMD AccountConnect prod2vpn
vpn_vpnclient0という仮想NICが作成されるので、netplanなどを使ってIPアドレス(例えば192.168.30.13)を振っておく。 5. prodから192.168.30.13宛に通信するとdevに流れるようになる。
2024/6/1以前に行っていた方法
リモートポート転送を使い、prod内のサービス(gtw-prod2dev)の80番ポート宛の通信を、devのproxy:80に流すようにしている。 実現方法
1. prod内にSSHサーバーのためのコンテナ(gtw-prod2dev)を立ち上げて、ホストの2224番ポートでlistenするように設定する。
2. リモートポート転送を使って、gtw-prod2dev:80宛の通信を、devのproxy:80に流す。
同様の方法で、自宅外からでもdev上のコードにアクセスできるように、gtw-prod2dev:2222宛の通信をdev:22に流している。したがって、gtw-prod2dev:2222にSSHするとdevにSSHできる。ただし、gtw-prod2dev:2222にSSHするためには、gtw-prod2dev:22(prod:2224)を踏み台(SSH)にする必要がある。 補足: 踏み台がないことは、自宅およびdevにとって危険である。踏み台がなくても済むようにホストのP番ポート宛の通信をgtw-prod2dev:2222に流す場合、ホストのP番ポート宛に大量のアクセスがあったとき、dev:22にそれがそのまま送り込まれることになり、自宅のネットワークの故障につながる。
注意: この記事に記載しているSSHのポート番号は、実際にmgn901.iconが使用しているポート番号とは異なります。