chore: add helm chart and docker

This commit is contained in:
Nuxgrid
2026-07-27 21:06:11 +02:00
parent 23a4f280c6
commit 356604fba4
46 changed files with 1390 additions and 0 deletions
+6
View File
@@ -0,0 +1,6 @@
apiVersion: v2
name: gestion-backend
description: Go API backend — gestion-commande
type: application
version: 0.1.0
appVersion: "1.0.0"
+47
View File
@@ -0,0 +1,47 @@
# =========================================================
# Stage 1: Build Go
# =========================================================
FROM golang:1.24-alpine AS builder
WORKDIR /app
RUN apk add --no-cache git ca-certificates tzdata gcc musl-dev
COPY backend/gestion/go.mod backend/gestion/go.sum ./
ENV GOPROXY=https://proxy.golang.org,direct
ENV GOSUMDB=sum.golang.org
ENV CGO_ENABLED=0
RUN go mod download
COPY backend/gestion/ .
RUN CGO_ENABLED=0 GOOS=linux go build \
-ldflags="-w -s -X main.Version=1.0.0 -X main.BuildTime=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
-o /app/server .
# =========================================================
# Stage 2: Runtime
# =========================================================
FROM alpine:latest AS runtime
RUN apk --no-cache add ca-certificates tzdata wget
RUN addgroup -g 101 app && adduser -u 101 -S app -G app
WORKDIR /app
COPY --from=builder /app/server .
COPY --from=builder /usr/share/zoneinfo /usr/share/zoneinfo
COPY helm/backend/entrypoint.sh .
RUN chmod +x entrypoint.sh
RUN mkdir -p /app/uploads/images /app/uploads/videos && \
chown -R app:app /app
USER app
EXPOSE 8080
ENTRYPOINT ["./entrypoint.sh"]
+16
View File
@@ -0,0 +1,16 @@
#!/bin/sh
set -e
# Créer le dossier uploads s'il n'existe pas (le volume le crée en root)
# Puis créer les sous-dossiers
if [ ! -d "/app/uploads" ]; then
mkdir -p /app/uploads
fi
# Créer les sous-répertoires
mkdir -p /app/uploads/images /app/uploads/videos 2>/dev/null || true
echo "✅ Répertoires uploads prêts"
# Lancer l'application
exec ./server
@@ -0,0 +1,21 @@
{{- define "backend.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- define "backend.fullname" -}}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- define "backend.labels" -}}
helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }}
app.kubernetes.io/name: {{ include "backend.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}
{{- define "backend.selectorLabels" -}}
app.kubernetes.io/name: {{ include "backend.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
@@ -0,0 +1,68 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "backend.fullname" . }}
labels:
{{- include "backend.labels" . | nindent 4 }}
spec:
{{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }}
{{- end }}
selector:
matchLabels:
{{- include "backend.selectorLabels" . | nindent 6 }}
template:
metadata:
{{- with .Values.podAnnotations }}
annotations:
{{- toYaml . | nindent 8 }}
{{- end }}
labels:
{{- include "backend.selectorLabels" . | nindent 8 }}
spec:
securityContext:
{{- toYaml .Values.podSecurityContext | nindent 8 }}
containers:
- name: backend
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
securityContext:
{{- toYaml .Values.securityContext | nindent 12 }}
ports:
- name: http
containerPort: 8080
protocol: TCP
envFrom:
- secretRef:
name: {{ include "backend.fullname" . }}-secrets
env:
{{- range $k, $v := .Values.env }}
- name: {{ $k }}
value: {{ $v | quote }}
{{- end }}
{{- if .Values.persistence.uploads.enabled }}
volumeMounts:
- name: uploads
mountPath: /app/uploads
{{- end }}
livenessProbe:
httpGet:
path: /api/v1/app-settings
port: http
initialDelaySeconds: 15
periodSeconds: 30
failureThreshold: 3
readinessProbe:
httpGet:
path: /api/v1/app-settings
port: http
initialDelaySeconds: 5
periodSeconds: 10
resources:
{{- toYaml .Values.resources | nindent 12 }}
{{- if .Values.persistence.uploads.enabled }}
volumes:
- name: uploads
persistentVolumeClaim:
claimName: {{ include "backend.fullname" . }}-uploads
{{- end }}
@@ -0,0 +1,22 @@
{{- if .Values.autoscaling.enabled }}
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: {{ include "backend.fullname" . }}
labels:
{{- include "backend.labels" . | nindent 4 }}
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: {{ include "backend.fullname" . }}
minReplicas: {{ .Values.autoscaling.minReplicas }}
maxReplicas: {{ .Values.autoscaling.maxReplicas }}
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
{{- end }}
@@ -0,0 +1,17 @@
{{- if .Values.persistence.uploads.enabled }}
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: {{ include "backend.fullname" . }}-uploads
labels:
{{- include "backend.labels" . | nindent 4 }}
spec:
accessModes:
- {{ .Values.persistence.uploads.accessMode }}
resources:
requests:
storage: {{ .Values.persistence.uploads.size }}
{{- if .Values.persistence.uploads.storageClass }}
storageClassName: {{ .Values.persistence.uploads.storageClass }}
{{- end }}
{{- end }}
@@ -0,0 +1,11 @@
apiVersion: v1
kind: Secret
metadata:
name: {{ include "backend.fullname" . }}-secrets
labels:
{{- include "backend.labels" . | nindent 4 }}
type: Opaque
stringData:
{{- range $k, $v := .Values.secrets }}
{{ $k }}: {{ $v | quote }}
{{- end }}
@@ -0,0 +1,15 @@
apiVersion: v1
kind: Service
metadata:
name: {{ include "backend.fullname" . }}
labels:
{{- include "backend.labels" . | nindent 4 }}
spec:
type: {{ .Values.service.type }}
selector:
{{- include "backend.selectorLabels" . | nindent 4 }}
ports:
- name: http
port: {{ .Values.service.port }}
targetPort: http
protocol: TCP
+70
View File
@@ -0,0 +1,70 @@
replicaCount: 2
image:
repository: backend-mln
tag: helm
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 8080
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
autoscaling:
enabled: true
minReplicas: 2
maxReplicas: 5
targetCPUUtilizationPercentage: 70
persistence:
uploads:
enabled: true
size: 5Gi
storageClass: ""
accessMode: ReadWriteOnce
env:
DB_HOST: postgres
DB_PORT: "5432"
DB_USER: postgres
DB_NAME: gestion_db
DB_SSLMODE: disable
REDIS_HOST: redis
REDIS_PORT: "6379"
API_PORT: "8080"
# Valeurs sensibles — à surcharger via --set-string ou un Secret Manager externe
secrets:
DB_PASSWORD: ""
SESSION_SECRET: ""
USER_JWT_SECRET: ""
USER_JWT_SECRET_OLD: ""
ADMIN_JWT_SECRET: ""
ADMIN_JWT_SECRET_OLD: ""
REDIS_PASSWORD: ""
TOMTOM_API_KEY: ""
TELEGRAM_WEBHOOK_URL: ""
TELEGRAM_WEBHOOK_SECRET: ""
NOWPAYMENTS_IPN_SECRET: ""
podAnnotations: {}
podSecurityContext:
runAsNonRoot: true
runAsUser: 101
runAsGroup: 101
fsGroup: 101
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: false
capabilities:
drop:
- ALL