From cdefbe3a81d5439c0d7c9e2aafa5a0bc9161e16e Mon Sep 17 00:00:00 2001 From: Gato Date: Mon, 15 Jun 2026 06:42:46 +0200 Subject: [PATCH] tech: ajout repo avec build main Signed-off-by: Gato --- bonsai/.env.example | 4 ++ bonsai/Dockerfile.api | 17 ++++++++ bonsai/Dockerfile.webapp | 16 ++++++++ bonsai/README.md | 53 +++++++++++++++++++++++++ bonsai/docker-compose.yml | 83 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 173 insertions(+) create mode 100644 bonsai/.env.example create mode 100644 bonsai/Dockerfile.api create mode 100644 bonsai/Dockerfile.webapp create mode 100644 bonsai/README.md create mode 100644 bonsai/docker-compose.yml diff --git a/bonsai/.env.example b/bonsai/.env.example new file mode 100644 index 0000000..635bf4b --- /dev/null +++ b/bonsai/.env.example @@ -0,0 +1,4 @@ +# Mot de passe PostgreSQL partagé entre le container db et l'API Spring Boot. +# Copier ce fichier en .env et définir une valeur sécurisée avant de démarrer. +# cp .env.example .env +POSTGRES_PASSWORD=changeme diff --git a/bonsai/Dockerfile.api b/bonsai/Dockerfile.api new file mode 100644 index 0000000..bde64c5 --- /dev/null +++ b/bonsai/Dockerfile.api @@ -0,0 +1,17 @@ +# syntax=docker/dockerfile:1 + +FROM eclipse-temurin:25-jdk AS builder +RUN apt-get update && apt-get install -y git openssh-client && rm -rf /var/lib/apt/lists/* +RUN mkdir -p /root/.ssh && \ + ssh-keyscan -p 2222 git.goutailler-olivier.com >> /root/.ssh/known_hosts +RUN --mount=type=ssh \ + --mount=type=cache,target=/root/.gradle \ + git clone --depth 1 --branch main \ + ssh://git@git.goutailler-olivier.com:2222/Gato/Bonsai-api.git /src && \ + cd /src && ./gradlew bootJar --no-daemon -q + +FROM eclipse-temurin:25-jre-alpine +WORKDIR /app +COPY --from=builder /src/build/libs/*.jar app.jar +EXPOSE 8080 +ENTRYPOINT ["java", "-jar", "app.jar"] diff --git a/bonsai/Dockerfile.webapp b/bonsai/Dockerfile.webapp new file mode 100644 index 0000000..a7715dd --- /dev/null +++ b/bonsai/Dockerfile.webapp @@ -0,0 +1,16 @@ +# syntax=docker/dockerfile:1 + +FROM node:22-alpine AS builder +RUN apk add --no-cache git openssh +RUN mkdir -p /root/.ssh && \ + ssh-keyscan -p 2222 git.goutailler-olivier.com >> /root/.ssh/known_hosts +RUN --mount=type=ssh \ + --mount=type=cache,target=/root/.npm \ + git clone --depth 1 --branch main \ + ssh://git@git.goutailler-olivier.com:2222/Gato/Bonsai-webapp.git /src && \ + cd /src && npm ci --cache /root/.npm && npm run build + +FROM nginx:alpine +COPY --from=builder /src/dist/Bonsai-webapp/browser /usr/share/nginx/html +COPY --from=builder /src/nginx.conf /etc/nginx/conf.d/default.conf +EXPOSE 80 diff --git a/bonsai/README.md b/bonsai/README.md new file mode 100644 index 0000000..6c2661a --- /dev/null +++ b/bonsai/README.md @@ -0,0 +1,53 @@ +# Bonsai — Stack complète + +Stack Docker Compose unifiée pour l'application Bonsai : base de données, API et webapp. + +Les images sont **buildées depuis les sources** de la branche `main` de chaque dépôt au moment du build. + +## Services + +| Service | Image de base | Source | +|---------|--------------|--------| +| `db` | `postgres:16-alpine` | — | +| `api` | `eclipse-temurin:25-jdk` → `25-jre-alpine` | `Bonsai-api` (branche `main`) | +| `webapp` | `node:22-alpine` → `nginx:alpine` | `Bonsai-webapp` (branche `main`) | + +## Prérequis + +- Docker avec BuildKit activé (Docker 23+) +- Accès SSH au dépôt Gitea (`git.goutailler-olivier.com:2222`) avec la clé chargée dans l'agent +- Réseau Docker externe `proxy` (Traefik) + +## Démarrage + +```bash +# 1. Configurer les variables d'environnement +cp .env.example .env +# Éditer .env et définir POSTGRES_PASSWORD + +# 2. S'assurer que la clé SSH est chargée +ssh-add ~/.ssh/ + +# 3. Builder les images (clone + compile) +docker compose build --ssh default + +# 4. Démarrer la stack +docker compose up -d +``` + +## Mise à jour + +Pour rebuilder depuis le dernier commit de `main` : + +```bash +docker compose build --ssh default --no-cache +docker compose up -d +``` + +## Arrêt + +```bash +docker compose down +``` + +Les données PostgreSQL sont persistées dans `~/Applications/data/bonsai/db_data` et les fichiers uploadés dans `~/Applications/data/bonsai/uploads`. diff --git a/bonsai/docker-compose.yml b/bonsai/docker-compose.yml new file mode 100644 index 0000000..c351c13 --- /dev/null +++ b/bonsai/docker-compose.yml @@ -0,0 +1,83 @@ +name: bonsai + +services: + db: + image: postgres:16-alpine + container_name: bonsai-db + restart: unless-stopped + environment: + POSTGRES_DB: bonsai + POSTGRES_USER: bonsai + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + TZ: Europe/Paris + healthcheck: + test: ["CMD-SHELL", "pg_isready -U bonsai -d bonsai"] + interval: 10s + timeout: 5s + retries: 5 + volumes: + - ~/Applications/data/bonsai/db_data:/var/lib/postgresql/data + networks: + - bonsai-net + + api: + build: + context: . + dockerfile: Dockerfile.api + ssh: + - default + container_name: bonsai-api + restart: unless-stopped + depends_on: + db: + condition: service_healthy + environment: + DATASOURCE_URL: jdbc:postgresql://db:5432/bonsai + DATASOURCE_USERNAME: bonsai + DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD} + KEYCLOAK_JWKS_URI: https://auth.goutailler-olivier.com/realms/bonsai/protocol/openid-connect/certs + CORS_ALLOWED_ORIGIN_PROD: https://bonsai.goutailler-olivier.com + SERVER_SERVLET_CONTEXT_PATH: /api + TZ: Europe/Paris + volumes: + - ~/Applications/data/bonsai/uploads:/app/uploads + networks: + - bonsai-net + - proxy + labels: + - traefik.enable=true + - traefik.http.routers.bonsai-api.rule=Host(`bonsai.goutailler-olivier.com`) && PathPrefix(`/api`) + - traefik.http.routers.bonsai-api.entrypoints=websecure + - traefik.http.routers.bonsai-api.tls.certresolver=le + - traefik.http.services.bonsai-api.loadbalancer.server.port=8080 + - traefik.docker.network=proxy + + webapp: + build: + context: . + dockerfile: Dockerfile.webapp + ssh: + - default + container_name: bonsai-webapp + restart: unless-stopped + depends_on: + - api + environment: + TZ: Europe/Paris + networks: + - bonsai-net + - proxy + labels: + - traefik.enable=true + - traefik.http.routers.bonsai-webapp.rule=Host(`bonsai.goutailler-olivier.com`) + - traefik.http.routers.bonsai-webapp.entrypoints=websecure + - traefik.http.routers.bonsai-webapp.tls.certresolver=le + - traefik.http.services.bonsai-webapp.loadbalancer.server.port=80 + - traefik.docker.network=proxy + +networks: + bonsai-net: + driver: bridge + proxy: + external: true + name: proxy