Skip to content

Commit 675e8a9

Browse files
authored
Merge pull request #353 from rafatecno1/millora-demo
Millora del flux d'instal·lació Demo Docker i experiència d'usuari (UX)
2 parents c2cff3b + 996a867 commit 675e8a9

File tree

7 files changed

+300
-235
lines changed

7 files changed

+300
-235
lines changed

README.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ Gestió de presència, incidències i més per a Instituts, Escoles i Acadèmies
2121

2222
- [1. Introducció](#introduccio)
2323
- [2. Requisits del sistema operatiu per instal·lar Django-Aula](#requisits)
24-
- [3. Desplegament d'una Demostració de Django-Aula (Quick Demo) amb Docker 🐳 ](#quickdemo)
24+
- [3. Desplegament d'una Demostració de Django-Aula amb Docker 🐳 ](#demodocker)
2525
- [4. Instal·lació i càrrega de dades de Django-Aula per ús real a un Centre Educatiu](#produccio)
2626
- [5. Equip Desenvolupador i Suport Tècnic](#dev-suport-tecnic)
2727

@@ -54,10 +54,10 @@ Per qualsevol tipus d'instal·lació, ja sigui per un ús real o per l'entorn de
5454

5555
---
5656

57-
<a name="quickdemo"></a>
58-
## Desplegament d'una Demostració de Django-Aula (Quick Demo) amb Docker 🐳
57+
<a name="demodocker"></a>
58+
## Desplegament d'una Demostració de Django-Aula amb Docker 🐳
5959

60-
L'entorn de demostració, conegut com Demo, és una versió funcional del sistema i que es pot posar en funcionament en molt pocs minuts. Disposa de dades fictícies (usuaris, professors, alumnat i un horari mínim) que faciliten observar l'aspecte visual i interaccionar, des de diferents rols, amb les funcionalitats de l'aplicatiu real Django-Aula.
60+
L'entorn de demostració, conegut com Demo, és una versió funcional del sistema i que es pot posar en funcionament en pocs minuts. Disposa de dades fictícies (usuaris, professors, alumnat i un horari mínim) que faciliten observar l'aspecte visual i interaccionar, des de diferents rols, amb les funcionalitats de l'aplicatiu real Django-Aula.
6161

6262
El desplegament de la Demo s'ha automatitzat amb l'execució de dues comandes i consta de dues passes consecutives:
6363

@@ -78,17 +78,17 @@ Es recomana crear un subdirectori dins el directori de l'usuari instal·lador pe
7878

7979
```bash
8080
mkdir demo-djau-docker && cd demo-djau-docker && \
81-
wget -q -O install_quick_demo_docker.sh https://raw.githubusercontent.com/ctrl-alt-d/django-aula/refs/heads/master/docker/install_quick_demo_docker.sh && \
82-
chmod +x install_quick_demo_docker.sh && \
83-
bash ./install_quick_demo_docker.sh
81+
wget -q -O install_demo_docker.sh https://raw.githubusercontent.com/ctrl-alt-d/django-aula/refs/heads/master/docker/install_demo_docker.sh && \
82+
chmod +x install_demo_docker.sh && \
83+
bash ./install_demo_docker.sh
8484
```
8585

86-
Tot i que el procés anterior és autònom i interactivament configurable, es recomana llegir la informació, molt més detallada del procés, segons el tipus de màquina (no virtualitzada, virtualitzada o servidor d'accés públic) on s'instal·larà la Demo. També hi haurà qui estarà interessat en dur a terme la instal·lació manual, tant de l'entorn de docker com de la Demo. Per tots aquests casos es recomana consultar els següents detallats documents:
86+
Tot i que el procés anterior és autònom i interactivament configurable, es recomana llegir la informació, molt més detallada del procés, segons el tipus de màquina (no virtualitzada, virtualitzada o servidor d'accés públic) on s'instal·larà la Demo. També hi haurà qui estarà interessat en dur a terme la instal·lació manual, tant de l'entorn de Docker com de la Demo. Per tots aquests casos es recomana consultar els següents detallats documents:
8787

8888

89-
➡️ **[Instal·lació de l'entorn de Docker i Docker Compose](docs/USER_MANUAL/demo/install_entorn_docker.md)**.
89+
➡️ **[Instal·lació automatitzada de l'entorn de Docker i Docker Compose](docs/USER_MANUAL/demo/install_entorn_docker.md)**.
9090

91-
➡️ **[Instal·lació ràpida de la Demo amb Docker](docs/USER_MANUAL/demo/install_demo_docker.md)**.
91+
➡️ **[Instal·lació automatitzada de la Demo amb Docker](docs/USER_MANUAL/demo/install_demo_docker.md)**.
9292

9393
➡️ **[Instal·lació manual de la Demo (sense Docker)](docs/USER_MANUAL/demo/install_demo_manual.md)**.
9494

docker/Dockerfile

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,13 @@ ENV PYTHONUNBUFFERED=1
55

66
WORKDIR /app
77
COPY djau/. .
8-
RUN apt-get update && apt-get install -y git wait-for-it \
8+
RUN apt-get update && apt-get install -y \
9+
git \
10+
# wait-for-it \
11+
postgresql-client \
912
libgl1 \
1013
libglib2.0-0 && \
11-
apt clean && rm -rf /var/lib/apt/lists/*
14+
apt clean && \
15+
rm -rf /var/lib/apt/lists/*
1216

1317
RUN pip install --upgrade pip && pip install -r requirements.txt

docker/carrega_inicial.old

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#!/bin/bash
2+
set -e
3+
4+
wait-for-it db:5432 --timeout=30 --strict
5+
6+
if [ ! -f /app/storage/.inicialitzat ]; then
7+
echo "Inicialitzant dades ..."
8+
python manage.py migrate
9+
python manage.py collectstatic --noinput
10+
./scripts/fixtures.sh
11+
python manage.py loaddemodata
12+
touch /app/storage/.inicialitzat
13+
else
14+
echo "Dades ja inicialitzades."
15+
fi
16+
17+
exec python manage.py runserver 0.0.0.0:8000
18+

docker/carrega_inicial.sh

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,44 @@
11
#!/bin/bash
22
set -e
3+
echo "Mostrant 'logs'..."
4+
echo
5+
echo "⌛ Esperant que la base de dades estigui operativa..."
36

4-
wait-for-it db:5432 --timeout=30 --strict
7+
TIMEOUT=60
8+
COUNT=0
9+
10+
# Utilitzem pg_isready per minimitzar el temps d'espera fent la comprovació amb motor de postgres
11+
until pg_isready -h db -U "$DB_USER" >/dev/null 2>&1; do
12+
sleep 1
13+
((COUNT+=1))
14+
15+
if [ $COUNT -ge $TIMEOUT ]; then
16+
echo "❌ ERROR: La base de dades no ha respost en $TIMEOUT segons."
17+
echo " El procés d'inicialització s'ha aturat. Revisa els logs amb: 'docker logs demo_db' o amb 'make logs'."
18+
exit 1
19+
fi
20+
done
21+
22+
echo "✅ PostgreSQL està llest! (El procés de preparació ha trigat $COUNT segons)"
23+
echo
24+
echo "📦 Aplicant migracions i preparant dades..."
25+
echo
526

627
if [ ! -f /app/storage/.inicialitzat ]; then
728
echo "Inicialitzant dades ..."
829
python manage.py migrate
30+
echo -e "\n"
931
python manage.py collectstatic --noinput
32+
echo -e "\n"
1033
./scripts/fixtures.sh
34+
echo -e "\n"
1135
python manage.py loaddemodata
1236
touch /app/storage/.inicialitzat
1337
else
14-
echo "Dades ja inicialitzades."
38+
echo "Les dades ja s'havien inicialitzant anteriorment."
1539
fi
16-
40+
echo
41+
echo "Engengant el servidor de desenvolupament..."
42+
echo
1743
exec python manage.py runserver 0.0.0.0:8000
1844

docker/install_demo_docker.sh

Lines changed: 235 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,235 @@
1+
#!/bin/bash
2+
# -------------------------------------------------------------
3+
# Script per a la instal·lació de la Demo Docker de django-aula.
4+
# Descarrega els fitxers de configuració i comprova la base de dades.
5+
# -------------------------------------------------------------
6+
7+
# --- 0. Configuració de rutes i repositori
8+
9+
# Ruta on s'executa el script (Directori arrel de la instal·lació)
10+
BASE_DIR=$(pwd)
11+
12+
# Dades del repositori
13+
REPO_USER="ctrl-alt-d"
14+
REPO_NAME="django-aula"
15+
REPO_BRANCA="master"
16+
17+
# Rutes locals
18+
DJAU_PATH="${BASE_DIR}/djau"
19+
DOCKER_SRC="${DJAU_PATH}/docker"
20+
FUNCTION_PATH="${DJAU_PATH}/setup_djau"
21+
22+
# URLs
23+
REPO_URL="https://github.com/${REPO_USER}/${REPO_NAME}.git"
24+
25+
clear
26+
echo "---------------------------------------------------------------"
27+
echo "--- Instal·lador automàtic de la Demo Docker de django-aula ---"
28+
echo "--- Branca: $REPO_BRANCA | Arrel: $BASE_DIR ---"
29+
echo "---------------------------------------------------------------"
30+
echo
31+
sleep 1
32+
33+
# --- 1. Clonació del repositori
34+
35+
# Instal·lar git, si cal.
36+
37+
echo "🔧 Comprovant que 'git' estigui instal·lat..."
38+
if ! command -v git &> /dev/null; then
39+
echo " Instal·lant 'git'..."
40+
sudo apt-get update -y >/dev/null 2>&1
41+
sudo apt-get install -y git
42+
if ! command -v git &> /dev/null; then
43+
echo " ERROR a la instal·lació de 'git'"
44+
exit 1
45+
fi
46+
else
47+
echo " ✅ 'git' ja està disponible."
48+
fi
49+
echo -e "\n"
50+
51+
# COMPROVACIÓ: El directori existeix i no està buit?
52+
if [ -d "$DJAU_PATH" ] && [ "$(ls -A "$DJAU_PATH")" ]; then
53+
rm -Rf $DJAU_PATH
54+
fi
55+
56+
echo -e "Clonant $REPO_URL, branca '$REPO_BRANCA' en $DJAU_PATH."
57+
echo
58+
59+
# Clonar el repositori com l'usuari de l'aplicació, forçant la branca especificada i amb profunditat mínima (no interessa tot l'historial)
60+
git clone --depth 1 -b "$REPO_BRANCA" "$REPO_URL" "$DJAU_PATH"
61+
62+
if [ $? -ne 0 ]; then
63+
echo -e "❌ ERROR: Fallida en clonar la branca '$REPO_BRANCA' del repositori '$REPO_URL'."
64+
echo "Comprovi la URL, conexió a internet o permisos de l'usuari."
65+
echo -e "\n"
66+
exit 1
67+
fi
68+
echo
69+
echo -e "✅ Repositori clonat (Branca: $REPO_BRANCA) a '$DJAU_PATH'."
70+
71+
echo -e "\n"
72+
sleep 2
73+
74+
# Carrega de la llibreria de funcions
75+
echo "Important variables de colors i funcions de la llibreria 'functions.sh'"
76+
if [ -f "$FUNCTION_PATH/functions.sh" ]; then
77+
source "$FUNCTION_PATH/functions.sh"
78+
echo -e "${C_EXITO}✅ Llibreria de funcions carregada amb èxit.${RESET}"
79+
else
80+
echo -e "\n\e[31m\e[1m❌ ERROR:\e[0m No s'ha trobat l'arxiu functions.sh dins el directori $FUNCTION_PATH."
81+
echo "No es pot continuar sense la llibreria de funcions."
82+
exit 1
83+
fi
84+
echo -e "\n"
85+
86+
# --- 2. Fitxers a descarregar ---
87+
88+
FILES_ORIGIN=(
89+
"Dockerfile"
90+
"docker-compose.demo.automatica.yml"
91+
"Makefile.demo.automatica"
92+
"env.demo.automatica"
93+
)
94+
FILES_DEST=(
95+
"Dockerfile"
96+
"docker-compose.yml"
97+
"Makefile"
98+
".env"
99+
)
100+
101+
# --- 3. Descarregar fitxers de configuració i dades ---
102+
103+
echo -e "${C_INFO}📦 Preparant fitxers pel desplegament des de ${DOCKER_SRC}...${RESET}"
104+
echo
105+
106+
for i in "${!FILES_ORIGIN[@]}"; do
107+
SRC="${DOCKER_SRC}/${FILES_ORIGIN[$i]}"
108+
DST="${BASE_DIR}/${FILES_DEST[$i]}"
109+
110+
if [ -f "$SRC" ]; then
111+
cp "$SRC" "$DST"
112+
echo -e "${C_EXITO}${FILES_DEST[$i]} preparat.${RESET}"
113+
else
114+
echo -e "${C_ERROR} ❌ No s'ha trobat l'origen: ${FILES_ORIGIN[$i]}${RESET}"
115+
exit 1
116+
fi
117+
done
118+
119+
echo
120+
echo -e "${C_EXITO}✅ Tots els fitxers s'han descarregat correctament. Com a comprovació es llista el contingut del directori:${RESET}"
121+
ls -lah Dockerfile docker-compose.yml Makefile .env
122+
123+
echo
124+
125+
# --- 4. Instal·lar make si cal ---
126+
127+
echo -e "${C_INFO}🔧 Comprovant que 'make' estigui instal·lat...${RESET}"
128+
if ! command -v make &> /dev/null; then
129+
echo -e "${C_INFO} Instal·lant 'make'...${RESET}"
130+
sudo apt-get update -y >/dev/null 2>&1
131+
sudo apt-get install -y make
132+
if ! command -v make &> /dev/null; then
133+
finalitzar_amb_error " Error a la instal·lació de 'make'"
134+
fi
135+
else
136+
echo -e "${C_EXITO} ✅ 'make' ja està disponible.${RESET}"
137+
fi
138+
139+
# --- 5. Pregunta pel domini o IP ---
140+
141+
echo
142+
echo -e "${C_INFO}🌍 Si la Demo ha de funcionar en una xarxa local cal definir quina IP té. Si es vol instal·lar en un servidor en internet (VPS) caldrà informar de la seva IP pública i del domini o subdomini, si n'hi ha.${RESET}"
143+
echo
144+
read_prompt "Vol afegir un domini o IP a **DEMO_ALLOWED_HOSTS** per poder accedir-hi externament a la Demo? (Per defecte NO: sí/NO): " REPLY "no"
145+
RESPONSE_LOWER=$(echo "$REPLY" | tr '[:upper:]' '[:lower:]')
146+
#read -p "Vol afegir un domini o IP a **DEMO_ALLOWED_HOSTS** per poder accedir-hi externament a la Demo? (S/n): " REPLY
147+
148+
if [[ "$RESPONSE_LOWER" = "" ]] || [[ "$RESPONSE_LOWER" = "si" ]] || [[ "$RESPONSE_LOWER" = "s" ]]; then
149+
read -p "👉 Introdueix els dominis o IPs separats per comes (ex: demo.elteudomini.cat,192.168.1.46): " HOSTS
150+
if [ -n "$HOSTS" ]; then
151+
sed -i "s|^DEMO_ALLOWED_HOSTS=.*|DEMO_ALLOWED_HOSTS=${HOSTS}|" .env
152+
echo -e "${C_EXITO}✅ Fitxer .env actualitzat amb DEMO_ALLOWED_HOSTS=${HOSTS}${RESET}"
153+
else
154+
echo -e "${C_INFO}⚠️ No s'ha introduït cap domini/IP. Es manté buit.${RESET}"
155+
fi
156+
else
157+
echo -e "${C_INFO}ℹ️ No s'ha modificat DEMO_ALLOWED_HOSTS. Es manté buit.${RESET}"
158+
fi
159+
160+
# --- 6. Posar en marxa els contenidors ---
161+
162+
# Comprovant que l'arxiu .env existeix
163+
if [ -f .env ]; then
164+
set -a
165+
source .env # carregar DB_USER, etc.
166+
set +a
167+
else
168+
finalitzar_amb_error "⚠️ No s'ha trobat el fitxer .env. No es pot comprovar l'estat de la base de dades."
169+
fi
170+
171+
echo
172+
echo -e "${C_INFO}🕓 Posant en marxa els contenidors de la Demo i de la Base de Dades PostgreSQL...${RESET}"
173+
echo
174+
make build
175+
make serve
176+
echo
177+
178+
# --- 7. Informació sobre els contenidors en marxa ---
179+
180+
echo
181+
echo -e "${C_INFO}--------------------------------------------${RESET}"
182+
echo -e "${C_INFO}📦 Estat final de l'estat dels contenidors ${RESET}"
183+
echo -e "${C_INFO}--------------------------------------------${RESET}"
184+
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
185+
echo -e "${C_INFO}--------------------------------------------${RESET}"
186+
echo
187+
echo
188+
189+
# --- 8. Espera a la finalització de la preparació ---
190+
191+
echo -e "${C_INFO}Progrès de preparació de la base de dades i del servidor de la demo (logs).${RESET}"
192+
echo -e "${C_INFO}El procés finalitzarà automàticament quan el servidor estigui llest.${RESET}"
193+
echo -e "${C_INFO}---------------------------------------------------------------------------${RESET}"
194+
echo -e "\n"
195+
196+
# Iniciem el bucle de lectura de logs
197+
docker logs -f demo_web 2>&1 | while read -r line; do
198+
199+
# 1. Bloc per ocultar els SyntaxWarning, per neteja visual. Si, per dev, es vol veure tota la sortida cal fer make logs
200+
if [[ "$line" == *"SyntaxWarning"* ]]; then
201+
continue
202+
fi
203+
204+
# 2. Imprimim la línia en gris per diferenciar-la del script
205+
echo -e "${GRIS}${line}${RESET}"
206+
207+
# 3. Condició de sortida: Quan Django ens diu que ja escolta al port 8000
208+
if [[ "$line" == *"Starting development server at"* ]]; then
209+
echo -e "${C_INFO}----------------------------------------------------------------------------------------${RESET}"
210+
echo -e "\n"
211+
echo -e "${C_EXITO}✅ EL SERVIDOR ESTÀ PREPARAT.${RESET}"
212+
# Matem el procés 'docker logs' per sortir del bucle 'while'
213+
pkill -P $$ -f "docker logs"
214+
break
215+
fi
216+
done
217+
218+
# --- 9. Missatge final ---
219+
220+
echo -e "\n"
221+
sleep 1
222+
223+
echo -e "${C_INFO}----------------------------------------------------------------------------------------"
224+
echo -e "ℹ️ Informació addicional${RESET}"
225+
echo -e "\n"
226+
echo -e "${C_INFO}Instruccions disponibles amb la comanda **make** per la Demo:${RESET}"
227+
echo -e "${C_INFO} 1. Si no està en marxa, executi: ${RESET}${CIANO}make serve${RESET}"
228+
echo -e "${C_INFO} 2. Per veure els logs: ${RESET}${CIANO}make logs${RESET}"
229+
echo -e "${C_INFO} 3. Per detenir la Demo: ${RESET}${CIANO}make stop${RESET}"
230+
echo -e "${C_INFO} 4. Per eliminar els contenidors: ${RESET}${CIANO}make down${RESET}${C_INFO} i després -> docker system prune -a"
231+
232+
echo
233+
echo -e "🌐 Si ha definit IP o dominis a DEMO_ALLOWED_HOSTS, provi ara d'accedir-hi al navegador!"
234+
echo -e " (p. ex. http://demo.elteudomini.cat:8000 o http://IP:8000)${RESET}"
235+
echo

0 commit comments

Comments
 (0)