migrade.sh を更新

trutedなproxyをcomposeにハードコードせずconfig.phpから持ってくる
This commit is contained in:
joe 2026-01-20 23:42:29 +00:00
parent aa2a835f1d
commit 5425b341f6

View file

@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# Nextcloud Snap to Docker Unified Migration Script # Nextcloud Snap to Docker Unified Migration Script
# State-aware: Resumes from last successful step # Version: 2026-01-21_v13 (Proxy-aware & State-managed)
set -e set -e
@ -9,33 +9,35 @@ BACKUP_BASE_DIR="/var/snap/nextcloud/common/backups"
TARGET_DIR="./nextcloud-docker" TARGET_DIR="./nextcloud-docker"
STATUS_FILE="$TARGET_DIR/.migration_status" STATUS_FILE="$TARGET_DIR/.migration_status"
echo "=== Nextcloud 移行プロセス (フラグ管理版) 開始 ===" echo "=== Nextcloud 移行プロセス開始 (v13) ==="
# 0. 基礎情報の取得と準備 # 0. 基礎準備
LATEST_BACKUP=$(ls -td ${BACKUP_BASE_DIR}/*/ 2>/dev/null | head -1) LATEST_BACKUP=$(ls -td ${BACKUP_BASE_DIR}/*/ 2>/dev/null | head -1)
if [ -z "$LATEST_BACKUP" ]; then echo "エラー: バックアップが見つかりません。"; exit 1; fi [ -z "$LATEST_BACKUP" ] && echo "エラー: バックアップなし" && exit 1
mkdir -p "$TARGET_DIR/data" "$TARGET_DIR/db" mkdir -p "$TARGET_DIR/data/data" "$TARGET_DIR/data/config" "$TARGET_DIR/db"
# ステータスファイルの読み込み(存在する場合)
if [ -f "$STATUS_FILE" ]; then if [ -f "$STATUS_FILE" ]; then
source "$STATUS_FILE" source "$STATUS_FILE"
echo "前回の続きから再開します。"
else else
echo "新規マイグレーションを開始します。"
echo "LATEST_BACKUP=$LATEST_BACKUP" > "$STATUS_FILE" echo "LATEST_BACKUP=$LATEST_BACKUP" > "$STATUS_FILE"
fi fi
# 1. 設定ファイルの特定と情報抽出 (PREPARE) # 1. 設定情報の抽出とCompose生成
if [ "$PREPARE_DONE" != "1" ]; then if [ "$PREPARE_DONE" != "1" ]; then
echo "[Step 1/5] 設定情報を抽出中..." echo "[Step 1/5] 設定情報を抽出中..."
[ -f "${LATEST_BACKUP}config.php" ] && CONFIG_PHP="${LATEST_BACKUP}config.php" || CONFIG_PHP=$(find "$LATEST_BACKUP" -maxdepth 2 -name "config.php" | head -n 1) [ -f "${LATEST_BACKUP}config.php" ] && CONFIG_PHP="${LATEST_BACKUP}config.php" || CONFIG_PHP=$(find "$LATEST_BACKUP" -maxdepth 2 -name "config.php" | head -n 1)
# DB情報抽出
NC_DB_USER=$(grep "'dbuser'" "$CONFIG_PHP" | cut -d"'" -f4 || echo "nextcloud") NC_DB_USER=$(grep "'dbuser'" "$CONFIG_PHP" | cut -d"'" -f4 || echo "nextcloud")
NC_DB_PASS=$(grep "'dbpassword'" "$CONFIG_PHP" | cut -d"'" -f4 || echo "password") NC_DB_PASS=$(grep "'dbpassword'" "$CONFIG_PHP" | cut -d"'" -f4 || echo "password")
NC_DB_NAME=$(grep "'dbname'" "$CONFIG_PHP" | cut -d"'" -f4 || echo "nextcloud") NC_DB_NAME=$(grep "'dbname'" "$CONFIG_PHP" | cut -d"'" -f4 || echo "nextcloud")
# docker-compose.yml 生成 # リバースプロキシ(NPM等)のIPアドレスを配列から抽出してカンマ区切りにする
# 'trusted_proxies' => array ( 0 => 'IP', 1 => 'IP' ) の形式に対応
PROXIES=$(sed -n "/'trusted_proxies'/,/)/p" "$CONFIG_PHP" | grep -E -o "([0-9]{1,3}\.){3}[0-9]{1,3}" | tr '\n' ',' | sed 's/,$//')
[ -z "$PROXIES" ] && PROXIES="127.0.0.1" # 取得失敗時のデフォルト
cat <<EOF > "$TARGET_DIR/docker-compose.yml" cat <<EOF > "$TARGET_DIR/docker-compose.yml"
services: services:
db: db:
@ -58,70 +60,74 @@ services:
- MYSQL_DATABASE=${NC_DB_NAME} - MYSQL_DATABASE=${NC_DB_NAME}
- MYSQL_USER=${NC_DB_USER} - MYSQL_USER=${NC_DB_USER}
- MYSQL_HOST=db - MYSQL_HOST=db
- TRUSTED_PROXIES=10.10.100.228 - TRUSTED_PROXIES=${PROXIES}
- OVERWRITEPROTOCOL=https - OVERWRITEPROTOCOL=http
EOF EOF
echo "PREPARE_DONE=1" >> "$STATUS_FILE" echo "PREPARE_DONE=1" >> "$STATUS_FILE"
echo "NC_DB_USER=$NC_DB_USER" >> "$STATUS_FILE" echo "NC_DB_USER=$NC_DB_USER" >> "$STATUS_FILE"
echo "NC_DB_PASS=$NC_DB_PASS" >> "$STATUS_FILE" echo "NC_DB_PASS=$NC_DB_PASS" >> "$STATUS_FILE"
echo "NC_DB_NAME=$NC_DB_NAME" >> "$STATUS_FILE" echo "NC_DB_NAME=$NC_DB_NAME" >> "$STATUS_FILE"
echo "Composeファイル生成完了。" echo "PROXIES=$PROXIES" >> "$STATUS_FILE"
else
echo "[Skip] Step 1: 設定抽出は完了済みです。"
source "$STATUS_FILE" # 最新変数を読み込み
fi fi
# 2. コンテナ起動 (UP) # 2. コンテナ起動 (修正があるため再起動を促す)
if [ "$UP_DONE" != "1" ]; then if [ "$UP_DONE" != "1" ]; then
echo "[Step 2/5] コンテナを起動中..." echo "[Step 2/5] コンテナを起動中..."
cd "$TARGET_DIR" && docker compose up -d cd "$TARGET_DIR" && docker compose up -d
echo "UP_DONE=1" >> "./.migration_status" echo "UP_DONE=1" >> "./.migration_status"
echo "コンテナ起動成功。DB初期化のため30秒待機します..." sleep 20
sleep 30
cd .. cd ..
else else
echo "[Skip] Step 2: コンテナは起動済みです。" # 既に起動していてもComposeファイルが更新されている可能性があるため再適用
echo "[Notice] 設定更新をコンテナに適用中..."
cd "$TARGET_DIR" && docker compose up -d && cd ..
fi fi
# 3. データ同期 (RSYNC) # 3. データ同期とConfigのクリーンアップ (前回と同じ)
if [ "$RSYNC_DONE" != "1" ]; then if [ "$RSYNC_DONE" != "1" ]; then
echo "[Step 3/5] ファイル同期中 (rsync)..." echo "[Step 3/5] ファイル同期とConfig修正..."
[ -d "${LATEST_BACKUP}data" ] && SRC="${LATEST_BACKUP}data" || SRC=$(find "$LATEST_BACKUP" -maxdepth 2 -type d -name "data" | head -n 1) [ -d "${LATEST_BACKUP}data" ] && SRC="${LATEST_BACKUP}data" || SRC=$(find "$LATEST_BACKUP" -maxdepth 2 -type d -name "data" | head -n 1)
sudo rsync -av "$SRC/" "$TARGET_DIR/data/" sudo rsync -av "$SRC/" "$TARGET_DIR/data/data/"
[ -f "${LATEST_BACKUP}config.php" ] && CP_SRC="${LATEST_BACKUP}config.php" || CP_SRC=$(find "$LATEST_BACKUP" -maxdepth 2 -name "config.php" | head -n 1)
CFG_DST="$TARGET_DIR/data/config/config.php"
sudo cp "$CP_SRC" "$CFG_DST"
sudo sed -i "/'apps_paths' =>/,/ ),/d" "$CFG_DST"
sudo sed -i "/'redis' =>/,/);/d" "$CFG_DST"
sudo sed -i "/'memcache.locking' =>/d" "$CFG_DST"
sudo sed -i "/'memcache.local' =>/d" "$CFG_DST"
sudo sed -i "s|'dbhost' => '.*'|'dbhost' => 'db'|" "$CFG_DST"
sudo sed -i "s|'datadirectory' => '.*'|'datadirectory' => '/var/www/html/data'|" "$CFG_DST"
sudo sed -i "s|'logfile' => '.*'|'logfile' => '/var/www/html/data/nextcloud.log'|" "$CFG_DST"
sudo sed -i "s/'maintenance' => true/'maintenance' => false/" "$CFG_DST"
sudo chown -R 33:33 "$TARGET_DIR/data" sudo chown -R 33:33 "$TARGET_DIR/data"
echo "RSYNC_DONE=1" >> "$STATUS_FILE" echo "RSYNC_DONE=1" >> "$STATUS_FILE"
else
echo "[Skip] Step 3: ファイル同期は完了済みです。"
fi fi
# 4. データベースインポート (DB) # 4. DBインポート (省略)
if [ "$DB_DONE" != "1" ]; then if [ "$DB_DONE" != "1" ]; then
echo "[Step 4/5] DBインポート中..." echo "[Step 4/5] DB復元..."
source "$STATUS_FILE"
[ -f "${LATEST_BACKUP}database.sql" ] && SQL="${LATEST_BACKUP}database.sql" || SQL=$(find "$LATEST_BACKUP" -maxdepth 2 -name "*.sql" | head -n 1) [ -f "${LATEST_BACKUP}database.sql" ] && SQL="${LATEST_BACKUP}database.sql" || SQL=$(find "$LATEST_BACKUP" -maxdepth 2 -name "*.sql" | head -n 1)
docker compose -f "$TARGET_DIR/docker-compose.yml" exec -T db mariadb -uroot -p${NC_DB_PASS} -e "CREATE DATABASE IF NOT EXISTS \`${NC_DB_NAME}\`;" docker compose -f "$TARGET_DIR/docker-compose.yml" exec -T db mariadb -uroot -p${NC_DB_PASS} -e "CREATE DATABASE IF NOT EXISTS \`${NC_DB_NAME}\`;"
docker compose -f "$TARGET_DIR/docker-compose.yml" exec -T db mariadb -uroot -p${NC_DB_PASS} "${NC_DB_NAME}" < "$SQL" docker compose -f "$TARGET_DIR/docker-compose.yml" exec -T db mariadb -uroot -p${NC_DB_PASS} "${NC_DB_NAME}" < "$SQL"
docker compose -f "$TARGET_DIR/docker-compose.yml" exec -T db mariadb -uroot -p${NC_DB_PASS} -e "GRANT ALL PRIVILEGES ON \`${NC_DB_NAME}\`.* TO '${NC_DB_USER}'@'%'; FLUSH PRIVILEGES;"
echo "DB_DONE=1" >> "$STATUS_FILE" echo "DB_DONE=1" >> "$STATUS_FILE"
else
echo "[Skip] Step 4: DBインポートは完了済みです。"
fi fi
# 5. システム設定とスキャン (FINISH) # 5. 最終仕上げ (Redis除去とスキャン)
if [ "$FINISH_DONE" != "1" ]; then if [ "$FINISH_DONE" != "1" ]; then
echo "[Step 5/5] システム設定適用 & ファイルスキャン..." echo "[Step 5/5] 設定クリーンアップとスキャン..."
[ -f "${LATEST_BACKUP}config.php" ] && CONFIG_PHP="${LATEST_BACKUP}config.php" || CONFIG_PHP=$(find "$LATEST_BACKUP" -maxdepth 2 -name "config.php" | head -n 1) docker compose -f "$TARGET_DIR/docker-compose.yml" exec -u www-data app php -r "
NC_INST_ID=$(grep "'instanceid'" "$CONFIG_PHP" | cut -d"'" -f4) include 'config/config.php';
NC_SECRET=$(grep "'secret'" "$CONFIG_PHP" | cut -d"'" -f4) unset(\$CONFIG['redis']);
NC_SALT=$(grep "'passwordsalt'" "$CONFIG_PHP" | cut -d"'" -f4) unset(\$CONFIG['memcache.local']);
unset(\$CONFIG['memcache.locking']);
docker compose -f "$TARGET_DIR/docker-compose.yml" exec -u www-data app php occ config:system:set instanceid --value="$NC_INST_ID" file_put_contents('config/config.php', '<?php \$CONFIG = ' . var_export(\$CONFIG, true) . ';');
docker compose -f "$TARGET_DIR/docker-compose.yml" exec -u www-data app php occ config:system:set secret --value="$NC_SECRET" " || true
docker compose -f "$TARGET_DIR/docker-compose.yml" exec -u www-data app php occ config:system:set passwordsalt --value="$NC_SALT" docker compose -f "$TARGET_DIR/docker-compose.yml" exec -u www-data app php occ upgrade || true
docker compose -f "$TARGET_DIR/docker-compose.yml" exec -u www-data app php occ config:system:set maintenance --value="false" --type=bool
docker compose -f "$TARGET_DIR/docker-compose.yml" exec -u www-data app php occ files:scan --all docker compose -f "$TARGET_DIR/docker-compose.yml" exec -u www-data app php occ files:scan --all
echo "FINISH_DONE=1" >> "$STATUS_FILE" echo "FINISH_DONE=1" >> "$STATUS_FILE"
else
echo "[Skip] Step 5: 設定適用とスキャンは完了済みです。"
fi fi
echo "=== 全行程が完了しました! ===" echo "=== 移行完了 (Trusted Proxies: $PROXIES) ==="