Phase 0: deployment shell
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
# Life Journey — Deployment Shell (Phase 0)
|
||||
|
||||
An empty, deployable shell for the async multiplayer board game. It contains no
|
||||
game logic yet — its only job is to prove the deployment path works: the server
|
||||
runs in Docker, is reachable through Nginx Proxy Manager over HTTPS, and
|
||||
WebSockets survive the reverse proxy.
|
||||
|
||||
Once both checks are green, adding the real game (Phase 1 onward) never touches
|
||||
the deployment story again.
|
||||
|
||||
## What's here
|
||||
|
||||
```
|
||||
lifegame/
|
||||
├── docker-compose.yml
|
||||
├── Dockerfile
|
||||
├── package.json / package-lock.json
|
||||
├── server/index.js # health endpoint + WebSocket echo
|
||||
└── public/index.html # live HTTP + WebSocket status page
|
||||
```
|
||||
|
||||
## 1. Put it on the homelab
|
||||
|
||||
Drop the folder in your services directory (e.g. `~/homelab/lifegame/`) and build:
|
||||
|
||||
```bash
|
||||
cd ~/homelab/lifegame
|
||||
docker compose up -d --build
|
||||
docker compose logs -f # expect: "Life Journey (Phase 0) listening on :3000"
|
||||
```
|
||||
|
||||
Verify locally on the host first:
|
||||
|
||||
```bash
|
||||
curl http://localhost:3000/api/health
|
||||
# {"ok":true,"service":"life-journey","phase":0,...}
|
||||
```
|
||||
|
||||
## 2. Point Nginx Proxy Manager at it
|
||||
|
||||
Add a **Proxy Host**:
|
||||
|
||||
- **Domain**: your chosen name, e.g. `game.example.com`
|
||||
- **Scheme**: `http`
|
||||
- **Forward Hostname / IP**:
|
||||
- *Option A (default compose):* the homelab's LAN IP (e.g. `192.168.x.x`)
|
||||
- *Option B (shared network):* `lifegame`
|
||||
- **Forward Port**: `3000`
|
||||
- **Websockets Support**: **ON** ← the easy-to-forget one
|
||||
- **SSL tab**: request a new Let's Encrypt certificate, Force SSL on
|
||||
|
||||
## 3. Confirm it works
|
||||
|
||||
Open `https://game.example.com`. You should see two rows go green:
|
||||
|
||||
- **Server (HTTP)** — the health endpoint responded
|
||||
- **WebSocket** — a live socket connected through the proxy
|
||||
|
||||
Click **Send WebSocket ping** and the status should show the echo came back.
|
||||
|
||||
If HTTP is green but WebSocket is red, the proxy isn't upgrading the
|
||||
connection — go back and toggle **Websockets Support** on the proxy host.
|
||||
|
||||
## Data & backups
|
||||
|
||||
The `lifegame-data` volume (mounted at `/app/data`) is where the SQLite
|
||||
database and uploaded player tokens will live in later phases. It's empty now,
|
||||
but include it in the same backup routine as your other self-hosted data.
|
||||
|
||||
## What Phase 1 adds
|
||||
|
||||
- The shared `game.js` rules engine (the pure reducer from the prototype)
|
||||
- SQLite data model: games, players, board/rule config, tokens
|
||||
- Rooms + shareable invite links / join codes
|
||||
- `NetworkTransport` on the client — the one-line swap that makes the game
|
||||
run across devices
|
||||
- Persistence & reconnection, since async means tabs close and servers restart
|
||||
Reference in New Issue
Block a user