現在、laravel プロジェクトをいくつか xserver 上に展開していますが、ローカルで作成・編集したファイルを xserver 上にアップロードするのは少し面倒です。
これまでは、
scp -r -i ~/.ssh/moheno.key -P 10022 \ ~/kenaproject/public/build \ moheno@sv12345.xserver.jp:/home/moheno/sample.net/kenaproject/public/みたいなコードを手動でアップロードしていました。
でも当然それだけではだめで、controller や model や blade を作成すると変更した部分をアップする必要があります。
moheno@moheno-Vostro-3268:~/kenaproject$ tree -L 1.├── app├── resources├── routes└── storageいろいろあるファイルの中で、おおよそ上の部分をアップすればほとんど事が足ります。
それをこれまでは手動でやっていましたが、面倒でしかも間違う可能性があるので自動化しようと思いました。
ローカルで設定したファイルをアップロードします。
#!/bin/bashset -e
export NVM_DIR="$HOME/.nvm"[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
cd ~/kenaprojectnpm run build
echo "=== ローカル → Xserver 同期開始 ==="
# ===== 設定 =====SSH_USER="moheno"SSH_HOST="sv12345xserver.jp"SSH_PORT="10022"SSH_KEY="$HOME/.ssh/moheno.key"DEST="/home/moheno/sample.net/kenaproject"SSH="ssh -i $SSH_KEY -p $SSH_PORT"
# ===== 1. ファイル同期 =====echo "=== ファイルアップロード中 ==="# public/buildrsync -avz --delete -e "$SSH" ~/kenaproject/public/build/ "$SSH_USER@$SSH_HOST:$DEST/public/build/"# resources/viewsrsync -avz --delete -e "$SSH" ~/kenaproject/resources/views/ "$SSH_USER@$SSH_HOST:$DEST/resources/views/"# apprsync -avz --delete -e "$SSH" ~/kenaproject/app/ "$SSH_USER@$SSH_HOST:$DEST/app/"# routesrsync -avz --delete -e "$SSH" ~/kenaproject/routes/ "$SSH_USER@$SSH_HOST:$DEST/routes/"# storage/apprsync -avz --delete -e "$SSH" ~/kenaproject/storage/app/ "$SSH_USER@$SSH_HOST:$DEST/storage/app/"echo "✅ ファイルアップロード完了"このシェルスクリプトを実行すると、ローカルでビルドされて、必要なファイルが rsync でアップロードされます。
scp と異なり、rsync なので差分しかアップロードされずとても高速です。
今度は、xserver からローカルへ rsync でファイルを同期します。
この場合は、データベースもダンプしてローカルの mariadb にインポートします。
#!/bin/bashset -e
echo "=== Xserver Laravel + DB 同期開始 ==="
# ===== 設定 =====SSH_USER="moheno"SSH_HOST="sv12345.xserver.jp"SSH_PORT="10022"SSH_KEY="$HOME/.ssh/moheno.key"SRC="$SSH_USER@$SSH_HOST:/home/moheno/sample.net/kenaproject"# Xserver DB設定XSERVER_DB_NAME="moheno_kenadb"XSERVER_DB_USER="moheno_quena"XSERVER_DB_PASS="pass"# ローカル DB設定LOCAL_DB_NAME="kenadb"LOCAL_DB_USER="root"LOCAL_DB_PASS="heno"# ダンプファイル(固定名)DUMP_FILE="xserver_dump.sql"SSH="ssh -i $SSH_KEY -p $SSH_PORT"# ===== 1. ファイル同期 =====echo "=== ファイル同期中 ==="# public/buildrsync -avz --delete -e "$SSH" "$SRC/public/build/" ~/kenaproject/public/build/# resources/viewsrsync -avz --delete -e "$SSH" "$SRC/resources/views/" ~/kenaproject/resources/views/# apprsync -avz --delete -e "$SSH" "$SRC/app/" ~/kenaproject/app/# routesrsync -avz --delete -e "$SSH" "$SRC/routes/" ~/kenaproject/routes/# storage/apprsync -avz --delete -e "$SSH" "$SRC/storage/app/" ~/kenaproject/storage/app/echo "✅ ファイル同期完了"# ===== 2. DB同期 =====echo "=== DBダンプ取得中 ==="ssh -i "$SSH_KEY" -p "$SSH_PORT" "$SSH_USER@$SSH_HOST" \ "mysqldump --default-character-set=utf8mb4 -u $XSERVER_DB_USER -p'$XSERVER_DB_PASS' $XSERVER_DB_NAME" \ > "$DUMP_FILE"echo "✅ DBダンプ取得完了: $DUMP_FILE"echo "=== ローカルMariaDBへインポート中 ==="mysql --default-character-set=utf8mb4 -u "$LOCAL_DB_USER" -p"$LOCAL_DB_PASS" "$LOCAL_DB_NAME" < "$DUMP_FILE"echo "🎉 同期完了"どちらのシェルスクリプトも数秒で完了します。
これが意外と難しく chatGPT は別々にしかできませんでした。
ローカルでダンプファイルを作成して、xserver の mariadb に上書きします。
#!/bin/bashset -e
SSH_USER="moheno"SSH_HOST="sv12345.xserver.jp"SSH_PORT="10022"SSH_KEY="$HOME/.ssh/moheno.key"
DB_NAME="moheno_kenadb"DB_USER="moheno_quena"DB_PASS="pass"
SQL="kenadb.sql"
echo "=== Xserver DB を初期化 ==="
ssh -i "$SSH_KEY" -p "$SSH_PORT" "$SSH_USER@$SSH_HOST" "mysql -u $DB_USER -p'$DB_PASS' -e 'DROP DATABASE IF EXISTS $DB_NAME;CREATE DATABASE $DB_NAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;'"
echo "=== SQL インポート ==="
cat "$SQL" | ssh -i "$SSH_KEY" -p "$SSH_PORT" "$SSH_USER@$SSH_HOST" \ "mysql -u $DB_USER -p'$DB_PASS' $DB_NAME"
echo "🎉 完全上書き完了"