stack.basicstack.de/apps
CTO Agent ae3f164987 fix(stalwart): Add externalTrafficPolicy: Local to LoadBalancer services
Root cause: ArgoCD continuously reverts the LoadBalancer services to use
externalTrafficPolicy: Cluster (the k8s default), causing k3s to assign
internal flannel VXLAN IPs (10.42.1.x) instead of the node public IPs.

With externalTrafficPolicy: Cluster, traffic can be routed to any node,
and k3s's service controller assigns the flannel overlay IPs. This breaks
external connectivity because those IPs are not routable from outside.

With externalTrafficPolicy: Local, traffic is only routed to pods on the
same node, and k3s assigns the node's actual public IP to the LoadBalancer.

This was the missing piece from the reliability hardening in commit b0f2acf.
Without this in git, any manual kubectl patch is reverted by ArgoCD sync.

Evidence: stalwart-smtp and stalwart-imap both showing LoadBalancer IPs:
10.42.1.1, 10.42.1.2, 10.42.1.3, 10.42.1.5 (internal flannel IPs)

Related: DEV-230, DEV-231, DEV-233, DEV-235

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-07-13 20:03:49 +00:00
..
argocd Add managed label to argocd sealed secrets 2026-07-12 16:32:34 +00:00
backup Add Forgejo deployment manifests for Argo CD GitOps 2026-07-12 13:55:47 +00:00
bookstack Document mysql-data-encrypted PVC as pre-existing, unmanaged resource 2026-07-12 17:13:26 +00:00
directus Convert all secrets to SealedSecrets for enhanced security 2026-07-01 18:38:27 +00:00
forgejo apps/forgejo/forgejo-postgres-secret-sealed.yaml aktualisiert 2026-07-12 14:10:45 +00:00
opencloud apps/opencloud/openldap-deployment.yaml aktualisiert 2026-07-12 16:02:10 +00:00
paperclip Convert all secrets to SealedSecrets for enhanced security 2026-07-01 18:38:27 +00:00
passbolt Convert all secrets to SealedSecrets for enhanced security 2026-07-01 18:38:27 +00:00
platform-prod Convert all secrets to SealedSecrets for enhanced security 2026-07-01 18:38:27 +00:00
pocket-id apps/pocket-id/deployment.yaml aktualisiert 2026-07-12 14:53:18 +00:00
stalwart fix(stalwart): Add externalTrafficPolicy: Local to LoadBalancer services 2026-07-13 20:03:49 +00:00
app-argocd.yaml ArgoCD: Replace complex stack sync with individual application syncs 2026-07-12 10:44:41 +00:00
app-backup.yaml ArgoCD: Replace complex stack sync with individual application syncs 2026-07-12 10:44:41 +00:00
app-basicstack-org.yaml Move Application manifests to apps root for proper self-management 2026-07-12 09:27:28 +00:00
app-bookstack.yaml Enable auto-sync for bookstack application 2026-07-12 17:17:53 +00:00
app-directus.yaml ArgoCD: Replace complex stack sync with individual application syncs 2026-07-12 10:44:41 +00:00
app-forgejo.yaml ArgoCD: Replace complex stack sync with individual application syncs 2026-07-12 10:44:41 +00:00
app-opencloud.yaml ArgoCD: Replace complex stack sync with individual application syncs 2026-07-12 10:44:41 +00:00
app-paperclip.yaml ArgoCD: Replace complex stack sync with individual application syncs 2026-07-12 10:44:41 +00:00
app-passbolt.yaml ArgoCD: Replace complex stack sync with individual application syncs 2026-07-12 10:44:41 +00:00
app-platform-prod.yaml ArgoCD: Replace complex stack sync with individual application syncs 2026-07-12 10:44:41 +00:00
app-pocket-id.yaml ArgoCD: Replace complex stack sync with individual application syncs 2026-07-12 10:44:41 +00:00
app-stalwart.yaml ArgoCD: Replace complex stack sync with individual application syncs 2026-07-12 10:44:41 +00:00
ARGOCD-MIGRATION.md ArgoCD: Replace complex stack sync with individual application syncs 2026-07-12 10:44:41 +00:00
README.md ArgoCD: Replace complex stack sync with individual application syncs 2026-07-12 10:44:41 +00:00

Applications

This directory contains deployment configurations for all applications running on the basicstack.de cluster.

ArgoCD Application Management

Each application has two types of files:

  1. app-<name>.yaml: ArgoCD Application manifest that tells ArgoCD to sync the app subdirectory
  2. <name>/: Application-specific Kubernetes manifests and configuration

The app-*.yaml files are synced by ArgoCD and create/manage the corresponding Application resources. Each application's manifests in its subdirectory are then synced by its Application resource.

Structure

Each application should have its own subdirectory containing:

  • Kubernetes manifests: Deployment, StatefulSet, Service, ConfigMap, Secret definitions
  • Helm values: If using Helm charts, include values.yaml files
  • Configuration files: Application-specific configs (TOML, JSON, YAML)
  • Documentation: README or guide specific to the application deployment
  • Patches: Any kubectl patches or modifications needed

Example: Stalwart

The stalwart/ directory serves as a reference implementation, containing:

  • Multiple deployment variants (basic, with OIDC, etc.)
  • Helm values files
  • Monitoring dashboard configurations
  • Backup/restore procedures
  • Operational documentation

Adding a New Application

  1. Create a new directory: apps/<application-name>/
  2. Add your Kubernetes manifests
  3. Include a README.md explaining:
    • What the application does
    • How to deploy it
    • Configuration options
    • Troubleshooting steps
  4. Test the deployment in a dev environment
  5. Commit with a descriptive message

Naming Conventions

  • Directory names: lowercase, hyphen-separated (e.g., my-app)
  • Manifest files: descriptive names indicating resource type (e.g., deployment.yaml, service.yaml)
  • Use consistent naming across applications