테이블 정렬 버튼의 과도한 스타일 제거 #291
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 Services | |
| on: | |
| push: | |
| branches: [release] | |
| paths: ["src/backend/**", "src/go/**", "src/frontend/**"] | |
| workflow_dispatch: | |
| jobs: | |
| deploy-web-service: | |
| name: Build and Deploy Web Service | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v3 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: "22" | |
| - name: Build Frontend | |
| env: | |
| VITE_DISCORD_LOGIN_URL: ${{ secrets.VITE_DISCORD_LOGIN_URL }} | |
| VITE_DISCORD_SERVER_LINK: ${{ secrets.VITE_DISCORD_SERVER_LINK }} | |
| VITE_LOGROCKET_ID: ${{ secrets.VITE_LOGROCKET_ID }} | |
| VITE_SENTRY_DSN: ${{ secrets.VITE_SENTRY_DSN }} | |
| run: | | |
| cd src/frontend | |
| yarn install | |
| yarn build | |
| mkdir -p ../backend/frontend-build | |
| cp -r build/* ../backend/frontend-build/ | |
| ls -la ../backend/frontend-build | |
| - name: Configure AWS credentials | |
| uses: aws-actions/configure-aws-credentials@v1 | |
| with: | |
| aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} | |
| aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} | |
| aws-region: ${{ secrets.AWS_REGION }} | |
| - name: Login to Amazon ECR | |
| id: login-ecr | |
| uses: aws-actions/amazon-ecr-login@v1 | |
| - name: Create nginx config | |
| run: | | |
| cp infra/web/default.conf default.conf | |
| - name: Copy nginx config | |
| uses: appleboy/scp-action@master | |
| with: | |
| host: ${{ secrets.EC2_HOST }} | |
| username: ubuntu | |
| key: ${{ secrets.EC2_SSH_KEY }} | |
| source: "default.conf" | |
| target: "/home/ubuntu" | |
| - name: Setup Nginx and SSL | |
| uses: appleboy/ssh-action@master | |
| with: | |
| host: ${{ secrets.EC2_HOST }} | |
| username: ubuntu | |
| key: ${{ secrets.EC2_SSH_KEY }} | |
| script: | | |
| if ! command -v nginx &> /dev/null; then | |
| sudo apt update | |
| sudo apt install -y nginx certbot python3-certbot-nginx | |
| fi | |
| sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak | |
| sudo cp /home/ubuntu/default.conf /etc/nginx/sites-available/default | |
| if [ ! -d "/etc/letsencrypt/live/loa-work.info" ]; then | |
| sudo certbot --nginx -d loa-work.info --non-interactive --agree-tos --email ${{ secrets.CERTBOT_EMAIL }} | |
| else | |
| sudo sed -i '/listen 443/,/^}/!b;/^}/!d;r /etc/nginx/sites-available/default.bak' /etc/nginx/sites-available/default | |
| fi | |
| sudo nginx -t && sudo systemctl reload nginx | |
| - name: Build and Push Docker image | |
| env: | |
| ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} | |
| IMAGE_TAG: ${{ github.sha }} | |
| run: | | |
| ls -la src/backend/frontend-build | |
| docker build \ | |
| -t $ECR_REGISTRY/loa-work/web-service:$IMAGE_TAG ./src/backend | |
| docker push $ECR_REGISTRY/loa-work/web-service:$IMAGE_TAG | |
| docker tag $ECR_REGISTRY/loa-work/web-service:$IMAGE_TAG $ECR_REGISTRY/loa-work/web-service:latest | |
| docker push $ECR_REGISTRY/loa-work/web-service:latest | |
| - name: Setup EC2 | |
| uses: appleboy/ssh-action@master | |
| with: | |
| host: ${{ secrets.EC2_HOST }} | |
| username: ubuntu | |
| key: ${{ secrets.EC2_SSH_KEY }} | |
| script: | | |
| # Copy setup script | |
| cat > setup.sh << 'EOF' | |
| $(cat .github/scripts/setup-ec2.sh) | |
| EOF | |
| chmod +x setup.sh | |
| # Run setup script with AWS credentials | |
| ./setup.sh "${{ secrets.AWS_ACCESS_KEY_ID }}" "${{ secrets.AWS_SECRET_ACCESS_KEY }}" | |
| rm setup.sh | |
| - name: Create promtail config | |
| run: | | |
| cp infra/web/promtail.yaml promtail.yaml | |
| - name: Copy Promtail config | |
| uses: appleboy/scp-action@master | |
| with: | |
| host: ${{ secrets.EC2_HOST }} | |
| username: ubuntu | |
| key: ${{ secrets.EC2_SSH_KEY }} | |
| source: "promtail.yaml" | |
| target: "/home/ubuntu" | |
| - name: Deploy Promtail to EC2 | |
| uses: appleboy/ssh-action@master | |
| with: | |
| host: ${{ secrets.EC2_HOST }} | |
| username: ubuntu | |
| key: ${{ secrets.EC2_SSH_KEY }} | |
| script: | | |
| sudo docker pull grafana/promtail:3.4 | |
| sudo docker stop promtail || true | |
| sudo docker rm promtail || true | |
| sudo docker run -d \ | |
| --name promtail \ | |
| --network host \ | |
| -v /var/lib/docker/containers:/var/lib/docker/containers:ro \ | |
| -v /home/ubuntu/promtail.yaml:/etc/promtail/config.yaml \ | |
| --user root \ | |
| grafana/promtail:3.4 -config.file=/etc/promtail/config.yaml || echo "Docker run failed: $?" | |
| - name: Setup pgAdmin config files | |
| run: | | |
| # Parse DATABASE_URL to extract connection details | |
| DB_URL="${{ secrets.DATABASE_URL }}" | |
| DB_HOST=$(echo $DB_URL | sed -n 's/.*@\([^:]*\):.*/\1/p') | |
| DB_USER=$(echo $DB_URL | sed -n 's/.*:\/\/\([^:]*\):.*/\1/p') | |
| DB_PASS=$(echo $DB_URL | sed -n 's/.*:\/\/[^:]*:\([^@]*\)@.*/\1/p') | |
| DB_NAME=$(echo $DB_URL | sed -n 's/.*\/\([^?]*\).*/\1/p') | |
| # Create servers.json with actual DB details | |
| sed "s/HOST_PLACEHOLDER/$DB_HOST/g; s/USER_PLACEHOLDER/$DB_USER/g; s/DB_NAME_PLACEHOLDER/$DB_NAME/g" \ | |
| infra/pgadmin/servers.json > servers.json | |
| # Create pgpass with actual credentials | |
| sed "s/HOST_PLACEHOLDER/$DB_HOST/g; s/USER_PLACEHOLDER/$DB_USER/g; s/PASSWORD_PLACEHOLDER/$DB_PASS/g" \ | |
| infra/pgadmin/pgpass > pgpass | |
| chmod 600 pgpass | |
| - name: Copy pgAdmin config to EC2 | |
| uses: appleboy/scp-action@master | |
| with: | |
| host: ${{ secrets.EC2_HOST }} | |
| username: ubuntu | |
| key: ${{ secrets.EC2_SSH_KEY }} | |
| source: "servers.json,pgpass" | |
| target: "/home/ubuntu" | |
| - name: Deploy Web Service and pgAdmin to EC2 | |
| uses: appleboy/ssh-action@master | |
| with: | |
| host: ${{ secrets.EC2_HOST }} | |
| username: ubuntu | |
| key: ${{ secrets.EC2_SSH_KEY }} | |
| script: | | |
| docker system prune -af --volumes | |
| aws ecr get-login-password --region ${{ secrets.AWS_REGION }} | docker login --username AWS --password-stdin ${{ secrets.ECR_REGISTRY }} | |
| docker pull ${{ secrets.ECR_REGISTRY }}/loa-work/web-service:latest | |
| docker stop web-service || true | |
| docker rm web-service || true | |
| docker stop pgadmin || true | |
| docker rm pgadmin || true | |
| # Start pgAdmin with pre-configured database | |
| docker run -d \ | |
| --name pgadmin \ | |
| -p 5050:80 \ | |
| --log-driver json-file \ | |
| --log-opt max-size=10m \ | |
| --log-opt max-file=3 \ | |
| -e PGADMIN_DEFAULT_EMAIL="admin@loa-work.info" \ | |
| -e PGADMIN_DEFAULT_PASSWORD="admin" \ | |
| -e PGADMIN_CONFIG_SERVER_MODE=False \ | |
| -v /home/ubuntu/servers.json:/pgadmin4/servers.json:ro \ | |
| -v /home/ubuntu/pgpass:/pgpass:ro \ | |
| --restart always \ | |
| dpage/pgadmin4:latest | |
| # Start web service | |
| docker run -d \ | |
| --name web-service \ | |
| -p 3000:3000 \ | |
| --log-driver json-file \ | |
| --log-opt max-size=10m \ | |
| --log-opt max-file=5 \ | |
| -e NODE_ENV=production \ | |
| -e DATABASE_URL="${{ secrets.DATABASE_URL }}" \ | |
| -e GOOGLE_CLIENT_ID="${{ secrets.GOOGLE_CLIENT_ID }}" \ | |
| -e GOOGLE_CLIENT_SECRET="${{ secrets.GOOGLE_CLIENT_SECRET }}" \ | |
| -e DISCORD_CLIENT_ID="${{ secrets.DISCORD_CLIENT_ID }}" \ | |
| -e DISCORD_CLIENT_SECRET="${{ secrets.DISCORD_CLIENT_SECRET }}" \ | |
| -e DISCORD_GOLD_EXCHANGE_RATE_WEBHOOK_URL="${{ secrets.DISCORD_GOLD_EXCHANGE_RATE_WEBHOOK_URL }}" \ | |
| -e KAKAO_CLIENT_ID="${{ secrets.KAKAO_CLIENT_ID }}" \ | |
| -e KAKAO_CLIENT_SECRET="${{ secrets.KAKAO_CLIENT_SECRET }}" \ | |
| -e CLIENT_HOST="${{ secrets.CLIENT_HOST }}" \ | |
| -e SESSION_SECRET="${{ secrets.SESSION_SECRET }}" \ | |
| --restart always \ | |
| ${{ secrets.ECR_REGISTRY }}/loa-work/web-service:latest | |
| - name: Run Database Migrations | |
| uses: appleboy/ssh-action@master | |
| with: | |
| host: ${{ secrets.EC2_HOST }} | |
| username: ubuntu | |
| key: ${{ secrets.EC2_SSH_KEY }} | |
| script: | | |
| docker system prune -af --volumes | |
| docker exec web-service npx prisma migrate deploy --schema=/app/prisma/schema.prisma | |
| deploy-go-services: | |
| strategy: | |
| matrix: | |
| include: | |
| - name: market-item-stat-scraper | |
| app-path: src/go/apps/market-item-stat-scraper | |
| host-secret: MISS_EC2_HOST | |
| ssh-key-secret: MISS_EC2_SSH_KEY | |
| - name: auction-item-stat-scraper | |
| app-path: src/go/apps/auction-item-stat-scraper | |
| host-secret: AISS_EC2_HOST | |
| ssh-key-secret: AISS_EC2_SSH_KEY | |
| name: Build and Deploy ${{ matrix.name }} | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v3 | |
| - name: Configure AWS credentials for ECR | |
| uses: aws-actions/configure-aws-credentials@v1 | |
| with: | |
| aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} | |
| aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} | |
| aws-region: ${{ secrets.AWS_REGION }} | |
| - name: Login to Amazon ECR | |
| id: login-ecr | |
| uses: aws-actions/amazon-ecr-login@v1 | |
| - name: Build and Push Docker image | |
| env: | |
| ECR_REGISTRY: ${{ secrets.ECR_REGISTRY }} | |
| IMAGE_TAG: ${{ github.sha }} | |
| run: | | |
| docker build \ | |
| --build-arg APP_PATH=${{ matrix.app-path }} \ | |
| -t $ECR_REGISTRY/loa-work/${{ matrix.name }}:$IMAGE_TAG \ | |
| -f src/go/Dockerfile . | |
| docker push $ECR_REGISTRY/loa-work/${{ matrix.name }}:$IMAGE_TAG | |
| docker tag $ECR_REGISTRY/loa-work/${{ matrix.name }}:$IMAGE_TAG $ECR_REGISTRY/loa-work/${{ matrix.name }}:latest | |
| docker push $ECR_REGISTRY/loa-work/${{ matrix.name }}:latest | |
| - name: Setup EC2 | |
| uses: appleboy/ssh-action@master | |
| with: | |
| host: ${{ secrets[matrix.host-secret] }} | |
| username: ubuntu | |
| key: ${{ secrets[matrix.ssh-key-secret] }} | |
| script: | | |
| # Copy setup script | |
| cat > setup.sh << 'EOF' | |
| $(cat .github/scripts/setup-ec2.sh) | |
| EOF | |
| chmod +x setup.sh | |
| # Run setup script with AWS credentials | |
| ./setup.sh "${{ secrets.AWS_ACCESS_KEY_ID }}" "${{ secrets.AWS_SECRET_ACCESS_KEY }}" | |
| rm setup.sh | |
| - name: Create promtail config for ${{ matrix.name }} | |
| run: | | |
| cp infra/go/${{ matrix.name }}-promtail.yaml promtail-${{ matrix.name }}.yaml | |
| - name: Copy Promtail config for ${{ matrix.name }} | |
| uses: appleboy/scp-action@master | |
| with: | |
| host: ${{ secrets[matrix.host-secret] }} | |
| username: ubuntu | |
| key: ${{ secrets[matrix.ssh-key-secret] }} | |
| source: "promtail-${{ matrix.name }}.yaml" | |
| target: "/home/ubuntu" | |
| - name: Deploy Promtail to EC2 for ${{ matrix.name }} | |
| uses: appleboy/ssh-action@master | |
| with: | |
| host: ${{ secrets[matrix.host-secret] }} | |
| username: ubuntu | |
| key: ${{ secrets[matrix.ssh-key-secret] }} | |
| script: | | |
| sudo docker pull grafana/promtail:3.4 | |
| sudo docker stop promtail || true | |
| sudo docker rm promtail || true | |
| sudo docker run -d \ | |
| --name promtail \ | |
| --network host \ | |
| -v /var/lib/docker/containers:/var/lib/docker/containers:ro \ | |
| -v /home/ubuntu/promtail-${{ matrix.name }}.yaml:/etc/promtail/config.yaml \ | |
| grafana/promtail:3.4 -config.file=/etc/promtail/config.yaml || echo "Docker run failed: $?" | |
| - name: Deploy to EC2 | |
| uses: appleboy/ssh-action@master | |
| with: | |
| host: ${{ secrets[matrix.host-secret] }} | |
| username: ubuntu | |
| key: ${{ secrets[matrix.ssh-key-secret] }} | |
| script: | | |
| aws ecr get-login-password --region ${{ secrets.AWS_REGION }} | docker login --username AWS --password-stdin ${{ secrets.ECR_REGISTRY }} | |
| docker pull ${{ secrets.ECR_REGISTRY }}/loa-work/${{ matrix.name }}:latest | |
| docker stop ${{ matrix.name }} || true | |
| docker rm ${{ matrix.name }} || true | |
| docker run -d \ | |
| --name ${{ matrix.name }} \ | |
| -p 3000:3000 \ | |
| -e DATABASE_URL="${{ secrets.DATABASE_URL }}" \ | |
| -e LOA_API_TOKEN="${{ secrets.LOA_API_TOKEN }}" \ | |
| --restart always \ | |
| ${{ secrets.ECR_REGISTRY }}/loa-work/${{ matrix.name }}:latest |