mirror of
https://github.com/dat515-2025/Group-8.git
synced 2026-03-22 06:57:47 +01:00
Compare commits
25 Commits
31add42d6d
...
merge/core
| Author | SHA1 | Date | |
|---|---|---|---|
| c689caea88 | |||
| 8c20deb690 | |||
| 39979b51ee | |||
| da0c77101d | |||
| a5a83e5d07 | |||
| 3749aa4525 | |||
| 94aa64addc | |||
| ba1677b2d3 | |||
|
|
8ea1ef9eea | ||
|
|
4b614902b2 | ||
| a152ecbe4d | |||
| 7d7dd98d0f | |||
| 5aca071ac2 | |||
|
|
80991c7390 | ||
|
|
1403e0029b | ||
| aa63e51e6a | |||
|
|
4aaaba3956 | ||
|
|
f0c28ba9e1 | ||
|
|
b560c07d62 | ||
|
|
f0b1452e30 | ||
| 6effb2793a | |||
|
|
ba7798259c | ||
| deb67f421e | |||
| 74557eeea8 | |||
| 2e0619d03f |
4
.github/workflows/build-image.yaml
vendored
4
.github/workflows/build-image.yaml
vendored
@@ -15,7 +15,7 @@ on:
|
|||||||
context:
|
context:
|
||||||
description: "Docker build context path"
|
description: "Docker build context path"
|
||||||
required: false
|
required: false
|
||||||
default: "7project/backend"
|
default: "7project/src/backend"
|
||||||
type: string
|
type: string
|
||||||
pr_number:
|
pr_number:
|
||||||
description: "PR number (required when mode=pr)"
|
description: "PR number (required when mode=pr)"
|
||||||
@@ -94,7 +94,7 @@ jobs:
|
|||||||
tags: |
|
tags: |
|
||||||
${{ env.IMAGE_REPO }}:${{ env.TAG1 }}
|
${{ env.IMAGE_REPO }}:${{ env.TAG1 }}
|
||||||
${{ env.IMAGE_REPO }}:${{ env.TAG2 }}
|
${{ env.IMAGE_REPO }}:${{ env.TAG2 }}
|
||||||
platforms: linux/amd64
|
platforms: linux/arm64,linux/amd64
|
||||||
|
|
||||||
- name: Set outputs
|
- name: Set outputs
|
||||||
id: set
|
id: set
|
||||||
|
|||||||
6
.github/workflows/deploy-pr.yaml
vendored
6
.github/workflows/deploy-pr.yaml
vendored
@@ -21,7 +21,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
mode: pr
|
mode: pr
|
||||||
image_repo: lukastrkan/cc-app-demo
|
image_repo: lukastrkan/cc-app-demo
|
||||||
context: 7project/backend
|
context: 7project/src/backend
|
||||||
pr_number: ${{ github.event.pull_request.number }}
|
pr_number: ${{ github.event.pull_request.number }}
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|
||||||
@@ -90,9 +90,9 @@ jobs:
|
|||||||
PR=${{ github.event.pull_request.number }}
|
PR=${{ github.event.pull_request.number }}
|
||||||
RELEASE=myapp-pr-$PR
|
RELEASE=myapp-pr-$PR
|
||||||
NAMESPACE=pr-$PR
|
NAMESPACE=pr-$PR
|
||||||
helm upgrade --install "$RELEASE" ./7project/charts/myapp-chart \
|
helm upgrade --install "$RELEASE" ./7project/src/charts/myapp-chart \
|
||||||
-n "$NAMESPACE" --create-namespace \
|
-n "$NAMESPACE" --create-namespace \
|
||||||
-f 7project/charts/myapp-chart/values-dev.yaml \
|
-f 7project/src/charts/myapp-chart/values-dev.yaml \
|
||||||
--set prNumber="$PR" \
|
--set prNumber="$PR" \
|
||||||
--set deployment="pr-$PR" \
|
--set deployment="pr-$PR" \
|
||||||
--set domain="$DOMAIN" \
|
--set domain="$DOMAIN" \
|
||||||
|
|||||||
12
.github/workflows/deploy-prod.yaml
vendored
12
.github/workflows/deploy-prod.yaml
vendored
@@ -4,9 +4,9 @@ on:
|
|||||||
push:
|
push:
|
||||||
branches: [ "main" ]
|
branches: [ "main" ]
|
||||||
paths:
|
paths:
|
||||||
- 7project/backend/**
|
- ../../7project/src/backend/**
|
||||||
- 7project/frontend/**
|
- ../../7project/src/frontend/**
|
||||||
- 7project/charts/myapp-chart/**
|
- ../../7project/src/charts/myapp-chart/**
|
||||||
- .github/workflows/deploy-prod.yaml
|
- .github/workflows/deploy-prod.yaml
|
||||||
- .github/workflows/build-image.yaml
|
- .github/workflows/build-image.yaml
|
||||||
- .github/workflows/frontend-pages.yml
|
- .github/workflows/frontend-pages.yml
|
||||||
@@ -32,7 +32,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
mode: prod
|
mode: prod
|
||||||
image_repo: lukastrkan/cc-app-demo
|
image_repo: lukastrkan/cc-app-demo
|
||||||
context: 7project/backend
|
context: 7project/src/backend
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|
||||||
get_urls:
|
get_urls:
|
||||||
@@ -103,9 +103,9 @@ jobs:
|
|||||||
SMTP_FROM: ${{ secrets.SMTP_FROM }}
|
SMTP_FROM: ${{ secrets.SMTP_FROM }}
|
||||||
UNIRATE_API_KEY: ${{ secrets.UNIRATE_API_KEY }}
|
UNIRATE_API_KEY: ${{ secrets.UNIRATE_API_KEY }}
|
||||||
run: |
|
run: |
|
||||||
helm upgrade --install myapp ./7project/charts/myapp-chart \
|
helm upgrade --install myapp ./7project/src/charts/myapp-chart \
|
||||||
-n prod --create-namespace \
|
-n prod --create-namespace \
|
||||||
-f 7project/charts/myapp-chart/values-prod.yaml \
|
-f 7project/src/charts/myapp-chart/values-prod.yaml \
|
||||||
--set deployment="prod" \
|
--set deployment="prod" \
|
||||||
--set domain="$DOMAIN" \
|
--set domain="$DOMAIN" \
|
||||||
--set domain_scheme="$DOMAIN_SCHEME" \
|
--set domain_scheme="$DOMAIN_SCHEME" \
|
||||||
|
|||||||
6
.github/workflows/frontend-pages.yml
vendored
6
.github/workflows/frontend-pages.yml
vendored
@@ -35,7 +35,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: 7project/frontend
|
working-directory: 7project/src/frontend
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -45,7 +45,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
node-version: '20'
|
node-version: '20'
|
||||||
cache: 'npm'
|
cache: 'npm'
|
||||||
cache-dependency-path: 7project/frontend/package-lock.json
|
cache-dependency-path: 7project/src/frontend/package-lock.json
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: npm ci
|
run: npm ci
|
||||||
@@ -61,7 +61,7 @@ jobs:
|
|||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: frontend-dist
|
name: frontend-dist
|
||||||
path: 7project/frontend/dist
|
path: 7project/src/frontend/dist
|
||||||
|
|
||||||
deploy:
|
deploy:
|
||||||
name: Deploy to Cloudflare Pages
|
name: Deploy to Cloudflare Pages
|
||||||
|
|||||||
10
.github/workflows/run-tests.yml
vendored
10
.github/workflows/run-tests.yml
vendored
@@ -46,21 +46,21 @@ jobs:
|
|||||||
|
|
||||||
- name: Add test dependencies to requirements
|
- name: Add test dependencies to requirements
|
||||||
run: |
|
run: |
|
||||||
echo "pytest==8.4.2" >> ./7project/backend/requirements.txt
|
echo "pytest==8.4.2" >> ./7project/src/backend/requirements.txt
|
||||||
echo "pytest-asyncio==1.2.0" >> ./7project/backend/requirements.txt
|
echo "pytest-asyncio==1.2.0" >> ./7project/src/backend/requirements.txt
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
python -m pip install --upgrade pip
|
python -m pip install --upgrade pip
|
||||||
pip install -r ./7project/backend/requirements.txt
|
pip install -r ./7project/src/backend/requirements.txt
|
||||||
|
|
||||||
- name: Run Alembic migrations
|
- name: Run Alembic migrations
|
||||||
run: |
|
run: |
|
||||||
alembic upgrade head
|
alembic upgrade head
|
||||||
working-directory: ./7project/backend
|
working-directory: ./7project/src/backend
|
||||||
|
|
||||||
- name: Run tests with pytest
|
- name: Run tests with pytest
|
||||||
env:
|
env:
|
||||||
PYTEST_RUN_CONFIG: "True"
|
PYTEST_RUN_CONFIG: "True"
|
||||||
run: pytest
|
run: pytest
|
||||||
working-directory: ./7project/backend
|
working-directory: ./7project/src/backend
|
||||||
8
.idea/.gitignore
generated
vendored
Normal file
8
.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
||||||
16
7project/.gitignore
vendored
16
7project/.gitignore
vendored
@@ -1,8 +1,8 @@
|
|||||||
/tofu/controlplane.yaml
|
/src/tofu/controlplane.yaml
|
||||||
/tofu/kubeconfig
|
/src/tofu/kubeconfig
|
||||||
/tofu/talosconfig
|
/src/tofu/talosconfig
|
||||||
/tofu/terraform.tfstate
|
/src/tofu/terraform.tfstate
|
||||||
/tofu/terraform.tfstate.backup
|
/src/tofu/terraform.tfstate.backup
|
||||||
/tofu/worker.yaml
|
/src/tofu/worker.yaml
|
||||||
/tofu/.terraform.lock.hcl
|
/src/tofu/.terraform.lock.hcl
|
||||||
/tofu/.terraform/
|
/src/tofu/.terraform/
|
||||||
|
|||||||
8
7project/.idea/.gitignore
generated
vendored
Normal file
8
7project/.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
||||||
@@ -1,43 +1,6 @@
|
|||||||
# Lab 6: Design Document for Course Project
|
# Personal Finance Tracker
|
||||||
|
## Folder Structure
|
||||||
| Lab 6: | Design Document for Course Project |
|
- meetings: Contains note from meetings
|
||||||
| ----------- | ---------------------------------- |
|
- scr: Source code for the project
|
||||||
| Subject: | DAT515 Cloud Computing |
|
- checklist: Project checklist and self assessment tracking
|
||||||
| Deadline: | **September 19, 2025 23:59** |
|
- report.md: Detailed report of the project
|
||||||
| Grading: | No Grade |
|
|
||||||
| Submission: | Group |
|
|
||||||
|
|
||||||
## Table of Contents
|
|
||||||
|
|
||||||
- [Table of Contents](#table-of-contents)
|
|
||||||
- [1. Design Document (design.md)](#1-design-document-designmd)
|
|
||||||
|
|
||||||
The design document is the first deliverable for your project.
|
|
||||||
We separated this out as a separate deliverable, with its own deadline, to ensure that you have a clear plan before you start coding.
|
|
||||||
This part only needs a cursory review by the teaching staff to ensure it is sufficiently comprehensive, while still realistic.
|
|
||||||
The teaching staff will assign you to a project mentor who will provide guidance and support throughout the development process.
|
|
||||||
|
|
||||||
## 1. Design Document (design.md)
|
|
||||||
|
|
||||||
You are required to prepare a design document for your application.
|
|
||||||
The design doc should be brief, well-organized and easy to understand.
|
|
||||||
The design doc should be prepared in markdown format and named `design.md` and submitted in the project group's repository.
|
|
||||||
Remember that you can use [mermaid diagrams](https://github.com/mermaid-js/mermaid#readme) in markdown files.
|
|
||||||
|
|
||||||
The design doc **should include** the following sections:
|
|
||||||
|
|
||||||
- **Overview**: A brief description of the application and its purpose.
|
|
||||||
- **Architecture**: The high-level architecture of the application, including components, interactions, and data flow.
|
|
||||||
- **Technologies**: The cloud computing technologies or services used in the application.
|
|
||||||
- **Deployment**: The deployment strategy for the application, including any infrastructure requirements.
|
|
||||||
|
|
||||||
The design document should be updated throughout the development process and reflect the final implementation of your project.
|
|
||||||
|
|
||||||
Optional sections may include:
|
|
||||||
|
|
||||||
- Security: The security measures implemented in the application to protect data and resources.
|
|
||||||
- Scalability: The scalability considerations for the application, including load balancing and auto-scaling.
|
|
||||||
- Monitoring: The monitoring and logging strategy for the application to track performance and detect issues.
|
|
||||||
- Disaster Recovery: The disaster recovery plan for the application to ensure business continuity in case of failures.
|
|
||||||
- Cost Analysis: The cost analysis of running the application on the cloud, including pricing models and cost-saving strategies.
|
|
||||||
- References: Any external sources or references used in the design document.
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
import app.celery_app # noqa: F401
|
|
||||||
from app.workers.celery_tasks import send_email
|
|
||||||
|
|
||||||
|
|
||||||
def enqueue_email(to: str, subject: str, body: str) -> None:
|
|
||||||
send_email.delay(to, subject, body)
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
import uvicorn
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
uvicorn.run("app.app:app", host="0.0.0.0", log_level="info")
|
|
||||||
@@ -7,64 +7,64 @@ Focus on areas that align with your project goals and interests.
|
|||||||
The core deliverables are required.
|
The core deliverables are required.
|
||||||
This means that you must get at least 2 points for each item in this category.
|
This means that you must get at least 2 points for each item in this category.
|
||||||
|
|
||||||
| **Category** | **Item** | **Max Points** | **Points** |
|
| **Category** | **Item** | **Max Points** | **Points** | **Comments** |
|
||||||
|----------------------------------| --------------------------------------- | -------------- |-------------------------------------------------|
|
|----------------------------------| --------------------------------------- | -------------- |-------------------------------------------------| |
|
||||||
| **Core Deliverables (Required)** | | | |
|
| **Core Deliverables (Required)** | | | | |
|
||||||
| Codebase & Organization | Well-organized project structure | 5 | 5 |
|
| Codebase & Organization | Well-organized project structure | 5 | 5 | |
|
||||||
| | Clean, readable code | 5 | 4 |
|
| | Clean, readable code | 5 | 4 | |
|
||||||
| | Use planning tool (e.g., GitHub issues) | 5 | 4 |
|
| | Use planning tool (e.g., GitHub issues) | 5 | 4 | |
|
||||||
| | Proper version control usage | 5 | 5 |
|
| | Proper version control usage | 5 | 5 | |
|
||||||
| 23 | Complete source code | 5 | 5 |
|
| 23 | Complete source code | 5 | 5 | |
|
||||||
| Documentation | Comprehensive reproducibility report | 10 | 4-5 |
|
| Documentation | Comprehensive reproducibility report | 10 | 4-5 | |
|
||||||
| | Updated design document | 5 | 2 |
|
| | Updated design document | 5 | 2 | |
|
||||||
| | Clear build/deployment instructions | 5 | 2 |
|
| | Clear build/deployment instructions | 5 | 2 | |
|
||||||
| | Troubleshooting guide | 5 | 1 |
|
| | Troubleshooting guide | 5 | 1 | |
|
||||||
| | Completed self-assessment table | 5 | 2 |
|
| | Completed self-assessment table | 5 | 2 | |
|
||||||
| 14 | Hour sheets for all members | 5 | 3 |
|
| 14 | Hour sheets for all members | 5 | 3 | |
|
||||||
| Presentation Video | Project demonstration | 5 | 0 |
|
| Presentation Video | Project demonstration | 5 | 0 | |
|
||||||
| | Code walk-through | 5 | 0 |
|
| | Code walk-through | 5 | 0 | |
|
||||||
| 0 | Deployment showcase | 5 | 0 |
|
| 0 | Deployment showcase | 5 | 0 | |
|
||||||
| **Technical Implementation** | | | |
|
| **Technical Implementation** | | | | |
|
||||||
| Application Functionality | Basic functionality works | 10 | 8 |
|
| Application Functionality | Basic functionality works | 10 | 8 | |
|
||||||
| | Advanced features implemented | 10 | 0 |
|
| | Advanced features implemented | 10 | 0 | |
|
||||||
| | Error handling & robustness | 10 | 4 |
|
| | Error handling & robustness | 10 | 4 | |
|
||||||
| 16 | User-friendly interface | 5 | 4 |
|
| 16 | User-friendly interface | 5 | 4 | |
|
||||||
| Backend & Architecture | Stateless web server | 5 | 5 |
|
| Backend & Architecture | Stateless web server | 5 | 5 | |
|
||||||
| | Stateful application | 10 | ? WHAT DOES THIS MEAN |
|
| | Stateful application | 10 | ? WHAT DOES THIS MEAN | |
|
||||||
| | Database integration | 10 | 10 |
|
| | Database integration | 10 | 10 | |
|
||||||
| | API design | 5 | 5 |
|
| | API design | 5 | 5 | |
|
||||||
| 20 | Microservices architecture | 10 | 0 |
|
| 20 | Microservices architecture | 10 | 0 | |
|
||||||
| Cloud Integration | Basic cloud deployment | 10 | 10 |
|
| Cloud Integration | Basic cloud deployment | 10 | 10 | |
|
||||||
| | Cloud APIs usage | 10 | ? WHAT DOES THIS MEAN |
|
| | Cloud APIs usage | 10 | ? WHAT DOES THIS MEAN | |
|
||||||
| | Serverless components | 10 | 0 |
|
| | Serverless components | 10 | 0 | |
|
||||||
| 10 | Advanced cloud services | 5 | 0 |
|
| 10 | Advanced cloud services | 5 | 0 | |
|
||||||
| **DevOps & Deployment** | | | |
|
| **DevOps & Deployment** | | | | |
|
||||||
| Containerization | Basic Dockerfile | 5 | 5 |
|
| Containerization | Basic Dockerfile | 5 | 5 | |
|
||||||
| | Optimized Dockerfile | 5 | 0 |
|
| | Optimized Dockerfile | 5 | 0 | |
|
||||||
| | Docker Compose | 5 | 5 - dev only |
|
| | Docker Compose | 5 | 5 - dev only | |
|
||||||
| 15 | Persistent storage | 5 | 5 |
|
| 15 | Persistent storage | 5 | 5 | |
|
||||||
| Deployment & Scaling | Manual deployment | 5 | 5 |
|
| Deployment & Scaling | Manual deployment | 5 | 5 | |
|
||||||
| | Automated deployment | 5 | 5 |
|
| | Automated deployment | 5 | 5 | |
|
||||||
| | Multiple replicas | 5 | 5 |
|
| | Multiple replicas | 5 | 5 | |
|
||||||
| 20 | Kubernetes deployment | 10 | 10 |
|
| 20 | Kubernetes deployment | 10 | 10 | |
|
||||||
| **Quality Assurance** | | | |
|
| **Quality Assurance** | | | | |
|
||||||
| Testing | Unit tests | 5 | 2 |
|
| Testing | Unit tests | 5 | 2 | |
|
||||||
| | Integration tests | 5 | 2 |
|
| | Integration tests | 5 | 2 | |
|
||||||
| | End-to-end tests | 5 | 5 |
|
| | End-to-end tests | 5 | 5 | |
|
||||||
| 9 | Performance testing | 5 | 0 |
|
| 9 | Performance testing | 5 | 0 | |
|
||||||
| Monitoring & Operations | Health checks | 5 | 5 |
|
| Monitoring & Operations | Health checks | 5 | 5 | |
|
||||||
| | Logging | 5 | 2 - only to terminal add logstash |
|
| | Logging | 5 | 2 - only to terminal add logstash | |
|
||||||
| 9 | Metrics/Monitoring | 5 | 2 - only DB, need to create Prometheus endpoint |
|
| 9 | Metrics/Monitoring | 5 | 2 - only DB, need to create Prometheus endpoint | |
|
||||||
| Security | HTTPS/TLS | 5 | 5 |
|
| Security | HTTPS/TLS | 5 | 5 | |
|
||||||
| | Authentication | 5 | 5 |
|
| | Authentication | 5 | 5 | |
|
||||||
| 15 | Authorization | 5 | 5 |
|
| 15 | Authorization | 5 | 5 | |
|
||||||
| **Innovation & Excellence** | | | |
|
| **Innovation & Excellence** | | | | |
|
||||||
| Advanced Features and | AI/ML Integration | 10 | 0 |
|
| Advanced Features and | AI/ML Integration | 10 | 0 | |
|
||||||
| Technical Excellence | Real-time features | 10 | 0 |
|
| Technical Excellence | Real-time features | 10 | 0 | |
|
||||||
| | Creative problem solving | 10 | ? |
|
| | Creative problem solving | 10 | ? | |
|
||||||
| | Performance optimization | 5 | 2 |
|
| | Performance optimization | 5 | 2 | |
|
||||||
| 2 | Exceptional user experience | 5 | 0 |
|
| 2 | Exceptional user experience | 5 | 0 | |
|
||||||
| **Total** | | **255** | **153** |
|
| **Total** | | **255** | **153** | |
|
||||||
|
|
||||||
## Grading Scale
|
## Grading Scale
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,8 @@
|
|||||||
|
|
||||||
**Project Name**: Personal Finance Tracker
|
**Project Name**: Personal Finance Tracker
|
||||||
|
|
||||||
|
**Deployment URL**: https://finance.ltrk.cz/
|
||||||
|
|
||||||
**Group Members**:
|
**Group Members**:
|
||||||
|
|
||||||
- 289229, Lukáš Trkan, lukastrkan
|
- 289229, Lukáš Trkan, lukastrkan
|
||||||
@@ -32,7 +34,7 @@ Other services deployed in the cluster includes Longhorn for persistent storage,
|
|||||||
### High-Level Architecture
|
### High-Level Architecture
|
||||||
|
|
||||||
```mermaid
|
```mermaid
|
||||||
flowchart LR
|
flowchart TB
|
||||||
n3(("User")) <--> client["Frontend"]
|
n3(("User")) <--> client["Frontend"]
|
||||||
proc_queue["Message Queue"] --> proc_queue_worker["Worker Service"]
|
proc_queue["Message Queue"] --> proc_queue_worker["Worker Service"]
|
||||||
proc_queue_worker -- SMTP --> ext_mail[("Email Service")]
|
proc_queue_worker -- SMTP --> ext_mail[("Email Service")]
|
||||||
@@ -61,7 +63,7 @@ The workflow works in the following way:
|
|||||||
- On every push to main, the production app is automatically updated
|
- On every push to main, the production app is automatically updated
|
||||||
- UI is responsive for mobile devices
|
- UI is responsive for mobile devices
|
||||||
- Slow operations (emails, transactions fetching) are handled
|
- Slow operations (emails, transactions fetching) are handled
|
||||||
in the background by Celery workers.
|
in the background by Celery workers.
|
||||||
- App is monitored using prometheus metrics endpoint and metrics are shown in Grafana dashboard.
|
- App is monitored using prometheus metrics endpoint and metrics are shown in Grafana dashboard.
|
||||||
|
|
||||||
### Components
|
### Components
|
||||||
@@ -73,7 +75,8 @@ in the background by Celery workers.
|
|||||||
- Worker service (backend/app/workers): Celery worker handling background tasks (emails, transactions fetching).
|
- Worker service (backend/app/workers): Celery worker handling background tasks (emails, transactions fetching).
|
||||||
- Database (MariaDB with Maxscale): Persists users, categories, transactions; schema managed by Alembic migrations.
|
- Database (MariaDB with Maxscale): Persists users, categories, transactions; schema managed by Alembic migrations.
|
||||||
- Message Queue (RabbitMQ): Queues background tasks for Celery workers.
|
- Message Queue (RabbitMQ): Queues background tasks for Celery workers.
|
||||||
- Infrastructure as Code (tofu/): OpenTofu modules provisioning cluster services (RabbitMQ, Redis, Cloudflare tunnel, etc.).
|
- Infrastructure as Code (tofu/): OpenTofu modules provisioning cluster services (RabbitMQ, Redis, Cloudflare tunnel,
|
||||||
|
etc.).
|
||||||
- Deployment Chart (charts/myapp-chart/): Helm chart to deploy the application to Kubernetes.
|
- Deployment Chart (charts/myapp-chart/): Helm chart to deploy the application to Kubernetes.
|
||||||
|
|
||||||
### Technologies Used
|
### Technologies Used
|
||||||
@@ -88,10 +91,15 @@ in the background by Celery workers.
|
|||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
|
Here are software and hardware prerequisites for the development and production environments. This section also
|
||||||
|
describes
|
||||||
|
necessary environment variables and key dependencies used in the project.
|
||||||
|
|
||||||
### System Requirements
|
### System Requirements
|
||||||
|
|
||||||
#### Development
|
#### Development
|
||||||
|
|
||||||
|
- OS: Tested on MacOS, Linux and Windows should work as well
|
||||||
- Minimum RAM: 8 GB
|
- Minimum RAM: 8 GB
|
||||||
- Storage: 10 GB+ free
|
- Storage: 10 GB+ free
|
||||||
|
|
||||||
@@ -135,10 +143,10 @@ in the background by Celery workers.
|
|||||||
#### Backend
|
#### Backend
|
||||||
|
|
||||||
- `MOJEID_CLIENT_ID`, `MOJEID_CLIENT_SECRET` \- OAuth client ID and secret for
|
- `MOJEID_CLIENT_ID`, `MOJEID_CLIENT_SECRET` \- OAuth client ID and secret for
|
||||||
MojeID - https://www.mojeid.cz/en/provider/
|
[MojeID](https://www.mojeid.cz/en/provider/)
|
||||||
- `BANKID_CLIENT_ID`, `BANKID_CLIENT_SECRET` \- OAuth client ID and secret for BankID - https://developer.bankid.cz/
|
- `BANKID_CLIENT_ID`, `BANKID_CLIENT_SECRET` \- OAuth client ID and secret for [BankID](https://developer.bankid.cz/)
|
||||||
- `CSAS_CLIENT_ID`, `CSAS_CLIENT_SECRET` \- OAuth client ID and secret for Česká
|
- `CSAS_CLIENT_ID`, `CSAS_CLIENT_SECRET` \- OAuth client ID and secret for [Česká
|
||||||
spořitelna - https://developers.erstegroup.com/docs/apis/bank.csas
|
spořitelna](https://developers.erstegroup.com/docs/apis/bank.csas)
|
||||||
- `DATABASE_URL`(or `MARIADB_HOST`, `MARIADB_PORT`, `MARIADB_DB`, `MARIADB_USER`, `MARIADB_PASSWORD`) \- MariaDB
|
- `DATABASE_URL`(or `MARIADB_HOST`, `MARIADB_PORT`, `MARIADB_DB`, `MARIADB_USER`, `MARIADB_PASSWORD`) \- MariaDB
|
||||||
connection details
|
connection details
|
||||||
- `RABBITMQ_USERNAME`, `RABBITMQ_PASSWORD` \- credentials for RabbitMQ
|
- `RABBITMQ_USERNAME`, `RABBITMQ_PASSWORD` \- credentials for RabbitMQ
|
||||||
@@ -204,7 +212,7 @@ uvicorn app.app:fastApi --reload --host 0.0.0.0 --port 8000
|
|||||||
### 6) Run Celery worker (optional, in another terminal)
|
### 6) Run Celery worker (optional, in another terminal)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd Group-8/7project/backend
|
cd Group-8/7project/src/backend
|
||||||
source .venv/bin/activate
|
source .venv/bin/activate
|
||||||
celery -A app.celery_app.celery_app worker -l info
|
celery -A app.celery_app.celery_app worker -l info
|
||||||
```
|
```
|
||||||
@@ -224,6 +232,9 @@ npm run dev
|
|||||||
|
|
||||||
### Backend
|
### Backend
|
||||||
|
|
||||||
|
App is separated into backend and frontend so it also needs to be built separately. Backend is build into docker image
|
||||||
|
and frontend is deployed as static files.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd 7project/backend
|
cd 7project/backend
|
||||||
# Dont forget to set correct image tag with your registry and name
|
# Dont forget to set correct image tag with your registry and name
|
||||||
@@ -234,13 +245,17 @@ docker buildx build --platform linux/amd64,linux/arm64 -t CHANGE_ME --push .
|
|||||||
### Frontend
|
### Frontend
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd project7/frontend
|
cd project7/src/frontend
|
||||||
npm ci
|
npm ci
|
||||||
npm run build
|
npm run build
|
||||||
```
|
```
|
||||||
|
|
||||||
## Deployment Instructions
|
## Deployment Instructions
|
||||||
|
|
||||||
|
Deployment is tested on TalosOS cluster with 1 control plane and 4 workers, cluster needs to be setup and configured
|
||||||
|
manually. Terraform/OpenTofu is then used to deploy base services to the cluster. App itself is deployed automatically
|
||||||
|
via GitHub actions and Helm chart. Frontend files are deployed to Cloudflare pages.
|
||||||
|
|
||||||
### Setup Cluster
|
### Setup Cluster
|
||||||
|
|
||||||
Deployment should work on any Kubernetes cluster. However, we are using 4 TalosOS virtual machines (1 control plane, 3
|
Deployment should work on any Kubernetes cluster. However, we are using 4 TalosOS virtual machines (1 control plane, 3
|
||||||
@@ -253,7 +268,7 @@ running on top of Proxmox VE.
|
|||||||
4) Navigate to tofu directory
|
4) Navigate to tofu directory
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd 7project/tofu
|
cd 7project/src/tofu
|
||||||
````
|
````
|
||||||
|
|
||||||
5) Set IP addresses in environment variables
|
5) Set IP addresses in environment variables
|
||||||
@@ -416,37 +431,18 @@ tofu apply
|
|||||||
- UNIRATE_API_KEY
|
- UNIRATE_API_KEY
|
||||||
5) On Github open Actions tab, select "Deploy Prod" and run workflow manually
|
5) On Github open Actions tab, select "Deploy Prod" and run workflow manually
|
||||||
|
|
||||||
# TODO: REMOVE I guess
|
|
||||||
|
|
||||||
2) Deploy the app using Helm
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Set the namespace
|
|
||||||
kubectl create namespace myapp || true
|
|
||||||
|
|
||||||
# Install/upgrade the chart with required values
|
|
||||||
helm upgrade --install myapp charts/myapp-chart \
|
|
||||||
-n myapp \
|
|
||||||
-f charts/myapp-chart/values.yaml \
|
|
||||||
--set image.backend.repository=myorg/myapp-backend \
|
|
||||||
--set image.backend.tag=latest \
|
|
||||||
--set env.BACKEND_URL="https://myapp.example.com" \
|
|
||||||
--set env.FRONTEND_URL="https://myapp.example.com" \
|
|
||||||
--set env.SECRET="CHANGE_ME_SECRET"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Testing Instructions
|
## Testing Instructions
|
||||||
|
|
||||||
The tests are located in 7project/backend/tests directory. All tests are run by GitHub actions on every pull request and
|
The tests are located in 7project/backend/tests directory. All tests are run by GitHub actions on every pull request and
|
||||||
push to main.
|
push to main.
|
||||||
See the workflow [here](../.github/workflows/run-tests.yml).
|
See the workflow [here](../.github/workflows/run-tests.yml).
|
||||||
|
|
||||||
If you want to run the tests locally, the preferred is to use a [bash script](backend/test-with-ephemeral-mariadb.sh)
|
If you want to run the tests locally, the preferred way is to use a [bash script](backend/test_locally.sh)
|
||||||
that will start a [test DB container](backend/docker-compose.test.yml) and remove it afterward.
|
that will start a test DB container with [docker compose](backend/docker-compose.test.yml) and remove it afterwards.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd 7project/backend
|
cd 7project/src/backend
|
||||||
bash test-with-ephemeral-mariadb.sh
|
bash test_locally.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
### Unit Tests
|
### Unit Tests
|
||||||
@@ -454,7 +450,7 @@ bash test-with-ephemeral-mariadb.sh
|
|||||||
There are only 5 basic unit tests, since our services logic is very simple
|
There are only 5 basic unit tests, since our services logic is very simple
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
bash test-with-ephemeral-mariadb.sh --only-unit
|
bash test_locally.sh --only-unit
|
||||||
```
|
```
|
||||||
|
|
||||||
### Integration Tests
|
### Integration Tests
|
||||||
@@ -462,7 +458,7 @@ bash test-with-ephemeral-mariadb.sh --only-unit
|
|||||||
There are 9 basic unit tests, testing the individual backend API logic
|
There are 9 basic unit tests, testing the individual backend API logic
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
bash test-with-ephemeral-mariadb.sh --only-integration
|
bash test_locally.sh --only-integration
|
||||||
```
|
```
|
||||||
|
|
||||||
### End-to-End Tests
|
### End-to-End Tests
|
||||||
@@ -470,7 +466,7 @@ bash test-with-ephemeral-mariadb.sh --only-integration
|
|||||||
There are 7 e2e tests, testing more complex app logic
|
There are 7 e2e tests, testing more complex app logic
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
bash test-with-ephemeral-mariadb.sh --only-e2e
|
bash test_locally.sh --only-e2e
|
||||||
```
|
```
|
||||||
|
|
||||||
## Usage Examples
|
## Usage Examples
|
||||||
@@ -503,7 +499,12 @@ curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:8000/authenticated-route
|
|||||||
|
|
||||||
### Frontend
|
### Frontend
|
||||||
|
|
||||||
- Start with: npm run dev in 7project/frontend
|
- Start with:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run dev in 7project/src/frontend
|
||||||
|
```
|
||||||
|
|
||||||
- Ensure VITE_BACKEND_URL is set to the backend URL (e.g., http://127.0.0.1:8000)
|
- Ensure VITE_BACKEND_URL is set to the backend URL (e.g., http://127.0.0.1:8000)
|
||||||
- Open http://localhost:5173
|
- Open http://localhost:5173
|
||||||
- Login, view latest transactions, filter, and add new transactions from the UI.
|
- Login, view latest transactions, filter, and add new transactions from the UI.
|
||||||
@@ -527,15 +528,25 @@ curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:8000/authenticated-route
|
|||||||
|
|
||||||
### Common Issues
|
### Common Issues
|
||||||
|
|
||||||
#### Issue 1: [Common problem]
|
#### Issue 1: Unable to apply Cloudflare terraform module
|
||||||
|
|
||||||
**Symptoms**: [What the user sees]
|
**Symptoms**: Terraform/OpenTofu apply fails during Cloudflare module deployment.
|
||||||
**Solution**: [Step-by-step fix]
|
This is caused by unknown variable not known beforehand.
|
||||||
|
|
||||||
#### Issue 2: [Another common problem]
|
**Solution**: Apply first without Cloudflare module and then apply again.
|
||||||
|
|
||||||
**Symptoms**: [What the user sees]
|
```bash
|
||||||
**Solution**: [Step-by-step fix]
|
tofu apply -exclude modules.cloudflare
|
||||||
|
tofu apply
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Issue 2: Pods are unable to start
|
||||||
|
|
||||||
|
**Symptoms**: Pods are unable to start with ImagePullBackOff error. This could be caused
|
||||||
|
by either hitting docker hub rate limits or by docker hub being down.
|
||||||
|
|
||||||
|
**Solution**: Make sure you updated the cluster config to use registry mirror as described in
|
||||||
|
"Setup Cluster" section.
|
||||||
|
|
||||||
### Debug Commands
|
### Debug Commands
|
||||||
|
|
||||||
@@ -598,18 +609,22 @@ curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:8000/authenticated-route
|
|||||||
|
|
||||||
### Dejan
|
### Dejan
|
||||||
|
|
||||||
| Date | Activity | Hours | Description |
|
| Date | Activity | Hours | Description | Representative Commit / PR |
|
||||||
|-----------------|----------------------|--------|---------------------------------------------------------------|
|
|:----------------|:---------------------|:-------|:--------------------------------------------------------------|:---------------------------------------------------------|
|
||||||
| 25.9. | Design | 2 | 6design |
|
| 25.9. | Design | 2 | 6design | |
|
||||||
| 9.10 to 11.10. | Backend APIs | 12 | Implemented Backend APIs |
|
| 9.10 to 11.10. | Backend APIs | 14 | Implemented Backend APIs | `PR #26`, `20-create-a-controller-layer-on-backend-side` |
|
||||||
| 13.10 to 15.10. | Frontend Development | 8 | Created user interface mockups |
|
| 13.10 to 15.10. | Frontend Development | 8 | Created user interface mockups | `PR #28`, `frontend basics` |
|
||||||
| Continually | Documentation | 6 | Documenting the dev process |
|
| Continually | Documentation | 7 | Documenting the dev process | |
|
||||||
| 21.10 to 23.10 | Tests, frontend | 10 | Test basics, balance charts, and frontend improvement |
|
| 21.10 to 23.10 | Tests, frontend | 10 | Test basics, balance charts, and frontend improvement | `PR #31`, `30 create tests and set up a GitHub pipeline` |
|
||||||
| 28.10 to 30.10 | CI | 6 | Integrated tests with test database setup on github workflows |
|
| 28.10 to 30.10 | CI | 6 | Integrated tests with test database setup on github workflows | `PR #28`, `frontend basics` |
|
||||||
| 28.10 to 30.10 | Frontend | 7 | UI improvements and exchange rate API integration |
|
| 28.10 to 30.10 | Frontend | 8 | UI improvements and exchange rate API integration | `PR #28`, `frontend basics` |
|
||||||
| 4.11 to 6.11 | Tests | 6 | Test fixes improvement, more integration and e2e |
|
| 4.11 to 6.11 | Tests | 6 | Test fixes improvement, more integration and e2e | `PR #28`, `frontend basics` |
|
||||||
| 4.11 to 6.11 | Frontend | 6 | Fixes, Improved UI, added support for mobile devices |
|
| 4.11 to 6.11 | Frontend | 6 | Fixes, Improved UI, added support for mobile devices | `PR #28`, `frontend basics` |
|
||||||
| **Total** | | **63** | |
|
| 11.11 | Backend APIs | 4 | Moved rates API, mock bank to Backend, few fixes | `PR #28`, `frontend basics` |
|
||||||
|
| 11.11 to 12.11 | Tests | 3 | Local testing DB container, few fixes | `PR #28`, `frontend basics` |
|
||||||
|
| 12.11 | Frontend | 3 | Enabled multiple transaction edits at once, CSAS button state | `PR #28`, `frontend basics` |
|
||||||
|
| 13.11 | Video | 3 | Video | |
|
||||||
|
| **Total** | | **80** | | |
|
||||||
|
|
||||||
### Group Total: [XXX.X] hours
|
### Group Total: [XXX.X] hours
|
||||||
|
|
||||||
@@ -627,7 +642,11 @@ curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:8000/authenticated-route
|
|||||||
|
|
||||||
This was caused by single SATA SSD disk running all VMs. This was solved by adding second NVMe disk just for Talos VMs.
|
This was caused by single SATA SSD disk running all VMs. This was solved by adding second NVMe disk just for Talos VMs.
|
||||||
|
|
||||||
[Describe the main challenges and how you overcame them]
|
#### Stucked IaC deployment
|
||||||
|
|
||||||
|
If the deployed module (helm chart for example) was not configured properly, it would get stuck and timeout resulting in
|
||||||
|
namespace that cannot be deleted.
|
||||||
|
This was solved by using snapshots in Proxmox and restoring if this happened.
|
||||||
|
|
||||||
### If We Did This Again
|
### If We Did This Again
|
||||||
|
|
||||||
@@ -637,6 +656,11 @@ FastAPI lacks usable build in support for database migrations and implementing A
|
|||||||
Tricky was also integrating FastAPI auth system with React frontend, since there is no official project template.
|
Tricky was also integrating FastAPI auth system with React frontend, since there is no official project template.
|
||||||
Using .NET (which we considered initially) would probably solve these issues.
|
Using .NET (which we considered initially) would probably solve these issues.
|
||||||
|
|
||||||
|
#### Private container registry
|
||||||
|
|
||||||
|
Using private container registry would allow us to include environment variables directly in the image during build.
|
||||||
|
This would simplify deployment and CI/CD setup.
|
||||||
|
|
||||||
[What would you do differently? What worked well that you'd keep?]
|
[What would you do differently? What worked well that you'd keep?]
|
||||||
|
|
||||||
### Individual Growth
|
### Individual Growth
|
||||||
@@ -652,11 +676,11 @@ The biggest challenge for me was time tracking since I am used to tracking to pr
|
|||||||
It was also interesting experience to be the one responsible for the initial project structure/design/setup
|
It was also interesting experience to be the one responsible for the initial project structure/design/setup
|
||||||
used not only by myself.
|
used not only by myself.
|
||||||
|
|
||||||
[Personal reflection on growth, challenges, and learning]
|
#### [Dejan]
|
||||||
|
|
||||||
#### [Team Member 2 Name]
|
Since I do not have a job, this project was probably the most complex one I have ever worked on.
|
||||||
|
It was also the first school project where I was encouraged to use AI.
|
||||||
|
|
||||||
[Personal reflection on growth, challenges, and learning]
|
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
23
7project/src/README.md
Normal file
23
7project/src/README.md
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
## Folder structure
|
||||||
|
|
||||||
|
- `src/`
|
||||||
|
- `backend/`
|
||||||
|
- `alembic/` - database migrations
|
||||||
|
- `app/` - main application code
|
||||||
|
- `tests/` - tests
|
||||||
|
- `docker-compose.test.yml` - docker compose for testing database
|
||||||
|
- `Dockerfile` - production Dockerfile
|
||||||
|
- `main.py` - App entrypoint
|
||||||
|
- `requirements.txt` - Python dependencies
|
||||||
|
- `test_locally.sh` - script to run tests with temporary database
|
||||||
|
- `charts/`
|
||||||
|
- `myapp-chart/` - Helm chart for deploying the application, supports prod and dev environments
|
||||||
|
- `frontend/` - React frontend application
|
||||||
|
- `tofu/` - Terraform/OpenTofu services deployment configurations
|
||||||
|
- `modules/` - separated modules for different services
|
||||||
|
- `main.tf` - main deployment configuration
|
||||||
|
- `variables.tf` - deployment variables
|
||||||
|
- `terraform.tfvars.example` - example variables file
|
||||||
|
- `compose.yaml` - Docker Compose file for local development
|
||||||
|
- `create_migration.sh` - script to create new Alembic database migration
|
||||||
|
- `upgrade_database.sh` - script to upgrade database to latest Alembic revision
|
||||||
8
7project/src/backend/.idea/.gitignore
generated
vendored
Normal file
8
7project/src/backend/.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
||||||
@@ -14,11 +14,10 @@ from httpx_oauth.oauth2 import BaseOAuth2
|
|||||||
|
|
||||||
from app.models.user import User
|
from app.models.user import User
|
||||||
from app.oauth.bank_id import BankID
|
from app.oauth.bank_id import BankID
|
||||||
from app.oauth.csas import CSASOAuth
|
from app.workers.celery_tasks import send_email
|
||||||
from app.oauth.custom_openid import CustomOpenID
|
from app.oauth.custom_openid import CustomOpenID
|
||||||
from app.oauth.moje_id import MojeIDOAuth
|
from app.oauth.moje_id import MojeIDOAuth
|
||||||
from app.services.db import get_user_db
|
from app.services.db import get_user_db
|
||||||
from app.core.queue import enqueue_email
|
|
||||||
|
|
||||||
SECRET = os.getenv("SECRET", "CHANGE_ME_SECRET")
|
SECRET = os.getenv("SECRET", "CHANGE_ME_SECRET")
|
||||||
|
|
||||||
@@ -87,7 +86,7 @@ class UserManager(UUIDIDMixin, BaseUserManager[User, uuid.UUID]):
|
|||||||
"Pokud jsi registraci neprováděl(a), tento email ignoruj.\n"
|
"Pokud jsi registraci neprováděl(a), tento email ignoruj.\n"
|
||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
enqueue_email(to=user.email, subject=subject, body=body)
|
send_email.delay(user.email, subject, body)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print("[Email Fallback] To:", user.email)
|
print("[Email Fallback] To:", user.email)
|
||||||
print("[Email Fallback] Subject:", subject)
|
print("[Email Fallback] Subject:", subject)
|
||||||
4
7project/src/backend/main.py
Normal file
4
7project/src/backend/main.py
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
import uvicorn
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
uvicorn.run("app.app:fastApi", host="0.0.0.0", log_level="info")
|
||||||
@@ -4,13 +4,13 @@ set -euo pipefail
|
|||||||
# Run tests against a disposable local MariaDB on host port 3307 using Docker Compose.
|
# Run tests against a disposable local MariaDB on host port 3307 using Docker Compose.
|
||||||
# Requirements: Docker, docker compose plugin, Python, Alembic, pytest.
|
# Requirements: Docker, docker compose plugin, Python, Alembic, pytest.
|
||||||
# Usage:
|
# Usage:
|
||||||
# chmod +x ./test-with-ephemeral-mariadb.sh
|
# chmod +x ./test_locally.sh
|
||||||
# # From 7project/backend directory
|
# # From 7project/backend directory
|
||||||
# ./test-with-ephemeral-mariadb.sh [--only-unit|--only-integration|--only-e2e] [pytest-args...]
|
# ./test_locally.sh [--only-unit|--only-integration|--only-e2e] [pytest-args...]
|
||||||
# # Examples:
|
# # Examples:
|
||||||
# ./test-with-ephemeral-mariadb.sh --only-unit -q
|
# ./test_locally.sh --only-unit -q
|
||||||
# ./test-with-ephemeral-mariadb.sh --only-integration -k "login"
|
# ./test_locally.sh --only-integration -k "login"
|
||||||
# ./test-with-ephemeral-mariadb.sh --only-e2e -vv
|
# ./test_locally.sh --only-e2e -vv
|
||||||
#
|
#
|
||||||
# This script will:
|
# This script will:
|
||||||
# 1) Start a MariaDB 11.4 container (ephemeral storage, port 3307)
|
# 1) Start a MariaDB 11.4 container (ephemeral storage, port 3307)
|
||||||
@@ -34,15 +34,16 @@ def test_authenticated_route_requires_auth(client):
|
|||||||
async def test_on_after_request_verify_enqueues_email(monkeypatch):
|
async def test_on_after_request_verify_enqueues_email(monkeypatch):
|
||||||
calls = {}
|
calls = {}
|
||||||
|
|
||||||
def fake_enqueue_email(to: str, subject: str, body: str):
|
class FakeCeleryTask:
|
||||||
calls.setdefault("emails", []).append({
|
def delay(to: str, subject: str, body: str):
|
||||||
"to": to,
|
calls.setdefault("emails", []).append({
|
||||||
"subject": subject,
|
"to": to,
|
||||||
"body": body,
|
"subject": subject,
|
||||||
})
|
"body": body,
|
||||||
|
})
|
||||||
|
|
||||||
# Patch the enqueue_email used inside user_service
|
# Patch the enqueue_email used inside user_service
|
||||||
monkeypatch.setattr(user_service, "enqueue_email", fake_enqueue_email)
|
monkeypatch.setattr(user_service, "send_email", FakeCeleryTask)
|
||||||
|
|
||||||
class DummyUser:
|
class DummyUser:
|
||||||
def __init__(self, email):
|
def __init__(self, email):
|
||||||
30
7project/src/charts/README.md
Normal file
30
7project/src/charts/README.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# Helm chart deployment
|
||||||
|
|
||||||
|
This directory contains a Helm chart for deploying the app to a cluster, it support bot production and preview
|
||||||
|
deployment.
|
||||||
|
|
||||||
|
## Directory Structure
|
||||||
|
|
||||||
|
- `myapp-chart/`
|
||||||
|
- `templates/`
|
||||||
|
- `app-deployment.yaml` - Kubernetes Deployment for the application
|
||||||
|
- `cron.yaml` - cronjob for periodic tasks - periodically calls app endpoint
|
||||||
|
- `database.yaml` - Creates database using MariaDB operator. Production database is kept, but preview/dev
|
||||||
|
database is dropped after uninstalling the chart.
|
||||||
|
- `database-grant.yaml` - Defines rights for the database user
|
||||||
|
- `database-user.yaml` - Creates database user
|
||||||
|
- `monitoring.yaml` - Adds /metrics endpoint to Prometheus scraping
|
||||||
|
- `prod.yaml` - Application secrets
|
||||||
|
- `rabbitmq-cluster.yaml` - Defines RabbitMQ cluster for this deployment
|
||||||
|
- `rabbitmq-permission.yalm` - Defines RabbitMQ user permissions
|
||||||
|
- `rabbitmq-queue.yaml` - Defines RabbitMQ queue
|
||||||
|
- `rabbitmq-user.yaml` - Defines RabbitMQ user
|
||||||
|
- `rabbitmq-user-secret.yaml` - Defines RabbitMQ user secret
|
||||||
|
- `service.yaml` - Kubernetes Service for the application
|
||||||
|
- `tunnel.yaml` - Cloudflare tunnel for accessing the application¨
|
||||||
|
- `worker-deployment.yaml` - Kubernetes Deployment for the Celery worker, uses same image as the app-deployment,
|
||||||
|
but with different entrypoint
|
||||||
|
- `Chart.yaml` - Helm chart metadata
|
||||||
|
- `values.yaml` - list of all configurable values
|
||||||
|
- `values-dev.yaml` - default values for development/preview deployment
|
||||||
|
- `values-prod.yaml` - default values for production deployment
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user