Add Docker configuration and environment setup for Tennis Roots project
This commit is contained in:
@@ -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,5 +1,6 @@
|
|||||||
node_modules/
|
node_modules/
|
||||||
.env
|
.env
|
||||||
|
!.env.example
|
||||||
*.log
|
*.log
|
||||||
.DS_Store
|
.DS_Store
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
|
|||||||
@@ -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
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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"]
|
||||||
Reference in New Issue
Block a user