Compare commits

15 Commits

Author SHA1 Message Date
bf213234b1 feat(infrastructure): add backups 2025-10-12 20:14:48 +02:00
4ea6876b74 feat(infrastructure): add forgotten values.yaml 2025-10-10 13:57:43 +02:00
6d5dd1a222 feat(infrastructure): update deployment
Some checks failed
Deploy Prod / Build and push image (reusable) (push) Has been cancelled
Deploy Prod / Frontend - Build and Deploy to Cloudflare Pages (prod) (push) Has been cancelled
Deploy Prod / Helm upgrade/install (prod) (push) Has been cancelled
2025-10-09 18:51:17 +02:00
ribardej
f09f9eaa82 feat(infrastructure): redone the system diagram 2025-10-09 15:55:23 +02:00
ae10c4daff Merge pull request #19 from dat515-2025/merge/basic_database_structure
feat(models): add basic database structure
2025-10-09 15:24:11 +02:00
abebdb019b feat(models): change unique index 2025-10-09 15:15:24 +02:00
6040f4339c feat(models): database changes 2025-10-09 15:09:26 +02:00
72c241f4f7 feat(infrastructure): database changes 2025-10-09 15:07:33 +02:00
8db669ac72 feat(infrastructure): database changes 2025-10-09 14:56:51 +02:00
e32e18f0de feat(models): add basic database structure 2025-10-09 14:41:11 +02:00
95996d22f8 feat(models): add basic database structure 2025-10-09 14:33:07 +02:00
ribardej
991c070918 meeting notes 2025-10-09 13:57:45 +02:00
derib2613
a717e4afeb Merge pull request #17 from dat515-2025/11-update-deployment
update
2025-10-09 12:43:45 +02:00
dbd37a8b83 feat(infrastructure): add frontend, deploy to cloudflare 2025-10-06 21:36:30 +02:00
f1cbdbce9c update 2025-10-06 21:29:35 +02:00
28 changed files with 374 additions and 61 deletions

View File

@@ -60,6 +60,7 @@ jobs:
EVENT_NAME: ${{ github.event_name }} EVENT_NAME: ${{ github.event_name }}
PR_NUMBER: ${{ github.event.pull_request.number || inputs.pr_number }} PR_NUMBER: ${{ github.event.pull_request.number || inputs.pr_number }}
PR_TEMPLATE: ${{ vars.BACKEND_URL_PR_TEMPLATE }} PR_TEMPLATE: ${{ vars.BACKEND_URL_PR_TEMPLATE }}
DEV_BASE_DOMAIN: ${{ secrets.BASE_DOMAIN }}
PROD_DOMAIN_VAR: ${{ vars.PROD_DOMAIN }} PROD_DOMAIN_VAR: ${{ vars.PROD_DOMAIN }}
PROD_DOMAIN_SECRET: ${{ secrets.PROD_DOMAIN }} PROD_DOMAIN_SECRET: ${{ secrets.PROD_DOMAIN }}
BACKEND_URL_OVERRIDE: ${{ vars.BACKEND_URL || secrets.BACKEND_URL }} BACKEND_URL_OVERRIDE: ${{ vars.BACKEND_URL || secrets.BACKEND_URL }}
@@ -75,10 +76,12 @@ jobs:
URL="https://${BACKEND_URL_OVERRIDE}" URL="https://${BACKEND_URL_OVERRIDE}"
fi fi
else else
# 2) PR template when building for PR # 2) PR-specific URL when building for PR
if [ "${MODE:-}" = "pr" ] || [ "${EVENT_NAME}" = "pull_request" ]; then if [ "${MODE:-}" = "pr" ] || [ "${EVENT_NAME}" = "pull_request" ]; then
if [ -n "${PR_TEMPLATE:-}" ] && [ -n "${PR_NUMBER:-}" ] ; then if [ -n "${PR_TEMPLATE:-}" ] && [ -n "${PR_NUMBER:-}" ] ; then
URL="${PR_TEMPLATE//\{PR\}/${PR_NUMBER}}" URL="${PR_TEMPLATE//\{PR\}/${PR_NUMBER}}"
elif [ -n "${DEV_BASE_DOMAIN:-}" ] && [ -n "${PR_NUMBER:-}" ]; then
URL="https://pr-${PR_NUMBER}.${DEV_BASE_DOMAIN}"
fi fi
fi fi
# 3) Fallback to PROD_DOMAIN (prefer repo var, then secret) # 3) Fallback to PROD_DOMAIN (prefer repo var, then secret)

