From 922552c30b3dba540e84429a0b9905c5e9b40fab Mon Sep 17 00:00:00 2001 From: vibsin9322 Date: Thu, 21 Aug 2025 18:23:27 +0900 Subject: [PATCH] Update deployment scripts with Node.js path fixes and data preservation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Modified deploy-to-nas.sh to use vibsin9322 account - Added Node.js path detection for Synology NAS - Fixed npm command paths to use full Node.js path - Added database backup and preservation logic - Created manual deployment guide and SSH helper scripts ๐Ÿค– Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .claude/settings.local.json | 9 +- deploy-manual.sh | 46 +++++++ deploy-to-nas.sh | 87 +++++++++----- enhanced-server.js | 234 ++++++++++++++++++++++++++++++++++++ ssh-connect.sh | 12 ++ 5 files changed, 359 insertions(+), 29 deletions(-) create mode 100644 deploy-manual.sh create mode 100644 enhanced-server.js create mode 100644 ssh-connect.sh diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 9853736..5125765 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -39,12 +39,17 @@ "mcp__sequential-thinking__sequentialthinking", "Bash(git commit:*)", "Bash(chmod:*)", - "Bash(./deploy-to-nas.sh:*)" + "Bash(./deploy-to-nas.sh:*)", + "Bash(ssh:*)", + "Bash(scp:*)", + "Bash(cat:*)", + "Bash(./deploy-manual.sh)" ], "deny": [], "ask": [], "additionalDirectories": [ - "C:\\c\\Users\\COMTREE\\claude_code" + "C:\\c\\Users\\COMTREE\\claude_code", + "C:\\Users\\COMTREE\\.ssh" ] }, "default-mode": "plan" diff --git a/deploy-manual.sh b/deploy-manual.sh new file mode 100644 index 0000000..b865fb9 --- /dev/null +++ b/deploy-manual.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +# ์ˆ˜๋™ ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ - ๊ฐ ๋‹จ๊ณ„๋ฅผ ๊ฐœ๋ณ„ ์‹คํ–‰ +NAS_IP="119.64.1.86" +NAS_USER="vibsin9322" +DEPLOY_DIR="/volume1/web/jaryo" +GITEA_URL="http://119.64.1.86:3000/vibsin9322/jaryo.git" + +echo "==========================================" +echo "๐Ÿ”ง ์ˆ˜๋™ ๋ฐฐํฌ ๊ฐ€์ด๋“œ" +echo "==========================================" +echo "๋‹ค์Œ ๋ช…๋ น๋“ค์„ ํ•˜๋‚˜์”ฉ ์‹คํ–‰ํ•˜์„ธ์š”:" +echo "" + +echo "1๏ธโƒฃ SSH ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ:" +echo "ssh -p 2222 $NAS_USER@$NAS_IP" +echo "" + +echo "2๏ธโƒฃ ๊ธฐ์กด ๋ฐฐํฌ ๋ฐฑ์—… (์žˆ๋Š” ๊ฒฝ์šฐ):" +echo "ssh -p 2222 $NAS_USER@$NAS_IP 'sudo cp -r $DEPLOY_DIR ${DEPLOY_DIR}_backup_\$(date +%Y%m%d_%H%M%S) 2>/dev/null || true'" +echo "" + +echo "3๏ธโƒฃ ๋ฐฐํฌ ๋””๋ ‰ํ† ๋ฆฌ ์ค€๋น„:" +echo "ssh -p 2222 $NAS_USER@$NAS_IP 'sudo rm -rf $DEPLOY_DIR && sudo mkdir -p $DEPLOY_DIR && sudo chown $NAS_USER:users $DEPLOY_DIR'" +echo "" + +echo "4๏ธโƒฃ Git ํด๋ก :" +echo "ssh -p 2222 $NAS_USER@$NAS_IP 'cd $DEPLOY_DIR && git clone $GITEA_URL .'" +echo "" + +echo "5๏ธโƒฃ ์˜์กด์„ฑ ์„ค์น˜:" +echo "ssh -p 2222 $NAS_USER@$NAS_IP 'cd $DEPLOY_DIR && npm install'" +echo "" + +echo "6๏ธโƒฃ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฒ˜๋ฆฌ:" +echo "ssh -p 2222 $NAS_USER@$NAS_IP 'cd $DEPLOY_DIR && if [ -f data/database.db ]; then echo \"๊ธฐ์กด DB ์œ ์ง€\"; else npm run init-db; fi'" +echo "" + +echo "7๏ธโƒฃ ์„œ๋น„์Šค ์‹œ์ž‘:" +echo "ssh -p 2222 $NAS_USER@$NAS_IP 'cd $DEPLOY_DIR && PORT=3005 nohup node server.js > logs/app.log 2>&1 & echo \$! > jaryo.pid'" +echo "" + +echo "8๏ธโƒฃ ์„œ๋น„์Šค ํ™•์ธ:" +echo "curl http://$NAS_IP:3005" +echo "" +echo "==========================================" \ No newline at end of file diff --git a/deploy-to-nas.sh b/deploy-to-nas.sh index 36eea5f..17aad97 100644 --- a/deploy-to-nas.sh +++ b/deploy-to-nas.sh @@ -1,15 +1,22 @@ #!/bin/bash # ์‹œ๋†€๋กœ์ง€ NAS ์ž๋ฃŒ์‹ค ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ -# ์‚ฌ์šฉ๋ฒ•: ./deploy-to-nas.sh [nas-ip] [project-name] +# ์‚ฌ์šฉ๋ฒ•: ./deploy-to-nas.sh [nas-ip] [project-name] [password] +# ์˜ˆ์‹œ: ./deploy-to-nas.sh 119.64.1.86 jaryo mypassword +# ํ™˜๊ฒฝ๋ณ€์ˆ˜: NAS_PASS=mypassword ./deploy-to-nas.sh # ๊ธฐ๋ณธ ์„ค์ • NAS_IP="${1:-119.64.1.86}" PROJECT_NAME="${2:-jaryo}" +NAS_USER="vibsin9322" +NAS_PASS="${3:-vibsin9322}" # ๊ธฐ๋ณธ ๋น„๋ฐ€๋ฒˆํ˜ธ, ํ™˜๊ฒฝ๋ณ€์ˆ˜ NAS_PASS๋กœ ์˜ค๋ฒ„๋ผ์ด๋“œ ๊ฐ€๋Šฅ DEPLOY_DIR="/volume1/web/$PROJECT_NAME" SERVICE_PORT="3005" GITEA_URL="http://$NAS_IP:3000/vibsin9322/jaryo.git" +# SSH ๋ช…๋ น์–ด ์ค€๋น„ +SSH_CMD="ssh -p 2222 -o ConnectTimeout=10 -o StrictHostKeyChecking=no $NAS_USER@$NAS_IP" + echo "==========================================" echo "๐Ÿš€ ์‹œ๋†€๋กœ์ง€ NAS ์ž๋ฃŒ์‹ค ๋ฐฐํฌ ์‹œ์ž‘" echo "==========================================" @@ -23,9 +30,13 @@ echo "==========================================" # ์‚ฌ์ „ ์š”๊ตฌ์‚ฌํ•ญ ํ™•์ธ echo "๐Ÿ“‹ 1๋‹จ๊ณ„: ์‚ฌ์ „ ์š”๊ตฌ์‚ฌํ•ญ ํ™•์ธ" +# SSH ๋ฐฉ์‹ ํ™•์ธ +echo "๐Ÿ”ง SSH ์ ‘์† ๋ฐฉ์‹: ๋น„๋ฐ€๋ฒˆํ˜ธ ํ”„๋กฌํ”„ํŠธ ๋ฐฉ์‹" +echo "๐Ÿ“ SSH ์—ฐ๊ฒฐ ์‹œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค." + # SSH ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ (ํฌํŠธ 2222) -echo "๐Ÿ”— SSH ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ ์ค‘... (ํฌํŠธ 2222)" -if ! ssh -p 2222 -o ConnectTimeout=5 admin@$NAS_IP "echo 'SSH ์—ฐ๊ฒฐ ์„ฑ๊ณต'" 2>/dev/null; then +echo "๐Ÿ”— SSH ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ ์ค‘... (์‚ฌ์šฉ์ž: $NAS_USER, ํฌํŠธ: 2222)" +if ! eval "$SSH_CMD 'echo SSH ์—ฐ๊ฒฐ ์„ฑ๊ณต'"; then echo "โŒ SSH ์—ฐ๊ฒฐ ์‹คํŒจ. ๋‹ค์Œ์„ ํ™•์ธํ•˜์„ธ์š”:" echo " - NAS IP ์ฃผ์†Œ: $NAS_IP" echo " - SSH ํฌํŠธ: 2222" @@ -37,27 +48,31 @@ echo "โœ… SSH ์—ฐ๊ฒฐ ์„ฑ๊ณต" # Node.js ์„ค์น˜ ํ™•์ธ echo "๐Ÿ“ฆ Node.js ์„ค์น˜ ํ™•์ธ ์ค‘..." -ssh -p 2222 admin@$NAS_IP "which node" >/dev/null 2>&1 -if [ $? -ne 0 ]; then +NODE_PATH="" +if eval "$SSH_CMD 'test -f /usr/local/bin/node'" 2>/dev/null; then + NODE_PATH="/usr/local/bin" +elif eval "$SSH_CMD 'which node'" >/dev/null 2>&1; then + NODE_PATH=$(eval "$SSH_CMD 'which node'" | dirname) +else echo "โŒ Node.js๊ฐ€ ์„ค์น˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค." echo "DSM ํŒจํ‚ค์ง€ ์„ผํ„ฐ์—์„œ Node.js๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”." exit 1 fi -NODE_VERSION=$(ssh -p 2222 admin@$NAS_IP "node --version") -echo "โœ… Node.js ์„ค์น˜๋จ: $NODE_VERSION" +NODE_VERSION=$(eval "$SSH_CMD '$NODE_PATH/node --version'") +echo "โœ… Node.js ์„ค์น˜๋จ: $NODE_VERSION ($NODE_PATH)" # Git ์„ค์น˜ ํ™•์ธ echo "๐Ÿ“ฆ Git ์„ค์น˜ ํ™•์ธ ์ค‘..." -ssh -p 2222 admin@$NAS_IP "which git" >/dev/null 2>&1 +eval "$SSH_CMD 'which git'" >/dev/null 2>&1 if [ $? -ne 0 ]; then echo "โŒ Git์ด ์„ค์น˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค." echo "DSM ํŒจํ‚ค์ง€ ์„ผํ„ฐ์—์„œ Git Server๋ฅผ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์„ธ์š”:" - echo "ssh -p 2222 admin@$NAS_IP 'sudo apt update && sudo apt install git'" + echo "ssh -p 2222 $NAS_USER@$NAS_IP 'sudo apt update && sudo apt install git'" exit 1 fi -GIT_VERSION=$(ssh -p 2222 admin@$NAS_IP "git --version") +GIT_VERSION=$(eval "$SSH_CMD 'git --version'") echo "โœ… Git ์„ค์น˜๋จ: $GIT_VERSION" # 2๋‹จ๊ณ„: ์†Œ์Šค ์ฝ”๋“œ ๋ฐฐํฌ @@ -66,7 +81,7 @@ echo "๐Ÿ“‚ 2๋‹จ๊ณ„: ์†Œ์Šค ์ฝ”๋“œ ๋ฐฐํฌ" # ๊ธฐ์กด ๋ฐฐํฌ ๋””๋ ‰ํ† ๋ฆฌ ํ™•์ธ echo "๐Ÿ—‚๏ธ ๋ฐฐํฌ ๋””๋ ‰ํ† ๋ฆฌ ํ™•์ธ ์ค‘..." -ssh -p 2222 admin@$NAS_IP " +eval "$SSH_CMD ' if [ -d '$DEPLOY_DIR' ]; then echo 'โš ๏ธ ๊ธฐ์กด ๋ฐฐํฌ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค: $DEPLOY_DIR' echo '๋ฐฑ์—… ์ƒ์„ฑ ์ค‘...' @@ -78,7 +93,7 @@ fi # ๋ฐฐํฌ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ echo "๐Ÿ“ ๋ฐฐํฌ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ ์ค‘..." -ssh -p 2222 admin@$NAS_IP " +eval "$SSH_CMD ' sudo mkdir -p '$DEPLOY_DIR' sudo chown admin:users '$DEPLOY_DIR' cd '$DEPLOY_DIR' @@ -86,7 +101,7 @@ cd '$DEPLOY_DIR' # Git ํด๋ก  echo "๐Ÿ“ฅ Gitea์—์„œ ์†Œ์Šค ์ฝ”๋“œ ํด๋ก  ์ค‘..." -ssh -p 2222 admin@$NAS_IP " +eval "$SSH_CMD ' cd '$DEPLOY_DIR' git clone '$GITEA_URL' . if [ \$? -ne 0 ]; then @@ -100,7 +115,7 @@ echo 'โœ… ์†Œ์Šค ์ฝ”๋“œ ํด๋ก  ์™„๋ฃŒ' echo "" echo "๐Ÿ”ง 3๋‹จ๊ณ„: ์˜์กด์„ฑ ์„ค์น˜ ๋ฐ ๋นŒ๋“œ" -ssh -p 2222 admin@$NAS_IP " +eval "$SSH_CMD ' cd '$DEPLOY_DIR' # ๊ธฐ์กด node_modules ์ œ๊ฑฐ @@ -111,7 +126,8 @@ fi # ์˜์กด์„ฑ ์„ค์น˜ echo '๐Ÿ“ฆ ์˜์กด์„ฑ ์„ค์น˜ ์ค‘...' -npm install +export PATH='$NODE_PATH':\$PATH +'$NODE_PATH'/npm install if [ \$? -ne 0 ]; then echo 'โŒ npm install ์‹คํŒจ' @@ -119,11 +135,27 @@ if [ \$? -ne 0 ]; then fi echo 'โœ… ์˜์กด์„ฑ ์„ค์น˜ ์™„๋ฃŒ' -# ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™” +# ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐฑ์—… ๋ฐ ์ดˆ๊ธฐํ™” if [ -f 'scripts/init-database.js' ]; then - echo '๐Ÿ—„๏ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™” ์ค‘...' - npm run init-db - echo 'โœ… ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™” ์™„๋ฃŒ' + # ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐฑ์—… + DB_FILE='data/database.db' + BACKUP_FILE='data/database_backup_$(date +%Y%m%d_%H%M%S).db' + + if [ -f '\$DB_FILE' ]; then + echo '๐Ÿ’พ ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐฑ์—… ์ค‘...' + cp '\$DB_FILE' '\$BACKUP_FILE' + echo 'โœ… ๋ฐฑ์—… ์™„๋ฃŒ: \$BACKUP_FILE' + + # ๊ธฐ์กด ๋ฐ์ดํ„ฐ ์œ ์ง€ - ์ดˆ๊ธฐํ™” ๊ฑด๋„ˆ๋›ฐ๊ธฐ + echo 'โ„น๏ธ ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐœ๊ฒฌ - ์ดˆ๊ธฐํ™” ๊ฑด๋„ˆ๋›ฐ๊ธฐ' + echo '๐Ÿ’ก ์ƒˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ํ•„์š”ํ•˜๋ฉด ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰: npm run init-db' + else + # ์ƒˆ ์„ค์น˜ - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™” + echo '๐Ÿ—„๏ธ ์ƒˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™” ์ค‘...' + export PATH='$NODE_PATH':\$PATH + '$NODE_PATH'/npm run init-db + echo 'โœ… ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™” ์™„๋ฃŒ' + fi fi " @@ -133,13 +165,14 @@ echo "โš™๏ธ 4๋‹จ๊ณ„: ์„œ๋น„์Šค ์„ค์ •" # ์‹œ์ž‘ ์Šคํฌ๋ฆฝํŠธ ์ƒ์„ฑ echo "๐Ÿ“ ์‹œ์ž‘ ์Šคํฌ๋ฆฝํŠธ ์ƒ์„ฑ ์ค‘..." -ssh -p 2222 admin@$NAS_IP " +eval "$SSH_CMD ' cat > '$DEPLOY_DIR/start-nas-service.sh' << 'EOF' #!/bin/bash # ์ž๋ฃŒ์‹ค NAS ์„œ๋น„์Šค ์‹œ์ž‘ ์Šคํฌ๋ฆฝํŠธ PROJECT_DIR='$DEPLOY_DIR' SERVICE_PORT='$SERVICE_PORT' +NODE_PATH='$NODE_PATH' PID_FILE='\$PROJECT_DIR/jaryo-nas.pid' LOG_FILE='\$PROJECT_DIR/logs/app.log' @@ -168,7 +201,7 @@ fi # ์„œ๋น„์Šค ์‹œ์ž‘ echo '๐Ÿš€ ์ž๋ฃŒ์‹ค ์„œ๋น„์Šค ์‹œ์ž‘ ์ค‘...' cd '\$PROJECT_DIR' -PORT='$SERVICE_PORT' nohup node server.js > '\$LOG_FILE' 2>&1 & +PORT='$SERVICE_PORT' nohup \$NODE_PATH/node server.js > '\$LOG_FILE' 2>&1 & echo \$! > '\$PID_FILE' sleep 2 @@ -192,7 +225,7 @@ chmod +x '$DEPLOY_DIR/start-nas-service.sh' # ์ค‘์ง€ ์Šคํฌ๋ฆฝํŠธ ์ƒ์„ฑ echo "๐Ÿ“ ์ค‘์ง€ ์Šคํฌ๋ฆฝํŠธ ์ƒ์„ฑ ์ค‘..." -ssh -p 2222 admin@$NAS_IP " +eval "$SSH_CMD ' cat > '$DEPLOY_DIR/stop-nas-service.sh' << 'EOF' #!/bin/bash @@ -233,7 +266,7 @@ chmod +x '$DEPLOY_DIR/stop-nas-service.sh' echo "" echo "๐ŸŽฌ 5๋‹จ๊ณ„: ์„œ๋น„์Šค ์‹œ์ž‘" -ssh -p 2222 admin@$NAS_IP "$DEPLOY_DIR/start-nas-service.sh" +eval "$SSH_CMD '$DEPLOY_DIR/start-nas-service.sh" # 6๋‹จ๊ณ„: ์ ‘์† ํ…Œ์ŠคํŠธ echo "" @@ -254,13 +287,13 @@ if curl -s "http://$NAS_IP:$SERVICE_PORT" >/dev/null; then echo "๐Ÿ“„ ๋กœ๊ทธ ํŒŒ์ผ: $DEPLOY_DIR/logs/app.log" echo "" echo "๐Ÿ”ง ์„œ๋น„์Šค ๊ด€๋ฆฌ:" - echo " ์‹œ์ž‘: ssh -p 2222 admin@$NAS_IP '$DEPLOY_DIR/start-nas-service.sh'" - echo " ์ค‘์ง€: ssh -p 2222 admin@$NAS_IP '$DEPLOY_DIR/stop-nas-service.sh'" - echo " ๋กœ๊ทธ: ssh -p 2222 admin@$NAS_IP 'tail -f $DEPLOY_DIR/logs/app.log'" + echo " ์‹œ์ž‘: ssh -p 2222 $NAS_USER@$NAS_IP '$DEPLOY_DIR/start-nas-service.sh'" + echo " ์ค‘์ง€: ssh -p 2222 $NAS_USER@$NAS_IP '$DEPLOY_DIR/stop-nas-service.sh'" + echo " ๋กœ๊ทธ: ssh -p 2222 $NAS_USER@$NAS_IP 'tail -f $DEPLOY_DIR/logs/app.log'" echo "" echo "๐Ÿ“ฑ ๋ธŒ๋ผ์šฐ์ €์—์„œ http://$NAS_IP:$SERVICE_PORT ์ ‘์†ํ•˜์„ธ์š”!" else echo "โŒ ์„œ๋น„์Šค ์ ‘์† ์‹คํŒจ" echo "๋กœ๊ทธ ํ™•์ธ:" - ssh -p 2222 admin@$NAS_IP "tail -20 $DEPLOY_DIR/logs/app.log" + eval "$SSH_CMD 'tail -20 $DEPLOY_DIR/logs/app.log" fi \ No newline at end of file diff --git a/enhanced-server.js b/enhanced-server.js new file mode 100644 index 0000000..c8d9cc0 --- /dev/null +++ b/enhanced-server.js @@ -0,0 +1,234 @@ +const http = require("http"); +const fs = require("fs"); +const path = require("path"); +const url = require("url"); + +const PORT = 3005; +const DATA_FILE = path.join(__dirname, 'data.json'); +const UPLOAD_DIR = path.join(__dirname, 'uploads'); + +// ๋ฐ์ดํ„ฐ ํŒŒ์ผ ์ดˆ๊ธฐํ™” +function initializeData() { + const defaultData = { + users: [ + { + id: '1', + email: 'admin@jaryo.com', + password: 'admin123', + name: '๊ด€๋ฆฌ์ž', + role: 'admin' + } + ], + files: [ + { + id: '1', + title: '์ƒ˜ํ”Œ ๋ฌธ์„œ', + description: '์ž๋ฃŒ์‹ค ํ…Œ์ŠคํŠธ์šฉ ์ƒ˜ํ”Œ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.', + category: '๋ฌธ์„œ', + tags: ['์ƒ˜ํ”Œ', 'ํ…Œ์ŠคํŠธ'], + user_id: '1', + created_at: new Date().toISOString(), + updated_at: new Date().toISOString(), + attachments: [] + } + ], + categories: ['๋ฌธ์„œ', '์ด๋ฏธ์ง€', '๋™์˜์ƒ', 'ํ”„๋ ˆ์  ํ…Œ์ด์…˜', '๊ธฐํƒ€'] + }; + + if (!fs.existsSync(DATA_FILE)) { + fs.writeFileSync(DATA_FILE, JSON.stringify(defaultData, null, 2)); + } + + if (!fs.existsSync(UPLOAD_DIR)) { + fs.mkdirSync(UPLOAD_DIR, { recursive: true }); + } +} + +// ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ/์“ฐ๊ธฐ +function readData() { + try { + const data = fs.readFileSync(DATA_FILE, 'utf8'); + return JSON.parse(data); + } catch (error) { + console.error('๋ฐ์ดํ„ฐ ์ฝ๊ธฐ ์˜ค๋ฅ˜:', error); + return { users: [], files: [], categories: [] }; + } +} + +function writeData(data) { + try { + fs.writeFileSync(DATA_FILE, JSON.stringify(data, null, 2)); + return true; + } catch (error) { + console.error('๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ ์˜ค๋ฅ˜:', error); + return false; + } +} + +// MIME ํƒ€์ž… +const mimeTypes = { + ".html": "text/html; charset=utf-8", + ".css": "text/css", + ".js": "application/javascript", + ".json": "application/json", + ".png": "image/png", + ".jpg": "image/jpeg" +}; + +// API ์š”์ฒญ ์ฒ˜๋ฆฌ +async function handleApiRequest(req, res, pathname, query) { + const data = readData(); + + if (pathname === "/api/files/public" && req.method === "GET") { + res.writeHead(200, { "Content-Type": "application/json" }); + res.end(JSON.stringify({ + success: true, + data: data.files, + total: data.files.length + })); + return; + } + + if (pathname === "/api/files" && req.method === "GET") { + res.writeHead(200, { "Content-Type": "application/json" }); + res.end(JSON.stringify({ + success: true, + data: data.files, + total: data.files.length + })); + return; + } + + if (pathname === "/api/auth/login" && req.method === "POST") { + let body = ''; + req.on('data', chunk => body += chunk); + req.on('end', () => { + try { + const { email, password } = JSON.parse(body); + const user = data.users.find(u => u.email === email && u.password === password); + + if (user) { + res.writeHead(200, { "Content-Type": "application/json" }); + res.end(JSON.stringify({ + success: true, + user: { + id: user.id, + email: user.email, + name: user.name, + role: user.role + } + })); + } else { + res.writeHead(401, { "Content-Type": "application/json" }); + res.end(JSON.stringify({ + success: false, + error: '์ด๋ฉ”์ผ ๋˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.' + })); + } + } catch (error) { + res.writeHead(400, { "Content-Type": "application/json" }); + res.end(JSON.stringify({ + success: false, + error: '์ž˜๋ชป๋œ ์š”์ฒญ์ž…๋‹ˆ๋‹ค.' + })); + } + }); + return; + } + + // ๊ธฐ๋ณธ ์‘๋‹ต + res.writeHead(200, { "Content-Type": "application/json" }); + res.end(JSON.stringify({ + success: true, + message: "์ž๋ฃŒ์‹ค API ์„œ๋ฒ„ ์‹คํ–‰ ์ค‘", + timestamp: new Date().toISOString(), + path: pathname + })); +} + +// ์ •์  ํŒŒ์ผ ์„œ๋น™ +async function serveStaticFile(req, res, pathname) { + const filePath = path.join(__dirname, pathname); + + fs.readFile(filePath, (err, data) => { + if (err) { + res.writeHead(404, { "Content-Type": "text/html; charset=utf-8" }); + res.end(` + + 404 Not Found + +

