Skip to content

테이블 정렬 버튼의 과도한 스타일 제거 #291

테이블 정렬 버튼의 과도한 스타일 제거

테이블 정렬 버튼의 과도한 스타일 제거 #291

Workflow file for this run

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