From f5fed81fabbe9d3f3a6dd4b20ee3b69a4fb3ab72 Mon Sep 17 00:00:00 2001 From: Roger Oriol Date: Sat, 31 Jan 2026 01:12:06 +0100 Subject: [PATCH] fava service --- fava/README.md | 85 ++++++++++++++++++++++++++++ fava/fava.yaml | 137 ++++++++++++++++++++++++++++++++++++++++++++++ fava/ingress.yaml | 28 ++++++++++ 3 files changed, 250 insertions(+) create mode 100644 fava/README.md create mode 100644 fava/fava.yaml create mode 100644 fava/ingress.yaml diff --git a/fava/README.md b/fava/README.md new file mode 100644 index 0000000..c17120f --- /dev/null +++ b/fava/README.md @@ -0,0 +1,85 @@ +# Fava - Beancount Web UI + +Aquest servei desplega Fava, una interfície web per visualitzar i editar llibres de comptes de Beancount. + +## Configuració + +### 1. Crea el Secret amb les credencials de Gitea + +Primer, crea un token d'accés personal a Gitea (Settings > Applications > Generate New Token). + +Després crea el Secret amb kubectl: + +```bash +kubectl create secret generic gitea-credentials \ + --from-literal=username='el_teu_usuari_gitea' \ + --from-literal=password='el_teu_token_gitea' \ + --namespace=fava +``` + +**Nota:** Assegura't de crear el namespace primer si no existeix: +```bash +kubectl create namespace fava +``` + +### 2. Ajusta el fitxer Beancount + +Si el teu fitxer principal no es diu `main.beancount`, actualitza els arguments del contenidor: + +```yaml +args: + - "/data/contabilitat/el_teu_fitxer.beancount" +``` + +### 3. Desplega el servei + +```bash +kubectl apply -f fava.yaml +kubectl apply -f ingress.yaml +``` + +**Important:** Desplega primer el namespace (que està inclòs a fava.yaml), després crea el Secret, i finalment aplica la resta dels recursos. + +Ordre recomanat: +```bash +# 1. Crear namespace i recursos base +kubectl apply -f fava.yaml + +# 2. Crear el secret (veure pas 1) +kubectl create secret generic gitea-credentials \ + --from-literal=username='el_teu_usuari' \ + --from-literal=password='el_teu_token' \ + --namespace=fava + +# 3. Si cal, reinicia el deployment perquè agafi el secret +kubectl rollout restart deployment/fava -n fava + +# 4. Aplica l'ingress +kubectl apply -f ingress.yaml +``` + +### 4. Verifica l'estat + +```bash +kubectl get pods -n fava +kubectl logs -n fava deployment/fava +``` + +## Accés + +Un cop desplegat, podràs accedir a Fava a: https://fava.rogi.casa + +## Actualització del repositori + +El repositori es clona a l'inici. Per actualitzar-lo amb els últims canvis: + +```bash +kubectl rollout restart deployment/fava -n fava +``` + +## Notes + +- El init container clona el repositori de Gitea al volum persistent +- Fava s'executa llegint el fitxer directament del repositori clonat +- Les credencials es guarden com a Secret de Kubernetes +- Usa un token d'accés personal de Gitea en lloc de la teva contrasenya diff --git a/fava/fava.yaml b/fava/fava.yaml new file mode 100644 index 0000000..1187def --- /dev/null +++ b/fava/fava.yaml @@ -0,0 +1,137 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: fava + +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: fava-data + namespace: fava +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: fava-init-script + namespace: fava +data: + init.sh: | + #!/bin/sh + set -e + + # Clone or update the repository + if [ ! -d "/data/contabilitat/.git" ]; then + echo "Cloning repository..." + git clone https://${GITEA_USERNAME}:${GITEA_PASSWORD}@gitea.gitea.svc.cluster.local:3000/${GITEA_USERNAME}/contabilitat.git /data/contabilitat + else + echo "Repository exists, pulling latest changes..." + cd /data/contabilitat + git pull + fi + + echo "Repository ready at /data/contabilitat" + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: fava + namespace: fava + labels: + app: fava +spec: + replicas: 1 + selector: + matchLabels: + app: fava + template: + metadata: + labels: + app: fava + spec: + initContainers: + - name: git-sync + image: alpine/git:latest + command: ["/bin/sh", "/scripts/init.sh"] + env: + - name: GITEA_USERNAME + valueFrom: + secretKeyRef: + name: gitea-credentials + key: username + - name: GITEA_PASSWORD + valueFrom: + secretKeyRef: + name: gitea-credentials + key: password + volumeMounts: + - name: data + mountPath: /data + - name: init-script + mountPath: /scripts + containers: + - name: fava + image: yegle/fava:latest + args: + - "/data/contabilitat/main.beancount" + - "-H" + - "0.0.0.0" + - "-p" + - "5000" + ports: + - containerPort: 5000 + name: http + volumeMounts: + - name: data + mountPath: /data + resources: + requests: + cpu: 100m + memory: 128Mi + limits: + cpu: 500m + memory: 512Mi + livenessProbe: + httpGet: + path: / + port: 5000 + initialDelaySeconds: 30 + periodSeconds: 10 + readinessProbe: + httpGet: + path: / + port: 5000 + initialDelaySeconds: 5 + periodSeconds: 5 + volumes: + - name: data + persistentVolumeClaim: + claimName: fava-data + - name: init-script + configMap: + name: fava-init-script + defaultMode: 0755 + +--- +apiVersion: v1 +kind: Service +metadata: + name: fava-service + namespace: fava +spec: + type: ClusterIP + selector: + app: fava + ports: + - name: http + port: 80 + targetPort: 5000 diff --git a/fava/ingress.yaml b/fava/ingress.yaml new file mode 100644 index 0000000..b5f498b --- /dev/null +++ b/fava/ingress.yaml @@ -0,0 +1,28 @@ +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: fava-ingress + namespace: fava + annotations: + kubernetes.io/ingress.class: "traefik" + traefik.ingress.kubernetes.io/redirect-entry-point: https + cert-manager.io/issuer: prod-issuer + cert-manager.io/issuer-kind: OriginIssuer + cert-manager.io/issuer-group: cert-manager.k8s.cloudflare.com +spec: + tls: + - hosts: + - fava.rogi.casa + secretName: fava-tls + rules: + - host: fava.rogi.casa + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: fava-service + port: + number: 80