デプロイの型
上書きするデプロイは危ない
ここまで、サイトの中身は /var/www/mysite に直接置いてきました。更新するときは、そこへファイルを上書きすることになります。
このやり方には問題が3つあります。
- 上書きの最中は、壊れた状態が見えている。半分だけ新しいページが訪問者に届く
- 戻せない。上書きした瞬間、前の版はどこにも残っていない
- いま何が公開されているのか分からない。ファイルの日付から推測するしかない
1つ目は数秒の話に見えますが、ファイルが多いほど窓は広がります。3つ目は事故が起きたときに効いてきます。「昨日の版に戻して」と言われて、昨日の版が手元に無い状況ほど困るものはありません。
版を並べて置き、向き先だけ変える
解決の型は決まっています。新しい版は別の場所に丸ごと作り、公開先の向き先を切り替える。この形です。
/var/www/mysite-deploy/
├── releases/
│ ├── 20260806-120000/
│ ├── 20260807-093000/
│ └── 20260401-101500/
└── current -> releases/20260401-101500releases の下に、版ごとのディレクトリが日時の名前で並びます。current は「いま公開しているのはこれ」を指す目印です。
この形にすると、さきほどの3つがそのまま解決します。
- 新しい版は誰にも見えない場所で完成させてから、向き先を変える。切り替えは一瞬で終わる
- 前の版は消さずに残っている。向き先を戻すだけで復帰できる
currentが何を指しているかを見れば、公開中の版が分かる
名前を日時にするのは、並べたときに時系列の順になるからです。v1、v2 のような通し番号だと、いつの版なのかが分かりません。
中身は rsync で運ぶ
新しい版を作るには、元になるファイルを releases の下へ運びます。
rsync -a --delete /var/www/mysite/ /var/www/mysite-deploy/releases/20260401-101500/rsync は、Linux 入門でバックアップに使ったものと同じです。
-a— 権限や更新日時を保ったまま丸ごと運ぶ--delete— 運び元に無いファイルを、運び先から消す
--delete が要点です。付けないと、前に置いて今回消したはずのファイルが残り続けます。消したはずのページがなぜか見えている、という不具合の原因はたいていこれです。
運び元の末尾の / にも意味があります。付けると「中身を」、付けないと「そのディレクトリごと」運びます。付け忘れると releases/20260401-101500/mysite/ という一段深い形になります。
実際に運ぶのは誰か
4章で deploy ユーザーを作りました。デプロイはこのユーザーの仕事です。root で運ぶと、置かれたファイルの持ち主が root になり、次に deploy から触れなくなります。
置き場所ごと deploy の持ち物にしておくのが、この先で詰まらないための下ごしらえです。
手を動かす
版を並べて置くための場所を作り、いまのサイトを最初の版として置きます。