Compare commits
2
Commits
4bb2188564
...
ec6edefd24
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ec6edefd24 | ||
|
|
dac62506b6 |
No files matched your search
@@ -14,25 +14,30 @@ Needs Go 1.25+ and Podman or Docker. Put a `.env` in the repo root (variables in
|
||||
podman-compose up -d db # or: docker compose up -d db
|
||||
cd server
|
||||
make migrate
|
||||
make dev # admin at http://localhost:3000/utils
|
||||
make dev # http://localhost:3000: the game (once built, below); /utils: the admin
|
||||
```
|
||||
|
||||
After pulling changes, run `make migrate` again before starting the server: it applies new
|
||||
migrations and syncs the tools with `config/game.json` (the server alone doesn't).
|
||||
After pulling changes or editing `server/config/game.json`, run `make migrate` again before
|
||||
starting the server: it applies new migrations and syncs the tools and prices with the
|
||||
config (the server alone doesn't).
|
||||
|
||||
## Defold client
|
||||
|
||||
Needs Java 21+. The Makefile downloads Defold's command-line builder (`bob.jar`). The editor
|
||||
is optional: https://defold.com/download/
|
||||
|
||||
With the server running:
|
||||
|
||||
```bash
|
||||
cd client
|
||||
make run # desktop build, plays against http://localhost:3000
|
||||
make web && make serve-web # browser build: open http://localhost:8080
|
||||
make web # browser build into dist/web/MoonMiners/
|
||||
```
|
||||
|
||||
The server serves the browser build at http://localhost:3000 (from
|
||||
`client/dist/web/MoonMiners`, or `MM_WEB_DIR`). It looks for the build when it starts:
|
||||
after the first `make web`, restart the server; later builds only need a page reload.
|
||||
Without a build, `/` goes to the admin. The desktop and browser games keep separate saved
|
||||
players.
|
||||
|
||||
## Deploy
|
||||
|
||||
Dokploy, Docker Compose with `docker-compose.prod.yml`. Details in `server/README.md`.
|
||||
+2
-1
@@ -31,7 +31,8 @@ build: $(BOB) .internal/lib/dependencies.json
|
||||
|
||||
# Web build (WebAssembly) into dist/web/MoonMiners/ (index.html + engine + archive). Release
|
||||
# by default; WEB_VARIANT=debug keeps logs and the test hook (window.mmTestQueue).
|
||||
# `make serve-web` serves it on :8080 with /api and /static proxied to UPSTREAM.
|
||||
# The game server serves it at / (server.go, MM_WEB_DIR); `make serve-web` serves it on :8080
|
||||
# with /api and /static proxied to UPSTREAM (a test server).
|
||||
WEB_VARIANT ?= release
|
||||
UPSTREAM ?= http://localhost:3000
|
||||
WEB_PORT ?= 8080
|
||||
|
||||
+5
-3
@@ -43,7 +43,8 @@ every interface), `DB_SSLMODE` (default `disable`), `ADMIN_PASSWORD` (the
|
||||
password of the admin pages, `/utils`; unset: they're locked), `ADMIN_USER_IDS`
|
||||
(comma-separated player ids that are admins in the game API: `state.admin`, `admin-grant`,
|
||||
saving moon settings), `MM_DEV=1` (reload templates and static files from disk; no admin
|
||||
login, and every player is an admin), `TRUST_PROXY=1` (behind a reverse proxy: rate-limit by
|
||||
login, and every player is an admin), `MM_WEB_DIR` (the browser build served at `/`; default `../client/dist/web/MoonMiners`,
|
||||
none there: `/` redirects to `/utils`), `TRUST_PROXY=1` (behind a reverse proxy: rate-limit by
|
||||
the last `X-Forwarded-For` address instead of the connection's, and mark the admin cookie
|
||||
Secure on HTTPS; new players are limited to 10 a minute per IP).
|
||||
|
||||
@@ -58,8 +59,9 @@ Secure on HTTPS; new players are limited to 10 a minute per IP).
|
||||
make migrate
|
||||
```
|
||||
|
||||
3. Run the server (`MM_DEV=1`: no admin login) and open the admin at
|
||||
http://localhost:3000/utils, or point the Defold client at it:
|
||||
3. Run the server (`MM_DEV=1`: no admin login). The admin is at
|
||||
http://localhost:3000/utils; the game at http://localhost:3000 once the client's
|
||||
`make web` has built it (then restart the server), or run the desktop client against it:
|
||||
|
||||
```bash
|
||||
make dev
|
||||
|
||||
+10
-4
@@ -68,10 +68,16 @@ func serve(ctx context.Context) error {
|
||||
mux.HandleFunc("GET /favicon.ico", func(w http.ResponseWriter, r *http.Request) {
|
||||
http.ServeFileFS(w, r, s.static, "favicon.ico")
|
||||
})
|
||||
// A Defold web build will be served here later; for now the admin.
|
||||
mux.HandleFunc("GET /{$}", func(w http.ResponseWriter, r *http.Request) {
|
||||
http.Redirect(w, r, "/utils", http.StatusSeeOther)
|
||||
})
|
||||
// The game's web build (client: make web) at /, from MM_WEB_DIR (default: the client's
|
||||
// dist/web/MoonMiners beside this checkout); without one, / goes to the admin.
|
||||
webDir := env("MM_WEB_DIR", "../client/dist/web/MoonMiners")
|
||||
if st, err := os.Stat(webDir + "/index.html"); err == nil && !st.IsDir() {
|
||||
mux.Handle("GET /", http.FileServerFS(os.DirFS(webDir)))
|
||||
} else {
|
||||
mux.HandleFunc("GET /{$}", func(w http.ResponseWriter, r *http.Request) {
|
||||
http.Redirect(w, r, "/utils", http.StatusSeeOther)
|
||||
})
|
||||
}
|
||||
mux.HandleFunc("GET /utils/login", s.handleLoginPage)
|
||||
mux.HandleFunc("POST /utils/login", s.handleLogin)
|
||||
mux.HandleFunc("POST /utils/logout", s.handleLogout)
|
||||
|
||||
Reference in new issue
Block a user