VPS に GitHub Actions と Docker Compose を使って自動デプロイ


<!--
SSH について
https://chatgpt.com/c/b3e5a90a-8f62-42b3-ba7d-cd96fc3b4557
  -->



## 1. 作ったもの

GitHub 上にあるリポジトリの main ブランチにソースコードを `git push` すると、サーバ (VPS) にソースコードをデプロイする機能

:::note warn
備忘録になります。すべてざっくりとしか書いていません
:::


## 2. ファイル

### <font color="#5f9ea0">◯ 構成</font>

```
$ tree -aL 3
.
├── deploy.sh
└── .github
    └── workflows
        └── main.yaml
$ 
```

* `compose.yaml` と関連する `Dockerfile` は省略


### <font color="#5f9ea0">2.1. `deploy.sh`</font>

1. 古い Docker Compose を停止する
2. 古い Docker Compose をバックアップする
3. 新しい Docker Compose をダウンロードする 
4. 新しい Docker Compose を起動する


```text:deploy.sh
#!/bin/bash

# 1. down
cd /home/ubuntu/Projects/your-project
docker compose down

# 2. backup
cd /home/ubuntu/Projects
yyyymmddhhmmss=`date +%Y%m%d%H%M%S`
mv your-project your-project-${yyyymmddhhmmss}

# 3. download
gh repo clone your-github-account/your-project

# 4. up
cd /home/ubuntu/Projects/your-project
docker compose build
docker compose up --detach
```

### <font color="#5f9ea0">2.2. `main.yaml`</font>

1. リポジトリをクローンして main ブランチに checkout する
2. SSH の設定をする
3. `deploy.sh` を本番環境の VPS 上で実行する

```yaml:main.yaml
name: Deploy to VPS

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest

    # 1. `name` はコメント
    # 2. `uses` は関数
    # 3. `with` は引数
    steps:
    - name: 1. リポジトリをクローンして main ブランチに checkout する
      uses: actions/checkout@v4
      # ここなにをしているかよくわからなかったのですが、コメントでおしえていただきました。
      # ありがとうございます！
      # > @Awayume(粟夢)
      # > GitHubリポジトリを自動的にクローン（して適切なブランチをcheckout）するActionです。
      # > これを使わないと、リポジトリにあるファイルにアクセスすることができません。

    - name: 2. SSH を設定
      uses: shimataro/ssh-key-action@v2
      with:
        # 1. 秘密鍵
        #    ここにコピペ
        #    https://github.com/{your-github-account}/{your-project}/settings/secrets/actions
        private-key: ${{ secrets.DEPLOY_KEY }}
        
        # 2. 公開鍵
        #    ここからコピペ（VPS に WebARENA Indigo を利用されている方は）
        #    https://indigo.arena.ne.jp/sshkey
        known-hosts: ssh-rsa AAAAB3N...

    # 4. `run` はコマンドが実行できます
    - name: 3. デプロイ
      run: |
        pwd
        ls -la
        ssh -o StrictHostKeyChecking=no ubuntu@example.com 'bash -s' < deploy.sh
```









## 3. 前提知識

これを知らないと上で何を書いているかわからない（正直この記事を書いている本人も何を書いているかわからない）。

### <font color="#5f9ea0">3.1. GitHub Actions</font>

- GitHub Actions の理解はこの辺から... 30分程度で概要から基本的な文法まで教えてくれます。Udemy も含めて色々探したのですが、この動画しか理解できませんでした（この動画も理解はできていません...）。
    - [GitHub Actions Tutorial - YouTube](https://www.youtube.com/watch?v=R8_veQiYBjI)
- 要点が短く列挙されています
    - [Github Actionsの使い方メモ - Qiita](https://qiita.com/HeRo/items/935d5e268208d411ab5a)
- GitHub Actions で使用する YAML の文法はサプーさんに教えてもらってください。
    - [YAML の書き方 初心者向け - YouTube](https://www.youtube.com/watch?v=rpbq6vXcNbM)


### <font color="#5f9ea0">3.2. SSH</font>

SSH の理解が足らずに苦慮しました。

1. `秘密鍵` だけでなく
2. `公開鍵` も提示しないといけないというのは想定外でした
3. `-o StrictHostKeyChecking=no` とかもなんなのかよくわかっていません




## 4. そのほか

### <font color="#5f9ea0">4.1. WebARENA</font>

* 今回使用した VPS は WebARENA Indigo になります。
    * [WebARENA Indigo](https://web.arena.ne.jp/indigo/)
* WebARENA を使っているのですが、この記事には助けていただきました。最初、ログインの資料が見当たらなくて焦りました笑
    * [WebArena Indigo 環境設定１）TeraTermからログインするまで - Qiita](https://qiita.com/naga_kt/items/0dd2f2e80bfd7a4666f8)
* 本当は NTTPC の WebARENA ではなく、AWS を使いたかったけどAWS は高くて使えなかった...orz
    * [個人開発でAWSを使いたい - Speaker Deck](https://speakerdeck.com/javadog/hunwarilt)

<!--
さくらの VPS へのデプロイの記事になります。

* [GithubのActionsでdocker-composeの内容をさくらVPSにデプロイしてみた](https://shiro-secret-base.com/github%E3%81%AEactions%E3%81%A7docker-compose%E3%81%AE%E5%86%85%E5%AE%B9%E3%82%92%E3%81%95%E3%81%8F%E3%82%89vps%E3%81%AB%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F/)


        # scp コマンドでアップロードする方法もあるそうです。
        # 今回は gh コマンドでダウンロード
        # scp -r . ubuntu@example.com:/home/ubuntu/Projects/new-your-project
-->

### <font color="#5f9ea0">4.2. デプロイ</font>

`git pull`, `gh repo clone` でデプロイするのはよくないのかもしれない...

https://twitter.com/hisaju01/status/1753353091964113290

https://twitter.com/q42_engineer/status/1753373705890369611

各自 ChatGPT 先生に聞いてください... 聞いてもわかりませんでしたが...orz

```md
# 質問
以下のような X のポストを見かけたのですが
git pull でデプロイすることによる問題点はなんですか？
また一般的にどのようにデプロイするのですか？

> 意外と現存するgit pullデプロイ
> https://twitter.com/hisaju01/status/1753353091964113290
```