Skip to content

Commit c8eef2c

Browse files
authored
Merge pull request #50 from AET-DevOps25/week8-backend
Week8 backend
2 parents 6f31e46 + 3def359 commit c8eef2c

File tree

55 files changed

+1779
-980
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+1779
-980
lines changed

.github/workflows/deploy-aws.yml

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ name: Deploy to AWS
22

33
on:
44
workflow_dispatch:
5+
inputs:
6+
image:
7+
description: "Image name and tag"
8+
required: false
59

610
jobs:
711
deploy:
@@ -16,7 +20,7 @@ jobs:
1620
uses: appleboy/scp-action@v0.1.7
1721
with:
1822
host: ${{ vars.EC2_PUBLIC_IP }}
19-
username: ${{ vars.AWS_EC2_USER }}
23+
username: ${{ secrets.AWS_EC2_USER }}
2024
key: ${{ secrets.SERVER_SSH_KEY }}
2125
source: "./docker-compose.prod.deploy.yml"
2226
target: ~/srv/app/
@@ -26,18 +30,20 @@ jobs:
2630
uses: appleboy/ssh-action@v1.0.3
2731
with:
2832
host: ${{ vars.EC2_PUBLIC_IP }}
29-
username: ${{ vars.AWS_EC2_USER }}
33+
username: ${{ secrets.AWS_EC2_USER }}
3034
key: ${{ secrets.SERVER_SSH_KEY }}
3135
script: |
3236
cat > ~/srv/app/.env <<EOF
3337
# GitHub Container Registry
3438
GHCR_USER=$(echo '${{ github.repository_owner }}' | tr '[:upper:]' '[:lower:]')
3539
GHCR_REPO=$(echo '${{ github.event.repository.name }}' | tr '[:upper:]' '[:lower:]')
3640
GHCR_TAG=$(
37-
if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then
38-
echo "${{ github.sha }}"
41+
if [[ -n "${{ github.event.inputs.image }}" ]]; then
42+
echo "${{ github.event.inputs.image }}"
43+
elif [[ "${{ github.ref }}" == "refs/heads/main" ]]; then
44+
echo "${{ github.sha }}"
3945
else
40-
echo "dev-${{ github.sha }}"
46+
echo "dev-${{ github.sha }}"
4147
fi
4248
)
4349
DB_USERNAME=${{ secrets.DB_USERNAME }}
@@ -55,16 +61,19 @@ jobs:
5561
SPRING_PROFILES_ACTIVE=docker
5662
PYTHONDONTWRITEBYTECODE=1
5763
PYTHONUNBUFFERED=1
64+
OLLAMA_BASE_URL="${{ secrets.OLLAMA_BASE_URL }}"
65+
OLLAMA_MODEL="${{ vars.OLLAMA_MODEL }}"
66+
OLLAMA_API_KEY="${{ secrets.OLLAMA_API_KEY }}"
5867
EOF
5968
6069
# SSH - pull images and restart containers
6170
- name: Pull images and restart containers remotely
6271
uses: appleboy/ssh-action@v1.0.3
6372
with:
6473
host: ${{ vars.EC2_PUBLIC_IP }}
65-
username: ${{ vars.AWS_EC2_USER }}
74+
username: ${{ secrets.AWS_EC2_USER }}
6675
key: ${{ secrets.SERVER_SSH_KEY }}
6776
script: |
6877
cd ~/srv/app
69-
docker compose -f docker-compose.prod.deploy.yml --env-file .env pull
70-
docker compose -f docker-compose.prod.deploy.yml --env-file .env up -d
78+
docker compose -f docker-compose.prod.deploy.yml pull
79+
docker compose -f docker-compose.prod.deploy.yml up -d

.github/workflows/docker-publish.yml

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,40 @@ on:
55
branches:
66
- main
77
workflow_dispatch:
8-
# 如果输入image tag,就跳过build
8+
# if input image tag, then skip test and build
99
inputs:
1010
image:
1111
description: "Image name and tag"
1212
required: false
1313

1414
jobs:
15-
build-and-push:
15+
unit-test:
1616
if: ${{ github.event.inputs.image == '' || github.event.inputs.image == null }}
1717
runs-on: ubuntu-latest
18+
steps:
19+
- uses: actions/checkout@v4
20+
21+
- name: Setup Gradle
22+
uses: gradle/actions/setup-gradle@v4.4.1
23+
24+
- name: Set up JDK
25+
uses: actions/setup-java@v4
26+
with:
27+
distribution: 'temurin'
28+
java-version: '21'
29+
30+
- name: Make gradlew executable
31+
run: chmod +x gradlew
32+
33+
- name: Make protobuf executable
34+
run: chmod +x service-application/protoc-gen-grpc-java-1.73.0-linux-x86_64.exe
35+
36+
- name: Run tests for all modules
37+
run: ./gradlew test
38+
39+
build-and-push:
40+
needs: unit-test
41+
runs-on: ubuntu-latest
1842

1943
permissions:
2044
contents: read

ansible/ansible.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ansible-playbook -i hosts.ini deploy.yml

ansible/deploy.yml

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88
update_cache: yes
99
when: ansible_os_family == "Debian"
1010

