Add Docker configuration and environment setup for Tennis Roots project

This commit is contained in:
Nicola
2026-06-24 13:08:41 +02:00
parent 2d4c3864ef
commit e36364b3d9
5 changed files with 113 additions and 1 deletions
+23
View File
@@ -0,0 +1,23 @@
# Tennis Roots Configurazione Docker
# Copia questo file in .env e personalizza i valori
# Dominio pubblico per il servizio (obbligatorio)
DOMAIN=tennis.ricordatiilatte.it
# Nome del container
CONTAINER_NAME=tennis-roots
# Rete Traefik esterna
TRAEFIK_NETWORK=traefik-public
# Certificato SSL
CERT_RESOLVER=letsencrypt
# Entrypoint Traefik
ENTRYPOINT=https
# Porta interna del server Express
INTERNAL_PORT=3000
# (Opzionale) Porta esterna per debug diretto senza Traefik
# HOST_PORT=3000
+1
View File
@@ -1,5 +1,6 @@
node_modules/ node_modules/
.env .env
!.env.example
*.log *.log
.DS_Store .DS_Store
Thumbs.db Thumbs.db
+47 -1
View File
@@ -132,6 +132,49 @@ cd server
npm run dev # node --watch npm run dev # node --watch
``` ```
## Deploy su VPS (Docker + Traefik)
Il progetto include `Dockerfile` e `docker-compose.yml` pronti per il deploy
su un'infrastruttura con **Traefik** come reverse proxy.
### Prerequisiti
- Docker e Docker Compose installati
- Rete `traefik-public` già esistente (`docker network create traefik-public`)
- Dominio configurato (es. `tennis.ricordatiilatte.it`)
### Procedura
```bash
# Clona il progetto sulla VPS
git clone <url> tennis-roots
cd tennis-roots
# Avvia
docker compose up -d
# Log
docker compose logs -f
```
### Accessi
| Risorsa | URL |
|---------|-----|
| Controller | `https://tennis.ricordatiilatte.it/controller/` |
| Scoreboard | `https://tennis.ricordatiilatte.it/overlay/scoreboard.html` |
| Match Info | `https://tennis.ricordatiilatte.it/overlay/match-info.html` |
| Clock | `https://tennis.ricordatiilatte.it/overlay/clock.html` |
| Server Ind. | `https://tennis.ricordatiilatte.it/overlay/server-indicator.html` |
| API stato | `https://tennis.ricordatiilatte.it/api/state` |
| WebSocket | `wss://tennis.ricordatiilatte.it/ws` |
### Note
- Il server è stateless (stato in memoria). Un restart azzera il match.
- Il WebSocket funziona nativamente con Traefik (upgrade HTTP → WS automatico).
- Se vuoi un dominio diverso, cambia il valore di `Host(...)` in `docker-compose.yml`.
## Regole punteggio implementate ## Regole punteggio implementate
- Punti game: 0, 15, 30, 40, Deuce, Vantaggio - Punti game: 0, 15, 30, 40, Deuce, Vantaggio
@@ -156,6 +199,9 @@ tennis-roots/
│ └── server-indicator.html │ └── server-indicator.html
├── controller/ ├── controller/
│ └── index.html # Pannello di controllo │ └── index.html # Pannello di controllo
├── start.sh # Script avvio rapido ├── server/
│ ├── Dockerfile # Immagine container
│ └── ...
├── docker-compose.yml # Deploy con Traefik
└── README.md └── README.md
``` ```
+27
View File
@@ -0,0 +1,27 @@
services:
tennis-roots:
build:
context: ./server
dockerfile: Dockerfile
container_name: ${CONTAINER_NAME:-tennis-roots}
restart: unless-stopped
security_opt:
- no-new-privileges:true
networks:
- ${TRAEFIK_NETWORK:-traefik-public}
labels:
- "traefik.enable=true"
- "traefik.docker.network=${TRAEFIK_NETWORK:-traefik-public}"
- "traefik.http.routers.tennis-roots.rule=Host(`${DOMAIN:-tennis.localhost}`)"
- "traefik.http.routers.tennis-roots.entrypoints=${ENTRYPOINT:-https}"
- "traefik.http.routers.tennis-roots.tls=true"
- "traefik.http.routers.tennis-roots.tls.certresolver=${CERT_RESOLVER:-letsencrypt}"
- "traefik.http.services.tennis-roots.loadbalancer.server.port=${INTERNAL_PORT:-3000}"
# Middleware per WebSocket (upgrade HTTP→WS)
- "traefik.http.routers.tennis-roots.middlewares=tennis-roots-headers"
- "traefik.http.middlewares.tennis-roots-headers.headers.customrequestheaders.X-Forwarded-Proto=https"
- "traefik.http.middlewares.tennis-roots-headers.headers.customresponseheaders.X-Robots-Tag=noindex"
networks:
${TRAEFIK_NETWORK:-traefik-public}:
external: true
+15
View File
@@ -0,0 +1,15 @@
# ---- Build ----
FROM node:22-alpine AS builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --omit=dev
# ---- Run ----
FROM node:22-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY index.js ./
EXPOSE 3000
USER node
CMD ["node", "index.js"]