GitHub Actionsを使用してHugoブログをリモートサーバーに自動デプロイする

Hugoブログのすべてのコンテンツが準備できたら、ブログをリモートサーバーにデプロイできます。この記事では、GitHub Actionsを使用してHugoブログをリモートサーバーに自動デプロイする方法を紹介します。

セキュリティのため、パスワードでリモートサーバーにログインすることはお勧めしません。代わりに、SSHキーを使用してログインします。リモートサーバーに新しいユーザーを作成し、そのユーザーのためにSSHキーを生成し、GitHub Actionsがそのキーを使用してリモートサーバーにログインし、Hugoブログをデプロイするように設定します。

ローカルでSSHキーを生成する

ローカルで生成されたSSHキーは、新しいユーザーがリモートサーバーにログインするために使用されます。ローカルでSSHキーを生成するには:

1
ssh-keygen -t rsa -b 4096 -C "blog@zair.top"

プロンプトに従って、ファイルの保存パス(~/.ssh/github-blog-deployに設定)とパスフレーズ(空でも可)を設定します。

生成されるファイルは以下の通りです:

  • 公開鍵ファイル:github-blog-deploy.pub
  • 秘密鍵ファイル:github-blog-deploy

リモートサーバーで新しいユーザーのSSH公開鍵を設定する

  1. リモートサーバーにログインする

    1
    
    ssh root@SSH_IP -p SSH_PORT 
  2. 新しいユーザーを作成する

    1
    
    sudo adduser deployuser
  3. 新しいユーザーのSSHログインを設定する

    1
    2
    3
    4
    5
    
    sudo mkdir /home/deployuser/.ssh
    sudo chmod 700 /home/deployuser/.ssh
    sudo touch /home/deployuser/.ssh/authorized_keys
    sudo chmod 600 /home/deployuser/.ssh/authorized_keys
    sudo chown -R deployuser:deployuser /home/deployuser/.ssh
  4. ローカルで生成した公開鍵をリモートサーバーにコピーする

    github-blog-deploy.pubファイルの内容を/home/deployuser/.ssh/authorized_keysファイルに追加します:

    1
    
    cat ~/.ssh/github-blog-deploy.pub | ssh root@SSH_IP -p SSH_PORT  'cat >> /home/deployuser/.ssh/authorized_keys'

    または手動で公開鍵の内容をコピーしてauthorized_keysファイルに貼り付けます:

    1
    
    sudo nano /home/deployuser/.ssh/authorized_keys

    github-blog-deploy.pubファイルの内容を貼り付けて保存します。

  5. 新しいユーザーのディレクトリ権限を設定する: ウェブサイトのデプロイディレクトリを作成し、権限を設定します:

    1
    
    sudo chown -R deployuser:deployuser /var/www/public

GitHub Actions設定ファイルを更新する

  1. 秘密鍵をGitHub Secretsに追加する

    • GitHubにログインし、Hugoブログのリポジトリに移動します。
    • Settings -> Secrets and variables -> Actions -> New repository secretを順にクリックします。
    • 新しいSecretを追加し、SSH_PRIVATE_KEYとして、github-blog-deployファイルの内容(秘密鍵)を値として設定します。実際の状況に応じてSSH_PRIVATE_KEYSSH_IPSSH_PORTの3つのSecretsを追加します。
  2. GitHub Actions設定ファイルを更新する

ファイル内容を以下のように追加します:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
name: Deploy Hugo Site

on:
  push:
    branches:
      - main

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v2
        with:
          submodules: true  # サブモジュールもクローンする

      - name: Set up Hugo
        uses: peaceiris/actions-hugo@v2
        with:
          hugo-version: 'latest'
          extended: true  # 拡張版を使用する

      - name: Build Hugo site
        run: hugo --minify

      - name: Deploy to remote server
        env:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
          SSH_IP: ${{ secrets.SSH_IP }}
          SSH_PORT: ${{ secrets.SSH_PORT }}
        run: |
          set -x  # デバッグを有効にする
          mkdir -p ~/.ssh
          echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
          chmod 600 ~/.ssh/id_rsa
          # ssh-keyscanの問題を診断するためのデバッグ情報を追加
          ssh-keyscan -p $SSH_PORT $SSH_IP || true  # ssh-keyscanが失敗しても続行
          ssh-keyscan -p $SSH_PORT $SSH_IP >> ~/.ssh/known_hosts
          ssh -o StrictHostKeyChecking=no -p $SSH_PORT deployuser@$SSH_IP "mkdir -p /var/www/public"
          rsync -avz -e "ssh -p $SSH_PORT" ./public/ deployuser@$SSH_IP:/var/www/public          
Buy me a coffee~
Tim 支付宝支付宝
Tim 贝宝贝宝
Tim 微信微信
0%