laravel プロジェクトのファイルの同期

(2025-12-16)

現在、laravel プロジェクトをいくつか xserver 上に展開していますが、ローカルで作成・編集したファイルを xserver 上にアップロードするのは少し面倒です。

これまでは、

Terminal window
scp -r -i ~/.ssh/moheno.key -P 10022 \
~/kenaproject/public/build \
moheno@sv12345.xserver.jp:/home/moheno/sample.net/kenaproject/public/

みたいなコードを手動でアップロードしていました。

でも当然それだけではだめで、controller や model や blade を作成すると変更した部分をアップする必要があります。

Terminal window
moheno@moheno-Vostro-3268:~/kenaproject$ tree -L 1
.
├── app
├── resources
├── routes
└── storage

いろいろあるファイルの中で、おおよそ上の部分をアップすればほとんど事が足ります。

それをこれまでは手動でやっていましたが、面倒でしかも間違う可能性があるので自動化しようと思いました。

ローカルから xserver へ

ローカルで設定したファイルをアップロードします。

#!/bin/bash
set -e
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
cd ~/kenaproject
npm 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/build
rsync -avz --delete -e "$SSH" ~/kenaproject/public/build/ "$SSH_USER@$SSH_HOST:$DEST/public/build/"
# resources/views
rsync -avz --delete -e "$SSH" ~/kenaproject/resources/views/ "$SSH_USER@$SSH_HOST:$DEST/resources/views/"
# app
rsync -avz --delete -e "$SSH" ~/kenaproject/app/ "$SSH_USER@$SSH_HOST:$DEST/app/"
# routes
rsync -avz --delete -e "$SSH" ~/kenaproject/routes/ "$SSH_USER@$SSH_HOST:$DEST/routes/"
# storage/app
rsync -avz --delete -e "$SSH" ~/kenaproject/storage/app/ "$SSH_USER@$SSH_HOST:$DEST/storage/app/"
echo "✅ ファイルアップロード完了"

このシェルスクリプトを実行すると、ローカルでビルドされて、必要なファイルが rsync でアップロードされます。

scp と異なり、rsync なので差分しかアップロードされずとても高速です。

xserver からローカルへ

今度は、xserver からローカルへ rsync でファイルを同期します。

この場合は、データベースもダンプしてローカルの mariadb にインポートします。

#!/bin/bash
set -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/build
rsync -avz --delete -e "$SSH" "$SRC/public/build/" ~/kenaproject/public/build/
# resources/views
rsync -avz --delete -e "$SSH" "$SRC/resources/views/" ~/kenaproject/resources/views/
# app
rsync -avz --delete -e "$SSH" "$SRC/app/" ~/kenaproject/app/
# routes
rsync -avz --delete -e "$SSH" "$SRC/routes/" ~/kenaproject/routes/
# storage/app
rsync -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 "🎉 同期完了"

どちらのシェルスクリプトも数秒で完了します。

データベースをローカルから xserver へ

これが意外と難しく chatGPT は別々にしかできませんでした。

ローカルでダンプファイルを作成して、xserver の mariadb に上書きします。

#!/bin/bash
set -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 "🎉 完全上書き完了"