diff --git a/apps/fc-landing/fc-landing.yaml b/apps/fc-landing/fc-landing.yaml
index d606df3..2e4786c 100644
--- a/apps/fc-landing/fc-landing.yaml
+++ b/apps/fc-landing/fc-landing.yaml
@@ -1,248 +1,320 @@
-# FlowerCore Landing Page
-# Blue Jay Lab branded landing page
-# ArgoCD managed - BlueJay Lab
----
-# fc-system namespace is shared; don't overwrite if it exists
-apiVersion: v1
-kind: Namespace
-metadata:
- name: fc-system
- labels:
- app.kubernetes.io/part-of: bluejay-infra
----
-# Landing page HTML
-apiVersion: v1
-kind: ConfigMap
-metadata:
- name: fc-landing-html
- namespace: fc-system
-data:
- index.html: |
-
-
-
-
-
- FlowerCore - Blue Jay Lab
-
-
-
-
-
🌻
-
FlowerCore
-
Blue Jay Lab
-
-
-
-
-
----
-# 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
- 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
- initialDelaySeconds: 5
- periodSeconds: 10
- readinessProbe:
- httpGet:
- path: /healthz
- port: 80
- 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
----
-# Traefik IngressRoute (internal only, no public cert needed)
-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: {}
+# 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.
+
+
+
+
+
+
+
+---
+# 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
+ 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
+ initialDelaySeconds: 5
+ periodSeconds: 10
+ readinessProbe:
+ httpGet:
+ path: /healthz
+ port: 80
+ 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
+---
+# 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: {}
+---
+# 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`)
+ 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`)
+ 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