#!/bin/bash set -Eeuo pipefail cd /home/container echo "======================================" echo "AccroCBio" echo "======================================" # -------------------------------------- # Configuration .env (sans `source` : mots de passe avec caractères spéciaux) # -------------------------------------- read_env() { local key="$1" value value="$(sed -n "s/^${key}=//p" /home/container/.env 2>/dev/null | tail -n 1 | tr -d '\r' || true)" value="${value#\"}" value="${value%\"}" value="${value#\'}" value="${value%\'}" printf '%s' "$value" } # -------------------------------------- # Mise à jour du projet (comme le start.sh fourni) # -------------------------------------- if [[ ! -d .git ]]; then if [[ -f backend/manage.py && -f frontend/package.json ]]; then echo "Projet présent sans .git : démarrage sans clonage." else REPOSITORY_URL="$(read_env REPOSITORY_URL)" REPOSITORY_URL="${REPOSITORY_URL:-https://gitea.louismazin.ovh/LouisMazin/AccroCBio.git}" if [[ -z "$REPOSITORY_URL" ]]; then echo "Dépôt Git absent : ajoute REPOSITORY_URL au .env ou copie le projet." >&2 exit 1 fi echo "Dépôt Git absent → clonage..." git clone "$REPOSITORY_URL" /tmp/accrocbio-site cp -a /tmp/accrocbio-site/. /home/container/ rm -rf /tmp/accrocbio-site fi else echo "Mise à jour du dépôt Git..." git fetch origin git reset --hard origin/main fi if [[ -d .git ]]; then echo "Git : $(git rev-parse --short HEAD)" fi FRONTEND_PORT="$(read_env FRONTEND_PORT)" BACKEND_PORT="$(read_env BACKEND_PORT)" for variable in FRONTEND_PORT BACKEND_PORT; do value="${!variable}" if ! [[ "$value" =~ ^[1-9][0-9]{0,4}$ ]] || (( value > 65535 )); then echo "Port $variable absent ou incorrect dans .env (attendu : 1 à 65535)." >&2 exit 1 fi done if [[ "$FRONTEND_PORT" == "$BACKEND_PORT" ]]; then echo "Les ports FRONTEND_PORT et BACKEND_PORT doivent être différents." >&2 exit 1 fi export FRONTEND_PORT BACKEND_PORT # Sous Pterodactyl, les deux applications tournent dans le même conteneur. export BACKEND_PROXY_HOST=127.0.0.1 # -------------------------------------- # Backend # -------------------------------------- cd /home/container/backend # Pterodactyl : le systeme Python du conteneur peut etre en lecture seule. # Installer les dependances dans /home/container (persistant et inscriptible), # jamais dans les site-packages systeme. PYTHON_BIN="python3" VENV_DIR="/home/container/.venv" if [[ -x "$VENV_DIR/bin/python" ]] && "$VENV_DIR/bin/python" -m pip --version >/dev/null 2>&1; then PYTHON_BIN="$VENV_DIR/bin/python" else # Nettoie un eventuel venv incomplet (ex. ensurepip absent). rm -rf -- "$VENV_DIR" echo "Creation de l'environnement Python dans $VENV_DIR..." if python3 -m venv --system-site-packages "$VENV_DIR" \ && "$VENV_DIR/bin/python" -m pip --version >/dev/null 2>&1; then PYTHON_BIN="$VENV_DIR/bin/python" else # Certaines images Pterodactyl ne contiennent pas le module venv. # pip --target fonctionne sans droits root ni ecriture dans /usr/local. echo "venv indisponible : installation locale avec pip --target." DEPS_DIR="/home/container/.python-deps" mkdir -p "$DEPS_DIR" export PYTHONPATH="$DEPS_DIR${PYTHONPATH:+:$PYTHONPATH}" PYTHON_BIN="python3" fi fi if [[ "$PYTHON_BIN" == "python3" ]]; then # Repli pour les images sans venv : repertorie accessible en ecriture. echo "Installation des dependances Python dans /home/container/.python-deps..." python3 -m pip install --disable-pip-version-check --no-cache-dir \ --target /home/container/.python-deps --upgrade -r requirements.txt else echo "Installation / verification des dependances dans le venv local..." "$PYTHON_BIN" -m pip install --disable-pip-version-check --no-cache-dir -r requirements.txt fi "$PYTHON_BIN" manage.py check "$PYTHON_BIN" manage.py migrate --noinput "$PYTHON_BIN" manage.py ensure_admin "$PYTHON_BIN" manage.py collectstatic --noinput --verbosity 0 echo "Demarrage Django sur :${BACKEND_PORT}" "$PYTHON_BIN" manage.py runserver "0.0.0.0:${BACKEND_PORT}" --noreload & BACKEND_PID=$! # -------------------------------------- # Frontend # -------------------------------------- cd /home/container/frontend echo "Installation des dépendances frontend..." if [[ -f package-lock.json ]]; then npm ci else npm install fi echo "Build React..." npm run build echo "Démarrage frontend sur :${FRONTEND_PORT}" npm run preview -- --host 0.0.0.0 --port "$FRONTEND_PORT" --strictPort & FRONTEND_PID=$! # -------------------------------------- # Arrêt propre # -------------------------------------- cleanup() { trap - SIGTERM SIGINT EXIT echo "Arrêt des applications..." kill "$BACKEND_PID" "$FRONTEND_PID" 2>/dev/null || true wait "$BACKEND_PID" "$FRONTEND_PID" 2>/dev/null || true } trap cleanup SIGTERM SIGINT EXIT echo "======================================" echo " Frontend : :${FRONTEND_PORT}" echo " Backend : :${BACKEND_PORT}" echo "======================================" wait -n "$BACKEND_PID" "$FRONTEND_PID"