From ead5ff0fdfb18570ca701c62893873b41711092d Mon Sep 17 00:00:00 2001 From: choibk Date: Mon, 26 Jan 2026 09:49:00 +0900 Subject: [PATCH] [STABLE] v0.4.2.4 - Robust .env protection during updates and manual update check UI --- .gitignore | 3 ++ server/.env1 | 23 +++++++++ server/routes/system.js | 83 ++++++++++++++++++++++++------ src/platform/pages/VersionPage.tsx | 3 +- 4 files changed, 95 insertions(+), 17 deletions(-) create mode 100644 server/.env1 diff --git a/.gitignore b/.gitignore index 4dba348..b19254b 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,9 @@ Desktop.ini # Project Specific - Server server/.env +server/.env.backup* +server/*.tmp +server/backups/ server/uploads/* !server/uploads/.gitkeep server/server.zip diff --git a/server/.env1 b/server/.env1 new file mode 100644 index 0000000..06e8984 --- /dev/null +++ b/server/.env1 @@ -0,0 +1,23 @@ +# ============================================== +# [Common Settings] +# ============================================== +DB_HOST=sokuree.com +DB_USER=choibk +DB_PASSWORD=^Ocean1472bk +PORT=3005 + +# ============================================== +# [Development Environment] - Local Windows +# ============================================== +# 로컬 개발용 DB (분리됨: sokuree_platform_dev) +# DB_NAME=sokuree_platform_dev +# DB_PORT=3307 +# Windows 환경 호환성 (tcp는 권한 오류 발생 가능) +CCTV_TRANSPORT_OVERRIDE=auto + +# ============================================== +# [Production Environment] - Synology NAS +# ============================================== +DB_NAME=sokuree_platform_prod +DB_PORT=3307 + diff --git a/server/routes/system.js b/server/routes/system.js index c5f05f9..1d50041 100644 --- a/server/routes/system.js +++ b/server/routes/system.js @@ -613,7 +613,7 @@ router.post('/version/update', isAuthenticated, hasRole('admin'), async (req, re // Build auth URL for git commands let remoteUrl = auth.url; - if (auth.user && auth.pass) { + if (auth.user && auth.pass && auth.url.includes('https://')) { remoteUrl = auth.url.replace('https://', `https://${encodeURIComponent(auth.user)}:${encodeURIComponent(auth.pass)}@`); } @@ -632,18 +632,33 @@ router.post('/version/update', isAuthenticated, hasRole('admin'), async (req, re scriptContent = ` @echo off echo [Update] Starting update to ${targetTag}... -if not exist "${backupDir}" mkdir "${backupDir}" -echo [Update] Backing up Uploads & Config... -tar -czvf "${backupDir}/backup_images_${timestamp}.tar.gz" server/uploads/ -if exist "server\\.env" copy "server\\.env" "${backupDir}\\env_backup_${timestamp}" +REM Ensure backup directory +set BACKUP_PATH=${backupDir} +if not exist "%BACKUP_PATH%" mkdir "%BACKUP_PATH%" 2>nul +if not exist "%BACKUP_PATH%" ( + echo [Warning] Global backup failed, using local backup. + set BACKUP_PATH=.\\server\\backups + if not exist ".\\server\\backups" mkdir ".\\server\\backups" +) + +echo [Update] Backing up Config... +if exist "server\\.env" ( + copy /Y "server\\.env" "%BACKUP_PATH%\\.env.backup.${timestamp}" + copy /Y "server\\.env" "server\\.env.tmp" +) echo [Update] Syncing Source Code... -git fetch "${remoteUrl}" +refs/tags/*:refs/tags/* --force --prune --prune-tags +git fetch "${remoteUrl}" --tags --force --prune git checkout -f ${targetTag} echo [Update] Restoring Config... -if exist "${backupDir}\\env_backup_${timestamp}" copy /Y "${backupDir}\\env_backup_${timestamp}" "server\\.env" +if exist "server\\.env.tmp" ( + copy /Y "server\\.env.tmp" "server\\.env" + del "server\\.env.tmp" +) else if exist "%BACKUP_PATH%\\.env.backup.${timestamp}" ( + copy /Y "%BACKUP_PATH%\\.env.backup.${timestamp}" "server\\.env" +) echo [Update] Installing & Building... call npm install @@ -651,8 +666,7 @@ call npm run build cd server call npm install -echo [Update] Restarting Server... -echo "Please restart your dev server manually if needed." +echo [Update] Done. `; } else { // Linux/Synology Script @@ -660,22 +674,59 @@ echo "Please restart your dev server manually if needed." scriptContent = `#!/bin/bash exec > >(tee -a update.log) 2>&1 echo "[Update] Starting update to ${targetTag}..." -mkdir -p ${backupDir} + +# Ensure backup directory +BACKUP_DIR="${backupDir}" +mkdir -p "$BACKUP_DIR" || { + echo "[Warning] Global backup failed, using local backup." + BACKUP_DIR="./server/backups" + mkdir -p "$BACKUP_DIR" +} echo "[Update] Backing up Database..." -${dumpTool} -u ${dbUser} --password='${dbPass}' --port ${dbPort} ${dbName} > ${backupDir}/backup_db_${timestamp}.sql || echo "DB Backup Failed, continuing..." +if [ -f "${dumpTool}" ]; then + echo "[Info] MySQL dump tool found. Attempting database backup..." + ${dumpTool} -u ${dbUser} --password='${dbPass}' --port ${dbPort} ${dbName} > "$BACKUP_DIR/backup_db_${timestamp}.sql" 2>/dev/null + if [ $? -eq 0 ]; then + echo "[Info] Database backup successful." + else + echo "[Warning] Database backup failed, continuing..." + fi +else + echo "[Warning] MySQL dump tool not found. Skipping DB backup." +fi -echo "[Update] Backing up Uploads & Config..." -tar -czvf ${backupDir}/backup_images_${timestamp}.tar.gz server/uploads/ -cp server/.env ${backupDir}/.env.backup.${timestamp} +echo "[Update] Backing up Config..." +if [ -f "server/.env" ]; then + echo "[Info] Backing up 'server/.env' to '$BACKUP_DIR/.env.backup.${timestamp}' and 'server/.env.tmp'." + cp "server/.env" "$BACKUP_DIR/.env.backup.${timestamp}" + cp "server/.env" "server/.env.tmp" +else + echo "[Warning] 'server/.env' not found. Skipping config backup." +fi echo "[Update] Syncing Source Code..." git remote set-url origin "${remoteUrl}" -git fetch origin +refs/tags/*:refs/tags/* --force --prune --prune-tags +git fetch origin --tags --force --prune +if [ $? -ne 0 ]; then + echo "[Error] Git fetch failed. Exiting update." + exit 1 +fi +echo "[Info] Git fetch successful." git checkout -f ${targetTag} +if [ $? -ne 0 ]; then + echo "[Error] Git checkout to ${targetTag} failed. Exiting update." + exit 1 +fi +echo "[Info] Git checkout to ${targetTag} successful." echo "[Update] Restoring Config..." -cp ${backupDir}/.env.backup.${timestamp} server/.env +if [ -f "server/.env.tmp" ]; then + cp "server/.env.tmp" "server/.env" + rm "server/.env.tmp" +elif [ -f "$BACKUP_DIR/.env.backup.${timestamp}" ]; then + cp "$BACKUP_DIR/.env.backup.${timestamp}" "server/.env" +fi echo "[Update] Installing & Building..." npm install diff --git a/src/platform/pages/VersionPage.tsx b/src/platform/pages/VersionPage.tsx index dfce7d9..3a13e8e 100644 --- a/src/platform/pages/VersionPage.tsx +++ b/src/platform/pages/VersionPage.tsx @@ -67,7 +67,8 @@ export function VersionPage() { useEffect(() => { fetchVersion(); - fetchRemoteVersion(); + // Removed fetchRemoteVersion from auto-load to prevent "automatic" sync feeling + // fetchRemoteVersion(); }, []); const handleUpdate = async () => {