1+ {#
2+ =======================================================================
3+ MASTER TEMPLATE for Frontend + Backend Application
4+ =======================================================================
5+ This single file contains all Kubernetes resources for the application.
6+
7+ ### HOW TO USE ###
8+ 1. Edit the variables in the "CONFIGURATION" section below.
9+ 2. Generate the final YAML with: j2 app.j2 > kubernetes.yml
10+ 3. Deploy with: kubectl apply -f kubernetes.yml
11+ =======================================================================
12+ #}
13+
14+ {# --- CONFIGURATION SECTION --- #}
15+ {# Edit the values in this section to configure your deployment. #}
16+
17+ {% set backend = {
18+ "name" : "todo-backend" ,
19+ "replicas" : 1,
20+ "image" : {
21+ "repository" : "docker0y4sh/todo-backend" ,
22+ "tag" : "latest"
23+ },
24+ "containerPort" : 8080,
25+ "resources" : {
26+ "requests" : { "memory" : "128Mi" , "cpu" : "100m" },
27+ "limits" : { "memory" : "256Mi" , "cpu" : "250m" }
28+ }
29+ } %}
30+
31+ {% set frontend = {
32+ "name" : "todo-frontend" ,
33+ "replicas" : 1,
34+ "image" : {
35+ "repository" : "docker0y4sh/todo-frontend" ,
36+ "tag" : "latest"
37+ },
38+ "containerPort" : 80,
39+ "resources" : {
40+ "requests" : { "memory" : "32Mi" , "cpu" : "50m" },
41+ "limits" : { "memory" : "64Mi" , "cpu" : "100m" }
42+ }
43+ } %}
44+
45+ {# -- Shared Ingress Configuration -- #}
46+ {% set ingress = {
47+ "host" : "toptodoapp.tech" ,
48+ "className" : "nginx" ,
49+ "tlsSecretName" : "toptodoapp-tls-secret" ,
50+ "issuerName" : "letsencrypt-staging"
51+ } %}
52+
53+ {# --- END OF CONFIGURATION --- #}
54+
55+
56+ # ==========================================================
57+ # Kubernetes Resources (Generated from the config above)
58+ # ==========================================================
59+
60+ # --- Backend Service ---
61+ apiVersion: v1
62+ kind: Service
63+ metadata:
64+ name: {{ backend.name }}-service
65+ spec:
66+ selector:
67+ app: {{ backend.name }}
68+ ports:
69+ - protocol: TCP
70+ port: {{ backend.containerPort }}
71+ targetPort: {{ backend.containerPort }}
72+ ---
73+ # --- Backend Deployment ---
74+ apiVersion: apps/v1
75+ kind: Deployment
76+ metadata:
77+ name: {{ backend.name }}-deployment
78+ spec:
79+ replicas: {{ backend.replicas }}
80+ selector:
81+ matchLabels:
82+ app: {{ backend.name }}
83+ template:
84+ metadata:
85+ labels:
86+ app: {{ backend.name }}
87+ spec:
88+ containers:
89+ - name: {{ backend.name }}-container
90+ image: "{{ backend.image.repository }}:{{ backend.image.tag }}"
91+ imagePullPolicy: Always
92+ ports:
93+ - containerPort: {{ backend.containerPort }}
94+ # Add env vars for database connection here if needed
95+ resources:
96+ requests:
97+ memory: "{{ backend.resources.requests.memory }}"
98+ cpu: "{{ backend.resources.requests.cpu }}"
99+ limits:
100+ memory: "{{ backend.resources.limits.memory }}"
101+ cpu: "{{ backend.resources.limits.cpu }}"
102+ ---
103+ # --- Frontend Service ---
104+ apiVersion: v1
105+ kind: Service
106+ metadata:
107+ name: {{ frontend.name }}-service
108+ spec:
109+ selector:
110+ app: {{ frontend.name }}
111+ ports:
112+ - protocol: TCP
113+ port: {{ frontend.containerPort }}
114+ targetPort: {{ frontend.containerPort }}
115+ ---
116+ # --- Frontend Deployment ---
117+ apiVersion: apps/v1
118+ kind: Deployment
119+ metadata:
120+ name: {{ frontend.name }}-deployment
121+ spec:
122+ replicas: {{ frontend.replicas }}
123+ selector:
124+ matchLabels:
125+ app: {{ frontend.name }}
126+ template:
127+ metadata:
128+ labels:
129+ app: {{ frontend.name }}
130+ spec:
131+ containers:
132+ - name: {{ frontend.name }}-container
133+ image: "{{ frontend.image.repository }}:{{ frontend.image.tag }}"
134+ imagePullPolicy: Always
135+ ports:
136+ - containerPort: {{ frontend.containerPort }}
137+ resources:
138+ requests:
139+ memory: "{{ frontend.resources.requests.memory }}"
140+ cpu: "{{ frontend.resources.requests.cpu }}"
141+ limits:
142+ memory: "{{ frontend.resources.limits.memory }}"
143+ cpu: "{{ frontend.resources.limits.cpu }}"
144+ ---
145+ # --- Ingress ---
146+ # This single Ingress directs traffic to both services.
147+ apiVersion: networking.k8s.io/v1
148+ kind: Ingress
149+ metadata:
150+ name: toptodoapp-ingress
151+ annotations:
152+ cert-manager.io/cluster-issuer: {{ ingress.issuerName }}
153+ spec:
154+ ingressClassName: {{ ingress.className }}
155+ tls:
156+ - hosts:
157+ - {{ ingress.host }}
158+ secretName: {{ ingress.tlsSecretName }}
159+ rules:
160+ - host: {{ ingress.host }}
161+ http:
162+ paths:
163+ # Path for the API backend
164+ - path: /api
165+ pathType: Prefix
166+ backend:
167+ service:
168+ name: {{ backend.name }}-service
169+ port:
170+ number: {{ backend.containerPort }}
171+ # Default path for the frontend
172+ - path: /
173+ pathType: Prefix
174+ backend:
175+ service:
176+ name: {{ frontend.name }}-service
177+ port:
178+ number: {{ frontend.containerPort }}
0 commit comments