merge: feature/50-gitea-docker-packages dans develop (images Docker publiées sur le registry Gitea et consommées par compose — évolution #50)

This commit is contained in:
Git Agent
2026-08-30 09:13:58 +02:00
7 changed files with 109 additions and 9 deletions

View File

@ -1,5 +1,9 @@
# Local compose defaults. Copy to .env when you need machine-specific paths. # Local compose defaults. Copy to .env when you need machine-specific paths.
# Images used by docker-compose.yaml.
READABOOK_REGISTRY=gitea.anthonybouteiller.ovh/blomios/readabook
READABOOK_TAG=latest
# Directory mounted read-only as /library in the API container. # Directory mounted read-only as /library in the API container.
READABOOK_LIBRARY_HOST_PATH=./data/library READABOOK_LIBRARY_HOST_PATH=./data/library

View File

@ -19,6 +19,15 @@ RUN pnpm --filter @readabook/api build
RUN pnpm --filter @readabook/api deploy --prod /prod RUN pnpm --filter @readabook/api deploy --prod /prod
FROM node:22-bookworm-slim AS runtime FROM node:22-bookworm-slim AS runtime
ARG OCI_IMAGE_CREATED
ARG OCI_IMAGE_REVISION
ARG OCI_IMAGE_VERSION=latest
LABEL org.opencontainers.image.title="ReadaBook API" \
org.opencontainers.image.description="ReadaBook NestJS API service" \
org.opencontainers.image.source="https://gitea.anthonybouteiller.ovh/blomios/ReadaBook" \
org.opencontainers.image.created="${OCI_IMAGE_CREATED}" \
org.opencontainers.image.revision="${OCI_IMAGE_REVISION}" \
org.opencontainers.image.version="${OCI_IMAGE_VERSION}"
ENV NODE_ENV=production ENV NODE_ENV=production
ENV HOST=0.0.0.0 ENV HOST=0.0.0.0
ENV PORT=3000 ENV PORT=3000

View File

@ -47,7 +47,8 @@ data/
library/ Dossier local à scanner, monté en lecture seule dans compose library/ Dossier local à scanner, monté en lecture seule dans compose
storage/ Cache backend, notamment couvertures extraites storage/ Cache backend, notamment couvertures extraites
Dockerfile Image API Dockerfile Image API
docker-compose.yaml Services API + web docker-compose.yaml Services API + web depuis images publiees
docker-compose.build.yaml Override de build local des images API + web
pnpm-workspace.yaml Workspace monorepo pnpm-workspace.yaml Workspace monorepo
``` ```
@ -72,7 +73,7 @@ Note sandbox constatée : sur Node 24 local, `better-sqlite3` peut nécessiter u
## Docker Compose ## Docker Compose
```bash ```bash
JWT_SECRET="replace-me" docker compose up --build JWT_SECRET="replace-me" docker compose up
``` ```
Services : Services :
@ -85,6 +86,24 @@ Ports :
- Hôte `3000` -> conteneur `web:80`. - Hôte `3000` -> conteneur `web:80`.
- LAPI est accessible depuis le navigateur via les routes proxifiées par Nginx : `/auth`, `/admin`, `/books`, `/progress`, `/healthz`. - LAPI est accessible depuis le navigateur via les routes proxifiées par Nginx : `/auth`, `/admin`, `/books`, `/progress`, `/healthz`.
Images par défaut :
- `${READABOOK_REGISTRY:-gitea.anthonybouteiller.ovh/blomios/readabook}/api:${READABOOK_TAG:-latest}`
- `${READABOOK_REGISTRY:-gitea.anthonybouteiller.ovh/blomios/readabook}/web:${READABOOK_TAG:-latest}`
Pour construire localement au lieu de tirer les images publiées :
```bash
READABOOK_TAG=local docker compose -f docker-compose.yaml -f docker-compose.build.yaml up --build
```
Pour publier les images vers le registry Gitea :
```bash
docker login gitea.anthonybouteiller.ovh
./scripts/publish.sh
```
## Frontend PWA ## Frontend PWA
Le frontend est accessible sur `http://localhost:3000` en compose. Il expose les routes MVP : Le frontend est accessible sur `http://localhost:3000` en compose. Il expose les routes MVP :
@ -108,6 +127,8 @@ Volumes :
Variables principales : Variables principales :
- `READABOOK_REGISTRY` : préfixe registry/repository des images API et web.
- `READABOOK_TAG` : tag dimage utilisé par compose et par `scripts/publish.sh`.
- `JWT_SECRET` : secret JWT, à changer hors développement. - `JWT_SECRET` : secret JWT, à changer hors développement.
- `OPEN_LIBRARY_ENABLED=true|false` : active/désactive lenrichissement distant. - `OPEN_LIBRARY_ENABLED=true|false` : active/désactive lenrichissement distant.
- `READABOOK_LIBRARY_HOST_PATH` : dossier hôte monté en lecture seule sur `/library`. - `READABOOK_LIBRARY_HOST_PATH` : dossier hôte monté en lecture seule sur `/library`.

View File

@ -17,6 +17,15 @@ RUN pnpm --filter @readabook/shared build
RUN pnpm --filter @readabook/web build RUN pnpm --filter @readabook/web build
FROM nginx:1.27-alpine AS runtime FROM nginx:1.27-alpine AS runtime
ARG OCI_IMAGE_CREATED
ARG OCI_IMAGE_REVISION
ARG OCI_IMAGE_VERSION=latest
LABEL org.opencontainers.image.title="ReadaBook Web" \
org.opencontainers.image.description="ReadaBook PWA served by Nginx" \
org.opencontainers.image.source="https://gitea.anthonybouteiller.ovh/blomios/ReadaBook" \
org.opencontainers.image.created="${OCI_IMAGE_CREATED}" \
org.opencontainers.image.revision="${OCI_IMAGE_REVISION}" \
org.opencontainers.image.version="${OCI_IMAGE_VERSION}"
COPY apps/web/nginx/default.conf /etc/nginx/conf.d/default.conf COPY apps/web/nginx/default.conf /etc/nginx/conf.d/default.conf
COPY --from=build /app/apps/web/dist /usr/share/nginx/html COPY --from=build /app/apps/web/dist /usr/share/nginx/html
EXPOSE 80 EXPOSE 80

20
docker-compose.build.yaml Normal file
View File

@ -0,0 +1,20 @@
services:
api:
build:
context: .
dockerfile: Dockerfile
args:
OCI_IMAGE_CREATED: ${OCI_IMAGE_CREATED:-local}
OCI_IMAGE_REVISION: ${OCI_IMAGE_REVISION:-local}
OCI_IMAGE_VERSION: ${READABOOK_TAG:-local}
image: ${READABOOK_REGISTRY:-gitea.anthonybouteiller.ovh/blomios/readabook}/api:${READABOOK_TAG:-local}
web:
build:
context: .
dockerfile: apps/web/Dockerfile
args:
OCI_IMAGE_CREATED: ${OCI_IMAGE_CREATED:-local}
OCI_IMAGE_REVISION: ${OCI_IMAGE_REVISION:-local}
OCI_IMAGE_VERSION: ${READABOOK_TAG:-local}
image: ${READABOOK_REGISTRY:-gitea.anthonybouteiller.ovh/blomios/readabook}/web:${READABOOK_TAG:-local}

View File

@ -1,8 +1,6 @@
services: services:
api: api:
build: image: ${READABOOK_REGISTRY:-gitea.anthonybouteiller.ovh/blomios/readabook}/api:${READABOOK_TAG:-latest}
context: .
dockerfile: Dockerfile
environment: environment:
NODE_ENV: production NODE_ENV: production
PORT: "3000" PORT: "3000"
@ -16,7 +14,7 @@ services:
INITIAL_ADMIN_PASSWORD: ${INITIAL_ADMIN_PASSWORD:-readabook-admin-change-me} INITIAL_ADMIN_PASSWORD: ${INITIAL_ADMIN_PASSWORD:-readabook-admin-change-me}
volumes: volumes:
- ./data:/data - ./data:/data
- /home/anthony/Documents/Projects/ReadaBook/Books:/library:ro - ${READABOOK_LIBRARY_HOST_PATH:-./data/library}:/library:ro
healthcheck: healthcheck:
test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:3000/healthz').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"] test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:3000/healthz').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"]
interval: 10s interval: 10s
@ -25,9 +23,7 @@ services:
start_period: 10s start_period: 10s
web: web:
build: image: ${READABOOK_REGISTRY:-gitea.anthonybouteiller.ovh/blomios/readabook}/web:${READABOOK_TAG:-latest}
context: .
dockerfile: apps/web/Dockerfile
depends_on: depends_on:
api: api:
condition: service_healthy condition: service_healthy

