feat: v2.0 – réorg docker/scripts, prod, résas, abonnements Wave, Flyway base vierge

This commit is contained in:
dahoud
2026-01-29 00:44:40 +00:00
parent 9d5e388efa
commit ce89face73
66 changed files with 2333 additions and 227 deletions

42
docker/Dockerfile Normal file
View File

@@ -0,0 +1,42 @@
##
## AfterWork Server - Development Dockerfile
## Image légère avec JRE Alpine (JAR pré-buildé requis)
##
FROM eclipse-temurin:17-jre-alpine
# Variables d'environnement
ENV LANG='en_US.UTF-8' \
QUARKUS_PROFILE=dev \
JAVA_OPTS="-Xmx512m -Xms256m -XX:+UseG1GC"
# Installation des dépendances système
RUN apk add --no-cache curl tzdata && \
cp /usr/share/zoneinfo/Africa/Douala /etc/localtime && \
echo "Africa/Douala" > /etc/timezone
# Création du user non-root
RUN addgroup -g 185 -S appuser && \
adduser -u 185 -S appuser -G appuser
# Création des répertoires
RUN mkdir -p /app /tmp/uploads && \
chown -R appuser:appuser /app /tmp/uploads
WORKDIR /app
# Copie du JAR (context = racine du projet, build après mvn package)
COPY --chown=appuser:appuser target/*-runner.jar /app/app.jar
# Exposition du port
EXPOSE 8080
# Healthcheck
HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \
CMD curl -f http://localhost:8080/q/health/ready || exit 1
# User non-root
USER appuser
# Lancement
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

61
docker/Dockerfile.prod Normal file
View File

@@ -0,0 +1,61 @@
##
## AfterWork Server - Production Dockerfile
## Build stage avec Maven + Runtime optimisé avec UBI8 OpenJDK 17
##
# ======================================
# STAGE 1: Build de l'application
# ======================================
FROM registry.access.redhat.com/ubi8/openjdk-17:1.18 AS builder
USER root
# Installation de Maven
RUN microdnf install -y maven && microdnf clean all
# Copie des fichiers du projet (context = racine du projet)
WORKDIR /build
COPY pom.xml .
COPY src ./src
# Build de l'application (skip tests pour accélérer)
RUN mvn clean package -DskipTests -Dquarkus.package.type=uber-jar
# ======================================
# STAGE 2: Image de runtime
# ======================================
FROM registry.access.redhat.com/ubi8/openjdk-17-runtime:1.18
# Variables d'environnement par défaut
ENV LANG='en_US.UTF-8' \
LANGUAGE='en_US:en' \
TZ='Africa/Douala' \
QUARKUS_PROFILE=prod \
DB_HOST=postgresql \
DB_PORT=5432 \
DB_NAME=afterwork_db \
DB_USERNAME=afterwork \
DB_PASSWORD=changeme \
JAVA_OPTS_APPEND="-XX:+UseG1GC \
-XX:+StringDeduplication \
-XX:+OptimizeStringConcat \
-XX:MaxRAMPercentage=75.0 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/tmp/heapdump.hprof \
-Djava.net.preferIPv4Stack=true"
# Configuration du port
EXPOSE 8080
# Copie de l'uber-jar depuis le builder
COPY --from=builder --chown=185:185 /build/target/*-runner.jar /deployments/app.jar
# User non-root pour la sécurité
USER 185
# Healthcheck sur l'endpoint Quarkus
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD curl -f http://localhost:8080/q/health/ready || exit 1
# Lancement de l'application
ENTRYPOINT ["java", "-jar", "/deployments/app.jar"]

54
docker/README.md Normal file
View File

@@ -0,0 +1,54 @@
# Docker AfterWork
Fichiers Docker pour le build et lexécution de lAPI AfterWork.
## Fichiers
| Fichier | Usage |
|---------|--------|
| `Dockerfile` | Image dev (JAR pré-buildé, Alpine) |
| `Dockerfile.prod` | Image prod (multi-stage Maven + UBI8) |
| `docker-compose.yml` | Stack optionnelle (app + PostgreSQL/Kafka sur lhôte) |
## Build (depuis la racine du projet)
```bash
# Image de production
docker build -f docker/Dockerfile.prod -t afterwork-quarkus:latest .
# Image de dev (après mvn package)
docker build -f docker/Dockerfile -t afterwork-quarkus:dev .
```
## Docker Compose
Utilise le PostgreSQL et Kafka déjà en cours dexécution sur lhôte (host.docker.internal).
**Depuis la racine :**
```bash
docker-compose -f docker/docker-compose.yml up -d
```
**Depuis docker/ :**
```bash
cd docker && docker-compose up -d
```
### PostgreSQL (obligatoire)
Lapplication se connecte à PostgreSQL sur lhôte (`host.docker.internal:5432`). Sans identifiants, lerreur **« no password was provided »** apparaît.
- **Par défaut** (si vous ne définissez rien) : `DB_USERNAME=afterwork`, `DB_PASSWORD=changeme`, `DB_NAME=afterwork_db`.
- Créer la base et lutilisateur dans PostgreSQL, par exemple :
```sql
CREATE USER afterwork WITH PASSWORD 'changeme';
CREATE DATABASE afterwork_db OWNER afterwork;
```
- Ou utiliser **vos** identifiants via un fichier **`.env` à la racine du projet** (mic-after-work-server-impl-quarkus-main) — Docker Compose le charge quand vous lancez depuis cette racine :
```bash
# Contenu de .env à la racine du projet
DB_USERNAME=monuser
DB_PASSWORD=monmotdepasse
DB_NAME=afterwork_db
```
Si vous lancez depuis `docker/` (`cd docker && docker-compose up`), placez le `.env` dans le dossier `docker/`.

26
docker/docker-compose.yml Normal file
View File

@@ -0,0 +1,26 @@
# Dev: mvn quarkus:dev (H2 in-memory, Swagger /q/swagger-ui, Kafka localhost:9092)
# App utilise le PostgreSQL existant (ex: skyfile sur 5432) - créer la DB: CREATE DATABASE afterwork_db;
# Lancer depuis la racine: docker-compose -f docker/docker-compose.yml up -d
# Ou depuis docker/: docker-compose up -d
#
# PostgreSQL: définir DB_USERNAME/DB_PASSWORD si votre instance utilise d'autres identifiants.
# Exemple .env à la racine docker/ : DB_USERNAME=monuser DB_PASSWORD=monmotdepasse
services:
app:
build:
context: ..
dockerfile: docker/Dockerfile.prod
image: afterwork-quarkus:latest
container_name: afterwork-quarkus
environment:
QUARKUS_PROFILE: prod
DB_HOST: host.docker.internal
DB_PORT: "5432"
DB_NAME: "${DB_NAME:-afterwork_db}"
DB_USERNAME: "${DB_USERNAME:-afterwork}"
DB_PASSWORD: "${DB_PASSWORD:-changeme}"
KAFKA_BOOTSTRAP_SERVERS: host.docker.internal:9092
JAVA_OPTS_APPEND: "-Dquarkus.http.host=0.0.0.0"
ports:
- "8080:8080"
restart: unless-stopped