用 Envoy 現代化佈署 Laravel

SSL

1.需用SSH 你的 vps/server

2.假設你用github, 你vps/server 要經ssh 可進入 github

建立ssh key可參考此文章前半部: https://skychoy.com/posts/175-%E7%94%9F%E6%88%90ssh-key-%E4%B8%A6%E7%AE%A1%E7%90%86server-%E6%88%96-vps%E4%B8%AD%E7%9A%84docker

Envoy 是什麼

Envoy 可理解為簡易版的CI/CD

Envoy是Laravel 開發的,用來佈署Laravel當然很適合

Envoy 用Blade語法,適合Laravel使用者

安裝 Envoy

composer require laravel/envoy --dev

參考文件:本機的 ~/.ssh/config

Host myserver
    HostName 123.123.123.123. //ssh server
    User root
    IdentityFile ~/.ssh/key_name

我相信用SSH連server的朋友的會為不同server建立不同的ssh key?

如手動,每次都需要

ssh -i ~/.ssh/key_name your-username@your-server-ip

但如果按照上面的~/.ssh/config 做法

ssh myserver
//就等同於
ssh -i ~/.ssh/key_name root@123.123.123.123

如果這時候每次用 ssh myserver 都要密碼...

登入server 執行

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

如果你可以直接免server密碼登入,那麼這一步可不執行

登入server建立並添加公鑰到 GitHub

先登入到server

ssh myserver

建立ssh key

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

會彈出來名你建個名稱,假設名為github

copy公鑰

cat ~/.ssh/github.pub

1.將生成的公鑰(假設名為 ~/.ssh/github.pub)複製到 GitHub: 2.登錄到你的 GitHub 帳戶。 3.進入 Settings > SSH and GPG keys > New SSH key。 4.將公鑰粘貼到相應的欄位並保存。

文件參考:server上的 ~/.ssh/config

Host github.com
    User git
    IdentityFile ~/.ssh/github

完成上面設定後再執行一次

ssh -T git@github.com

之後輸入yes 執行

建立一次記錄在server上,否則直接執行Envoy會無法驗證到github

參考文件 Envoy.blade.php

@servers(['web' => 'myserver'])

@setup
    $repository = 'git@github.com:username/someone.git';
    $app_dir = '/opt/apache/www/domain.com/public_html';
    $docker_dir = '/www/domain.com/public_html';
    $container_name = 'php8'; 
@endsetup

@story('deploy')
    prepare_directory
    clone_or_pull
    install_dependencies
    migrate
@endstory

@task('prepare_directory')
    echo 'Preparing directory...'
    mkdir -p {{ $app_dir }}
    sudo chown -R root:root {{ $app_dir }}

@endtask

@task('clone_or_pull')
    echo 'Cloning or pulling repository...'
    if [ -d {{ $app_dir }}/.git ]; then
        cd {{ $app_dir }}
        git pull origin main
    else
        git clone {{ $repository }} {{ $app_dir }}
    fi
@endtask

@task('install_dependencies')
    echo 'Installing dependencies...'
    docker exec -w {{ $docker_dir }} {{ $container_name }} composer install --no-interaction --prefer-dist
    sudo chown -R www:www {{ $app_dir }}
@endtask

@task('migrate')
    echo 'Running migrations...'
    docker exec -w {{ $docker_dir }} {{ $container_name }} php artisan migrate --force
@endtask

解釋一下:

因為上一步~/.ssh/config設定了連線,所以@servers(['web' => 'myserver'])就足夠

$repository 填寫你的git 對應的帳號及git name

$app_dir vps/server, 你網站的root path, 但要詳細的絕對路徑

$docker_dir因為我的案例是用docker運作PHP,對docker而言,路徑訪問不出外層的,所以由/opt 開始的路徑好像去不了? 所以這樣填解決了我一個大坑

$container_name 如上,因為我是用docker,執行composer install時需要經docker 去執行,所以需要知道docker中 PHP 的容器名稱

執行

cd laravel_project
php vendor/bin/envoy run deploy

常見問題

1.建立SSH key時不一定自動是放 ~/.ssh/ 需要確定一下生成了在什麼位置,常見是應該存放在這

2.我是因為server中PHP經docker運作,所以composer路徑是個大坑,要注意

3.SSH登入時一般用root登入,但是apache等網頁server一般情況下是執行不了文件為root擁有人的文件,所以在 Envoy.blade.phpinstall_dependencies 這一步我做了 sudo chown -R www:www {{ $app_dir }} 把整個目錄都還給原本的 apache使用者,不一定是www 視乎你server個別設定

4.如上問題 Envoy.blade.phpprepare_directory做了sudo chown -R root:root {{ $app_dir }} 把chown全設定為 登入者相同的名稱,比如root,這樣才能繼續做下面的動作

5.建立ssh key時很多時都會設定個密碼短語,但如果在 Envoy 所用的SSH Key 我建議就不用設定,主要是因為...Envoy本來就是自動化佈署,但如果你的ssh key 有密碼短語,那麼你執行時幾乎每一步都要打一次密碼,一點也不自動,所以你自己可考慮一下是否需要短語

6.@task('xxxx')@endtask 之間就是直接打 Linux command,所以需要對Linux command 有一定的基礎認知