-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
120 lines (116 loc) · 4.34 KB
/
Copy pathdocker-compose.yml
File metadata and controls
120 lines (116 loc) · 4.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# CodeCraft hinter Traefik.
#
# Zwei Dienste unter EINER Domain: Traefik schickt /api an das Backend, alles
# andere an den Editor. Das ist kein Selbstzweck — der Editor spricht das
# Backend über relative Pfade an (apps/web/src/backend.ts), gleiche Herkunft
# also, und damit entfällt CORS vollständig.
#
# Voraussetzungen auf dem Server:
# - Netzwerk `proxy` existiert (docker network create proxy)
# - Traefik mit entryPoints `web`/`websecure` und certresolver `myresolver`
# - .env mit DOMAIN (siehe .env.example)
# - Datenverzeichnis: mkdir -p daten && sudo chown 10001:10001 daten
services:
server:
build:
context: .
target: server
container_name: codecraft-server
restart: unless-stopped
environment:
- NODE_ENV=production
- CODECRAFT_DATA=/daten/backend.json
# Traefik setzt X-Forwarded-For. Ohne das hier teilten sich alle Kinder
# einer Schule einen Drossel-Zähler und sperrten sich gegenseitig aus.
# Nur setzen, solange das Backend wirklich nur über Traefik erreichbar
# ist — es hat bewusst kein `ports:`.
- CODECRAFT_TRUST_PROXY=1
volumes:
# Gemapptes Verzeichnis statt Volume: die Zauberwörter und Programme der
# Kinder sollen im Klartext danebenliegen und sich mit `cp` sichern
# lassen. Muss 10001:10001 gehören, siehe Dockerfile.
- ./daten:/daten
labels:
- "traefik.enable=true"
- "traefik.docker.network=proxy"
# HTTP
- "traefik.http.routers.codecraft-api.rule=Host(`${DOMAIN}`) && PathPrefix(`/api`)"
- "traefik.http.routers.codecraft-api.entryPoints=web"
# Traefik sortiert von sich aus nach Regellänge, die /api-Regel gewänne
# also ohnehin. Ausgeschrieben, weil ein stiller Wechsel hier bedeutete,
# dass der Editor statt der API ausgeliefert wird — und das sähe im
# Browser nach einem Fehler im Frontend aus.
- "traefik.http.routers.codecraft-api.priority=100"
# HTTPS
- "traefik.http.routers.codecraft-api-ssl.rule=Host(`${DOMAIN}`) && PathPrefix(`/api`)"
- "traefik.http.routers.codecraft-api-ssl.entryPoints=websecure"
- "traefik.http.routers.codecraft-api-ssl.tls=true"
- "traefik.http.routers.codecraft-api-ssl.tls.certresolver=myresolver"
- "traefik.http.routers.codecraft-api-ssl.priority=100"
# Service
- "traefik.http.services.codecraft-api.loadbalancer.server.port=8090"
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "5"
networks:
- proxy
web:
build:
context: .
target: web
container_name: codecraft-web
restart: unless-stopped
depends_on:
- server
labels:
- "traefik.enable=true"
- "traefik.docker.network=proxy"
# HTTP
- "traefik.http.routers.codecraft.rule=Host(`${DOMAIN}`)"
- "traefik.http.routers.codecraft.entryPoints=web"
- "traefik.http.routers.codecraft.priority=1"
# HTTPS
- "traefik.http.routers.codecraft-ssl.rule=Host(`${DOMAIN}`)"
- "traefik.http.routers.codecraft-ssl.entryPoints=websecure"
- "traefik.http.routers.codecraft-ssl.tls=true"
- "traefik.http.routers.codecraft-ssl.tls.certresolver=myresolver"
- "traefik.http.routers.codecraft-ssl.priority=1"
# Service
- "traefik.http.services.codecraft.loadbalancer.server.port=80"
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "5"
networks:
- proxy
luanti:
build:
context: .
dockerfile: docker/luanti/Dockerfile
container_name: codecraft-luanti
restart: unless-stopped
depends_on:
- server
volumes:
# Nur die Welt — Spiel und Mod stecken im Image, siehe Dockerfile.
# Muss 30000:30000 gehören (Nutzer "minetest" im offiziellen Image).
- ./welt:/var/lib/minetest/.minetest/worlds
ports:
# Absichtlich kein Standardport nach außen — LUANTI_PORT in .env.
- "${LUANTI_PORT}:30000/udp"
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "5"
networks:
# Gleiches Netz wie das Backend, nicht wegen Traefik (Luanti spricht kein
# HTTP nach außen), sondern damit die Mod das Backend unter dem
# Dienstnamen "server" erreicht — siehe docker/luanti/minetest.conf.
- proxy
networks:
proxy:
external: true