🎉

エックスサーバーにローカル→github→サーバーへ自動デプロイしたメモ

2023/01/25に公開

前に書いた記事ではconohaのDocker環境にデプロイした軌跡を書きました。
https://zenn.dev/ytksato/articles/df781303d6d260

今回はエックスサーバー(レンタル)にデプロイしたいので過程を記事に残します。

全体的な流れ

前回とやることはほぼ同じはずですが全体像のイメージ

エックスサーバー側で「ssh設定」から状態をONにして公開鍵を作る

ローカルのmacからgithubにソースをpush

・ github actionsでpushを検知したら、自動でエックスサーバーにログインする
・ githubからgit pullして最新のソース取得したりコードを移動する

と言う内容のコードをgithub actionsに書いてそれらが実行されてデプロイが完了

https://hsmtweb.com/tool-service/github-actions.html

実践

エックスサーバーのssh設定は公式を見て設定してもらうので割愛
https://www.xserver.ne.jp/manual/man_server_ssh.php

vpsと違ってsshの設定とかが楽・・

ダウンロードしたsshkeyを適宜移動させてそのまま接続コマンドを打つとパーミッションエラーになるはず

$ ssh [サーバーID]@[サーバーID].xsrv.jp -p 10022 -i ~/.ssh/[サーバーID].key
The authenticity of host '[[サーバーID].xsrv.jp]:10022 ([**.***.***.**]:10022)' can't be established.
ED25519 key fingerprint is SHA256:************************.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[[サーバーID].xsrv.jp]:10022' (ED25519) to the list of known hosts.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/Users/***/.ssh/[サーバーID].key' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/Users/***/.ssh/[サーバーID].key": bad permissions
[サーバーID]@[サーバーID].xsrv.jp: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

パーミッションエラーを解消

chmod 600 ~/.ssh/[サーバーID].key

sshでログインしてgitが使えることを確認

$ git --version
git version 1.8.3.1

トップディレクトリ配下にファイルを設置してgithubに配置する。
すると以下のファイル内容を元にgithub actionsが動作してくれる。

その前に以下のリンクの準備は済ませておこう
(サーバー側にgithubアカウントの設定と、yml内で使っているSSH_KEYなどの変数をシークレットに設定の部分)
https://zenn.dev/ytksato/articles/df781303d6d260#vps側でgit-pullできるようにする

/.github/workflows/deploy.yml
name: deploy
on:
  push:
    branches: main
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Install SSH Key for Deploy
        uses: appleboy/ssh-action@master
        with:
          key: ${{ secrets.SSH_KEY }}
          host: ${{ secrets.HOST_NAME }}
          username: ${{ secrets.SSH_USER }}
          port: ${{ secrets.SSH_PORT }}
          # git用ディレクトリからドキュメントルートにファイルをコピー
          script: |
            cd /home/****/****.xsrv.jp/forgit/ 
            git pull origin main
            \cp -rf /home/****/****.xsrv.jp/forgit/src/* /home/****/****.xsrv.jp/public_html 

わざわざ /home/〜/〜.xsrv.jp/forgit/ のディレクトリを作成してファイルをコピーしている理由について説明する。

私の環境ではローカルでDockerを構築して、そこで問題がなければpushして
本番環境に反映させることを目的にしている。

そうするとディレクトリ構造が以下の様になることが多いと思う

プロジェクト名/
├─ src/
│  ├─ 実際のコードのディレクトリ/

プロジェクト名のディレクトリごとgithubに置く場合src以下のソースだけサーバー側に欲しいのに
ドキュメントルートに全部来てしまってうまくいかないと言う状態に陥った。

特定のディレクトリだけpullすれば良いのでは?と考えた。
https://qiita.com/ponsuke0531/items/1e0ab0d6845ec93a0dc0
https://ja.stackoverflow.com/questions/73497/gitのsparse-checkoutにてリモートリポジトリから特定のフォルダ配下の中身だけ取得したい

src以下のファイルだけpullして欲しいのにディレクトリ構造が変わってしまうのでできないらしい。
(よく考えればそりゃそうだ)

仕方ないのでgit pullする用のディレクトリからドキュメントルートにソースを移動する(上書きする)方法に変更。という経緯。

また前の環境ではmvコマンド問題なかったのに、エックスサーバーでは同名のファイルが
存在していると上書きができなかったのでcpコマンドに変更した。

Discussion