404 - ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

+

์š”์ฒญํ•œ ํŒŒ์ผ: ${pathname}

+

ํ™ˆ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

+ + + `); + return; + } + + const ext = path.extname(filePath); + const contentType = mimeTypes[ext] || "text/plain"; + + res.writeHead(200, { "Content-Type": contentType }); + res.end(data); + }); +} + +// HTTP ์„œ๋ฒ„ +const server = http.createServer(async (req, res) => { + res.setHeader("Access-Control-Allow-Origin", "*"); + res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); + res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With"); + + if (req.method === "OPTIONS") { + res.writeHead(200); + res.end(); + return; + } + + const parsedUrl = url.parse(req.url, true); + let pathname = parsedUrl.pathname; + const query = parsedUrl.query; + + console.log(`๐Ÿ“จ ${req.method} ${pathname}`); + + if (pathname.startsWith("/api/")) { + try { + await handleApiRequest(req, res, pathname, query); + } catch (error) { + console.error('API ์ฒ˜๋ฆฌ ์˜ค๋ฅ˜:', error); + res.writeHead(500, { "Content-Type": "application/json" }); + res.end(JSON.stringify({ + success: false, + error: '์„œ๋ฒ„ ๋‚ด๋ถ€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.' + })); + } + return; + } + + if (pathname === "/" || pathname === "/index.html") { + pathname = "/index.html"; + } else if (pathname === "/admin" || pathname === "/admin/") { + pathname = "/admin/index.html"; + } + + await serveStaticFile(req, res, pathname); +}); + +server.listen(PORT, () => { + console.log(`๐Ÿš€ ํ–ฅ์ƒ๋œ ์ž๋ฃŒ์‹ค ์„œ๋ฒ„๊ฐ€ ํฌํŠธ ${PORT}์—์„œ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค`); + console.log(`๐Ÿ“ ์ ‘์† URL: http://119.64.1.86:${PORT}`); + console.log(`๐Ÿ”ง ๊ด€๋ฆฌ์ž URL: http://119.64.1.86:${PORT}/admin`); + console.log(`โฐ ์‹œ์ž‘ ์‹œ๊ฐ„: ${new Date().toLocaleString("ko-KR")}`); + + initializeData(); + console.log(`โœ… ๋ฐ์ดํ„ฐ ํŒŒ์ผ ์ดˆ๊ธฐํ™” ์™„๋ฃŒ`); +}); + +process.on("SIGINT", () => { + console.log("\n๐Ÿ›‘ ์„œ๋ฒ„๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค..."); + server.close(() => { + console.log("โœ… ์„œ๋ฒ„๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค"); + process.exit(0); + }); +}); \ No newline at end of file diff --git a/ssh-connect.sh b/ssh-connect.sh new file mode 100644 index 0000000..2142941 --- /dev/null +++ b/ssh-connect.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +# SSH ์—ฐ๊ฒฐ ํ—ฌํผ ์Šคํฌ๋ฆฝํŠธ +NAS_IP="${1:-119.64.1.86}" +NAS_USER="${2:-vibsin9322}" +COMMAND="${3:-echo 'SSH ์—ฐ๊ฒฐ ์„ฑ๊ณต'}" + +# ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ SSH ์—ฐ๊ฒฐ +echo "๐Ÿ”‘ SSH ์—ฐ๊ฒฐ ์‹œ๋„: $NAS_USER@$NAS_IP:2222" +echo "๐Ÿ“ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”:" + +ssh -p 2222 -o StrictHostKeyChecking=no "$NAS_USER@$NAS_IP" "$COMMAND" \ No newline at end of file