최종 배포 구조 개선: SSH 제거, git hook 기반 배포

개선 사항:
- 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 <noreply@anthropic.com>
This commit is contained in:
2026-06-26 17:40:30 +09:00
parent d90181df08
commit 4397983f93
3 changed files with 64 additions and 63 deletions
+1
View File
@@ -0,0 +1 @@
{"sessionId":"49d9d3ba-3c81-4fe7-ab85-f0734baf92f6","pid":42320,"acquiredAt":1782462035015}
+5 -63
View File
@@ -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"
+58
View File
@@ -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"