This project is a modern online CV display and generation application, designed using a microservices architecture and deployed in a highly available Cloud environment. The main objective is to practice key DevOps concepts: Infrastructure as Code (IaC), containerization, Kubernetes orchestration, and continuous deployment (CI/CD).
The application is split into three distinct, autonomous, and scalable microservices:
| Component | Technology | Role |
|---|---|---|
cv-frontend |
React / Nginx | Responsive web user interface to view the CV. |
cv-api |
Node.js / Express | REST API managing dynamic profile data. |
cv-pdf |
Node.js Worker | PDF generation and export service for the CV. |
- Cloud Provider: Microsoft Azure (Managed resources)
- Orchestration: Azure Kubernetes Service (AKS) (Cluster:
aks-cv-cluster) - Image Registry: Azure Container Registry (ACR) (
cvregistryfranck.azurecr.io) - CI/CD: GitHub Actions (Automated Build & Push)
- Routing & Ingress: Nginx Ingress Controller (Reverse-proxy and single entry point to the cluster)
- IaC: Terraform (Automated provisioning of Azure infrastructure)
If you want to test the application locally without deploying to Azure/Kubernetes, you can spin up the entire stack in seconds using Docker Compose:
- Clone the repository and navigate to the root directory.
- Run the following command:
docker-compose up --buildOpen your browser and navigate to http://localhost:3000 (or the port configured for your frontend) to view the application.
The code lifecycle is fully automated using a GitHub Actions pipeline (ci.yml):
- Build & Tag: On every commit to the
mainbranch, GitHub Actions triggers Docker image builds for each microservice. - Push to ACR: Secure authentication to Azure via repository deployment secrets, followed by pushing images with both the
latesttag and the commit hash (SHA). - Rotation Strategy: Managed Azure access keys with dual-entry rotation to ensure continuous security without service interruption.
[ Code Commit ] ──> [ GitHub Actions ] ──> [ Azure Container Registry (ACR) ] │ (Image Pull) ▼ [ Azure Kubernetes Service ] ├── Ingress Nginx Controller ├── Pod cv-frontend (Running) ├── Pod cv-api (Running) └── Pod cv-pdf (Running)
Note: All application pods are configured to run resiliently and are self-managed by Kubernetes.
The proper functioning of the application depends on the configuration of environment variables.
Before running the project locally, create a .env file at the root by copying the provided example:
cp .env.example .env| Variable | Description | Default Value |
|---|---|---|
| API_URL | The API URL for the cv-pdf service to fetch data. | http://api:8000 |
- Cloud Deployment (Azure) When deploying to Azure (via App Service, Container Apps, or Kubernetes), these variables must be defined directly in the Azure Portal:
Navigate to your specific Azure resource.
Access Configuration (or Environment variables).
Add API_URL with the public URL value of your deployed API service (e.g., https://api-cv.azurewebsites.net).
- Configured Azure CLI
kubectlconnected to the AKS cluster
To deploy the entire stack (Deployments, Services, Ingress) to the cluster:
kubectl apply -f k8s/- Check Cluster Health Status
kubectl get pods -n defaultExpected status: All components (cv-frontend, cv-api, cv-pdf, ingress-nginx) must display a Running status.
- Retrieve Public Access IP
kubectl get ingressCopy the public IP address from the ADDRESS column to browse the live application.
🧠 Skills Validated Through This Project Microservices Architecture: Decoupling responsibilities and managing inter-service communication.
Cloud Security: Advanced secret management (GitHub Secrets), network isolation, and access role management (AcrPull) between Azure services.
Resilience & High Availability: Configuring Kubernetes deployment strategies, automatic container restarts upon failure, and traffic management via Ingress.
Troubleshooting: Deep container log analysis (kubectl logs), investigating Pod lifecycles (ImagePullBackOff debugging), and workflow pipeline analysis.