Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
44323b1
adding ci-cd
Feb 20, 2026
383b7d9
adding cluster
Feb 20, 2026
3ab9a98
ci-cd modified
Feb 20, 2026
3d51b30
ci-cd modifiedv2
Feb 20, 2026
6a9c02f
ci-cd modifiedv3
Feb 20, 2026
0dd9c0e
ci-cd modifiedv4
Feb 20, 2026
7d920c0
ci-cd modifiedv5
Feb 20, 2026
b051401
ci-cd modifiedv6
Feb 20, 2026
c40e022
ci-cd modifiedv7
Feb 20, 2026
2bee157
ci-cd modifiedv8
Feb 20, 2026
8147d6c
ci-cd modifiedv9
Feb 20, 2026
287b487
ci-cd modifiedv10
Feb 20, 2026
bb4e616
fix: resolve PVC conflict, set storageClassName to gp2
gerardogm-devops Feb 20, 2026
84d1ed0
ci-cd modifiedv11
Feb 20, 2026
7db760c
Merge branch 'latin' of github.com:cesarboada-hash/ironhack-project-2…
Feb 20, 2026
8c34e37
ci-cd modifiedv13
Feb 20, 2026
f9dfc8b
ci-cd modifiedv14
Feb 20, 2026
7db5f4a
fix: add subPath to postgres volume mount
gerardogm-devops Feb 20, 2026
acbf279
Merge branch 'latin' of https://github.com/cesarboada-hash/ironhack-p…
gerardogm-devops Feb 20, 2026
bf7419c
fix: add subPath to postgres, fix PVCs storageClassName
gerardogm-devops Feb 20, 2026
9769f4b
Delete example host from ingress.yaml
gerardogm-devops Feb 20, 2026
72003ec
ci-cd modifiedv15
Feb 20, 2026
d748797
ci-cd modifiedv16
Feb 20, 2026
b00c163
css style correction in vote
gerardogm-devops Feb 20, 2026
2233627
add security context to redis in redis-deployment.yml
gerardogm-devops Feb 23, 2026
29312d9
db credentials update
Feb 23, 2026
2709c74
add user fsGroup:999 to the pods
gerardogm-devops Feb 23, 2026
42a842d
adding clusterissuer
Feb 23, 2026
d07361f
adding voting tls
Feb 23, 2026
18d4a00
changes
Feb 23, 2026
bdc0c18
changes
Feb 23, 2026
d37f554
last change
Feb 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 58 additions & 0 deletions .github/workflows/ci-cd-pipeline.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
name: CI/CD Pipeline

on:
push:
branches: [ latin ]
workflow_dispatch:

jobs:
build-and-deploy:
runs-on: ubuntu-latest
permissions:
id-token: write # For AWS OIDC
contents: read

steps:
- name: Checkout code
uses: actions/checkout@v3

- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}

- name: Build and Push Vote
run: |
cd vote
docker build -t ${{ secrets.DOCKER_USERNAME }}/vote:latest .
docker push ${{ secrets.DOCKER_USERNAME }}/vote:latest

- name: Build and Push Result
run: |
cd result
docker build -t ${{ secrets.DOCKER_USERNAME }}/result:latest .
docker push ${{ secrets.DOCKER_USERNAME }}/result:latest

- name: Build and Push Worker
run: |
cd worker
docker build -t ${{ secrets.DOCKER_USERNAME }}/worker:latest .
docker push ${{ secrets.DOCKER_USERNAME }}/worker:latest

- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::686699774218:role/github-actions-eks-role
aws-region: ${{ secrets.AWS_REGION }}

- name: Install eksctl
run: |
curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin

- name: Update Kubeconfig
run: eksctl utils write-kubeconfig --cluster voting-app-cluster --region ${{ secrets.AWS_REGION }}

- name: Deploy Kubernetes Manifests
run: kubectl apply -R -f k8s/ # Asumiendo YAMLs están en carpeta k8s/
48 changes: 48 additions & 0 deletions infra/eks/cluster.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
name: voting-app-cluster
region: sa-east-1 # cambia si prefieres otra región (ej: eu-west-1)
version: "1.31" # o la versión más reciente soportada

managedNodeGroups:
- name: standard-workers
instanceType: t2.small
minSize: 1
maxSize: 3
desiredCapacity: 2
volumeSize: 30
volumeType: gp3
ssh:
allow: false
iam:
withAddonPolicies:
autoScaler: true
externalDNS: true
certManager: true

- name: standard-workers-medium
instanceType: t3.medium
minSize: 1
maxSize: 3
desiredCapacity: 2
volumeSize: 30
volumeType: gp3
ssh:
allow: false
iam:
withAddonPolicies:
autoScaler: true
externalDNS: true
certManager: true

