Skip to content

Commit 5f64de4

Browse files
feat: add deployment files for aws
1 parent f531746 commit 5f64de4

File tree

2 files changed

+158
-0
lines changed

2 files changed

+158
-0
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
name: Deploy Docker Images
2+
3+
on:
4+
workflow_dispatch:
5+
6+
jobs:
7+
deploy:
8+
runs-on: ubuntu-latest
9+
environment:
10+
name: AWS
11+
url: "https://client.${{ vars.EC2_PUBLIC_IP }}.nip.io"
12+
steps:
13+
- name: Checkout Code
14+
uses: actions/checkout@v4
15+
16+
- name: Copy Docker Compose File From Repo to VM Host
17+
uses: appleboy/[email protected]
18+
with:
19+
host: ${{ vars.EC2_PUBLIC_IP }}
20+
username: ${{ vars.AWS_EC2_USER }}
21+
key: ${{ secrets.AWS_EC2_PRIVATE_KEY }}
22+
source: "./compose.aws.yml"
23+
target: /home/${{ vars.AWS_EC2_USER }}
24+
25+
- name: SSH to VM and Create .env.prod
26+
uses: appleboy/[email protected]
27+
with:
28+
host: ${{ vars.EC2_PUBLIC_IP }}
29+
username: ${{ vars.AWS_EC2_USER }}
30+
key: ${{ secrets.AWS_EC2_PRIVATE_KEY }}
31+
script: |
32+
rm .env.prod
33+
touch .env.prod
34+
echo "CLIENT_HOST=client.${{ vars.EC2_PUBLIC_IP }}.nip.io" >> .env.prod
35+
echo "SERVER_HOST=api.${{ vars.EC2_PUBLIC_IP }}.nip.io" >> .env.prod
36+
echo "PUBLIC_API_URL=https://api.${{ vars.EC2_PUBLIC_IP }}.nip.io/api" >> .env.prod
37+
38+
- name: SSH to VM and Execute Docker-Compose Up
39+
uses: appleboy/[email protected]
40+
with:
41+
host: ${{ vars.EC2_PUBLIC_IP }}
42+
username: ${{ vars.AWS_EC2_USER }}
43+
key: ${{ secrets.AWS_EC2_PRIVATE_KEY }}
44+
script: |
45+
echo "Logging into Docker registry..."
46+
echo ${{ secrets.GITHUB_TOKEN }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin
47+
echo "Starting Docker Compose..."
48+
docker compose -f compose.aws.yml --env-file=.env.prod up --pull=always -d

deployment/compose.aws.yml

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
services:
2+
reverse-proxy:
3+
image: traefik:v3.4
4+
command:
5+
- "--providers.docker=true"
6+
- "--providers.docker.exposedByDefault=false"
7+
- "--entrypoints.web.address=:80"
8+
- "--entrypoints.websecure.address=:443"
9+
- "--entrypoints.web.http.redirections.entryPoint.to=websecure"
10+
- "--entrypoints.web.http.redirections.entryPoint.scheme=https"
11+
- "--certificatesresolvers.letsencrypt.acme.httpchallenge=true"
12+
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
13+
14+
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
15+
restart: unless-stopped
16+
ports:
17+
- "80:80"
18+
- "443:443"
19+
volumes:
20+
- /var/run/docker.sock:/var/run/docker.sock
21+
- ./letsencrypt:/letsencrypt
22+
networks:
23+
- backend
24+
25+
gateway-service:
26+
image: ghcr.io/aet-devops25/w05-template/gateway:latest
27+
container_name: gateway-service
28+
environment:
29+
- SPRING_PROFILES_ACTIVE=docker
30+
restart: unless-stopped
31+
depends_on:
32+
- chat-service
33+
- matching-service
34+
- user-service
35+
labels:
36+
- "traefik.enable=true"
37+
- "traefik.http.routers.gateway.rule=Host(`${SERVER_HOST}`)"
38+
- "traefik.http.services.gateway.loadbalancer.server.port=8080"
39+
- "traefik.http.routers.gateway.entrypoints=websecure"
40+
- "traefik.http.routers.gateway.tls.certresolver=letsencrypt"
41+
networks:
42+
- backend
43+
44+
chat-service:
45+
image: ghcr.io/aet-devops25/w05-template/chat:latest
46+
container_name: chat-service
47+
environment:
48+
- SPRING_PROFILES_ACTIVE=docker
49+
restart: unless-stopped
50+
labels:
51+
- "traefik.enable=true"
52+
- "traefik.http.routers.chat.rule=Host(`${SERVER_HOST}`) && PathPrefix(`/api/chat`)"
53+
- "traefik.http.services.chat.loadbalancer.server.port=80"
54+
- "traefik.http.routers.chat.entrypoints=websecure"
55+
- "traefik.http.routers.chat.tls.certresolver=letsencrypt"
56+
networks:
57+
- backend
58+
59+
matching-service:
60+
image: ghcr.io/aet-devops25/w05-template/matching:latest
61+
container_name: matching-service
62+
environment:
63+
- SPRING_PROFILES_ACTIVE=docker
64+
restart: unless-stopped
65+
labels:
66+
- "traefik.enable=true"
67+
- "traefik.http.routers.matching.rule=Host(`${SERVER_HOST}`) && PathPrefix(`/api/matching`)"
68+
- "traefik.http.services.matching.loadbalancer.server.port=80"
69+
- "traefik.http.routers.matching.entrypoints=websecure"
70+
- "traefik.http.routers.matching.tls.certresolver=letsencrypt"
71+
networks:
72+
- backend
73+
74+
user-service:
75+
image: ghcr.io/aet-devops25/w05-template/user:latest
76+
container_name: user-service
77+
environment:
78+
- SPRING_PROFILES_ACTIVE=docker
79+
restart: unless-stopped
80+
labels:
81+
- "traefik.enable=true"
82+
- "traefik.http.routers.user.rule=Host(`${SERVER_HOST}`) && PathPrefix(`/api/user`)"
83+
- "traefik.http.services.user.loadbalancer.server.port=80"
84+
- "traefik.http.routers.user.entrypoints=websecure"
85+
- "traefik.http.routers.user.tls.certresolver=letsencrypt"
86+
networks:
87+
- backend
88+
89+
client:
90+
image: ghcr.io/aet-devops25/w05-template/client:latest
91+
environment:
92+
- PUBLIC_API_URL=${PUBLIC_API_URL}
93+
depends_on:
94+
- gateway-service
95+
restart: unless-stopped
96+
labels:
97+
- "traefik.enable=true"
98+
- "traefik.http.routers.client.rule=Host(`${CLIENT_HOST}`)"
99+
- "traefik.http.services.client.loadbalancer.server.port=3000"
100+
- "traefik.http.routers.client.entrypoints=websecure"
101+
- "traefik.http.routers.client.tls.certresolver=letsencrypt"
102+
- "traefik.http.middlewares.client-compress.compress=true"
103+
- "traefik.http.routers.client.middlewares=client-compress"
104+
- "traefik.http.routers.client.priority=1"
105+
networks:
106+
- backend
107+
108+
networks:
109+
backend:
110+
driver: bridge

0 commit comments

Comments
 (0)