# FlowerCore Landing Page # Blue Jay Lab branded landing page - PUBLIC facing # ArgoCD managed - BlueJay Lab --- apiVersion: v1 kind: Namespace metadata: name: fc-system labels: app.kubernetes.io/part-of: bluejay-infra --- # Landing page HTML (public-safe - no internal LAN references) apiVersion: v1 kind: ConfigMap metadata: name: fc-landing-html namespace: fc-system data: index.html: | FlowerCore

FlowerCore

Blue Jay Lab

Multi-tenant service management platform built on .NET 10, Kubernetes, and GitOps. Digital signage, telephony IVR, MySQL/PHP hosting, and infrastructure automation.

Source

Gitea repositories

Mail

Webmail access

Chat

Matrix messaging

GitHub

Open source

17
Services
13
VLANs
12k+
Tests
--- # nginx configuration apiVersion: v1 kind: ConfigMap metadata: name: fc-landing-nginx-conf namespace: fc-system data: default.conf: | server { listen 80; server_name _; root /usr/share/nginx/html; index index.html; location / { try_files $uri $uri/ =404; } location /healthz { access_log off; return 200 "ok"; add_header Content-Type text/plain; } } --- # Landing Page Deployment apiVersion: apps/v1 kind: Deployment metadata: name: fc-landing namespace: fc-system labels: app: fc-landing spec: replicas: 1 selector: matchLabels: app: fc-landing template: metadata: labels: app: fc-landing annotations: flowercore.io/healthz-auth-policy: "allow-anonymous" spec: containers: - name: nginx image: nginx:alpine ports: - containerPort: 80 name: http volumeMounts: - name: nginx-conf mountPath: /etc/nginx/conf.d/default.conf subPath: default.conf - name: html mountPath: /usr/share/nginx/html resources: requests: memory: 16Mi cpu: 5m limits: memory: 64Mi cpu: 50m livenessProbe: httpGet: path: /healthz port: 80 httpHeaders: - name: X-Forwarded-Proto value: https initialDelaySeconds: 5 periodSeconds: 10 readinessProbe: httpGet: path: /healthz port: 80 httpHeaders: - name: X-Forwarded-Proto value: https initialDelaySeconds: 3 periodSeconds: 5 volumes: - name: nginx-conf configMap: name: fc-landing-nginx-conf - name: html configMap: name: fc-landing-html --- apiVersion: v1 kind: Service metadata: name: fc-landing namespace: fc-system spec: selector: app: fc-landing ports: - port: 80 targetPort: 80 name: http --- # TLS Certificate for internal LAN access apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: fc-landing-tls namespace: fc-system spec: secretName: fc-landing-tls issuerRef: name: step-ca-acme kind: ClusterIssuer dnsNames: - flowercore.iamworkin.lan --- # Internal IngressRoute (LAN access) apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: fc-landing namespace: fc-system spec: entryPoints: - websecure routes: - match: Host(`flowercore.iamworkin.lan`) kind: Rule services: - name: fc-landing port: 80 tls: secretName: fc-landing-tls --- # Public IngressRoute (flowercore.io with Cloudflare origin cert) apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: fc-landing-public namespace: fc-system spec: entryPoints: - websecure routes: - match: (Host(`flowercore.io`) || Host(`www.flowercore.io`)) && (Method(`GET`) || Method(`HEAD`)) kind: Rule services: - name: fc-landing port: 80 tls: secretName: cf-origin-flowercore-io --- # HTTP to HTTPS redirect for public domain apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: fc-landing-public-http namespace: fc-system spec: entryPoints: - web routes: - match: (Host(`flowercore.io`) || Host(`www.flowercore.io`)) && (Method(`GET`) || Method(`HEAD`)) kind: Rule services: - name: fc-landing port: 80 middlewares: - name: redirect-https --- apiVersion: traefik.io/v1alpha1 kind: Middleware metadata: name: redirect-https namespace: fc-system spec: redirectScheme: scheme: https permanent: true