#!/usr/bin/env bash # # Assemble l'arborescence d'exécution à partir d'un dépôt déjà construit. # # Le dépôt et l'instance qui tourne n'ont PAS la même forme : le clone contient # des sources et un `apps/nextjs/.next/standalone` ; l'instance attend # `apps/nextjs/server.js`, `db/migrations/`, `build/better_sqlite3.node` à sa # racine. Ce script fait la conversion — les mêmes COPY que le stage `runner` # du Dockerfile officiel, d'où vient la disposition de /opt/homarr. # # Usage : ops/assemble-standalone.sh # # Construire d'abord : # pnpm turbo build --filter=@homarr/nextjs... --filter=@homarr/cli # set -euo pipefail DEST="${1:?usage: ops/assemble-standalone.sh }" REPO="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "$REPO" [ -d apps/nextjs/.next/standalone ] || { echo "apps/nextjs/.next/standalone absent — construis d'abord :" >&2 echo " pnpm turbo build --filter=@homarr/nextjs... --filter=@homarr/cli" >&2 exit 1 } mkdir -p "$DEST" # L'ordre suit le Dockerfile : le standalone d'abord, le reste par-dessus. cp -a apps/nextjs/.next/standalone/. "$DEST/" mkdir -p "$DEST/apps/nextjs/.next" cp -a apps/nextjs/.next/static "$DEST/apps/nextjs/.next/static" cp -a apps/nextjs/public "$DEST/apps/nextjs/public" cp -a apps/nextjs/next.config.ts apps/nextjs/package.json pnpm-workspace.yaml "$DEST/" mkdir -p "$DEST/apps/cli" cp -a packages/cli/cli.cjs "$DEST/apps/cli/cli.cjs" # Binaire natif : lié à l'architecture et à l'ABI Node de la machine qui a # construit. Assembler et exécuter sur la même machine rend la question sans # objet ; c'est le déploiement à distance qui doit la poser. mkdir -p "$DEST/build" cp -a node_modules/better-sqlite3/build/Release/better_sqlite3.node "$DEST/build/" mkdir -p "$DEST/db" rm -rf "$DEST/db/migrations" cp -a packages/db/migrations "$DEST/db/migrations" # run.sh n'est copié que s'il manque, jamais écrasé. Sur le LXC, l'installateur # a adapté le sien — il annonce le port 80 là où celui du dépôt annonce 7575 — # et l'écraser ferait écouter nginx sur deux ports différents selon la famille # d'adresses. Même raison pour entrypoint.sh, nginx.conf et redis.conf, qui # appartiennent à l'installation et ne sont pas copiés du tout. if [ -f "$DEST/run.sh" ]; then echo "run.sh déjà présent — laissé tel quel (il peut être adapté à cette installation)." if ! diff -q scripts/run.sh "$DEST/run.sh" > /dev/null; then echo " il diffère de scripts/run.sh : \`diff scripts/run.sh $DEST/run.sh\` pour voir quoi." fi else cp -a scripts/run.sh "$DEST/run.sh" chmod +x "$DEST/run.sh" fi echo "Assemblé dans $DEST ($(du -sh "$DEST" | cut -f1))"