これはアドベントカレンダー4日目の記事です.他の記事は こちら .
こんにちは,自宅鯖に狂わされたぎがおにおんです.突然ですが,ネットに居場所,ありますか? ここでいう居場所とは,自分のホムペなどです. まだ勉強中,自分とは無縁だ…などと思っている人こそ,今すぐサーバを持つべきです. 場所がなければ,何も生まれません.自分のサーバがあれば,何ができるでしょう?
- 独自ドメインのメアドを持つ
- 友人と遊ぶためのMinecraftサーバ
- 24時間寝ずに働き続けるDiscord Bot
- 個人用のWebアプリのバックエンド
- 自己紹介ページを,世界中に公開する.
これらは,自分のPCや大学のPCでは不可能です.電源を落としたら終わるし,学内ネットワークの制限もあるからです. 自由なインターネットの世界に,24時間365日稼働するサーバを手に入れて初めて,居場所があると言えるでしょう.しかし,Windowsを使いすぎると,思考力が鈍ってしまうものです.講義で一応CLIを学ぶ機会はあっても,これを実用に使うことについては聞く機会もなく,CLIは面倒くさいだけだという認識の方もいると思います. しかし,サーバにとって,GUIはリソースを食い潰すだけの寄生虫です.保守でしか見ないデスクトップのどこにリソースを費やす意味がありましょうか.また,ボタンをクリックする操作は通常は自動化できません.自動化処理は,CLIでやるべきです.スクリプト一つで世界を構築できて初めて,エンジニアといえるでしょう.
サーバ代の心配も無用です.今回は,Oracle Cloud (OCI)の狂気レベルの無料枠と,MyDNSを使い,完全無料で,しかも有料VPSを凌駕するハイスペックサーバーを手に入れて,実際にWebサーバを構築してみます.
何をするかはサーバを建ててから考えれば良いのです.今こそ,インターネットに居場所を作りましょう!
なぜOCIか
クラウドサーバーといえばAWSやGCPが有名ですが,学生が個人でサーバーを持つならOracle Cloud Infrastructure(OCI)一択です. 無料枠のスペックが異常に高いのです.
通常,クラウドの無料枠といえば1 vCPU / 1GB RAMくらいが相場です.これはOSを動かすだけで精一杯で,重いアプリケーションを動かすとすぐに落ちてしまいます.しかも,AWSなどは12ヶ月間のみ無料といった期限付きがほとんどです.
しかし,OCIの Always Freeの,特に Armインスタンス は次元が違います. ここでスペックを見てみましょう.
| 項目 | OCI (Always Free) | AWS (Free Tier) |
|---|---|---|
| CPU | 4OCPU (約4 vCPU相当) | 1vCPU |
| メモリ | 24GB | 1GB |
| 期間 | 無期限 | 12ヶ月 |
| ストレージ | 200GB | 30GB |
さて,あなたのPCにメモリは24GBありますか?GUIアリのPCですら中々ここまでのメモリを積んでいることは無いでしょう.まして,CLIのみの運用だったら滅多な用途では不足しないレベルです.もはやサブPCを配っているようなものです.使わない手は無いでしょう.学生なんて乞食してなんぼです.
アカウント登録
さて,では早速登録をしていきましょう. この リンクの「無料で始める」ボタンをクリックして登録を行います.基本は指示に従えばOKですが,ホームリージョンは変更できないので注意です.東京は当たり前に人気なので,個人的にはまだマシな大阪がおすすめです.Ping値は実用の範疇ですし,東京は人気が高すぎて可用性が厳しいので.また,クレカの登録で弾かれることがありますが,銀行系のカードは体感で通りやすかったです.カード会社が海外利用を弾いているケースもあるので,何かあったらとりあえずメールボックスを確認してみてください.
無事登録できた方,おめでとうございます.第一関門突破です.次に「Pay As You Go」にプランをアップグレードしましょう.これは任意ですが,Armインスタンスはあまりに人気で,無料のみのユーザには有料アカウントよりVM立ち上げが困難になっているので,無駄な時間を浪費したくない方はアップグレードするのが一番手取り早いです.ホームのハンバーガーメニュー→「請求とコスト管理」→「支払いのアップグレードと管理」から行えます.OCIは,無料枠のリソースには「Always Free」のラベルがあるのでミスして課金するというのはまず起こらないのでクラウド破産の心配は少ないです.不安な方は念の為に,予算アラートを設定すると良いでしょう.先ほどの「請求とコスト管理」のタブの「予算」から1円の予算,アラートのメアド登録で安心して眠れます()

VMの立ち上げ
では早速,VMを実際に立ち上げていきましょう.ダッシュボード→「コンピュート」→「インスタンス」と移動します.
SSH接続とセキュリティ
さて,ここから実際にサーバっぽい運用を実際にして行きましょう.まず,サーバにssh接続します.わざわざTeraTermなどを入れる必要はありません.今やMicrosoftもデフォルトでsshクライアントを搭載する時代です.(Macの皆さんもターミナルを開きましょう^_^)ターミナルで先程ダウンロードした鍵のあるディレクトリを開きましょう.エクスプローラでパスをコピーしてcdするだけです.
ssh -i ./{ur.key} ubuntu@{urIP_Addr}
{ur.key}と{urIP_Addr}は,先程落とした鍵のファイル名とインスタンスのIPアドレスを入れます.IPアドレスはさっきのインスタンス画面の「グローバルIP」のIPアドレスです.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
上記のようなエラーがでたら,鍵のファイルのパーミッションが緩すぎるので,Windowsなら権限を所有者のみに,Macなら,chmod 600して解消できます.
# 現在のユーザーにのみアクセス権を付与する.ssh.keyを自分のファイル名にしてください.
icacls .\ssh.key /c /t /inheritance:d
icacls .\ssh.key /c /t /grant ${env:UserName}:F
icacls .\ssh.key /c /t /remove Administrator "Authenticated Users" BUILTIN\Administrators BUILTIN Everyone System Users
プロンプトが,ubuntu@{hoatname}:~$になればOKです.ここから保守管理をしていくわけですね.
sudo apt update && sudo apt upgrade -y
を実行して,パッケージの更新を行います.updateで更新の確認,upgradeで実行というイメージです.常に最新にすることが望ましいです.更新が面倒な方は,unattended-upgradesを用いて自動化できます.詳細は
この記事
を参考に設定してみてください(他力本願寺).
では,次にファイアウォールをいじります.OCI含むクラウドはOSとネットワークの二重でファイアウォールが張られていることが多いです.まず,クラウド側のネットワークのファイアウォールを解除します.今回は,ウェブサーバの構築を目標にするので,80と443を開けます.

