feat: app educativa comarques de Catalunya v3
- 6 nivells de dificultat (flashcards, tria, uneix, escriu, mapa, mapa cec) - Registre de jugadors sense contrasenya (nom + emoji avatar) - Backend Node.js + Express + PostgreSQL (pg) - Mapa SVG interactiu amb dades GeoJSON reals (ICGC) - Filtre de comarques per jugador (muntanya, BCN, GI, LL, T, totes) - Estadistiques per nivell guardades a PostgreSQL - Panel d'administrador amb PIN - Manual integrat per a nens de 10-12 anys - Mode offline (fallback sense backend) - Deploy: Docker + Nginx + Let's Encrypt a Oracle Cloud ARM
This commit is contained in:
44
deploy/deploy.sh
Executable file
44
deploy/deploy.sh
Executable file
@@ -0,0 +1,44 @@
|
||||
#!/usr/bin/env bash
|
||||
# deploy.sh — Desplegar Comarques de Catalunya a l'Oracle VPS
|
||||
# Ús: ./deploy.sh [usuari@host]
|
||||
# Exemple: ./deploy.sh ubuntu@80.225.185.50
|
||||
#
|
||||
# NOTA: Aquest script NO toca la configuració de Nginx.
|
||||
# La config SSL es gestiona manualment al VPS (veure docs Craft).
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
VPS="${1:-ubuntu@80.225.185.50}"
|
||||
REMOTE_PUBLIC="/srv/docker/data/comarques/public"
|
||||
REMOTE_COMPOSE="/srv/docker/compose"
|
||||
LOCAL_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
DOMAIN="comarques.jaumegar.work"
|
||||
|
||||
echo "▶ Desplegant a ${VPS}..."
|
||||
|
||||
# 1. Crear directoris remots si no existeixen
|
||||
ssh "$VPS" "sudo mkdir -p ${REMOTE_PUBLIC} /var/www/certbot && \
|
||||
sudo chown -R ubuntu:ubuntu /srv/docker/data/comarques"
|
||||
|
||||
# 2. Fitxers estàtics (Nginx els serveix directament — sense reiniciar Docker)
|
||||
echo "▶ Pujant fitxers estàtics..."
|
||||
scp "${LOCAL_DIR}/index.html" "${VPS}:${REMOTE_PUBLIC}/"
|
||||
scp "${LOCAL_DIR}/comarca-paths.js" "${VPS}:${REMOTE_PUBLIC}/"
|
||||
|
||||
# 3. Codi del servidor Node.js
|
||||
echo "▶ Pujant codi del servidor..."
|
||||
ssh "$VPS" "mkdir -p /srv/docker/builds/comarques"
|
||||
scp "${LOCAL_DIR}/server.js" "${VPS}:/srv/docker/builds/comarques/"
|
||||
scp "${LOCAL_DIR}/package.json" "${VPS}:/srv/docker/builds/comarques/"
|
||||
scp "${LOCAL_DIR}/Dockerfile" "${VPS}:/srv/docker/builds/comarques/"
|
||||
|
||||
# 4. Construir imatge i reiniciar contenidor
|
||||
echo "▶ Construint imatge Docker..."
|
||||
ssh "$VPS" "cd /srv/docker/builds/comarques && docker build -t comarques-de-catalunya:latest ."
|
||||
|
||||
echo "▶ Reiniciant contenidor..."
|
||||
ssh "$VPS" "cd ${REMOTE_COMPOSE} && docker compose up -d comarques"
|
||||
|
||||
echo ""
|
||||
echo "✅ Desplegament completat!"
|
||||
echo " https://${DOMAIN}"
|
||||
35
deploy/docker-compose.snippet.yml
Normal file
35
deploy/docker-compose.snippet.yml
Normal file
@@ -0,0 +1,35 @@
|
||||
# ── Afegir aquest servei al docker-compose.yml existent ──────────────────────
|
||||
# Fitxer: /srv/docker/compose/docker-compose.yml
|
||||
#
|
||||
# PREREQUISIT: crear la BD al contenidor gitea_db ABANS d'arrencar:
|
||||
# docker exec -it gitea_db psql -U gitea -c "CREATE DATABASE comarques;"
|
||||
# docker exec -it gitea_db psql -U gitea -c "CREATE USER comarques WITH PASSWORD 'el_teu_password';"
|
||||
# docker exec -it gitea_db psql -U gitea -c "GRANT ALL PRIVILEGES ON DATABASE comarques TO comarques;"
|
||||
|
||||
comarques:
|
||||
image: comarques-de-catalunya:latest
|
||||
container_name: comarques
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "127.0.0.1:3003:3003" # només accessible des de localhost (Nginx fa de proxy)
|
||||
environment:
|
||||
PORT: 3003
|
||||
ADMIN_PIN: "${COMARQUES_ADMIN_PIN}"
|
||||
DATABASE_URL: "${COMARQUES_DATABASE_URL}"
|
||||
volumes:
|
||||
- /srv/docker/data/comarques/public:/app/public:ro # fitxers estàtics (read-only)
|
||||
networks:
|
||||
- oracle-services
|
||||
depends_on:
|
||||
- gitea_db
|
||||
healthcheck:
|
||||
test: ["CMD", "wget", "-qO-", "http://localhost:3003/api/health"]
|
||||
interval: 30s
|
||||
timeout: 5s
|
||||
retries: 3
|
||||
start_period: 15s
|
||||
|
||||
# ── Variables d'entorn ────────────────────────────────────────────────────────
|
||||
# Afegir a /srv/docker/compose/.env:
|
||||
# COMARQUES_ADMIN_PIN=el_teu_pin_secret
|
||||
# COMARQUES_DATABASE_URL=postgresql://comarques:el_teu_password@gitea_db:5432/comarques
|
||||
24
deploy/nginx-comarques-http.conf
Normal file
24
deploy/nginx-comarques-http.conf
Normal file
@@ -0,0 +1,24 @@
|
||||
server {
|
||||
listen 80;
|
||||
server_name comarques.jaumegar.work;
|
||||
|
||||
location /.well-known/acme-challenge/ {
|
||||
root /var/www/certbot;
|
||||
}
|
||||
|
||||
root /srv/docker/data/comarques/public;
|
||||
index index.html;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
location /api/ {
|
||||
proxy_pass http://127.0.0.1:3003;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
}
|
||||
41
deploy/nginx-comarques.conf
Normal file
41
deploy/nginx-comarques.conf
Normal file
@@ -0,0 +1,41 @@
|
||||
server {
|
||||
listen 80;
|
||||
server_name comarques.jaumegar.work;
|
||||
|
||||
location /.well-known/acme-challenge/ {
|
||||
root /var/www/certbot;
|
||||
}
|
||||
|
||||
location / {
|
||||
return 301 https://$host$request_uri;
|
||||
}
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443 ssl;
|
||||
server_name comarques.jaumegar.work;
|
||||
|
||||
ssl_certificate /etc/letsencrypt/live/comarques.jaumegar.work/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/comarques.jaumegar.work/privkey.pem;
|
||||
include /etc/letsencrypt/options-ssl-nginx.conf;
|
||||
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
|
||||
|
||||
# Static files served directly by Nginx (faster, no Node overhead)
|
||||
root /srv/docker/data/comarques/public;
|
||||
index index.html;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
# API proxied to Node.js backend
|
||||
location /api/ {
|
||||
proxy_pass http://127.0.0.1:3003;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_read_timeout 30s;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user