View File

@@ -45,11 +45,11 @@ flowchart LR
proc_cron[Task planner] --> proc_queue proc_cron[Task planner] --> proc_queue
proc_queue_worker --> ext_bank[(Bank API)] proc_queue_worker --> ext_bank[(Bank API)]
proc_queue_worker --> db proc_queue_worker --> db
client[Client/UI] --> api[API Gateway / Web Server] client[Client/UI] <--> api[API Gateway / Web Server]
api --> svc[Web API] api <--> svc[Web API]
svc --> proc_queue svc --> proc_queue
svc --> db[(Database)] svc <--> db[(Database)]
svc --> cache[(Cache)] svc <--> cache[(Cache)]
``` ```
- Components and responsibilities: What does each box do? - Components and responsibilities: What does each box do?

View File

@@ -11,7 +11,7 @@ script_location = %(here)s/alembic
# Uncomment the line below if you want the files to be prepended with date and time # Uncomment the line below if you want the files to be prepended with date and time
# see https://alembic.sqlalchemy.org/en/latest/tutorial.html#editing-the-ini-file # see https://alembic.sqlalchemy.org/en/latest/tutorial.html#editing-the-ini-file
# for all available tokens # for all available tokens
# file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s
# sys.path path, will be prepended to sys.path if present. # sys.path path, will be prepended to sys.path if present.
# defaults to the current working directory. for multiple paths, the path separator # defaults to the current working directory. for multiple paths, the path separator

View File

@@ -1,8 +1,8 @@
"""Init migration """add categories
Revision ID: 81f275275556 Revision ID: 63e072f09836
Revises: Revises:
Create Date: 2025-09-24 17:39:25.346690 Create Date: 2025-10-09 14:56:14.653249
""" """
from typing import Sequence, Union from typing import Sequence, Union
@@ -13,7 +13,7 @@ import sqlalchemy as sa
# revision identifiers, used by Alembic. # revision identifiers, used by Alembic.
revision: str = '81f275275556' revision: str = '63e072f09836'
down_revision: Union[str, Sequence[str], None] = None down_revision: Union[str, Sequence[str], None] = None
branch_labels: Union[str, Sequence[str], None] = None branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None
@@ -22,12 +22,6 @@ depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None: def upgrade() -> None:
"""Upgrade schema.""" """Upgrade schema."""
# ### commands auto generated by Alembic - please adjust! ### # ### commands auto generated by Alembic - please adjust! ###
op.create_table('transaction',
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('amount', sa.Float(), nullable=False),
sa.Column('description', sa.String(length=255), nullable=True),
sa.PrimaryKeyConstraint('id')
)
op.create_table('user', op.create_table('user',
sa.Column('first_name', sa.String(length=100), nullable=True), sa.Column('first_name', sa.String(length=100), nullable=True),
sa.Column('last_name', sa.String(length=100), nullable=True), sa.Column('last_name', sa.String(length=100), nullable=True),
@@ -40,13 +34,38 @@ def upgrade() -> None:
sa.PrimaryKeyConstraint('id') sa.PrimaryKeyConstraint('id')
) )
op.create_index(op.f('ix_user_email'), 'user', ['email'], unique=True) op.create_index(op.f('ix_user_email'), 'user', ['email'], unique=True)
op.create_table('categories',
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('name', sa.String(length=100), nullable=False),
sa.Column('description', sa.String(length=255), nullable=True),
sa.Column('user_id', fastapi_users_db_sqlalchemy.generics.GUID(), nullable=False),
sa.ForeignKeyConstraint(['user_id'], ['user.id'], ),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('name')
)
op.create_table('transaction',
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('amount', sa.Float(), nullable=False),
sa.Column('description', sa.String(length=255), nullable=True),
sa.Column('user_id', fastapi_users_db_sqlalchemy.generics.GUID(), nullable=False),
sa.ForeignKeyConstraint(['user_id'], ['user.id'], ),
sa.PrimaryKeyConstraint('id')
)
op.create_table('category_transaction',
sa.Column('id_category', sa.Integer(), nullable=True),
sa.Column('id_transaction', sa.Integer(), nullable=True),
sa.ForeignKeyConstraint(['id_category'], ['categories.id'], ),
sa.ForeignKeyConstraint(['id_transaction'], ['transaction.id'], )
)
# ### end Alembic commands ### # ### end Alembic commands ###
def downgrade() -> None: def downgrade() -> None:
"""Downgrade schema.""" """Downgrade schema."""
# ### commands auto generated by Alembic - please adjust! ### # ### commands auto generated by Alembic - please adjust! ###
op.drop_table('category_transaction')
op.drop_table('transaction')
op.drop_table('categories')
op.drop_index(op.f('ix_user_email'), table_name='user') op.drop_index(op.f('ix_user_email'), table_name='user')
op.drop_table('user') op.drop_table('user')
op.drop_table('transaction')
# ### end Alembic commands ### # ### end Alembic commands ###

