feat: v2.0 – réorg docker/scripts, prod, résas, abonnements Wave, Flyway base vierge
This commit is contained in:
42
docker/Dockerfile
Normal file
42
docker/Dockerfile
Normal 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
61
docker/Dockerfile.prod
Normal 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
54
docker/README.md
Normal file
@@ -0,0 +1,54 @@
|
||||
# Docker AfterWork
|
||||
|
||||
Fichiers Docker pour le build et l’exécution de l’API 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 l’hô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 d’exécution sur l’hô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)
|
||||
|
||||
L’application se connecte à PostgreSQL sur l’hôte (`host.docker.internal:5432`). Sans identifiants, l’erreur **« 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 l’utilisateur 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
26
docker/docker-compose.yml
Normal 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
|
||||
Reference in New Issue
Block a user