11-
- name: Install Docker and Docker Compose plugin (for Ubuntu)
12-
apt:
13-
name:
14-
- docker.io
15-
- docker-compose-plugin
16-
state: present
11+
- name: Install Docker using official script (for Ubuntu)
12+
shell: |
13+
curl -fsSL https://get.docker.com | bash
14+
args:
15+
executable: /bin/bash
1716
when: ansible_os_family == "Debian"
17+
become: true
1818

1919
- name: Add the user to the docker group
2020
user:
@@ -28,14 +28,14 @@
2828
state: directory
2929
mode: '0755'
3030

31-
- name: Copy .env to server
32-
copy:
33-
src: .env
34-
dest: /srv/app/.env
35-
mode: '0600'
31+
- name: Create letsencrypt
32+
file:
33+
path: /srv/app/letsencrypt
34+
state: directory
35+
mode: '0755'
3636

37-
- name: Copy docker-compose.prod.yml to server
38-
copy:
39-
src: docker-compose.prod.yml
40-
dest: /srv/app/docker-compose.prod.yml
41-
mode: '0644'
37+
- name: Create acme.json
38+
file:
39+
path: /srv/app/letsencrypt/acme.json
40+
state: touch
41+
mode: '0600'

ansible/hosts.ini.example

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[aws]
2+
xxx.xxx.xxx.xxx ansible_user=xxx ansible_ssh_private_key_file=/home/xxx/.pem_temp/xxx.pem

