Merge pull request #325 from PromptPlace/feat/#307 #248
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: deploy-main | |
| on: | |
| push: | |
| branches: [ main ] | |
| workflow_dispatch: | |
| jobs: | |
| deploy: | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Check prisma has changes | |
| id: paths-filter | |
| uses: dorny/paths-filter@v3 | |
| with: | |
| filters: | | |
| prisma: ["prisma/**"] | |
| - name: Configure SSH | |
| env: | |
| EC2_USER: ubuntu | |
| EC2_HOST: ${{ secrets.EC2_HOST }} | |
| EC2_SSH_KEY: ${{ secrets.EC2_SSH_KEY }} | |
| run: | | |
| set -euo pipefail | |
| mkdir -p ~/.ssh | |
| printf "%s" "$EC2_SSH_KEY" > ~/.ssh/id_rsa | |
| chmod 600 ~/.ssh/id_rsa | |
| cat >>~/.ssh/config <<END | |
| Host prod | |
| HostName $EC2_HOST | |
| User $EC2_USER | |
| IdentityFile ~/.ssh/id_rsa | |
| StrictHostKeyChecking no | |
| END | |
| - name: Prepare target dir | |
| run: | | |
| ssh prod 'sudo mkdir -p /opt/app && sudo chown ubuntu:ubuntu /opt/app' | |
| - name: Sync workspace (rsync --delete) | |
| run: | | |
| rsync -az --delete \ | |
| --exclude ".git" \ | |
| --exclude "node_modules" \ | |
| ./ prod:/opt/app/ | |
| - name: Write .env on EC2 | |
| run: | | |
| ssh prod 'cat > /opt/app/.env <<EOF | |
| ${{ secrets.ENV_CONTENT }} | |
| EOF' | |
| - name: Install, Generate & Build on server | |
| run: | | |
| ssh prod 'cd /opt/app && \ | |
| pnpm install --frozen-lockfile && \ | |
| pnpm exec prisma generate && \ | |
| pnpm build' | |
| - name: Prisma migrate (only when schema changed) | |
| if: steps.paths-filter.outputs.prisma == 'true' | |
| run: | | |
| ssh prod 'cd /opt/app && pnpm exec prisma migrate deploy' | |
| - name: Install/Update systemd service | |
| run: | | |
| ssh prod 'cat > app.service << "UNIT" | |
| [Unit] | |
| Description=PromptPlace Backend | |
| After=network.target | |
| [Service] | |
| User=ubuntu | |
| WorkingDirectory=/opt/app | |
| EnvironmentFile=/opt/app/.env | |
| Environment=NODE_ENV=production | |
| Environment=PNPM_HOME=/home/ubuntu/.local/share/pnpm | |
| Environment=PATH=/home/ubuntu/.local/share/pnpm:/usr/local/bin:/usr/bin:/bin | |
| ExecStart=/bin/bash -lc '"'"'pnpm start'"'"' | |
| Restart=always | |
| RestartSec=3 | |
| # Optional: 확보/로그 | |
| StandardOutput=journal | |
| StandardError=journal | |
| [Install] | |
| WantedBy=multi-user.target | |
| UNIT | |
| sudo mv app.service /etc/systemd/system/app.service | |
| sudo systemctl daemon-reload | |
| sudo systemctl enable app | |
| sudo systemctl restart app | |
| ' | |
| # PM2를 쓰고 있었다면 서비스 충돌 방지를 위해 종료(1회 실행) | |
| - name: Stop PM2 app (one-time) | |
| run: | | |
| ssh prod 'pm2 delete promptplace || true' |