diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 00000000..00fb6f47 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,13 @@ +FROM python:3.12-slim + +ENV PYTHONDONTWRITEBYTECODE=1 +ENV PYTHONUNBUFFERED=1 + +WORKDIR /app +COPY djau/. . +RUN apt-get update && apt-get install -y git wait-for-it \ + libgl1 \ + libglib2.0-0 && \ + apt clean && rm -rf /var/lib/apt/lists/* + +RUN pip install --upgrade pip && pip install -r requirements.txt diff --git a/docker/Makefile.demo.automatica b/docker/Makefile.demo.automatica index 155374fb..c17b20d5 100644 --- a/docker/Makefile.demo.automatica +++ b/docker/Makefile.demo.automatica @@ -1,7 +1,12 @@ -.PHONY: serve stop down logs +.PHONY: build serve stop down logs # ----------- DEMO ----------- +build: + ${INFO} "Creating builder image..." + @ docker compose -f docker-compose.yml build --no-cache web + ${INFO} "Build completed" + serve: ${INFO} "Running demo services (detached)" @ docker compose -f docker-compose.yml up -d diff --git a/docker/carrega_inicial.sh b/docker/carrega_inicial.sh new file mode 100755 index 00000000..35fe9daa --- /dev/null +++ b/docker/carrega_inicial.sh @@ -0,0 +1,18 @@ +#!/bin/bash +set -e + +wait-for-it db:5432 --timeout=30 --strict + +if [ ! -f /app/storage/.inicialitzat ]; then + echo "Inicialitzant dades ..." + python manage.py migrate + python manage.py collectstatic --noinput + ./scripts/fixtures.sh + python manage.py loaddemodata + touch /app/storage/.inicialitzat +else + echo "Dades ja inicialitzades." +fi + +exec python manage.py runserver 0.0.0.0:8000 + diff --git a/docker/docker-compose.demo.automatica.yml b/docker/docker-compose.demo.automatica.yml index e5b7b5ad..928d302f 100644 --- a/docker/docker-compose.demo.automatica.yml +++ b/docker/docker-compose.demo.automatica.yml @@ -1,7 +1,7 @@ # docker/docker-compose.demo.automatica.yml services: db: - image: postgres:17.7-alpine + image: postgres:16 container_name: demo_db ports: - "5432:5432" @@ -13,15 +13,14 @@ services: POSTGRES_DB: ${DB_NAME} volumes: - pg_data:/var/lib/postgresql/data - - ./dades-demo-sql:/docker-entrypoint-initdb.d restart: always web: image: django_aula:latest container_name: demo_web -# build: -# context: . -# dockerfile: Dockerfile + build: + context: . + dockerfile: Dockerfile depends_on: - db env_file: @@ -31,7 +30,11 @@ services: restart: always ports: - "8000:8000" - command: bash -c "wait-for-it db:5432 --timeout=30 --strict && python manage.py runserver 0.0.0.0:8000" + volumes: + - media_data:/app/storage + command: docker/carrega_inicial.sh volumes: pg_data: + media_data: + diff --git a/docker/install_quick_demo_docker.sh b/docker/install_quick_demo_docker.sh index 0efb204f..e79ba479 100644 --- a/docker/install_quick_demo_docker.sh +++ b/docker/install_quick_demo_docker.sh @@ -14,55 +14,97 @@ clear echo -e "⚙️ Iniciant instal·lació ràpida de la Demo en Docker...\n" echo +# ---------------------------------------------------------------------- +# --- 1.1. CLONACIÓ DEL REPOSITORI +# ---------------------------------------------------------------------- + +echo "------- Clonant repositori ----------------------------" +echo "-------------------------------------------------------" +echo -e "\n" + +# --- Instal·lar git si cal --- + +echo "🔧 Comprovant que 'git' estigui instal·lat..." +if ! command -v git &> /dev/null; then + echo " Instal·lant 'git'..." + sudo apt-get update -y >/dev/null 2>&1 + sudo apt-get install -y git + if ! command -v git &> /dev/null; then + echo " ERROR a la instal·lació de 'git'" + exit 1 + fi +else + echo " ✅ 'git' ja està disponible." +fi + +FULL_PATH="./djau" +REPO_URL="https://github.com/${REPO}.git" # repositori del projecte +GIT_BRANCH=${BRANCA} # Si es vol instal·lar una branca concreta. Exemple: "feat/upgrade-bootstrap" + +# COMPROVACIÓ: El directori existeix i no està buit? +if [ -d "$FULL_PATH" ] && [ "$(ls -A "$FULL_PATH")" ]; then + rm -Rf $FULL_PATH +fi +echo -e "Clonant $REPO_URL, branca '$GIT_BRANCH' en $FULL_PATH." + +# Clonar el repositori com l'usuari de l'aplicació, forçant la branca especificada +git clone -b "$GIT_BRANCH" "$REPO_URL" "$FULL_PATH" + +if [ $? -ne 0 ]; then + echo -e "❌ ERROR: Fallida en clonar la branca '$GIT_BRANCH' del repositori '$REPO_URL'." + echo "Comprovi la URL, conexió a internet o permisos de l'usuari." + echo -e "\n" + exit 1 +fi +echo -e "✅ Repositori clonat (Branca: $GIT_BRANCH) a '$FULL_PATH'." + + +echo -e "\n" +sleep 3 + # --- 2. Fitxers a descarregar --- FILES_TO_DOWNLOAD=( + "Dockerfile" "docker-compose.demo.automatica.yml" "Makefile.demo.automatica" "env.demo.automatica" - "dades_demo.sql" ) DEST_FILES=( + "Dockerfile" "docker-compose.yml" "Makefile" ".env" - "dades-demo-sql/dades_demo.sql" -) + ) # --- 3. Descarregar fitxers de configuració i dades --- echo "📦 Descarregant fitxers necessaris..." -mkdir -p dades-demo-sql for i in "${!FILES_TO_DOWNLOAD[@]}"; do ORIGIN="${FILES_TO_DOWNLOAD[$i]}" DEST="${DEST_FILES[$i]}" - URL="${URL_BASE}/${ORIGIN}" # Crear el directori si no existeix mkdir -p "$(dirname "${DEST}")" echo " -> Descarregant ${ORIGIN} com a ${DEST}..." - if wget -q -O "${DEST}" "${URL}"; then + if cp "${FULL_PATH}/docker/${ORIGIN}" "${DEST}"; then echo " ✅ Fitxer ${DEST} descarregat correctament." else echo " ❌ Error en descarregar ${ORIGIN}." exit 1 fi - # Assignar permisos adequats - if [[ "${DEST}" == *.sql ]]; then - chmod 644 "${DEST}" - fi - echo done echo "✅ Tots els fitxers s'han descarregat correctament." echo -ls -lah docker-compose.yml Makefile .env dades-demo-sql/dades_demo.sql +ls -lah Dockerfile docker-compose.yml Makefile .env + echo @@ -71,7 +113,12 @@ echo echo "🔧 Comprovant que 'make' estigui instal·lat..." if ! command -v make &> /dev/null; then echo " Instal·lant 'make'..." - sudo apt-get update -y >/dev/null 2>&1 && sudo apt-get install -y make + sudo apt-get update -y >/dev/null 2>&1 + sudo apt-get install -y make + if ! command -v make &> /dev/null; then + echo " ERROR a la instal·lació de 'make'" + exit 1 + fi else echo " ✅ 'make' ja està disponible." fi @@ -99,14 +146,6 @@ fi # --- 6. Posar en marxa els contenidors --- -echo -echo "🕓 Posant en marxa els contenidors de la Demo i de la Base de Dades PostgreSQL..." -echo -make serve -echo - -# --- 7. Esperar que la base de dades estigui llesta --- - # Comprovant que l'arxiu .env existeix if [ -f .env ]; then set -a @@ -117,6 +156,15 @@ else exit 1 fi +echo +echo "🕓 Posant en marxa els contenidors de la Demo i de la Base de Dades PostgreSQL..." +echo +make build +make serve +echo + +# --- 7. Esperar que la base de dades estigui llesta --- + echo echo "⌛ Esperant que la base de dades estigui llesta (pot trigar uns segons)..." TIMEOUT=60 @@ -132,22 +180,21 @@ until docker exec demo_db pg_isready -U "$DB_USER" >/dev/null 2>&1; do done echo " ✅ PostgreSQL està llest!" +echo +echo "--------------------------------------------" +echo "📦 Estat final de l'estat dels contenidors" +echo "--------------------------------------------" +docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" +echo "--------------------------------------------" +echo +echo -# --- 8. Comprovació del fitxer SQL --- +# --- 8. Espera a la finalització de la preparació --- -echo -echo "🔍 Comprovant si s'ha carregat el fitxer SQL de dades de la demo..." -DB_LOGS=$(docker logs demo_db 2>&1 | grep -E "docker-entrypoint-initdb.d/.*\.sql" | tail -n 1) +echo "Premi qualsevol tecla per continuar i mostrar el progrés de la preparació de la demo." +read -p "posteriorment CTRL-C per deixar de mostrar la informació." -n1 -s -if [[ "$DB_LOGS" == *".sql"* ]]; then - echo " ✅ Base de dades inicialitzada correctament!" - echo " Fragment del log:" - echo " $DB_LOGS" - else - echo "⚠️ No s'ha trobat cap evidència que s'hagi executat dades_demo.sql" - echo " -> Revisa amb: docker logs demo_db | less" - echo " -> o torna a reiniciar amb: make down && make serve" -fi +docker logs -f demo_web # --- 9. Missatge final --- @@ -155,12 +202,6 @@ echo echo echo "Finalització de l'automatització!" -echo -echo "--------------------------------------------" -echo "📦 Estat final de l'estat dels contenidors" -echo "--------------------------------------------" -docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" -echo "--------------------------------------------" echo echo echo "ℹ️ Informació addicional" diff --git a/install_djau.sh b/install_djau.sh index 715cf205..7596f2c4 100644 --- a/install_djau.sh +++ b/install_djau.sh @@ -17,7 +17,7 @@ REPO_URL="https://github.com/ctrl-alt-d/django-aula.git" # repositori del projec GIT_BRANCH="master" # Si es vol instal·lar una branca concreta. Exemple: "feat/upgrade-bootstrap" # Definició de sistema d'inicialització de processos del Sistema Operatiu (SysVinit vs Systemd) -IS_SYSTEMD=0 # Per defecte, assumim que no és systemd (Debian, etc.) +IS_SYSTEMD=0 # Per defecte, assumim que no és systemd (Devuan, etc.) if command -v systemctl >/dev/null 2>&1; then # La comanda systemctl s'ha trobat: és un sistema amb systemd (Debian, Ubuntu o derivats)