MàJ - Application.properties
This commit is contained in:
@@ -0,0 +1,70 @@
|
|||||||
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
|
kind: Kustomization
|
||||||
|
|
||||||
|
metadata:
|
||||||
|
name: lionsdev-client-production
|
||||||
|
annotations:
|
||||||
|
config.kubernetes.io/local-config: "true"
|
||||||
|
|
||||||
|
namespace: lions-apps
|
||||||
|
|
||||||
|
resources:
|
||||||
|
- ../../kubernetes/namespace.yaml
|
||||||
|
- ../../kubernetes/configmap.yaml
|
||||||
|
- ../../kubernetes/secret.yaml
|
||||||
|
- ../../kubernetes/rbac.yaml
|
||||||
|
- ../../kubernetes/deployment.yaml
|
||||||
|
- ../../kubernetes/service.yaml
|
||||||
|
- ../../kubernetes/ingress.yaml
|
||||||
|
- ../../kubernetes/hpa.yaml
|
||||||
|
|
||||||
|
images:
|
||||||
|
- name: registry.lions.dev/lionsdev/lionsdev-client
|
||||||
|
newTag: latest
|
||||||
|
|
||||||
|
replicas:
|
||||||
|
- name: lionsdev-client
|
||||||
|
count: 3
|
||||||
|
|
||||||
|
patchesStrategicMerge:
|
||||||
|
- patches/configmap-production.yaml
|
||||||
|
- patches/ingress-production.yaml
|
||||||
|
- patches/deployment-production.yaml
|
||||||
|
|
||||||
|
patchesJson6902:
|
||||||
|
- target:
|
||||||
|
group: apps
|
||||||
|
version: v1
|
||||||
|
kind: Deployment
|
||||||
|
name: lionsdev-client
|
||||||
|
path: patches/deployment-resources.yaml
|
||||||
|
|
||||||
|
configMapGenerator:
|
||||||
|
- name: lionsdev-client-production-config
|
||||||
|
literals:
|
||||||
|
- ENVIRONMENT=production
|
||||||
|
- DOMAIN=lions.dev
|
||||||
|
- LOG_LEVEL=INFO
|
||||||
|
- QUARKUS_PROFILE=prod
|
||||||
|
- CLUSTER_NAME=k2
|
||||||
|
- REPLICA_COUNT=3
|
||||||
|
|
||||||
|
secretGenerator:
|
||||||
|
- name: lionsdev-client-production-secrets
|
||||||
|
literals:
|
||||||
|
- DATABASE_URL=jdbc:postgresql://postgresql-service.postgresql.svc.cluster.local:5432/lionsdb
|
||||||
|
- VAULT_ADDR=https://vault.lions.dev
|
||||||
|
- PROMETHEUS_URL=https://prometheus.lions.dev
|
||||||
|
- GRAFANA_URL=https://grafana.lions.dev
|
||||||
|
|
||||||
|
commonLabels:
|
||||||
|
environment: production
|
||||||
|
cluster: k2
|
||||||
|
tier: frontend
|
||||||
|
app.kubernetes.io/instance: lionsdev-client-production
|
||||||
|
|
||||||
|
commonAnnotations:
|
||||||
|
deployment.kubernetes.io/environment: production
|
||||||
|
deployment.kubernetes.io/cluster: k2
|
||||||
|
deployment.kubernetes.io/managed-by: lionsctl
|
||||||
|
contact: gbanedahoud@gmail.com
|
||||||
@@ -0,0 +1,102 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: lionsdev-client-config
|
||||||
|
namespace: lions-apps
|
||||||
|
data:
|
||||||
|
# Production-specific application configuration
|
||||||
|
application.properties: |
|
||||||
|
# Quarkus Configuration
|
||||||
|
quarkus.application.name=lionsdev-client
|
||||||
|
quarkus.application.version=1.0.0
|
||||||
|
|
||||||
|
# HTTP Configuration - Production
|
||||||
|
quarkus.http.port=8080
|
||||||
|
quarkus.http.host=0.0.0.0
|
||||||
|
quarkus.http.cors=true
|
||||||
|
quarkus.http.cors.origins=https://lions.dev,https://www.lions.dev
|
||||||
|
|
||||||
|
# Database Configuration - Production
|
||||||
|
quarkus.datasource.db-kind=postgresql
|
||||||
|
quarkus.datasource.jdbc.url=jdbc:postgresql://postgresql-service.postgresql.svc.cluster.local:5432/lionsdb
|
||||||
|
quarkus.datasource.jdbc.max-size=50
|
||||||
|
quarkus.datasource.jdbc.min-size=10
|
||||||
|
quarkus.datasource.jdbc.acquisition-timeout=30
|
||||||
|
quarkus.datasource.jdbc.leak-detection-interval=10M
|
||||||
|
|
||||||
|
# Hibernate Configuration - Production
|
||||||
|
quarkus.hibernate-orm.database.generation=validate
|
||||||
|
quarkus.hibernate-orm.log.sql=false
|
||||||
|
quarkus.hibernate-orm.sql-load-script=no-file
|
||||||
|
quarkus.hibernate-orm.statistics=false
|
||||||
|
|
||||||
|
# Logging Configuration - Production
|
||||||
|
quarkus.log.level=INFO
|
||||||
|
quarkus.log.category."dev.lions".level=INFO
|
||||||
|
quarkus.log.category."org.hibernate".level=WARN
|
||||||
|
quarkus.log.category."io.quarkus".level=INFO
|
||||||
|
quarkus.log.console.enable=true
|
||||||
|
quarkus.log.console.format=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c{3.}] (%t) %s%e%n
|
||||||
|
quarkus.log.console.json=false
|
||||||
|
|
||||||
|
# Health Check Configuration
|
||||||
|
quarkus.health.extensions.enabled=true
|
||||||
|
quarkus.smallrye-health.root-path=/health
|
||||||
|
quarkus.smallrye-health.liveness-path=/health/live
|
||||||
|
quarkus.smallrye-health.readiness-path=/health/ready
|
||||||
|
quarkus.smallrye-health.startup-path=/health/started
|
||||||
|
|
||||||
|
# Metrics Configuration - Production
|
||||||
|
quarkus.micrometer.enabled=true
|
||||||
|
quarkus.micrometer.export.prometheus.enabled=true
|
||||||
|
quarkus.micrometer.export.prometheus.path=/metrics
|
||||||
|
quarkus.micrometer.binder.jvm=true
|
||||||
|
quarkus.micrometer.binder.system=true
|
||||||
|
quarkus.micrometer.binder.http-server.enabled=true
|
||||||
|
|
||||||
|
# OpenAPI Configuration - Production (disabled for security)
|
||||||
|
quarkus.swagger-ui.enable=false
|
||||||
|
quarkus.openapi.path=/api/openapi
|
||||||
|
mp.openapi.extensions.smallrye.info.title=Lions Dev Client API
|
||||||
|
mp.openapi.extensions.smallrye.info.version=1.0.0
|
||||||
|
mp.openapi.extensions.smallrye.info.description=Lions Dev professional website and client portal
|
||||||
|
mp.openapi.extensions.smallrye.info.contact.email=contact@lions.dev
|
||||||
|
mp.openapi.extensions.smallrye.info.contact.name=Lions Dev Team
|
||||||
|
mp.openapi.extensions.smallrye.info.contact.url=https://lions.dev
|
||||||
|
|
||||||
|
# Security Configuration - Production
|
||||||
|
quarkus.http.auth.basic=false
|
||||||
|
quarkus.security.jpa.enabled=false
|
||||||
|
quarkus.http.ssl.certificate.reload-period=24H
|
||||||
|
|
||||||
|
# Static Resources Configuration - Production
|
||||||
|
quarkus.http.static-resources."/"=META-INF/resources
|
||||||
|
quarkus.http.static-resources.cache-control=max-age=31536000, public, immutable
|
||||||
|
quarkus.http.enable-compression=true
|
||||||
|
|
||||||
|
# Performance Configuration
|
||||||
|
quarkus.thread-pool.core-threads=8
|
||||||
|
quarkus.thread-pool.max-threads=50
|
||||||
|
quarkus.thread-pool.queue-size=1000
|
||||||
|
|
||||||
|
# Production environment configuration
|
||||||
|
environment: "production"
|
||||||
|
domain: "lions.dev"
|
||||||
|
log-level: "INFO"
|
||||||
|
cluster: "k2"
|
||||||
|
|
||||||
|
# Lions Dev Production Configuration
|
||||||
|
lions.dev.company.name=Lions Dev
|
||||||
|
lions.dev.company.email=contact@lions.dev
|
||||||
|
lions.dev.company.phone=+225 01 01 75 95 25
|
||||||
|
lions.dev.company.address=Abidjan, Côte d'Ivoire
|
||||||
|
lions.dev.company.website=https://lions.dev
|
||||||
|
lions.dev.company.description=Enterprise digital transformation partner delivering mission-critical solutions across Africa
|
||||||
|
|
||||||
|
# Production feature flags
|
||||||
|
lions.dev.features.analytics.enabled=true
|
||||||
|
lions.dev.features.monitoring.enabled=true
|
||||||
|
lions.dev.features.contact-form.enabled=true
|
||||||
|
lions.dev.features.newsletter.enabled=true
|
||||||
|
lions.dev.features.debug.enabled=false
|
||||||
|
lions.dev.features.swagger.enabled=false
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: lionsdev-client
|
||||||
|
namespace: lions-apps
|
||||||
|
annotations:
|
||||||
|
deployment.kubernetes.io/environment: "production"
|
||||||
|
deployment.kubernetes.io/cluster: "k2"
|
||||||
|
deployment.kubernetes.io/domain: "lions.dev"
|
||||||
|
spec:
|
||||||
|
replicas: 3
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
prometheus.io/scrape: "true"
|
||||||
|
prometheus.io/port: "8080"
|
||||||
|
prometheus.io/path: "/metrics"
|
||||||
|
deployment.kubernetes.io/environment: "production"
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: lionsdev-client
|
||||||
|
image: registry.lions.dev/lionsdev/lionsdev-client:latest
|
||||||
|
env:
|
||||||
|
- name: QUARKUS_PROFILE
|
||||||
|
value: "prod"
|
||||||
|
- name: ENVIRONMENT
|
||||||
|
value: "production"
|
||||||
|
- name: CLUSTER_NAME
|
||||||
|
value: "k2"
|
||||||
|
- name: DOMAIN
|
||||||
|
value: "lions.dev"
|
||||||
|
- name: JAVA_OPTS
|
||||||
|
value: "-Xms512m -Xmx1024m -XX:+UseG1GC -XX:+UseStringDeduplication -XX:+OptimizeStringConcat"
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: "512Mi"
|
||||||
|
cpu: "300m"
|
||||||
|
limits:
|
||||||
|
memory: "1Gi"
|
||||||
|
cpu: "1000m"
|
||||||
|
livenessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /health/live
|
||||||
|
port: http
|
||||||
|
scheme: HTTP
|
||||||
|
initialDelaySeconds: 60
|
||||||
|
periodSeconds: 30
|
||||||
|
timeoutSeconds: 10
|
||||||
|
failureThreshold: 3
|
||||||
|
successThreshold: 1
|
||||||
|
readinessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /health/ready
|
||||||
|
port: http
|
||||||
|
scheme: HTTP
|
||||||
|
initialDelaySeconds: 30
|
||||||
|
periodSeconds: 10
|
||||||
|
timeoutSeconds: 5
|
||||||
|
failureThreshold: 3
|
||||||
|
successThreshold: 1
|
||||||
|
startupProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /health/started
|
||||||
|
port: http
|
||||||
|
scheme: HTTP
|
||||||
|
initialDelaySeconds: 30
|
||||||
|
periodSeconds: 10
|
||||||
|
timeoutSeconds: 5
|
||||||
|
failureThreshold: 60
|
||||||
|
successThreshold: 1
|
||||||
@@ -0,0 +1,100 @@
|
|||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: lionsdev-client-ingress
|
||||||
|
namespace: lions-apps
|
||||||
|
annotations:
|
||||||
|
# Production-specific Nginx configurations
|
||||||
|
nginx.ingress.kubernetes.io/ssl-redirect: "true"
|
||||||
|
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
|
||||||
|
nginx.ingress.kubernetes.io/use-regex: "true"
|
||||||
|
|
||||||
|
# SSL/TLS Configuration for Production
|
||||||
|
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||||
|
cert-manager.io/acme-challenge-type: "http01"
|
||||||
|
|
||||||
|
# Production performance optimizations
|
||||||
|
nginx.ingress.kubernetes.io/proxy-body-size: "50m"
|
||||||
|
nginx.ingress.kubernetes.io/proxy-connect-timeout: "30"
|
||||||
|
nginx.ingress.kubernetes.io/proxy-send-timeout: "30"
|
||||||
|
nginx.ingress.kubernetes.io/proxy-read-timeout: "30"
|
||||||
|
nginx.ingress.kubernetes.io/proxy-buffering: "on"
|
||||||
|
nginx.ingress.kubernetes.io/proxy-buffer-size: "16k"
|
||||||
|
nginx.ingress.kubernetes.io/proxy-buffers-number: "8"
|
||||||
|
|
||||||
|
# Production caching strategy
|
||||||
|
nginx.ingress.kubernetes.io/server-snippet: |
|
||||||
|
# Static assets - long-term caching
|
||||||
|
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot|webp|avif)$ {
|
||||||
|
expires 1y;
|
||||||
|
add_header Cache-Control "public, immutable";
|
||||||
|
add_header X-Content-Type-Options "nosniff";
|
||||||
|
add_header Vary "Accept-Encoding";
|
||||||
|
gzip_static on;
|
||||||
|
}
|
||||||
|
|
||||||
|
# HTML files - short-term caching
|
||||||
|
location ~* \.(html|htm)$ {
|
||||||
|
expires 1h;
|
||||||
|
add_header Cache-Control "public, must-revalidate";
|
||||||
|
add_header X-Content-Type-Options "nosniff";
|
||||||
|
add_header X-Frame-Options "DENY";
|
||||||
|
add_header X-XSS-Protection "1; mode=block";
|
||||||
|
add_header Referrer-Policy "strict-origin-when-cross-origin";
|
||||||
|
}
|
||||||
|
|
||||||
|
# API endpoints - no caching
|
||||||
|
location ~* ^/api/ {
|
||||||
|
expires -1;
|
||||||
|
add_header Cache-Control "no-cache, no-store, must-revalidate";
|
||||||
|
add_header Pragma "no-cache";
|
||||||
|
}
|
||||||
|
|
||||||
|
# Production security headers
|
||||||
|
nginx.ingress.kubernetes.io/configuration-snippet: |
|
||||||
|
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
|
||||||
|
add_header X-Content-Type-Options "nosniff" always;
|
||||||
|
add_header X-Frame-Options "DENY" always;
|
||||||
|
add_header X-XSS-Protection "1; mode=block" always;
|
||||||
|
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
|
||||||
|
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' https://cdnjs.cloudflare.com https://fonts.googleapis.com https://www.googletagmanager.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://cdnjs.cloudflare.com; font-src 'self' https://fonts.gstatic.com https://cdnjs.cloudflare.com; img-src 'self' data: https: blob:; connect-src 'self' https://www.google-analytics.com; frame-ancestors 'none'; base-uri 'self'; form-action 'self';" always;
|
||||||
|
add_header Permissions-Policy "geolocation=(), microphone=(), camera=(), payment=(), usb=(), magnetometer=(), gyroscope=(), speaker=(), fullscreen=(self)" always;
|
||||||
|
|
||||||
|
# Production rate limiting
|
||||||
|
nginx.ingress.kubernetes.io/rate-limit: "200"
|
||||||
|
nginx.ingress.kubernetes.io/rate-limit-window: "1m"
|
||||||
|
nginx.ingress.kubernetes.io/rate-limit-connections: "50"
|
||||||
|
|
||||||
|
# Production monitoring
|
||||||
|
nginx.ingress.kubernetes.io/enable-access-log: "true"
|
||||||
|
nginx.ingress.kubernetes.io/enable-rewrite-log: "false"
|
||||||
|
|
||||||
|
# Production redirect from www to non-www
|
||||||
|
nginx.ingress.kubernetes.io/from-to-www-redirect: "true"
|
||||||
|
spec:
|
||||||
|
tls:
|
||||||
|
- hosts:
|
||||||
|
- lions.dev
|
||||||
|
- www.lions.dev
|
||||||
|
secretName: lionsdev-client-tls-prod
|
||||||
|
rules:
|
||||||
|
- host: lions.dev
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: lionsdev-client-service
|
||||||
|
port:
|
||||||
|
number: 80
|
||||||
|
- host: www.lions.dev
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: lionsdev-client-service
|
||||||
|
port:
|
||||||
|
number: 80
|
||||||
85
applications/lionsdev-client/kubernetes/configmap.yaml
Normal file
85
applications/lionsdev-client/kubernetes/configmap.yaml
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: lionsdev-client-config
|
||||||
|
namespace: lions-apps
|
||||||
|
labels:
|
||||||
|
app: lionsdev-client
|
||||||
|
app.kubernetes.io/name: lionsdev-client
|
||||||
|
app.kubernetes.io/part-of: lions-infrastructure
|
||||||
|
app.kubernetes.io/managed-by: lionsctl
|
||||||
|
data:
|
||||||
|
# Application configuration
|
||||||
|
application.properties: |
|
||||||
|
# Quarkus Configuration
|
||||||
|
quarkus.application.name=lionsdev-client
|
||||||
|
quarkus.application.version=1.0.0
|
||||||
|
|
||||||
|
# HTTP Configuration
|
||||||
|
quarkus.http.port=8080
|
||||||
|
quarkus.http.host=0.0.0.0
|
||||||
|
quarkus.http.cors=true
|
||||||
|
quarkus.http.cors.origins=https://lions.dev,https://staging.lions.dev,https://dev.lions.dev
|
||||||
|
|
||||||
|
# Database Configuration (will be overridden by secrets)
|
||||||
|
quarkus.datasource.db-kind=postgresql
|
||||||
|
quarkus.datasource.jdbc.url=jdbc:postgresql://postgresql-service.postgresql.svc.cluster.local:5432/lionsdb
|
||||||
|
quarkus.datasource.jdbc.max-size=20
|
||||||
|
quarkus.datasource.jdbc.min-size=5
|
||||||
|
|
||||||
|
# Hibernate Configuration
|
||||||
|
quarkus.hibernate-orm.database.generation=update
|
||||||
|
quarkus.hibernate-orm.log.sql=false
|
||||||
|
quarkus.hibernate-orm.sql-load-script=no-file
|
||||||
|
|
||||||
|
# Logging Configuration
|
||||||
|
quarkus.log.level=INFO
|
||||||
|
quarkus.log.category."dev.lions".level=DEBUG
|
||||||
|
quarkus.log.console.enable=true
|
||||||
|
quarkus.log.console.format=%d{HH:mm:ss} %-5p [%c{2.}] (%t) %s%e%n
|
||||||
|
|
||||||
|
# Health Check Configuration
|
||||||
|
quarkus.health.extensions.enabled=true
|
||||||
|
quarkus.smallrye-health.root-path=/health
|
||||||
|
|
||||||
|
# Metrics Configuration
|
||||||
|
quarkus.micrometer.enabled=true
|
||||||
|
quarkus.micrometer.export.prometheus.enabled=true
|
||||||
|
quarkus.micrometer.export.prometheus.path=/metrics
|
||||||
|
|
||||||
|
# OpenAPI Configuration
|
||||||
|
quarkus.swagger-ui.enable=true
|
||||||
|
quarkus.swagger-ui.path=/swagger-ui
|
||||||
|
mp.openapi.extensions.smallrye.info.title=Lions Dev Client API
|
||||||
|
mp.openapi.extensions.smallrye.info.version=1.0.0
|
||||||
|
mp.openapi.extensions.smallrye.info.description=Lions Dev professional website and client portal
|
||||||
|
mp.openapi.extensions.smallrye.info.contact.email=contact@lions.dev
|
||||||
|
mp.openapi.extensions.smallrye.info.contact.name=Lions Dev Team
|
||||||
|
mp.openapi.extensions.smallrye.info.contact.url=https://lions.dev
|
||||||
|
|
||||||
|
# Security Configuration
|
||||||
|
quarkus.http.auth.basic=false
|
||||||
|
quarkus.security.jpa.enabled=false
|
||||||
|
|
||||||
|
# Static Resources Configuration
|
||||||
|
quarkus.http.static-resources."/"=META-INF/resources
|
||||||
|
quarkus.http.static-resources.cache-control=max-age=86400
|
||||||
|
|
||||||
|
# Environment-specific overrides (will be patched per environment)
|
||||||
|
environment: "production"
|
||||||
|
domain: "lions.dev"
|
||||||
|
log-level: "INFO"
|
||||||
|
|
||||||
|
# Lions Dev specific configuration
|
||||||
|
lions.dev.company.name=Lions Dev
|
||||||
|
lions.dev.company.email=contact@lions.dev
|
||||||
|
lions.dev.company.phone=+225 01 01 75 95 25
|
||||||
|
lions.dev.company.address=Abidjan, Côte d'Ivoire
|
||||||
|
lions.dev.company.website=https://lions.dev
|
||||||
|
lions.dev.company.description=Enterprise digital transformation partner delivering mission-critical solutions across Africa
|
||||||
|
|
||||||
|
# Feature flags
|
||||||
|
lions.dev.features.analytics.enabled=true
|
||||||
|
lions.dev.features.monitoring.enabled=true
|
||||||
|
lions.dev.features.contact-form.enabled=true
|
||||||
|
lions.dev.features.newsletter.enabled=true
|
||||||
149
applications/lionsdev-client/kubernetes/deployment.yaml
Normal file
149
applications/lionsdev-client/kubernetes/deployment.yaml
Normal file
@@ -0,0 +1,149 @@
|
|||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: lionsdev-client
|
||||||
|
namespace: lions-apps
|
||||||
|
labels:
|
||||||
|
app: lionsdev-client
|
||||||
|
app.kubernetes.io/name: lionsdev-client
|
||||||
|
app.kubernetes.io/part-of: lions-infrastructure
|
||||||
|
app.kubernetes.io/managed-by: lionsctl
|
||||||
|
app.kubernetes.io/version: "1.0.0"
|
||||||
|
annotations:
|
||||||
|
deployment.kubernetes.io/revision: "1"
|
||||||
|
description: "Lions Dev professional website and client portal"
|
||||||
|
spec:
|
||||||
|
replicas: 3
|
||||||
|
strategy:
|
||||||
|
type: RollingUpdate
|
||||||
|
rollingUpdate:
|
||||||
|
maxSurge: 1
|
||||||
|
maxUnavailable: 0
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: lionsdev-client
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: lionsdev-client
|
||||||
|
app.kubernetes.io/name: lionsdev-client
|
||||||
|
app.kubernetes.io/part-of: lions-infrastructure
|
||||||
|
app.kubernetes.io/version: "1.0.0"
|
||||||
|
annotations:
|
||||||
|
prometheus.io/scrape: "true"
|
||||||
|
prometheus.io/port: "8080"
|
||||||
|
prometheus.io/path: "/metrics"
|
||||||
|
spec:
|
||||||
|
serviceAccountName: lionsdev-client
|
||||||
|
securityContext:
|
||||||
|
runAsNonRoot: true
|
||||||
|
runAsUser: 1001
|
||||||
|
runAsGroup: 1001
|
||||||
|
fsGroup: 1001
|
||||||
|
containers:
|
||||||
|
- name: lionsdev-client
|
||||||
|
image: registry.lions.dev/lionsdev/lionsdev-client:latest
|
||||||
|
imagePullPolicy: Always
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
containerPort: 8080
|
||||||
|
protocol: TCP
|
||||||
|
- name: metrics
|
||||||
|
containerPort: 8080
|
||||||
|
protocol: TCP
|
||||||
|
env:
|
||||||
|
- name: KUBERNETES_NAMESPACE
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: metadata.namespace
|
||||||
|
- name: HOSTNAME
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: metadata.name
|
||||||
|
- name: QUARKUS_PROFILE
|
||||||
|
value: "prod"
|
||||||
|
envFrom:
|
||||||
|
- configMapRef:
|
||||||
|
name: lionsdev-client-config
|
||||||
|
- secretRef:
|
||||||
|
name: lionsdev-client-secrets
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: "256Mi"
|
||||||
|
cpu: "200m"
|
||||||
|
limits:
|
||||||
|
memory: "1Gi"
|
||||||
|
cpu: "1000m"
|
||||||
|
livenessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /health/live
|
||||||
|
port: http
|
||||||
|
scheme: HTTP
|
||||||
|
initialDelaySeconds: 30
|
||||||
|
periodSeconds: 10
|
||||||
|
timeoutSeconds: 5
|
||||||
|
failureThreshold: 3
|
||||||
|
successThreshold: 1
|
||||||
|
readinessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /health/ready
|
||||||
|
port: http
|
||||||
|
scheme: HTTP
|
||||||
|
initialDelaySeconds: 10
|
||||||
|
periodSeconds: 5
|
||||||
|
timeoutSeconds: 3
|
||||||
|
failureThreshold: 3
|
||||||
|
successThreshold: 1
|
||||||
|
startupProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /health/started
|
||||||
|
port: http
|
||||||
|
scheme: HTTP
|
||||||
|
initialDelaySeconds: 10
|
||||||
|
periodSeconds: 5
|
||||||
|
timeoutSeconds: 3
|
||||||
|
failureThreshold: 30
|
||||||
|
successThreshold: 1
|
||||||
|
securityContext:
|
||||||
|
allowPrivilegeEscalation: false
|
||||||
|
readOnlyRootFilesystem: true
|
||||||
|
runAsNonRoot: true
|
||||||
|
runAsUser: 1001
|
||||||
|
capabilities:
|
||||||
|
drop:
|
||||||
|
- ALL
|
||||||
|
volumeMounts:
|
||||||
|
- name: tmp
|
||||||
|
mountPath: /tmp
|
||||||
|
- name: logs
|
||||||
|
mountPath: /app/logs
|
||||||
|
volumes:
|
||||||
|
- name: tmp
|
||||||
|
emptyDir: {}
|
||||||
|
- name: logs
|
||||||
|
emptyDir: {}
|
||||||
|
imagePullSecrets:
|
||||||
|
- name: registry-lions-dev
|
||||||
|
nodeSelector:
|
||||||
|
kubernetes.io/os: linux
|
||||||
|
tolerations:
|
||||||
|
- key: "node.kubernetes.io/not-ready"
|
||||||
|
operator: "Exists"
|
||||||
|
effect: "NoExecute"
|
||||||
|
tolerationSeconds: 300
|
||||||
|
- key: "node.kubernetes.io/unreachable"
|
||||||
|
operator: "Exists"
|
||||||
|
effect: "NoExecute"
|
||||||
|
tolerationSeconds: 300
|
||||||
|
affinity:
|
||||||
|
podAntiAffinity:
|
||||||
|
preferredDuringSchedulingIgnoredDuringExecution:
|
||||||
|
- weight: 100
|
||||||
|
podAffinityTerm:
|
||||||
|
labelSelector:
|
||||||
|
matchExpressions:
|
||||||
|
- key: app
|
||||||
|
operator: In
|
||||||
|
values:
|
||||||
|
- lionsdev-client
|
||||||
|
topologyKey: kubernetes.io/hostname
|
||||||
67
applications/lionsdev-client/kubernetes/hpa.yaml
Normal file
67
applications/lionsdev-client/kubernetes/hpa.yaml
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
apiVersion: autoscaling/v2
|
||||||
|
kind: HorizontalPodAutoscaler
|
||||||
|
metadata:
|
||||||
|
name: lionsdev-client-hpa
|
||||||
|
namespace: lions-apps
|
||||||
|
labels:
|
||||||
|
app: lionsdev-client
|
||||||
|
app.kubernetes.io/name: lionsdev-client
|
||||||
|
app.kubernetes.io/part-of: lions-infrastructure
|
||||||
|
app.kubernetes.io/managed-by: lionsctl
|
||||||
|
spec:
|
||||||
|
scaleTargetRef:
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
name: lionsdev-client
|
||||||
|
minReplicas: 2
|
||||||
|
maxReplicas: 10
|
||||||
|
metrics:
|
||||||
|
- type: Resource
|
||||||
|
resource:
|
||||||
|
name: cpu
|
||||||
|
target:
|
||||||
|
type: Utilization
|
||||||
|
averageUtilization: 70
|
||||||
|
- type: Resource
|
||||||
|
resource:
|
||||||
|
name: memory
|
||||||
|
target:
|
||||||
|
type: Utilization
|
||||||
|
averageUtilization: 80
|
||||||
|
behavior:
|
||||||
|
scaleDown:
|
||||||
|
stabilizationWindowSeconds: 300
|
||||||
|
policies:
|
||||||
|
- type: Percent
|
||||||
|
value: 50
|
||||||
|
periodSeconds: 60
|
||||||
|
- type: Pods
|
||||||
|
value: 2
|
||||||
|
periodSeconds: 60
|
||||||
|
selectPolicy: Min
|
||||||
|
scaleUp:
|
||||||
|
stabilizationWindowSeconds: 60
|
||||||
|
policies:
|
||||||
|
- type: Percent
|
||||||
|
value: 100
|
||||||
|
periodSeconds: 30
|
||||||
|
- type: Pods
|
||||||
|
value: 4
|
||||||
|
periodSeconds: 30
|
||||||
|
selectPolicy: Max
|
||||||
|
---
|
||||||
|
apiVersion: policy/v1
|
||||||
|
kind: PodDisruptionBudget
|
||||||
|
metadata:
|
||||||
|
name: lionsdev-client-pdb
|
||||||
|
namespace: lions-apps
|
||||||
|
labels:
|
||||||
|
app: lionsdev-client
|
||||||
|
app.kubernetes.io/name: lionsdev-client
|
||||||
|
app.kubernetes.io/part-of: lions-infrastructure
|
||||||
|
app.kubernetes.io/managed-by: lionsctl
|
||||||
|
spec:
|
||||||
|
minAvailable: 1
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: lionsdev-client
|
||||||
89
applications/lionsdev-client/kubernetes/ingress.yaml
Normal file
89
applications/lionsdev-client/kubernetes/ingress.yaml
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: lionsdev-client-ingress
|
||||||
|
namespace: lions-apps
|
||||||
|
labels:
|
||||||
|
app: lionsdev-client
|
||||||
|
app.kubernetes.io/name: lionsdev-client
|
||||||
|
app.kubernetes.io/part-of: lions-infrastructure
|
||||||
|
app.kubernetes.io/managed-by: lionsctl
|
||||||
|
annotations:
|
||||||
|
# Nginx Ingress Controller annotations
|
||||||
|
kubernetes.io/ingress.class: "nginx"
|
||||||
|
nginx.ingress.kubernetes.io/ssl-redirect: "true"
|
||||||
|
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
|
||||||
|
nginx.ingress.kubernetes.io/use-regex: "true"
|
||||||
|
|
||||||
|
# SSL/TLS Configuration
|
||||||
|
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||||
|
cert-manager.io/acme-challenge-type: "http01"
|
||||||
|
|
||||||
|
# Performance and caching
|
||||||
|
nginx.ingress.kubernetes.io/proxy-body-size: "10m"
|
||||||
|
nginx.ingress.kubernetes.io/proxy-connect-timeout: "60"
|
||||||
|
nginx.ingress.kubernetes.io/proxy-send-timeout: "60"
|
||||||
|
nginx.ingress.kubernetes.io/proxy-read-timeout: "60"
|
||||||
|
nginx.ingress.kubernetes.io/proxy-buffering: "on"
|
||||||
|
nginx.ingress.kubernetes.io/proxy-buffer-size: "8k"
|
||||||
|
|
||||||
|
# Static assets caching
|
||||||
|
nginx.ingress.kubernetes.io/server-snippet: |
|
||||||
|
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
|
||||||
|
expires 1y;
|
||||||
|
add_header Cache-Control "public, immutable";
|
||||||
|
add_header X-Content-Type-Options "nosniff";
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~* \.(html|htm)$ {
|
||||||
|
expires 1h;
|
||||||
|
add_header Cache-Control "public, must-revalidate";
|
||||||
|
add_header X-Content-Type-Options "nosniff";
|
||||||
|
add_header X-Frame-Options "DENY";
|
||||||
|
add_header X-XSS-Protection "1; mode=block";
|
||||||
|
add_header Referrer-Policy "strict-origin-when-cross-origin";
|
||||||
|
}
|
||||||
|
|
||||||
|
# Security headers
|
||||||
|
nginx.ingress.kubernetes.io/configuration-snippet: |
|
||||||
|
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
|
||||||
|
add_header X-Content-Type-Options "nosniff" always;
|
||||||
|
add_header X-Frame-Options "DENY" always;
|
||||||
|
add_header X-XSS-Protection "1; mode=block" always;
|
||||||
|
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
|
||||||
|
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' https://cdnjs.cloudflare.com https://fonts.googleapis.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://cdnjs.cloudflare.com; font-src 'self' https://fonts.gstatic.com https://cdnjs.cloudflare.com; img-src 'self' data: https:; connect-src 'self'; frame-ancestors 'none';" always;
|
||||||
|
|
||||||
|
# Rate limiting
|
||||||
|
nginx.ingress.kubernetes.io/rate-limit: "100"
|
||||||
|
nginx.ingress.kubernetes.io/rate-limit-window: "1m"
|
||||||
|
|
||||||
|
# Monitoring
|
||||||
|
nginx.ingress.kubernetes.io/enable-access-log: "true"
|
||||||
|
nginx.ingress.kubernetes.io/enable-rewrite-log: "false"
|
||||||
|
spec:
|
||||||
|
tls:
|
||||||
|
- hosts:
|
||||||
|
- lions.dev
|
||||||
|
- www.lions.dev
|
||||||
|
secretName: lionsdev-client-tls
|
||||||
|
rules:
|
||||||
|
- host: lions.dev
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: lionsdev-client-service
|
||||||
|
port:
|
||||||
|
number: 80
|
||||||
|
- host: www.lions.dev
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: lionsdev-client-service
|
||||||
|
port:
|
||||||
|
number: 80
|
||||||
47
applications/lionsdev-client/kubernetes/namespace.yaml
Normal file
47
applications/lionsdev-client/kubernetes/namespace.yaml
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Namespace
|
||||||
|
metadata:
|
||||||
|
name: lions-apps
|
||||||
|
labels:
|
||||||
|
name: lions-apps
|
||||||
|
app.kubernetes.io/name: lions-apps
|
||||||
|
app.kubernetes.io/part-of: lions-infrastructure
|
||||||
|
app.kubernetes.io/managed-by: lionsctl
|
||||||
|
annotations:
|
||||||
|
description: "Lions Dev applications namespace"
|
||||||
|
contact: "infrastructure@lions.dev"
|
||||||
|
environment: "multi-environment"
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ResourceQuota
|
||||||
|
metadata:
|
||||||
|
name: lions-apps-quota
|
||||||
|
namespace: lions-apps
|
||||||
|
spec:
|
||||||
|
hard:
|
||||||
|
requests.cpu: "4"
|
||||||
|
requests.memory: 8Gi
|
||||||
|
limits.cpu: "8"
|
||||||
|
limits.memory: 16Gi
|
||||||
|
persistentvolumeclaims: "10"
|
||||||
|
services: "20"
|
||||||
|
secrets: "50"
|
||||||
|
configmaps: "50"
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: LimitRange
|
||||||
|
metadata:
|
||||||
|
name: lions-apps-limits
|
||||||
|
namespace: lions-apps
|
||||||
|
spec:
|
||||||
|
limits:
|
||||||
|
- default:
|
||||||
|
cpu: "1"
|
||||||
|
memory: "1Gi"
|
||||||
|
defaultRequest:
|
||||||
|
cpu: "100m"
|
||||||
|
memory: "128Mi"
|
||||||
|
type: Container
|
||||||
|
- default:
|
||||||
|
storage: "10Gi"
|
||||||
|
type: PersistentVolumeClaim
|
||||||
71
applications/lionsdev-client/kubernetes/rbac.yaml
Normal file
71
applications/lionsdev-client/kubernetes/rbac.yaml
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
metadata:
|
||||||
|
name: lionsdev-client
|
||||||
|
namespace: lions-apps
|
||||||
|
labels:
|
||||||
|
app: lionsdev-client
|
||||||
|
app.kubernetes.io/name: lionsdev-client
|
||||||
|
app.kubernetes.io/part-of: lions-infrastructure
|
||||||
|
app.kubernetes.io/managed-by: lionsctl
|
||||||
|
automountServiceAccountToken: true
|
||||||
|
---
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
kind: Role
|
||||||
|
metadata:
|
||||||
|
name: lionsdev-client-role
|
||||||
|
namespace: lions-apps
|
||||||
|
labels:
|
||||||
|
app: lionsdev-client
|
||||||
|
app.kubernetes.io/name: lionsdev-client
|
||||||
|
app.kubernetes.io/part-of: lions-infrastructure
|
||||||
|
app.kubernetes.io/managed-by: lionsctl
|
||||||
|
rules:
|
||||||
|
- apiGroups: [""]
|
||||||
|
resources: ["configmaps", "secrets"]
|
||||||
|
verbs: ["get", "list", "watch"]
|
||||||
|
- apiGroups: [""]
|
||||||
|
resources: ["pods"]
|
||||||
|
verbs: ["get", "list", "watch"]
|
||||||
|
- apiGroups: ["apps"]
|
||||||
|
resources: ["deployments", "replicasets"]
|
||||||
|
verbs: ["get", "list", "watch"]
|
||||||
|
- apiGroups: [""]
|
||||||
|
resources: ["services", "endpoints"]
|
||||||
|
verbs: ["get", "list", "watch"]
|
||||||
|
---
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
kind: RoleBinding
|
||||||
|
metadata:
|
||||||
|
name: lionsdev-client-rolebinding
|
||||||
|
namespace: lions-apps
|
||||||
|
labels:
|
||||||
|
app: lionsdev-client
|
||||||
|
app.kubernetes.io/name: lionsdev-client
|
||||||
|
app.kubernetes.io/part-of: lions-infrastructure
|
||||||
|
app.kubernetes.io/managed-by: lionsctl
|
||||||
|
subjects:
|
||||||
|
- kind: ServiceAccount
|
||||||
|
name: lionsdev-client
|
||||||
|
namespace: lions-apps
|
||||||
|
roleRef:
|
||||||
|
kind: Role
|
||||||
|
name: lionsdev-client-role
|
||||||
|
apiGroup: rbac.authorization.k8s.io
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: registry-lions-dev
|
||||||
|
namespace: lions-apps
|
||||||
|
labels:
|
||||||
|
app: lionsdev-client
|
||||||
|
app.kubernetes.io/name: lionsdev-client
|
||||||
|
app.kubernetes.io/part-of: lions-infrastructure
|
||||||
|
app.kubernetes.io/managed-by: lionsctl
|
||||||
|
type: kubernetes.io/dockerconfigjson
|
||||||
|
data:
|
||||||
|
.dockerconfigjson: eyJhdXRocyI6eyJyZWdpc3RyeS5saW9ucy5kZXYiOnsidXNlcm5hbWUiOiJsaW9uc3JlZ2lzdHJ5IiwicGFzc3dvcmQiOiJMaW9uc1JlZ2lzdHJ5MjAyNSEiLCJhdXRoIjoiYkdsdmJuTnlaV2RwYzNSeWVUcE1hVzl1YzFKbFoybHpkSEo1TWpBeU5TRT0ifX19
|
||||||
|
# Base64 encoded Docker config for registry.lions.dev
|
||||||
|
# Username: lionsregistry
|
||||||
|
# Password: LionsRegistry2025!
|
||||||
61
applications/lionsdev-client/kubernetes/secret.yaml
Normal file
61
applications/lionsdev-client/kubernetes/secret.yaml
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: lionsdev-client-secrets
|
||||||
|
namespace: lions-apps
|
||||||
|
labels:
|
||||||
|
app: lionsdev-client
|
||||||
|
app.kubernetes.io/name: lionsdev-client
|
||||||
|
app.kubernetes.io/part-of: lions-infrastructure
|
||||||
|
app.kubernetes.io/managed-by: lionsctl
|
||||||
|
annotations:
|
||||||
|
vault.hashicorp.com/agent-inject: "true"
|
||||||
|
vault.hashicorp.com/role: "lionsdev-client"
|
||||||
|
vault.hashicorp.com/agent-inject-secret-database: "secret/lionsdev-client/database"
|
||||||
|
vault.hashicorp.com/agent-inject-template-database: |
|
||||||
|
{{- with secret "secret/lionsdev-client/database" -}}
|
||||||
|
QUARKUS_DATASOURCE_USERNAME={{ .Data.data.username }}
|
||||||
|
QUARKUS_DATASOURCE_PASSWORD={{ .Data.data.password }}
|
||||||
|
{{- end }}
|
||||||
|
type: Opaque
|
||||||
|
data:
|
||||||
|
# Database credentials (base64 encoded)
|
||||||
|
# These will be injected by Vault in production
|
||||||
|
# Default values for development/testing
|
||||||
|
QUARKUS_DATASOURCE_USERNAME: bGlvbnNfdXNlcg== # lions_user
|
||||||
|
QUARKUS_DATASOURCE_PASSWORD: TGlvbnNEZXYyMDI1IQ== # LionsDev2025!
|
||||||
|
|
||||||
|
# SMTP Configuration for contact forms
|
||||||
|
QUARKUS_MAILER_HOST: c210cC5nbWFpbC5jb20= # smtp.gmail.com
|
||||||
|
QUARKUS_MAILER_PORT: NTg3 # 587
|
||||||
|
QUARKUS_MAILER_USERNAME: Y29udGFjdEBsaW9ucy5kZXY= # contact@lions.dev
|
||||||
|
QUARKUS_MAILER_PASSWORD: "" # Will be injected by Vault
|
||||||
|
|
||||||
|
# JWT Secret for session management
|
||||||
|
JWT_SECRET: TGlvbnNEZXZKV1RTZWNyZXQyMDI1IUVudGVycHJpc2U= # LionsDevJWTSecret2025!Enterprise
|
||||||
|
|
||||||
|
# API Keys for external services
|
||||||
|
GOOGLE_ANALYTICS_ID: "" # Will be injected by Vault
|
||||||
|
GOOGLE_MAPS_API_KEY: "" # Will be injected by Vault
|
||||||
|
|
||||||
|
# Monitoring and observability
|
||||||
|
PROMETHEUS_AUTH_TOKEN: "" # Will be injected by Vault
|
||||||
|
GRAFANA_API_KEY: "" # Will be injected by Vault
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: lionsdev-client-tls
|
||||||
|
namespace: lions-apps
|
||||||
|
labels:
|
||||||
|
app: lionsdev-client
|
||||||
|
app.kubernetes.io/name: lionsdev-client
|
||||||
|
app.kubernetes.io/part-of: lions-infrastructure
|
||||||
|
app.kubernetes.io/managed-by: lionsctl
|
||||||
|
annotations:
|
||||||
|
cert-manager.io/issuer: "letsencrypt-prod"
|
||||||
|
type: kubernetes.io/tls
|
||||||
|
data:
|
||||||
|
# TLS certificate and key will be automatically generated by cert-manager
|
||||||
|
tls.crt: ""
|
||||||
|
tls.key: ""
|
||||||
53
applications/lionsdev-client/kubernetes/service.yaml
Normal file
53
applications/lionsdev-client/kubernetes/service.yaml
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: lionsdev-client-service
|
||||||
|
namespace: lions-apps
|
||||||
|
labels:
|
||||||
|
app: lionsdev-client
|
||||||
|
app.kubernetes.io/name: lionsdev-client
|
||||||
|
app.kubernetes.io/part-of: lions-infrastructure
|
||||||
|
app.kubernetes.io/managed-by: lionsctl
|
||||||
|
annotations:
|
||||||
|
service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
|
||||||
|
prometheus.io/scrape: "true"
|
||||||
|
prometheus.io/port: "8080"
|
||||||
|
prometheus.io/path: "/metrics"
|
||||||
|
spec:
|
||||||
|
type: ClusterIP
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
port: 80
|
||||||
|
targetPort: http
|
||||||
|
protocol: TCP
|
||||||
|
- name: metrics
|
||||||
|
port: 8080
|
||||||
|
targetPort: metrics
|
||||||
|
protocol: TCP
|
||||||
|
selector:
|
||||||
|
app: lionsdev-client
|
||||||
|
sessionAffinity: None
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: lionsdev-client-headless
|
||||||
|
namespace: lions-apps
|
||||||
|
labels:
|
||||||
|
app: lionsdev-client
|
||||||
|
app.kubernetes.io/name: lionsdev-client
|
||||||
|
app.kubernetes.io/part-of: lions-infrastructure
|
||||||
|
app.kubernetes.io/managed-by: lionsctl
|
||||||
|
annotations:
|
||||||
|
service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
|
||||||
|
spec:
|
||||||
|
type: ClusterIP
|
||||||
|
clusterIP: None
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
port: 80
|
||||||
|
targetPort: http
|
||||||
|
protocol: TCP
|
||||||
|
selector:
|
||||||
|
app: lionsdev-client
|
||||||
|
publishNotReadyAddresses: true
|
||||||
212
deploy-lionsdev-client.sh
Normal file
212
deploy-lionsdev-client.sh
Normal file
@@ -0,0 +1,212 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Lions Dev Client Deployment Script
|
||||||
|
# This script deploys the Lions Dev application using lionsctl pipeline
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Configuration
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
LIONSCTL_PATH="${SCRIPT_DIR}/../lions-infrastructure-2025/lionsctl/lionsctl.exe"
|
||||||
|
REPO_URL="https://git.lions.dev/lionsctl-bot/lionsctl-deployments"
|
||||||
|
BRANCH="main"
|
||||||
|
JAVA_VERSION=17
|
||||||
|
NOTIFICATION_EMAIL="gbanedahoud@gmail.com"
|
||||||
|
|
||||||
|
# Colors for output
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# Logging functions
|
||||||
|
log_info() {
|
||||||
|
echo -e "${BLUE}[INFO]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_success() {
|
||||||
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_warning() {
|
||||||
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_error() {
|
||||||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Help function
|
||||||
|
show_help() {
|
||||||
|
cat << EOF
|
||||||
|
Lions Dev Client Deployment Script
|
||||||
|
|
||||||
|
Usage: $0 [OPTIONS]
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
-e, --environment Target environment (dev|staging|production) [default: production]
|
||||||
|
-c, --cluster Target cluster (k1|k2) [default: k2 for production, k1 for dev/staging]
|
||||||
|
-b, --branch Git branch to deploy [default: main]
|
||||||
|
-m, --email Notification email [default: gbanedahoud@gmail.com]
|
||||||
|
-j, --java-version Java version to use [default: 17]
|
||||||
|
-h, --help Show this help message
|
||||||
|
|
||||||
|
EXAMPLES:
|
||||||
|
# Deploy to production (default)
|
||||||
|
$0
|
||||||
|
|
||||||
|
# Deploy to staging
|
||||||
|
$0 --environment staging
|
||||||
|
|
||||||
|
# Deploy to development
|
||||||
|
$0 --environment dev --cluster k1
|
||||||
|
|
||||||
|
# Deploy specific branch to production
|
||||||
|
$0 --branch feature/new-design --environment production
|
||||||
|
|
||||||
|
ENVIRONMENTS:
|
||||||
|
- dev: Development environment on k1 cluster (dev.lions.dev)
|
||||||
|
- staging: Staging environment on k1 cluster (staging.lions.dev)
|
||||||
|
- production: Production environment on k2 cluster (lions.dev)
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse command line arguments
|
||||||
|
ENVIRONMENT="production"
|
||||||
|
CLUSTER=""
|
||||||
|
EMAIL="$NOTIFICATION_EMAIL"
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
-e|--environment)
|
||||||
|
ENVIRONMENT="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-c|--cluster)
|
||||||
|
CLUSTER="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-b|--branch)
|
||||||
|
BRANCH="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-m|--email)
|
||||||
|
EMAIL="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-j|--java-version)
|
||||||
|
JAVA_VERSION="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-h|--help)
|
||||||
|
show_help
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
log_error "Unknown option: $1"
|
||||||
|
show_help
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Set default cluster based on environment if not specified
|
||||||
|
if [[ -z "$CLUSTER" ]]; then
|
||||||
|
case $ENVIRONMENT in
|
||||||
|
production)
|
||||||
|
CLUSTER="k2"
|
||||||
|
;;
|
||||||
|
dev|staging)
|
||||||
|
CLUSTER="k1"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
log_error "Invalid environment: $ENVIRONMENT. Must be dev, staging, or production."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Validate inputs
|
||||||
|
if [[ ! "$ENVIRONMENT" =~ ^(dev|staging|production)$ ]]; then
|
||||||
|
log_error "Invalid environment: $ENVIRONMENT. Must be dev, staging, or production."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! "$CLUSTER" =~ ^(k1|k2)$ ]]; then
|
||||||
|
log_error "Invalid cluster: $CLUSTER. Must be k1 or k2."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if lionsctl exists
|
||||||
|
if [[ ! -f "$LIONSCTL_PATH" ]]; then
|
||||||
|
log_error "lionsctl not found at: $LIONSCTL_PATH"
|
||||||
|
log_info "Please build lionsctl first:"
|
||||||
|
log_info " cd ../lions-infrastructure-2025/lionsctl && go build -o lionsctl.exe"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Display deployment information
|
||||||
|
log_info "🚀 Lions Dev Client Deployment"
|
||||||
|
log_info "================================"
|
||||||
|
log_info "Repository: $REPO_URL"
|
||||||
|
log_info "Branch: $BRANCH"
|
||||||
|
log_info "Environment: $ENVIRONMENT"
|
||||||
|
log_info "Cluster: $CLUSTER"
|
||||||
|
log_info "Java Version: $JAVA_VERSION"
|
||||||
|
log_info "Email: $EMAIL"
|
||||||
|
log_info "================================"
|
||||||
|
|
||||||
|
# Confirm deployment
|
||||||
|
if [[ "$ENVIRONMENT" == "production" ]]; then
|
||||||
|
log_warning "⚠️ You are about to deploy to PRODUCTION!"
|
||||||
|
log_warning "This will affect the live Lions Dev website at https://lions.dev"
|
||||||
|
read -p "Are you sure you want to continue? (y/N): " -n 1 -r
|
||||||
|
echo
|
||||||
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||||
|
log_info "Deployment cancelled."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Execute deployment
|
||||||
|
log_info "🔄 Starting deployment..."
|
||||||
|
|
||||||
|
"$LIONSCTL_PATH" pipeline \
|
||||||
|
--url "$REPO_URL" \
|
||||||
|
--branch "$BRANCH" \
|
||||||
|
--java-version "$JAVA_VERSION" \
|
||||||
|
--environment "$ENVIRONMENT" \
|
||||||
|
--cluster "$CLUSTER" \
|
||||||
|
--mail "$EMAIL" \
|
||||||
|
--verbose
|
||||||
|
|
||||||
|
DEPLOYMENT_STATUS=$?
|
||||||
|
|
||||||
|
if [[ $DEPLOYMENT_STATUS -eq 0 ]]; then
|
||||||
|
log_success "🎉 Deployment completed successfully!"
|
||||||
|
|
||||||
|
case $ENVIRONMENT in
|
||||||
|
production)
|
||||||
|
log_success "✅ Lions Dev is now live at: https://lions.dev"
|
||||||
|
;;
|
||||||
|
staging)
|
||||||
|
log_success "✅ Staging environment is available at: https://staging.lions.dev"
|
||||||
|
;;
|
||||||
|
dev)
|
||||||
|
log_success "✅ Development environment is available at: https://dev.lions.dev"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
log_info "📊 You can monitor the deployment at:"
|
||||||
|
log_info " - Kubernetes Dashboard: https://k8s.lions.dev"
|
||||||
|
log_info " - Grafana Monitoring: https://grafana.lions.dev"
|
||||||
|
log_info " - Application Logs: kubectl logs -n lions-apps -l app=lionsdev-client"
|
||||||
|
|
||||||
|
else
|
||||||
|
log_error "❌ Deployment failed with exit code: $DEPLOYMENT_STATUS"
|
||||||
|
log_info "🔍 Check the logs above for error details"
|
||||||
|
log_info "📧 A notification email has been sent to: $EMAIL"
|
||||||
|
exit $DEPLOYMENT_STATUS
|
||||||
|
fi
|
||||||
Reference in New Issue
Block a user