#!/bin/bash # Nextcloud Snap to Docker Unified Migration Script # Version: 2026-01-21_v13 (Proxy-aware & State-managed) set -e # --- 設定 --- BACKUP_BASE_DIR="/var/snap/nextcloud/common/backups" TARGET_DIR="./nextcloud-docker" STATUS_FILE="$TARGET_DIR/.migration_status" echo "=== Nextcloud 移行プロセス開始 (v13) ===" # 0. 基礎準備 LATEST_BACKUP=$(ls -td ${BACKUP_BASE_DIR}/*/ 2>/dev/null | head -1) [ -z "$LATEST_BACKUP" ] && echo "エラー: バックアップなし" && exit 1 mkdir -p "$TARGET_DIR/data/data" "$TARGET_DIR/data/config" "$TARGET_DIR/db" if [ -f "$STATUS_FILE" ]; then source "$STATUS_FILE" else echo "LATEST_BACKUP=$LATEST_BACKUP" > "$STATUS_FILE" fi # 1. 設定情報の抽出とCompose生成 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) # DB情報抽出 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") # リバースプロキシ(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 < "$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=${PROXIES} - OVERWRITEPROTOCOL=http 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 "PROXIES=$PROXIES" >> "$STATUS_FILE" fi # 2. コンテナ起動 (修正があるため再起動を促す) if [ "$UP_DONE" != "1" ]; then echo "[Step 2/5] コンテナを起動中..." cd "$TARGET_DIR" && docker compose up -d echo "UP_DONE=1" >> "./.migration_status" sleep 20 cd .. else # 既に起動していてもComposeファイルが更新されている可能性があるため再適用 echo "[Notice] 設定更新をコンテナに適用中..." cd "$TARGET_DIR" && docker compose up -d && cd .. fi # 3. データ同期とConfigのクリーンアップ (前回と同じ) if [ "$RSYNC_DONE" != "1" ]; then 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) 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" echo "RSYNC_DONE=1" >> "$STATUS_FILE" fi # 4. DBインポート (省略) if [ "$DB_DONE" != "1" ]; then 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) 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" echo "DB_DONE=1" >> "$STATUS_FILE" fi # 5. 最終仕上げ (Redis除去とスキャン) if [ "$FINISH_DONE" != "1" ]; then echo "[Step 5/5] 設定クリーンアップとスキャン..." docker compose -f "$TARGET_DIR/docker-compose.yml" exec -u www-data app php -r " include 'config/config.php'; unset(\$CONFIG['redis']); unset(\$CONFIG['memcache.local']); unset(\$CONFIG['memcache.locking']); file_put_contents('config/config.php', '> "$STATUS_FILE" fi echo "=== 移行完了 (Trusted Proxies: $PROXIES) ==="