View File

@@ -0,0 +1,34 @@
"""update categories unique
Revision ID: 390041bd839e
Revises: 63e072f09836
Create Date: 2025-10-09 15:14:31.557686
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = '390041bd839e'
down_revision: Union[str, Sequence[str], None] = '63e072f09836'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
"""Upgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index(op.f('name'), table_name='categories')
op.create_unique_constraint('uix_name_user_id', 'categories', ['name', 'user_id'])
# ### end Alembic commands ###
def downgrade() -> None:
"""Downgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.drop_constraint('uix_name_user_id', 'categories', type_='unique')
op.create_index(op.f('name'), 'categories', ['name'], unique=True)
# ### end Alembic commands ###

View File

@@ -17,6 +17,7 @@ if not DATABASE_URL:
# Load all models to register them # Load all models to register them
from app.models.user import User from app.models.user import User
from app.models.transaction import Transaction from app.models.transaction import Transaction
from app.models.categories import Category
ssl_enabled = os.getenv("MARIADB_HOST", "localhost") != "localhost" ssl_enabled = os.getenv("MARIADB_HOST", "localhost") != "localhost"
connect_args = {"ssl": {"ssl": True}} if ssl_enabled else {} connect_args = {"ssl": {"ssl": True}} if ssl_enabled else {}

View File

@@ -0,0 +1,25 @@
from fastapi_users_db_sqlalchemy import GUID
from sqlalchemy import Column, Integer, String, ForeignKey, Table, UniqueConstraint
from sqlalchemy.orm import relationship
from app.core.base import Base
association_table = Table(
"category_transaction",
Base.metadata,
Column("id_category", Integer, ForeignKey("categories.id")),
Column("id_transaction", Integer, ForeignKey("transaction.id"))
)
class Category(Base):
__tablename__ = "categories"
__table_args__ = (
UniqueConstraint("name", "user_id", name="uix_name_user_id"),
)
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(length=100), nullable=False)
description = Column(String(length=255), nullable=True)
user_id = Column(GUID, ForeignKey("user.id"), nullable=False)
user = relationship("User", back_populates="categories")
transactions = relationship("Transaction", secondary=association_table, back_populates="categories")

View File

@@ -1,9 +1,17 @@
from sqlalchemy import Column, Integer, String, Float from fastapi_users_db_sqlalchemy import GUID
from sqlalchemy import Column, Integer, String, Float, ForeignKey
from sqlalchemy.orm import relationship
from app.core.base import Base from app.core.base import Base
from app.models.categories import association_table
class Transaction(Base): class Transaction(Base):
__tablename__ = "transaction" __tablename__ = "transaction"
id = Column(Integer, primary_key=True, autoincrement=True) id = Column(Integer, primary_key=True, autoincrement=True)
amount = Column(Float, nullable=False) amount = Column(Float, nullable=False)
description = Column(String(length=255), nullable=True) description = Column(String(length=255), nullable=True)
user_id = Column(GUID, ForeignKey("user.id"), nullable=False)
# Relationship
user = relationship("User", back_populates="transactions")
categories = relationship("Category", secondary=association_table, back_populates="transactions")

View File

@@ -1,7 +1,13 @@
from sqlalchemy import Column, String from sqlalchemy import Column, String
from sqlalchemy.orm import relationship
from fastapi_users.db import SQLAlchemyBaseUserTableUUID from fastapi_users.db import SQLAlchemyBaseUserTableUUID
from app.core.base import Base from app.core.base import Base
class User(SQLAlchemyBaseUserTableUUID, Base): class User(SQLAlchemyBaseUserTableUUID, Base):
first_name = Column(String(length=100), nullable=True) first_name = Column(String(length=100), nullable=True)
last_name = Column(String(length=100), nullable=True) last_name = Column(String(length=100), nullable=True)
# Relationship
transactions = relationship("Transaction", back_populates="user")
categories = relationship("Category", back_populates="user")

View File

@@ -25,7 +25,7 @@ spec:
- containerPort: {{ .Values.app.port }} - containerPort: {{ .Values.app.port }}
env: env:
- name: MARIADB_HOST - name: MARIADB_HOST
value: {{ printf "%s.%s.svc.cluster.local" .Values.mariadb.mariaDbRef.name .Values.mariadb.mariaDbRef.namespace | quote }} value: "mariadb-repl-maxscale-internal.mariadb-operator.svc.cluster.local"
- name: MARIADB_PORT - name: MARIADB_PORT
value: '3306' value: '3306'
- name: MARIADB_DB - name: MARIADB_DB

View File

@@ -29,6 +29,7 @@ worker:
# Queue name for Celery worker and for CRD Queue # Queue name for Celery worker and for CRD Queue
mailQueueName: "mail_queue" mailQueueName: "mail_queue"
service: service:
port: 80 port: 80

View File

@@ -8,4 +8,8 @@ fi
cd backend || { echo "Directory 'backend' does not exist"; exit 1; } cd backend || { echo "Directory 'backend' does not exist"; exit 1; }
alembic revision --autogenerate -m "$1" alembic revision --autogenerate -m "$1"
git add alembic/versions/* git add alembic/versions/*
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
echo -e "${YELLOW}Don't forget to check imports in the new migration file!${NC}"
cd - || exit cd - || exit

View File

@@ -35,16 +35,20 @@ Prepare 3-5 questions and topics you want to discuss with your mentor.
1. Anything we should add structure-wise? 1. Anything we should add structure-wise?
2. Anything you would like us to prioritize until next week? 2. Anything you would like us to prioritize until next week?
3. Question 3
## Discussion Notes (During Meeting) ## Discussion Notes (During Meeting)
- start working on the report
- start coding the actual code
- write problems solved
- redo the system diagram - see the response as well
- create a meetings folder wih seperate meetings files
## Action Items for Next Week (During Meeting) ## Action Items for Next Week (During Meeting)
Last 3 minutes of the meeting, summarize action items. Last 3 minutes of the meeting, summarize action items.
- [ ] Action Item 1 - [ ] start coding the app logic
- [ ] Action Item 2 - [ ] start writing the report so it matches the actual progress
- [ ] Action Item 3 - [ ] redo the system diagram so it includes a response flow
--- ---

View File

@@ -0,0 +1,41 @@
# Weekly Meeting Notes
- Group X - Project Title
- Mentor: Mentor Name
Keep all meeting notes in the `meetings.md` file in your project folder.
Just copy the template below for each weekly meeting and fill in the details.
## Administrative Info
- Date: 2025-09-19
- Attendees: Name1, Name2, Name3
- Notetaker: Name1
## Progress Update (Before Meeting)
Summary of what has been accomplished since the last meeting in the following categories.
### Coding
### Documentation
## Questions and Topics for Discussion (Before Meeting)
Prepare 3-5 questions and topics you want to discuss with your mentor.
1. Question 1
2. Question 2
3. Question 3
## Discussion Notes (During Meeting)
## Action Items for Next Week (During Meeting)
Last 3 minutes of the meeting, summarize action items.
- [ ] Action Item 1
- [ ] Action Item 2
- [ ] Action Item 3
---

View File

@@ -96,6 +96,13 @@ module "database" {
phpmyadmin_enabled = var.phpmyadmin_enabled phpmyadmin_enabled = var.phpmyadmin_enabled
cloudflare_domain = var.cloudflare_domain cloudflare_domain = var.cloudflare_domain
s3_enabled = var.s3_enabled
s3_bucket = var.s3_bucket
s3_region = var.s3_region
s3_endpoint = var.s3_endpoint
s3_key_id = var.s3_key_id
s3_key_secret = var.s3_key_secret
} }
#module "argocd" { #module "argocd" {

View File

@@ -1,4 +1,4 @@
apiVersion: v2 apiVersion: v2
name: maxscale-helm name: maxscale-helm
version: 1.0.7 version: 1.0.14
description: Helm chart for MaxScale related Kubernetes manifests description: Helm chart for MaxScale related Kubernetes manifests

View File

@@ -0,0 +1,42 @@
{{- if .Values.s3.enabled }}
apiVersion: k8s.mariadb.com/v1alpha1
kind: Backup
metadata:
name: backup
namespace: mariadb-operator
spec:
mariaDbRef:
name: mariadb-repl
namespace: mariadb-operator
schedule:
cron: "0 */3 * * *"
suspend: false
timeZone: "Europe/Prague"
maxRetention: 720h # 30 days
compression: bzip2
storage:
s3:
bucket: {{ .Values.s3.bucket | quote }}
endpoint: {{ .Values.s3.endpoint | quote }}
accessKeyIdSecretKeyRef:
name: s3-credentials
key: key_id
secretAccessKeySecretKeyRef:
name: s3-credentials
key: secret_key
region: {{ .Values.s3.region | quote }}
tls:
enabled: true
# Define a PVC to use as staging area for keeping the backups while they are being processed.
stagingStorage:
persistentVolumeClaim:
resources:
requests:
storage: 10Gi
accessModes:
- ReadWriteOnce
args:
- --single-transaction
- --all-databases
logLevel: info
{{- end }}

View File

@@ -60,6 +60,8 @@ spec:
scrapeTimeout: 10s scrapeTimeout: 10s
prometheusRelease: kube-prometheus-stack prometheusRelease: kube-prometheus-stack
jobLabel: mariadb-monitoring jobLabel: mariadb-monitoring
auth:
generate: true
tls: tls:
enabled: true enabled: true

View File

@@ -0,0 +1,11 @@
{{- if .Values.s3.enabled }}
apiVersion: v1
kind: Secret
metadata:
name: s3-credentials
namespace: mariadb-operator
type: Opaque
stringData:
key_id: "{{ .Values.s3.key_id }}"
secret_key: "{{ .Values.s3.key_secret }}"
{{- end }}

View File

@@ -28,7 +28,7 @@ spec:
- name: DATABASE_ENABLE_SSL - name: DATABASE_ENABLE_SSL
value: "yes" value: "yes"
- name: DATABASE_HOST - name: DATABASE_HOST
value: "mariadb-repl" value: "mariadb-repl-maxscale-internal"
- name: DATABASE_PORT_NUMBER - name: DATABASE_PORT_NUMBER
value: "3306" value: "3306"
- name: PHPMYADMIN_ALLOW_NO_PASSWORD - name: PHPMYADMIN_ALLOW_NO_PASSWORD

View File

@@ -14,4 +14,12 @@ metallb:
phpmyadmin: phpmyadmin:
enabled: true enabled: true
s3:
enabled: false
endpoint: ""
region: ""
bucket: ""
key_id: ""
key_secret: ""
base_domain: example.com base_domain: example.com

View File

@@ -9,16 +9,16 @@ terraform {
version = "3.0.2" version = "3.0.2"
} }
kubernetes = { kubernetes = {
source = "hashicorp/kubernetes" source = "hashicorp/kubernetes"
version = "2.38.0" version = "2.38.0"
} }
} }
} }
resource "kubernetes_namespace" "mariadb-operator" { resource "kubernetes_namespace" "mariadb-operator" {
metadata { metadata {
name = "mariadb-operator" name = "mariadb-operator"
} }
} }
locals { locals {
@@ -30,46 +30,53 @@ locals {
} }
resource "kubectl_manifest" "secrets" { resource "kubectl_manifest" "secrets" {
yaml_body = local.mariadb_secret_yaml yaml_body = local.mariadb_secret_yaml
depends_on = [ kubernetes_namespace.mariadb-operator ] depends_on = [kubernetes_namespace.mariadb-operator]
} }
resource "helm_release" "mariadb-operator-crds" { resource "helm_release" "mariadb-operator-crds" {
name = "mariadb-operator-crds" name = "mariadb-operator-crds"
repository = "https://helm.mariadb.com/mariadb-operator" repository = "https://helm.mariadb.com/mariadb-operator"
chart = "mariadb-operator-crds" chart = "mariadb-operator-crds"
namespace = "mariadb-operator" namespace = "mariadb-operator"
version = "25.8.4" version = "25.8.4"
depends_on = [ kubectl_manifest.secrets ] depends_on = [kubectl_manifest.secrets]
timeout = 3600 timeout = 3600
} }
resource "helm_release" "mariadb-operator" { resource "helm_release" "mariadb-operator" {
name = "mariadb-operator" name = "mariadb-operator"
repository = "https://helm.mariadb.com/mariadb-operator" repository = "https://helm.mariadb.com/mariadb-operator"
chart = "mariadb-operator" chart = "mariadb-operator"
depends_on = [ helm_release.mariadb-operator-crds, kubectl_manifest.secrets ] depends_on = [helm_release.mariadb-operator-crds, kubectl_manifest.secrets]
namespace = "mariadb-operator" namespace = "mariadb-operator"
timeout = 3600 version = "25.8.3"
timeout = 3600
} }
resource "helm_release" "maxscale_helm" { resource "helm_release" "maxscale_helm" {
name = "maxscale-helm" name = "maxscale-helm"
chart = "${path.module}/charts/maxscale-helm" chart = "${path.module}/charts/maxscale-helm"
version = "1.0.7" version = "1.0.14"
depends_on = [ helm_release.mariadb-operator-crds, kubectl_manifest.secrets ] depends_on = [helm_release.mariadb-operator-crds, kubectl_manifest.secrets]
timeout = 3600 timeout = 3600
set = [ set = [
{ name = "user.name", value = var.mariadb_user_name }, { name = "user.name", value = var.mariadb_user_name },
{ name = "user.host", value = var.mariadb_user_host }, { name = "user.host", value = var.mariadb_user_host },
{ name = "metallb.maxscale_ip", value = var.maxscale_ip }, { name = "metallb.maxscale_ip", value = var.maxscale_ip },
{ name = "metallb.service_ip", value = var.service_ip }, { name = "metallb.service_ip", value = var.service_ip },
{ name = "metallb.primary_ip", value = var.primary_ip }, { name = "metallb.primary_ip", value = var.primary_ip },
{ name = "metallb.secondary_ip", value = var.secondary_ip }, { name = "metallb.secondary_ip", value = var.secondary_ip },
{ name = "phpmyadmin.enabled", value = tostring(var.phpmyadmin_enabled) }, { name = "phpmyadmin.enabled", value = tostring(var.phpmyadmin_enabled) },
{ name = "base_domain", value = var.cloudflare_domain } { name = "base_domain", value = var.cloudflare_domain },
{ name = "s3.key_id", value = var.s3_key_id },
{ name = "s3.key_secret", value = var.s3_key_secret },
{ name = "s3.enabled", value = var.s3_enabled },
{ name = "s3.endpoint", value = var.s3_endpoint },
{ name = "s3.region", value = var.s3_region },
{ name = "s3.bucket", value = var.s3_bucket },
] ]
} }

View File

@@ -52,7 +52,39 @@ variable "mariadb_user_password" {
} }
variable "cloudflare_domain" { variable "cloudflare_domain" {
type = string type = string
default = "Base cloudflare domain, e.g. example.com" default = "Base cloudflare domain, e.g. example.com"
nullable = false nullable = false
} }
variable "s3_key_id" {
description = "S3 Key ID for backups"
type = string
sensitive = true
}
variable "s3_key_secret" {
description = "S3 Key Secret for backups"
type = string
sensitive = true
}
variable "s3_enabled" {
description = "Enable S3 backups"
type = bool
}
variable "s3_endpoint" {
description = "S3 endpoint for backups"
type = string
}
variable "s3_region" {
description = "S3 region for backups"
type = string
}
variable "s3_bucket" {
description = "S3 bucket name for backups"
type = string
}

View File

@@ -0,0 +1,15 @@
# Values overriding defaults for metrics-server Helm chart
# Fix TLS and address selection issues when scraping kubelets (common on Talos)
args:
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP
- --kubelet-use-node-status-port=true
# Using hostNetwork often helps in restricted CNI/DNS environments
#hostNetwork: true
# Required when hostNetwork is true so DNS works as expected
#dnsPolicy: ClusterFirstWithHostNet
# Enable metrics API service monitor if Prometheus Operator is present (optional)
# serviceMonitor:
# enabled: true

View File

@@ -16,6 +16,12 @@ terraform {
} }
} }
resource "kubernetes_namespace" "rabbitmq_namespace" {
metadata {
name = "rabbitmq-system"
}
}
resource "helm_release" "rabbitmq_operator" { resource "helm_release" "rabbitmq_operator" {
name = "rabbitmq-cluster-operator" name = "rabbitmq-cluster-operator"
@@ -24,8 +30,7 @@ resource "helm_release" "rabbitmq_operator" {
version = "4.4.34" version = "4.4.34"
namespace = "rabbitmq-system" namespace = "rabbitmq-system"
create_namespace = true
# Zde můžete přepsat výchozí hodnoty chartu, pokud by bylo potřeba # Zde můžete přepsat výchozí hodnoty chartu, pokud by bylo potřeba
# Například sledovat jen určité namespace, nastavit tolerations atd. # Například sledovat jen určité namespace, nastavit tolerations atd.
@@ -59,6 +64,7 @@ resource "helm_release" "rabbitmq_operator" {
value = "true" value = "true"
} }
] ]
depends_on = [kubernetes_namespace.rabbitmq_namespace]
} }

View File

@@ -2,4 +2,4 @@ apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster kind: RabbitmqCluster
metadata: metadata:
name: 'rabbitmq-cluster' name: 'rabbitmq-cluster'
namespace: "rabbitmq" namespace: "rabbitmq-system"

View File

@@ -2,7 +2,7 @@ apiVersion: networking.cfargotunnel.com/v1alpha1
kind: TunnelBinding kind: TunnelBinding
metadata: metadata:
name: rabbit-tunnel-binding name: rabbit-tunnel-binding
namespace: rabbitmq namespace: rabbitmq-system
subjects: subjects:
- name: rabbit-gui - name: rabbit-gui
spec: spec:

View File

@@ -108,3 +108,40 @@ variable "rabbitmq-password" {
sensitive = true sensitive = true
description = "Admin password for RabbitMQ user" description = "Admin password for RabbitMQ user"
} }
variable "s3_key_id" {
description = "S3 Key ID for backups"
type = string
sensitive = true
nullable = false
}
variable "s3_key_secret" {
description = "S3 Key Secret for backups"
type = string
sensitive = true
nullable = false
}
variable "s3_enabled" {
description = "Enable S3 backups"
type = bool
}
variable "s3_endpoint" {
description = "S3 endpoint for backups"
type = string
}
variable "s3_region" {
description = "S3 region for backups"
type = string
}
variable "s3_bucket" {
description = "S3 bucket name for backups"
type = string
}