- ソースCIDR:0.0.0.0/0
- 宛先ポート範囲:80,443
これで,クラウド側はOKです.
次に,サーバ側でも同じ作業をします.
# ポート80(HTTP)を開放
sudo iptables -I INPUT 6 -m state --state NEW -p tcp --dport 80 -j ACCEPT
# ポート443(HTTPS)を開放
sudo iptables -I INPUT 6 -m state --state NEW -p tcp --dport 443 -j ACCEPT
# 設定を永続化する
sudo netfilter-persistent save
Dockerを導入する
では,実際にページやアプリを公開してみましょう.一昔前は,aptコマンドでサーバ側に一々パッケージを入れていたものですが,今は便利なDockerという箱に押し込んでシステムを汚さずにアプリケーションを起動できます.今回は,簡単のため,こちらを用いましょう.
curl -fsSL https://get.docker.com |bash
## 上のコマンドが成功したら以下を実行
sudo usermod -aG docker $USER
このコマンド一発で環境が出来上がります.便利な時代です.sshを切断して再接続すると変更が適用されます.
では,早速,Webサーバを公開してみましょう.
docker run -p 80:80 --name webserver nginx
シェルに黒文字がずらーっと流れましたか?この状態で,PCのブラウザにサーバのipを打ち込んでみましょう.
ドメインを入手する
では,このipアドレスに名前を与える作業,即ちドメインの取得をします.通常ドメインは有料ですが,仏のような方がドメインを貸してくれています.ありがたく利用させていただきましょう. この ページから登録を行います.2
完了後,来るメールにパスワードとIDがあるので,これでログインし,DomainInfoタブに移動します.そこから,「Domain」セクションに,希望する名前+.mydns.jpを入力し,確認→送信をします.これでドメインを使用できるようになりました.

では,このドメインとサーバのipアドレスを紐付けていきましょう.MyDNSに,定期的にipを通知する必要があります. サーバのシェルで,
crontab -e
を実行してください.Select an editor…と訊かれたら,1(nano)を選択してください.(お好みがある方はそちらをどうぞ.多くの人にとってはnanoで十分です) そこに,以下を入力します.
# 10分ごとにMyDNSへIPアドレスを通知する
*/10 * * * * curl -u {MasterID}:{Password} https://www.mydns.jp/login.html &> /dev/null
{MasterID}と{Password}は,先程のMydnsのものを入力してください.Ctrl+S→Ctrl+Xで終了して暫く待った後,コンテナを起動してブラウザにドメインを入れればページが表示されすはずです.
しかし,今時http,少しダサくないですか?()ここでは,Caddyという別のWebサーバを使ってSSL化までしてしまいましょう. まず,データ保管のディレクトリを作成しましょう.
mkdir ~/myserver
cd ~/myserver
先程とは違い,docker composeを使います.これで,Dockerのコマンドを一々打たずともコンテナを起動できるようになります. まず定義ファイルとテストページを作成します.
# コンテナの定義ファイル
cat <<EOF>compose.yaml
services:
caddy:
image: caddy:latest
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./site:/usr/share/caddy
- caddy_data:/data
- caddy_config:/config
volumes:
caddy_data:
caddy_config:
EOF
次に,証明書の定義ファイルを作成します.
nano Caddyfile
#自分のドメインに変更
your-domain.mydns.jp {
root * /usr/share/caddy
file_server
}
最後にページを立ち上げてみましょう
# サイト用ディレクトリ作成
mkdir site
# テスト用HTML作成
echo "<h1>Hello from Secure Oracle Cloud!</h1>" > site/index.html
# 起動(-dをつけるとバックグラウンドで実行できます.終了するときはdocker compose downを使用)
docker compose up -d
これで,サーバを起動すると,ブラウザからアクセスできるかつ危険なページ表記が消えているはずです.これでいつでも知り合いにホームページを自慢できますね!!!
おわりに
今回の作業で,タダでホームページやウェブアプリを公開するための強力なサーバを手に入れました.CLIも思ったより簡単ではありませんか?これをベースに,できることは山ほどあります.その一方,するべきセキュリティ対策も山ほどあります.絶えず生じている脆弱性の修正パッケージは,なるべく早く,常に最新にしている必要があります.更新は自動化もできますが,完全に自動にすると後方互換性の問題が生じる可能性もあるためそのリスクとのトレードオフでもあります. CLIというハードルを乗り越え,実際にWebサーバまで構築したあなたならこれから何をするか,何をできるか,を探索することはもう怖いことではありません.世界へ飛び出しましょう!
コメント
コメントを読み込んでいます...