127 lines
No EOL
5.3 KiB
Bash
127 lines
No EOL
5.3 KiB
Bash
#!/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 <<EOF > "$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 "=== 全行程が完了しました! ===" |