addons:
- name: vpc-cni
- name: coredns
- name: kube-proxy
- name: aws-ebs-csi-driver
- name: eks-pod-identity-agent

addonsConfig:
autoApplyPodIdentityAssociations: true
24 changes: 24 additions & 0 deletions ironhack-project-2-latin-team.sln
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.2.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Worker", "worker\Worker.csproj", "{69C79C25-F84F-479E-3E79-EC68C71F7F70}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{69C79C25-F84F-479E-3E79-EC68C71F7F70}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{69C79C25-F84F-479E-3E79-EC68C71F7F70}.Debug|Any CPU.Build.0 = Debug|Any CPU
{69C79C25-F84F-479E-3E79-EC68C71F7F70}.Release|Any CPU.ActiveCfg = Release|Any CPU
{69C79C25-F84F-479E-3E79-EC68C71F7F70}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {ACB31A12-1815-4DB8-BAB2-C86F254A0117}
EndGlobalSection
EndGlobal
22 changes: 22 additions & 0 deletions k8s/cert-manager/clusterissuer.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: de.gerardogmilian@gmail.com
privateKeySecretRef:
name: letsencrypt-prod
preferredChain: "ISRG Root X1"
solvers:
- dns01:
route53:
region: sa-east-1
accessKeyID: AKIAZ7YT7AEFB5WDTS7V
secretAccessKeySecretRef:
name: route53-secret
key: secret-access-key
selector:
dnsZones:
- "app-vote-latin.com"
47 changes: 47 additions & 0 deletions k8s/ingress/ingress.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: voting-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
ingressClassName: nginx
tls:
- hosts:
- app-vote-latin.com
secretName: voting-tls-selfsigned
rules:
- host: app-vote-latin.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: vote-service
port:
number: 80
- path: /result
pathType: Prefix
backend:
service:
name: result-service
port:
number: 80
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: vote-service
port:
number: 80
- path: /result
pathType: Prefix
backend:
service:
name: result-service
port:
number: 80
40 changes: 40 additions & 0 deletions k8s/postgres/postgres-deployment.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres-deployment
spec:
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:15-alpine
ports:
- containerPort: 5432
env:
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
name: db-credentials
key: POSTGRES_USER
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: db-credentials
key: POSTGRES_PASSWORD
- name: POSTGRES_DB
value: votes
volumeMounts:
- mountPath: /var/lib/postgresql/data
subPath: pgdata
name: postgres-data
volumes:
- name: postgres-data
persistentVolumeClaim:
claimName: postgres-pvc
12 changes: 12 additions & 0 deletions k8s/postgres/postgres-pvc.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: gp2
resources:
requests:
storage: 5Gi # Ajusta a 5Gi si ya existe uno con ese tamaño (como en tu error anterior)
storageClassName: gp2 # O el StorageClass de tu cluster EKS (gp2 es común en AWS)
12 changes: 12 additions & 0 deletions k8s/postgres/postgres-service.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
apiVersion: v1
kind: Service
metadata:
name: postgres-service
spec:
selector:
app: postgres
ports:
- protocol: TCP
port: 5432
targetPort: 5432
type: ClusterIP
31 changes: 31 additions & 0 deletions k8s/redis/redis-deployment.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-deployment
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
securityContext:
fsGroup: 999
containers:
- name: redis
image: redis:alpine
securityContext:
runAsUser: 999
runAsGroup: 999
ports:
- containerPort: 6379
volumeMounts:
- mountPath: /data
name: redis-data
volumes:
- name: redis-data
persistentVolumeClaim:
claimName: redis-pvc
11 changes: 11 additions & 0 deletions k8s/redis/redis-pvc.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: redis-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: gp2
resources:
requests:
storage: 1Gi
12 changes: 12 additions & 0 deletions k8s/redis/redis-service.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
apiVersion: v1
kind: Service
metadata:
name: redis-service
spec:
selector:
app: redis
ports:
- protocol: TCP
port: 6379
targetPort: 6379
type: ClusterIP
36 changes: 36 additions & 0 deletions k8s/result/result-deployment.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: result-deployment
spec:
replicas: 1
selector:
matchLabels:
app: result
template:
metadata:
labels:
app: result
spec:
containers:
- name: result
image: cesarboada/result:latest # Use your Docker Hub image
ports:
- containerPort: 80
env:
- name: PG_HOST
value: postgres-service
- name: PG_PORT
value: "5432"
- name: PG_USER
valueFrom:
secretKeyRef:
name: db-credentials
key: POSTGRES_USER
- name: PG_PASSWORD
valueFrom:
secretKeyRef:
name: db-credentials
key: POSTGRES_PASSWORD
- name: PG_DATABASE
value: votes
12 changes: 12 additions & 0 deletions k8s/result/result-service.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
apiVersion: v1
kind: Service
metadata:
name: result-service
spec:
selector:
app: result
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
Loading