From 4397983f9308f536ed5ea51a92965b961f51b375 Mon Sep 17 00:00:00 2001 From: Claude Code Date: Fri, 26 Jun 2026 17:40:30 +0900 Subject: [PATCH] =?UTF-8?q?=EC=B5=9C=EC=A2=85=20=EB=B0=B0=ED=8F=AC=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EA=B0=9C=EC=84=A0:=20SSH=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0,=20git=20hook=20=EA=B8=B0=EB=B0=98=20=EB=B0=B0?= =?UTF-8?q?=ED=8F=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 개선 사항: - SSH 키 완전 제거 - git post-receive hook으로 자동 배포 - CI는 빌드만 수행 (publish 생성) - git push 시 서버의 post-receive hook이 자동으로 배포 실행 배포 흐름: 1. git commit & push (로컬) 2. Gitea repository 업데이트 3. post-receive hook 자동 실행 4. 서버에서 빌드 후 배포.sh 호출 5. 배포 완료 장점: - 간단함 (SSH 인증 불필요) - 안전함 (별도의 인증 정보 저장 불필요) - 빠름 (네트워크 오버헤드 최소) - 한 곳에서 관리 (서버의 deploy.sh) Co-Authored-By: Claude Haiku 4.5 --- .claude/scheduled_tasks.lock | 1 + .gitea/workflows/deploy.yml | 68 +++--------------------------------- deploy.sh | 58 ++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 63 deletions(-) create mode 100644 .claude/scheduled_tasks.lock create mode 100644 deploy.sh diff --git a/.claude/scheduled_tasks.lock b/.claude/scheduled_tasks.lock new file mode 100644 index 0000000..1d16352 --- /dev/null +++ b/.claude/scheduled_tasks.lock @@ -0,0 +1 @@ +{"sessionId":"49d9d3ba-3c81-4fe7-ab85-f0734baf92f6","pid":42320,"acquiredAt":1782462035015} \ No newline at end of file diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index d0957d2..4e464e3 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -6,7 +6,7 @@ on: - master jobs: - build-and-deploy: + build: runs-on: ubuntu-latest steps: @@ -30,75 +30,17 @@ jobs: - name: Publish Admin run: dotnet publish TaxBaik.Admin/ -c Release -o ./publish/admin - - name: Copy migrations to publish + - name: Copy migrations run: | cp -r db/migrations ./publish/web/migrations || true cp -r db/migrations ./publish/admin/migrations || true - - name: Generate build info + - name: Generate version info run: | mkdir -p ./publish/web/wwwroot ./publish/admin/wwwroot COMMIT_HASH=$(git rev-parse --short HEAD) BUILD_TIME=$(date -u +'%Y-%m-%d %H:%M:%S UTC') echo "Version: $COMMIT_HASH" > ./publish/web/wwwroot/version.txt echo "Built: $BUILD_TIME" >> ./publish/web/wwwroot/version.txt - echo "Version: $COMMIT_HASH" > ./publish/admin/wwwroot/version.txt - echo "Built: $BUILD_TIME" >> ./publish/admin/wwwroot/version.txt - echo "✓ Version files created:" - cat ./publish/web/wwwroot/version.txt - - - name: Deploy Web - run: | - set -e - WEB_TIMESTAMP=$(date +%Y%m%d_%H%M%S) - DEPLOY_HOME="/home/kjh2064" - WEB_DEPLOY_DIR="$DEPLOY_HOME/deployments/taxbaik_${WEB_TIMESTAMP}" - - echo "=== Deploying Web (v$(git rev-parse --short HEAD)) ===" - echo "Deploy dir: $WEB_DEPLOY_DIR" - mkdir -p "$WEB_DEPLOY_DIR" || { echo "Failed to mkdir"; exit 1; } - cp -r ./publish/web "$WEB_DEPLOY_DIR/" || { echo "Failed to copy"; exit 1; } - ln -sfn "$WEB_DEPLOY_DIR/web" "$DEPLOY_HOME/taxbaik_active" || { echo "Failed to symlink"; exit 1; } - echo "✓ Web deployed to $WEB_DEPLOY_DIR" - - echo "=== Stopping TaxBaik.Web ===" - pkill -9 -f "TaxBaik.Web" || echo "No process to kill" - sleep 3 - - echo "=== Starting TaxBaik.Web ===" - cd "$DEPLOY_HOME/taxbaik_active" || { echo "Failed to cd"; exit 1; } - export ConnectionStrings__Default="Host=localhost;Database=taxbaikdb;Username=taxbaik;Password=taxbaik123" - export ASPNETCORE_ENVIRONMENT=Production - export ASPNETCORE_URLS=http://127.0.0.1:5001 - nohup /usr/local/dotnet/dotnet TaxBaik.Web.dll > web.log 2>&1 & - sleep 2 - echo "✓ Web process started" - ps aux | grep TaxBaik.Web | grep -v grep || echo "Process not found" - - - name: Deploy Admin - run: | - set -e - ADMIN_TIMESTAMP=$(date +%Y%m%d_%H%M%S) - DEPLOY_HOME="/home/kjh2064" - ADMIN_DEPLOY_DIR="$DEPLOY_HOME/deployments/taxbaik_admin_${ADMIN_TIMESTAMP}" - - echo "=== Deploying Admin (v$(git rev-parse --short HEAD)) ===" - echo "Deploy dir: $ADMIN_DEPLOY_DIR" - mkdir -p "$ADMIN_DEPLOY_DIR" || { echo "Failed to mkdir"; exit 1; } - cp -r ./publish/admin "$ADMIN_DEPLOY_DIR/" || { echo "Failed to copy"; exit 1; } - ln -sfn "$ADMIN_DEPLOY_DIR/admin" "$DEPLOY_HOME/taxbaik_admin_active" || { echo "Failed to symlink"; exit 1; } - echo "✓ Admin deployed to $ADMIN_DEPLOY_DIR" - - echo "=== Stopping TaxBaik.Admin ===" - pkill -9 -f "TaxBaik.Admin" || echo "No process to kill" - sleep 3 - - echo "=== Starting TaxBaik.Admin ===" - cd "$DEPLOY_HOME/taxbaik_admin_active" || { echo "Failed to cd"; exit 1; } - export ConnectionStrings__Default="Host=localhost;Database=taxbaikdb;Username=taxbaik;Password=taxbaik123" - export ASPNETCORE_ENVIRONMENT=Production - export ASPNETCORE_URLS=http://127.0.0.1:5002 - nohup /usr/local/dotnet/dotnet TaxBaik.Admin.dll > admin.log 2>&1 & - sleep 2 - echo "✓ Admin process started" - ps aux | grep TaxBaik.Admin | grep -v grep || echo "Process not found" + cp ./publish/web/wwwroot/version.txt ./publish/admin/wwwroot/version.txt + echo "✓ Build complete - Version: $COMMIT_HASH" diff --git a/deploy.sh b/deploy.sh new file mode 100644 index 0000000..693cedb --- /dev/null +++ b/deploy.sh @@ -0,0 +1,58 @@ +#!/bin/bash +set -e + +DEPLOY_HOME="/home/kjh2064" +WEB_TIMESTAMP=$(date +%Y%m%d_%H%M%S) + +echo "===== 🚀 TaxBaik 배포 스크립트 =====" +echo "Web Timestamp: $WEB_TIMESTAMP" + +# Web 배포 +echo "=== Deploying Web ===" +WEB_DEPLOY_DIR="$DEPLOY_HOME/deployments/taxbaik_${WEB_TIMESTAMP}" +mkdir -p "$WEB_DEPLOY_DIR" + +if [ -z "$1" ]; then + echo "Error: Publish directory required" + exit 1 +fi + +# 첫 번째 인자는 publish 경로 +cp -r "$1/web" "$WEB_DEPLOY_DIR/" +ln -sfn "$WEB_DEPLOY_DIR/web" "$DEPLOY_HOME/taxbaik_active" +echo "✓ Web symlink updated: $WEB_DEPLOY_DIR/web" + +# Admin 배포 +echo "=== Deploying Admin ===" +ADMIN_TIMESTAMP=$(date +%Y%m%d_%H%M%S) +ADMIN_DEPLOY_DIR="$DEPLOY_HOME/deployments/taxbaik_admin_${ADMIN_TIMESTAMP}" +mkdir -p "$ADMIN_DEPLOY_DIR" +cp -r "$1/admin" "$ADMIN_DEPLOY_DIR/" +ln -sfn "$ADMIN_DEPLOY_DIR/admin" "$DEPLOY_HOME/taxbaik_admin_active" +echo "✓ Admin symlink updated: $ADMIN_DEPLOY_DIR/admin" + +# 프로세스 재시작 +echo "=== Restarting processes ===" +pkill -9 -f "TaxBaik.Web" || true +pkill -9 -f "TaxBaik.Admin" || true +sleep 3 + +echo "=== Starting Web ===" +cd "$DEPLOY_HOME/taxbaik_active" +export ConnectionStrings__Default="Host=localhost;Database=taxbaikdb;Username=taxbaik;Password=taxbaik123" +export ASPNETCORE_ENVIRONMENT=Production +export ASPNETCORE_URLS=http://127.0.0.1:5001 +nohup /usr/local/dotnet/dotnet TaxBaik.Web.dll > web.log 2>&1 & +sleep 2 +ps aux | grep TaxBaik.Web | grep -v grep && echo "✓ Web started" || echo "✗ Web failed" + +echo "=== Starting Admin ===" +cd "$DEPLOY_HOME/taxbaik_admin_active" +export ASPNETCORE_URLS=http://127.0.0.1:5002 +nohup /usr/local/dotnet/dotnet TaxBaik.Admin.dll > admin.log 2>&1 & +sleep 2 +ps aux | grep TaxBaik.Admin | grep -v grep && echo "✓ Admin started" || echo "✗ Admin failed" + +echo "" +echo "===== ✅ 배포 완료 =====" +cat "$DEPLOY_HOME/taxbaik_active/wwwroot/version.txt" 2>/dev/null || echo "Version file not found"