build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ subprojects {
3434
implementation 'org.springframework.boot:spring-boot-starter-actuator'
3535
implementation 'io.micrometer:micrometer-registry-prometheus:1.15.1'
3636

37+
implementation("net.logstash.logback:logstash-logback-encoder:8.1")
38+
3739
developmentOnly 'org.springframework.boot:spring-boot-devtools'
3840
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
3941

docker-compose.prod.deploy.yml

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ services:
1010
- "--entrypoints.web.http.redirections.entrypoint.to=websecure"
1111
- "--entrypoints.web.http.redirections.entrypoint.scheme=https"
1212
- "--providers.docker=true"
13-
- "--providers.docker.exposedByDefault=false"
13+
- "--providers.docker.exposedbydefault=false"
1414
- "--certificatesresolvers.letsencrypt.acme.httpchallenge=true"
1515
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
1616
- "--certificatesresolvers.letsencrypt.acme.email=admin@aihr.com"
@@ -20,16 +20,11 @@ services:
2020
ports:
2121
- "80:80" # HTTP
2222
- "443:443" # HTTPS
23-
- "8080:8080" # Traefik dashboard
2423
volumes:
2524
- /var/run/docker.sock:/var/run/docker.sock:ro
25+
- /home/ubuntu/srv/app/letsencrypt:/letsencrypt
2626
networks:
2727
- ai-hr-network
28-
labels:
29-
- "traefik.enable=true"
30-
- "traefik.http.routers.traefik.rule=Host(`traefik.localhost`)"
31-
- "traefik.http.routers.traefik.service=api@internal"
32-
- "traefik.http.routers.traefik.entrypoints=web"
3328

3429
# PostgreSQL database
3530
postgresql:
@@ -48,7 +43,7 @@ services:
4843
test:
4944
[
5045
"CMD-SHELL",
51-
"PGPASSWORD=$$POSTGRES_PASSWORD psql -U $$POSTGRES_USER -d ai_db -tAc \"SELECT to_regclass('public.embeddings');\" | grep -q embeddings"
46+
"PGPASSWORD=$$POSTGRES_PASSWORD psql -U $$POSTGRES_USER -d postgres -tAc \"SELECT 1 FROM pg_database WHERE datname='ai_db';\" | grep -q 1"
5247
]
5348
interval: 10s
5449
timeout: 5s
@@ -89,8 +84,8 @@ services:
8984
retries: 3
9085
labels:
9186
- "traefik.enable=true"
92-
- "traefik.http.routers.auth.rule=Host(`localhost`) && PathPrefix(`/api/v1/auth`)"
93-
- "traefik.http.routers.auth.entrypoints=web"
87+
- "traefik.http.routers.auth.rule=Host(`ec2-34-236-4-221.compute-1.amazonaws.com`) && PathPrefix(`/api/v1/auth`)"
88+
- "traefik.http.routers.auth.entrypoints=websecure"
9489
- "traefik.http.services.auth.loadbalancer.server.port=8080"
9590

9691
# Job management service
@@ -100,8 +95,6 @@ services:
10095
depends_on:
10196
postgresql:
10297
condition: service_healthy
103-
service-auth:
104-
condition: service_healthy
10598
networks:
10699
- ai-hr-network
107100
environment:
@@ -128,8 +121,8 @@ services:
128121
retries: 3
129122
labels:
130123
- "traefik.enable=true"
131-
- "traefik.http.routers.job.rule=Host(`localhost`) && PathPrefix(`/api/v1/jobs`)"
132-
- "traefik.http.routers.job.entrypoints=web"
124+
- "traefik.http.routers.job.rule=Host(`ec2-34-236-4-221.compute-1.amazonaws.com`) && PathPrefix(`/api/v1/jobs`)"
125+
- "traefik.http.routers.job.entrypoints=websecure"
133126
- "traefik.http.services.job.loadbalancer.server.port=8081"
134127

135128
# Application management service
@@ -139,10 +132,6 @@ services:
139132
depends_on:
140133
postgresql:
141134
condition: service_healthy
142-
service-auth:
143-
condition: service_healthy
144-
service-job:
145-
condition: service_healthy
146135
networks:
147136
- ai-hr-network
148137
environment:
@@ -174,8 +163,8 @@ services:
174163
retries: 3
175164
labels:
176165
- "traefik.enable=true"
177-
- "traefik.http.routers.application.rule=Host(`localhost`) && (PathPrefix(`/api/v1/applications`) || PathPrefix(`/api/v1/chat`) || PathPrefix(`/api/v1/assessments`) || PathPrefix(`/api/v1/files`))"
178-
- "traefik.http.routers.application.entrypoints=web"
166+
- "traefik.http.routers.application.rule=Host(`ec2-34-236-4-221.compute-1.amazonaws.com`) && (PathPrefix(`/api/v1/applications`) || PathPrefix(`/api/v1/chat`) || PathPrefix(`/api/v1/assessments`) || PathPrefix(`/api/v1/files`))"
167+
- "traefik.http.routers.application.entrypoints=websecure"
179168
- "traefik.http.services.application.loadbalancer.server.port=8082"
180169

181170
# GenAI service
@@ -190,8 +179,12 @@ services:
190179
environment:
191180
- PYTHONDONTWRITEBYTECODE=1
192181
- PYTHONUNBUFFERED=1
193-
- OLLAMA_BASE_URL=${OLLAMA_BASE_URL} \
194-
- OLLAMA_MODEL=${OLLAMA_MODEL} \
182+
- DB_HOST=${DB_HOST:-postgresql}
183+
- DB_PORT=${DB_PORT:-5432}
184+
- DB_USERNAME=${DB_USERNAME:-postgres}
185+
- DB_PASSWORD=${DB_PASSWORD:-postgres}
186+
- OLLAMA_BASE_URL=${OLLAMA_BASE_URL}
187+
- OLLAMA_MODEL=${OLLAMA_MODEL}
195188
- OLLAMA_API_KEY=${OLLAMA_API_KEY}
196189

197190
# Frontend
@@ -202,8 +195,10 @@ services:
202195
- ai-hr-network
203196
labels:
204197
- "traefik.enable=true"
205-
- "traefik.http.routers.frontend.rule=Host(`localhost`)"
206-
- "traefik.http.routers.frontend.entrypoints=web"
198+
- "traefik.http.routers.frontend.rule=Host(`ec2-34-236-4-221.compute-1.amazonaws.com`)"
199+
- "traefik.http.routers.frontend.entrypoints=websecure"
200+
- "traefik.http.routers.frontend.tls=true"
201+
- "traefik.http.routers.frontend.tls.certresolver=letsencrypt"
207202
- "traefik.http.services.frontend.loadbalancer.server.port=80"
208203

209204
networks:

docker-compose.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ services:
4242
test:
4343
[
4444
"CMD-SHELL",
45-
"PGPASSWORD=$$POSTGRES_PASSWORD psql -U $$POSTGRES_USER -d ai_db -tAc \"SELECT to_regclass('public.embeddings');\" | grep -q embeddings"
45+
"PGPASSWORD=$$POSTGRES_PASSWORD psql -U $$POSTGRES_USER -d postgres -tAc \"SELECT 1 FROM pg_database WHERE datname='ai_db';\" | grep -q 1"
4646
]
4747
interval: 10s
4848
timeout: 5s
@@ -186,6 +186,10 @@ services:
186186
environment:
187187
- PYTHONDONTWRITEBYTECODE=1
188188
- PYTHONUNBUFFERED=1
189+
- DB_HOST=${DB_HOST:-postgresql}
190+
- DB_PORT=${DB_PORT:-5432}
191+
- DB_USERNAME=${DB_USERNAME:-postgres}
192+
- DB_PASSWORD=${DB_PASSWORD:-postgres}
189193
- OLLAMA_BASE_URL=${OLLAMA_BASE_URL}
190194
- OLLAMA_MODEL=${OLLAMA_MODEL}
191195
- OLLAMA_API_KEY=${OLLAMA_API_KEY}

helm/aihr/charts/postgresql/templates/secret.yaml

Lines changed: 0 additions & 4 deletions
This file was deleted.

helm/aihr/charts/service-application/templates/deployment.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,13 @@ spec:
2828
- name: application
2929
image: "{{ default $defaultRepo .Values.image.repository }}:{{ default $tag .Values.image.tag }}"
3030
imagePullPolicy: {{ .Values.image.pullPolicy }}
31+
resources:
32+
requests:
33+
cpu: 100m
34+
memory: 128Mi
35+
limits:
36+
cpu: 500m
37+
memory: 512Mi
3138
ports:
3239
- name: http
3340
containerPort: {{ .Values.service.port }}

0 commit comments

Comments
 (0)