From aa2a835f1deaf7b23dc4d79c95f8e9f7a770dfeb Mon Sep 17 00:00:00 2001 From: joe Date: Tue, 20 Jan 2026 21:29:34 +0000 Subject: [PATCH] =?UTF-8?q?migrade.sh=20=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- migrade.sh | 127 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 migrade.sh diff --git a/migrade.sh b/migrade.sh new file mode 100644 index 0000000..06f75f9 --- /dev/null +++ b/migrade.sh @@ -0,0 +1,127 @@ +#!/bin/bash +# Nextcloud Snap to Docker Unified Migration Script +# State-aware: Resumes from last successful step + +set -e + +# --- 設定 --- +BACKUP_BASE_DIR="/var/snap/nextcloud/common/backups" +TARGET_DIR="./nextcloud-docker" +STATUS_FILE="$TARGET_DIR/.migration_status" + +echo "=== Nextcloud 移行プロセス (フラグ管理版) 開始 ===" + +# 0. 基礎情報の取得と準備 +LATEST_BACKUP=$(ls -td ${BACKUP_BASE_DIR}/*/ 2>/dev/null | head -1) +if [ -z "$LATEST_BACKUP" ]; then echo "エラー: バックアップが見つかりません。"; exit 1; fi + +mkdir -p "$TARGET_DIR/data" "$TARGET_DIR/db" + +# ステータスファイルの読み込み(存在する場合) +if [ -f "$STATUS_FILE" ]; then + source "$STATUS_FILE" + echo "前回の続きから再開します。" +else + echo "新規マイグレーションを開始します。" + echo "LATEST_BACKUP=$LATEST_BACKUP" > "$STATUS_FILE" +fi + +# 1. 設定ファイルの特定と情報抽出 (PREPARE) +if [ "$PREPARE_DONE" != "1" ]; then + 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) + + 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_NAME=$(grep "'dbname'" "$CONFIG_PHP" | cut -d"'" -f4 || echo "nextcloud") + + # docker-compose.yml 生成 + cat < "$TARGET_DIR/docker-compose.yml" +services: + db: + image: mariadb:10.11 + restart: always + volumes: [ "./db:/var/lib/mysql" ] + environment: + - MYSQL_ROOT_PASSWORD=${NC_DB_PASS} + - MYSQL_DATABASE=${NC_DB_NAME} + - MYSQL_USER=${NC_DB_USER} + - MYSQL_PASSWORD=${NC_DB_PASS} + app: + image: nextcloud:latest + restart: always + ports: [ "8080:80" ] + links: [ db ] + volumes: [ "./data:/var/www/html" ] + environment: + - MYSQL_PASSWORD=${NC_DB_PASS} + - MYSQL_DATABASE=${NC_DB_NAME} + - MYSQL_USER=${NC_DB_USER} + - MYSQL_HOST=db + - TRUSTED_PROXIES=10.10.100.228 + - OVERWRITEPROTOCOL=https +EOF + echo "PREPARE_DONE=1" >> "$STATUS_FILE" + echo "NC_DB_USER=$NC_DB_USER" >> "$STATUS_FILE" + echo "NC_DB_PASS=$NC_DB_PASS" >> "$STATUS_FILE" + echo "NC_DB_NAME=$NC_DB_NAME" >> "$STATUS_FILE" + echo "Composeファイル生成完了。" +else + echo "[Skip] Step 1: 設定抽出は完了済みです。" + source "$STATUS_FILE" # 最新変数を読み込み +fi + +# 2. コンテナ起動 (UP) +if [ "$UP_DONE" != "1" ]; then + echo "[Step 2/5] コンテナを起動中..." + cd "$TARGET_DIR" && docker compose up -d + echo "UP_DONE=1" >> "./.migration_status" + echo "コンテナ起動成功。DB初期化のため30秒待機します..." + sleep 30 + cd .. +else + echo "[Skip] Step 2: コンテナは起動済みです。" +fi + +# 3. データ同期 (RSYNC) +if [ "$RSYNC_DONE" != "1" ]; then + echo "[Step 3/5] ファイル同期中 (rsync)..." + [ -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 chown -R 33:33 "$TARGET_DIR/data" + echo "RSYNC_DONE=1" >> "$STATUS_FILE" +else + echo "[Skip] Step 3: ファイル同期は完了済みです。" +fi + +# 4. データベースインポート (DB) +if [ "$DB_DONE" != "1" ]; then + echo "[Step 4/5] DBインポート中..." + [ -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} "${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" +else + echo "[Skip] Step 4: DBインポートは完了済みです。" +fi + +# 5. システム設定とスキャン (FINISH) +if [ "$FINISH_DONE" != "1" ]; then + 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) + NC_INST_ID=$(grep "'instanceid'" "$CONFIG_PHP" | cut -d"'" -f4) + NC_SECRET=$(grep "'secret'" "$CONFIG_PHP" | cut -d"'" -f4) + NC_SALT=$(grep "'passwordsalt'" "$CONFIG_PHP" | cut -d"'" -f4) + + docker compose -f "$TARGET_DIR/docker-compose.yml" exec -u www-data app php occ config:system:set instanceid --value="$NC_INST_ID" + docker compose -f "$TARGET_DIR/docker-compose.yml" exec -u www-data app php occ config:system:set secret --value="$NC_SECRET" + 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 files:scan --all + echo "FINISH_DONE=1" >> "$STATUS_FILE" +else + echo "[Skip] Step 5: 設定適用とスキャンは完了済みです。" +fi + +echo "=== 全行程が完了しました! ===" \ No newline at end of file