コース一覧
サーバー運用実践:セキュリティ・監視・デプロイ
deploy.sh v2

サーバー運用実践:セキュリティ・監視・デプロイ

構築済みのnginxサーバーを、専用ユーザー・SSH鍵認証・ufwで保護し、HTTPS化、ログとヘルスチェックの監視、systemdタイマー、リリース切替、ロールバック、障害復旧までを実践します。本番を想定した安全な公開・監視・デプロイの基本を身につける30レッスンのコースです。

1
セキュリティのきほん
01. 専用ユーザーで動かす16分
02. SSH鍵認証16分
03. sshdを固める16分
04. ufwファイアウォール16分
05. ポートの棚卸し16分
06. ミッション サーバーを固める16分
07. 第4章クイズ12分
2
HTTPS
01. HTTPSとTLSのしくみ16分
02. 自己署名証明書を作る16分
03. nginxにHTTPSを設定16分
04. HTTPからのリダイレクト16分
05. ミッション HTTPS化完了16分
06. 第5章クイズ12分
3
運用と監視
01. tmuxで多重端末16分
02. ログローテーション16分
03. エラーログ監視16分
04. ヘルスチェック16分
05. systemdタイマー16分
06. ミッション 監視の自動化16分
07. 第6章クイズ12分
4
デプロイ
01. デプロイの型16分
02. シンボリックリンク16分
03. deploy.sh v216分
04. ロールバック16分
05. ミッション ワンコマンドデプロイ16分
06. 第7章クイズ12分
5
総合制作
01. ゼロから構築ミッション16分
02. 障害対応演習16分
03. 自由拡張16分
04. 完成と次のステップ16分

deploy.sh v2

手順が3つあると、いつか1つ抜ける

前のレッスンで、デプロイの手順は3つになりました。版を作る、中身を運ぶ、リンクを張り替える。そのあと reload です。

手で打つ限り、いつか抜けます。急いでいるとき、疲れているとき、割り込みが入ったとき。張り替えを忘れれば公開は変わらず、reload を忘れれば古い版が返り続けます。どちらも「やったつもり」で終わるので、たちが悪い失敗です。

Linux 入門で deploy.sh を書きました。あれを、この章で作った型に合わせて作り直します。

日時は自分で作らせる

版の名前を手で打つのはやめます。

ターミナル

RELEASE=$(date '+%Y%m%d-%H%M%S')

date の書式指定で 20260401-101500 の形が作れます。変数に入れておけば、あとで何度でも使い回せます。

変数を使うときは、${RELEASE} のように中括弧で囲む書き方が安全です。$RELEASEabc と書くと RELEASEabc という別の変数として読まれてしまうためです。

途中で失敗したら、そこで止める

スクリプトの1行目の下に、次の1行を足します。

ターミナル

set -e

これで、途中のコマンドが失敗した時点でスクリプト全体が止まります。

無いとどうなるかを考えると、必要さが分かります。ファイルを運ぶ rsync が途中で失敗したのに、次の行の張り替えは実行されてしまう。結果、中途半端な版が公開される。止まってくれたほうが、ずっと安全です。

set -u も足しておくと、定義していない変数を使ったときに止まります。打ち間違えた変数名が空文字として扱われ、rm -rf / のような取り返しのつかない命令になる事故を防げます。

何をしたかを声に出させる

ターミナル

echo "リリース ${RELEASE} を作成しました"

自動化したスクリプトほど、何をしたかを出力させます。あとで journalctl やログを見たときに、いつどの版を出したかが分かるためです。黙って成功するスクリプトは、黙って失敗します。

全体の形

組み立てるとこうなります。

ターミナル

#!/bin/bash
set -eu

SRC=/var/www/mysite/
BASE=/var/www/mysite-deploy
RELEASE=$(date '+%Y%m%d-%H%M%S')

mkdir -p "${BASE}/releases/${RELEASE}"
rsync -a --delete "${SRC}" "${BASE}/releases/${RELEASE}/"
ln -sfn "${BASE}/releases/${RELEASE}" "${BASE}/current"
systemctl reload nginx

echo "デプロイ完了 ${RELEASE}"

変数を " で囲むのは、パスに空白が入っていても1つのまとまりとして扱わせるためです。習慣にしておくと、思わぬところで助かります。

手を動かす

日時つきの版を自動で作り、張り替えと reload まで一気に終わらせるスクリプトを書きます。

ヒント

set -e が無いと、途中で失敗しても張り替えまで進んで中途半端な版が公開されます

変数は "${RELEASE}" のように囲むと、空白が入っていても1つのまとまりとして扱われます

  • 1. /root/bin/deploy.sh を書く。1行目は #!/bin/bash、その下に set -eu を置く
  • 2. RELEASE=$(date '+%Y%m%d-%H%M%S') で版の名前を作る
  • 3. mkdir -p と rsync -a --delete で新しい版を作る
  • 4. ln -sfn で current を張り替える
  • 5. systemctl reload nginx で反映し、最後に何をしたかを echo で出す
  • 6. chmod +x を付けて実行し、新しい版が公開されることを確かめる

Linux は使うときに起動します(初回は約102MB通信します)

12 項目で採点します