41
scripts/publish.sh Executable file
View File

@ -0,0 +1,41 @@
#!/usr/bin/env bash
set -euo pipefail
REGISTRY="${READABOOK_REGISTRY:-gitea.anthonybouteiller.ovh/blomios/readabook}"
TAG="${READABOOK_TAG:-latest}"
REVISION="${OCI_IMAGE_REVISION:-$(git rev-parse HEAD)}"
CREATED="${OCI_IMAGE_CREATED:-$(date -u +%Y-%m-%dT%H:%M:%SZ)}"
PLATFORM="${DOCKER_BUILD_PLATFORM:-}"
build_args=(
--build-arg "OCI_IMAGE_CREATED=${CREATED}"
--build-arg "OCI_IMAGE_REVISION=${REVISION}"
--build-arg "OCI_IMAGE_VERSION=${TAG}"
)
platform_args=()
if [[ -n "${PLATFORM}" ]]; then
platform_args=(--platform "${PLATFORM}")
fi
echo "Publishing ReadaBook images to ${REGISTRY} with tag ${TAG}"
docker buildx build \
"${platform_args[@]}" \
"${build_args[@]}" \
--tag "${REGISTRY}/api:${TAG}" \
--push \
--file Dockerfile \
.
docker buildx build \
"${platform_args[@]}" \
"${build_args[@]}" \
--tag "${REGISTRY}/web:${TAG}" \
--push \
--file apps/web/Dockerfile \
.
echo "Published:"
echo " ${REGISTRY}/api:${TAG}"
echo " ${REGISTRY}/web:${TAG}"