tech: ajout repo avec build main
Signed-off-by: Gato <cedric@goutailler-olivier.fr>
This commit is contained in:
@@ -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
|
||||||
@@ -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"]
|
||||||
@@ -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
|
||||||
@@ -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/<ta_cle>
|
||||||
|
|
||||||
|
# 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`.
|
||||||
@@ -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
|
||||||
Reference in New Issue
Block a user