diff --git a/deploys/ops-manual/05-deployment.md b/deploys/ops-manual/05-deployment.md index 888f9ce..e9582dc 100644 --- a/deploys/ops-manual/05-deployment.md +++ b/deploys/ops-manual/05-deployment.md @@ -206,7 +206,11 @@ pipeline { stages { stage('Checkout') { - steps { checkout scm } + steps { + slackSend channel: '#product_infra', color: '#439FE0', tokenCredentialId: 'slack-token', + message: "πŸš€ *react* λΉŒλ“œ μ‹œμž‘ (`${env.BRANCH_NAME}`)\n<${env.BUILD_URL}|λΉŒλ“œ #${env.BUILD_NUMBER}>" + checkout scm + } } stage('Prepare Env') { @@ -312,8 +316,14 @@ pipeline { } post { - success { echo 'βœ… react 배포 μ™„λ£Œ (' + env.BRANCH_NAME + ')' } - failure { echo '❌ react 배포 μ‹€νŒ¨ (' + env.BRANCH_NAME + ')' } + success { + slackSend channel: '#product_infra', color: 'good', tokenCredentialId: 'slack-token', + message: "βœ… *react* 배포 성곡 (`${env.BRANCH_NAME}`)\n<${env.BUILD_URL}|λΉŒλ“œ #${env.BUILD_NUMBER}>" + } + failure { + slackSend channel: '#product_infra', color: 'danger', tokenCredentialId: 'slack-token', + message: "❌ *react* 배포 μ‹€νŒ¨ (`${env.BRANCH_NAME}`)\n<${env.BUILD_URL}|λΉŒλ“œ #${env.BUILD_NUMBER}>" + } } } ``` @@ -369,7 +379,11 @@ pipeline { stages { stage('Checkout') { - steps { checkout scm } + steps { + slackSend channel: '#product_infra', color: '#439FE0', tokenCredentialId: 'slack-token', + message: "πŸš€ *api* λΉŒλ“œ μ‹œμž‘ (`${env.BRANCH_NAME}`)\n<${env.BUILD_URL}|λΉŒλ“œ #${env.BUILD_NUMBER}>" + checkout scm + } } // ── main β†’ μš΄μ˜μ„œλ²„ Stage 배포 ── @@ -386,6 +400,7 @@ pipeline { . ${DEPLOY_USER}@211.117.60.189:/home/webservice/api-stage/releases/${RELEASE_ID}/ ssh ${DEPLOY_USER}@211.117.60.189 ' cd /home/webservice/api-stage/releases/${RELEASE_ID} && + mkdir -p bootstrap/cache storage/framework/{views,cache/data,sessions} storage/logs && ln -sfn /home/webservice/api-stage/shared/.env .env && ln -sfn /home/webservice/api-stage/shared/storage/app storage/app && composer install --no-dev --optimize-autoloader --no-interaction && @@ -427,6 +442,7 @@ pipeline { . ${DEPLOY_USER}@211.117.60.189:/home/webservice/api/releases/${RELEASE_ID}/ ssh ${DEPLOY_USER}@211.117.60.189 ' cd /home/webservice/api/releases/${RELEASE_ID} && + mkdir -p bootstrap/cache storage/framework/{views,cache/data,sessions} storage/logs && ln -sfn /home/webservice/api/shared/.env .env && ln -sfn /home/webservice/api/shared/storage/app storage/app && composer install --no-dev --optimize-autoloader --no-interaction && @@ -448,9 +464,13 @@ pipeline { } post { - success { echo "βœ… api 배포 μ™„λ£Œ (${env.BRANCH_NAME})" } + success { + slackSend channel: '#product_infra', color: 'good', tokenCredentialId: 'slack-token', + message: "βœ… *api* 배포 성곡 (`${env.BRANCH_NAME}`)\n<${env.BUILD_URL}|λΉŒλ“œ #${env.BUILD_NUMBER}>" + } failure { - echo "❌ api 배포 μ‹€νŒ¨ (${env.BRANCH_NAME})" + slackSend channel: '#product_infra', color: 'danger', tokenCredentialId: 'slack-token', + message: "❌ *api* 배포 μ‹€νŒ¨ (`${env.BRANCH_NAME}`)\n<${env.BUILD_URL}|λΉŒλ“œ #${env.BUILD_NUMBER}>" script { if (env.BRANCH_NAME == 'main') { sshagent(credentials: ['deploy-ssh-key']) { @@ -490,26 +510,29 @@ git clone --depth 1 --branch main https://git.sam.it.kr/SamProject/sam-api.git $ ln -sfn /home/webservice/api/shared/storage /home/webservice/api/releases/$RELEASE_ID/storage ln -sfn /home/webservice/api/shared/.env /home/webservice/api/releases/$RELEASE_ID/.env -# 3. μ˜μ‘΄μ„± μ„€μΉ˜ +# 3. ν•„μˆ˜ 디렉토리 생성 (.gitignore에 μ˜ν•΄ λˆ„λ½) cd /home/webservice/api/releases/$RELEASE_ID +mkdir -p bootstrap/cache storage/framework/{views,cache/data,sessions} storage/logs + +# 4. μ˜μ‘΄μ„± μ„€μΉ˜ composer install --no-dev --optimize-autoloader --no-interaction -# 4. μΊμ‹œ 생성 +# 5. μΊμ‹œ 생성 php artisan config:cache php artisan route:cache php artisan view:cache -# 5. λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ (ν•„μš”μ‹œ) +# 6. λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ (ν•„μš”μ‹œ) php artisan migrate --force -# 6. 심링크 μ „ν™˜ (이 μ‹œμ μ— 배포 적용) +# 7. 심링크 μ „ν™˜ (이 μ‹œμ μ— 배포 적용) ln -sfn /home/webservice/api/releases/$RELEASE_ID /home/webservice/api/current -# 7. μ„œλΉ„μŠ€ λ¦¬λ‘œλ“œ +# 8. μ„œλΉ„μŠ€ λ¦¬λ‘œλ“œ sudo systemctl reload php8.4-fpm sudo supervisorctl restart sam-queue-worker:* -# 8. 였래된 릴리즈 정리 (졜근 5개만 μœ μ§€) +# 9. 였래된 릴리즈 정리 (졜근 5개만 μœ μ§€) cd /home/webservice/api/releases ls -1dt */ | tail -n +6 | xargs rm -rf 2>/dev/null || true ``` @@ -527,6 +550,7 @@ ln -sfn /home/webservice/api-stage/shared/storage /home/webservice/api-stage/rel ln -sfn /home/webservice/api-stage/shared/.env /home/webservice/api-stage/releases/$RELEASE_ID/.env cd /home/webservice/api-stage/releases/$RELEASE_ID +mkdir -p bootstrap/cache storage/framework/{views,cache/data,sessions} storage/logs composer install --no-dev --optimize-autoloader --no-interaction php artisan config:cache php artisan route:cache @@ -560,7 +584,11 @@ pipeline { stages { stage('Checkout') { - steps { checkout scm } + steps { + slackSend channel: '#product_infra', color: '#439FE0', tokenCredentialId: 'slack-token', + message: "πŸš€ *mng* λΉŒλ“œ μ‹œμž‘ (`${env.BRANCH_NAME}`)\n<${env.BUILD_URL}|λΉŒλ“œ #${env.BUILD_NUMBER}>" + checkout scm + } } // ── main β†’ μš΄μ˜μ„œλ²„ Production ── @@ -578,10 +606,11 @@ pipeline { . ${DEPLOY_USER}@211.117.60.189:/home/webservice/mng/releases/${RELEASE_ID}/ ssh ${DEPLOY_USER}@211.117.60.189 ' cd /home/webservice/mng/releases/${RELEASE_ID} && + mkdir -p bootstrap/cache storage/framework/{views,cache/data,sessions} storage/logs && ln -sfn /home/webservice/mng/shared/.env .env && ln -sfn /home/webservice/mng/shared/storage/app storage/app && composer install --no-dev --optimize-autoloader --no-interaction && - npm install --production=false && + npm install --prefer-offline && npm run build && php artisan config:cache && php artisan route:cache && @@ -600,9 +629,13 @@ pipeline { } post { - success { echo "βœ… mng 배포 μ™„λ£Œ (${env.BRANCH_NAME})" } + success { + slackSend channel: '#product_infra', color: 'good', tokenCredentialId: 'slack-token', + message: "βœ… *mng* 배포 성곡 (`${env.BRANCH_NAME}`)\n<${env.BUILD_URL}|λΉŒλ“œ #${env.BUILD_NUMBER}>" + } failure { - echo "❌ mng 배포 μ‹€νŒ¨ (${env.BRANCH_NAME})" + slackSend channel: '#product_infra', color: 'danger', tokenCredentialId: 'slack-token', + message: "❌ *mng* 배포 μ‹€νŒ¨ (`${env.BRANCH_NAME}`)\n<${env.BUILD_URL}|λΉŒλ“œ #${env.BUILD_NUMBER}>" script { if (env.BRANCH_NAME == 'main') { sshagent(credentials: ['deploy-ssh-key']) { @@ -634,10 +667,11 @@ ln -sfn /home/webservice/mng/shared/storage /home/webservice/mng/releases/$RELEA ln -sfn /home/webservice/mng/shared/.env /home/webservice/mng/releases/$RELEASE_ID/.env cd /home/webservice/mng/releases/$RELEASE_ID +mkdir -p bootstrap/cache storage/framework/{views,cache/data,sessions} storage/logs composer install --no-dev --optimize-autoloader --no-interaction # Vite λΉŒλ“œ (Blade + Tailwind) -npm install --production=false +npm install --prefer-offline npm run build php artisan config:cache @@ -807,6 +841,7 @@ ssh sam-prod " ln -sfn /home/webservice/api/shared/storage /home/webservice/api/releases/${RELEASE_ID}/storage && ln -sfn /home/webservice/api/shared/.env /home/webservice/api/releases/${RELEASE_ID}/.env && cd /home/webservice/api/releases/${RELEASE_ID} && + mkdir -p bootstrap/cache storage/framework/{views,cache/data,sessions} storage/logs && composer install --no-dev --optimize-autoloader --no-interaction && php artisan config:cache && php artisan route:cache && @@ -874,4 +909,10 @@ ls -la /var/lib/jenkins/workspace/ 2. npm run build μ‹€νŒ¨ -- TypeScript 였λ₯˜, ν™˜κ²½λ³€μˆ˜ λˆ„λ½ 3. rsync μ‹€νŒ¨ -- SSH ν‚€ 문제, λ””μŠ€ν¬ 곡간 λΆ€μ‘± 4. composer install μ‹€νŒ¨ -- λ„€νŠΈμ›Œν¬, PHP ν™•μž₯ λˆ„λ½ -5. SSH μ—°κ²° μ‹€νŒ¨ -- known_hosts λ³€κ²½, ν‚€ 만료 \ No newline at end of file +5. SSH μ—°κ²° μ‹€νŒ¨ -- known_hosts λ³€κ²½, ν‚€ 만료 +6. Laravel `package:discover` μ‹€νŒ¨ -- `bootstrap/cache/` 디렉토리 λˆ„λ½ (`.gitignore`에 포함) +7. Blade view μΊμ‹œ μ‹€νŒ¨ -- `storage/framework/views/` 디렉토리 λˆ„λ½ +8. `Target class [request] does not exist` -- CLI μ»¨ν…μŠ€νŠΈμ—μ„œ `request()` 호좜 (AppServiceProvider 확인) + +> **Laravel 배포 ν•„μˆ˜:** `mkdir -p bootstrap/cache storage/framework/{views,cache/data,sessions} storage/logs`λ₯Ό +> `composer install` 전에 μ‹€ν–‰ν•΄μ•Ό 함. `.gitignore`κ°€ 이 디렉토리듀을 μ œμ™Έν•˜λ―€λ‘œ rsync/git clone ν›„ 생성 ν•„μš”. \ No newline at end of file diff --git a/deploys/ops-manual/07-monitoring.md b/deploys/ops-manual/07-monitoring.md index a2a2d75..8a01bea 100644 --- a/deploys/ops-manual/07-monitoring.md +++ b/deploys/ops-manual/07-monitoring.md @@ -167,7 +167,7 @@ node_filefd_allocated **μ•Œλ¦Ό 채널:** Grafana > Alerting > Contact points μ—μ„œ 이메일, Slack λ“± μ„€μ • -> **TODO:** Contact Point에 μ‹€μ œ 이메일 μ£Όμ†Œ λ˜λŠ” Slack Webhook μ„€μ • ν•„μš” (ν˜„μž¬ κΈ°λ³Έ email placeholder) +**ν˜„μž¬ μ„€μ •:** SAM Slack Contact Point (Incoming Webhook) μ—°κ²° μ™„λ£Œ. Notification Policyμ—μ„œ SAM Alerts ν΄λ”μ˜ μ•Œλ¦Όμ΄ Slack `#product_infra` μ±„λ„λ‘œ 전솑됨. ---