Phase 0: deployment shell
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
/**
|
||||
* Life Journey — Phase 0 deployment shell.
|
||||
*
|
||||
* This does the minimum needed to prove the plumbing works end to end:
|
||||
* - serves the static frontend
|
||||
* - answers GET /api/health (is the server reachable?)
|
||||
* - accepts a WebSocket on /ws (does WS survive the reverse proxy?)
|
||||
*
|
||||
* There is deliberately NO game logic here yet. Phase 1 adds the shared
|
||||
* game.js reducer, a SQLite-backed data model, rooms, and real actions.
|
||||
* The data directory is created now so the Docker volume mount is validated.
|
||||
*/
|
||||
|
||||
import http from 'node:http';
|
||||
import path from 'node:path';
|
||||
import fs from 'node:fs';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import express from 'express';
|
||||
import { WebSocketServer } from 'ws';
|
||||
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||
const PORT = process.env.PORT || 3000;
|
||||
const DATA_DIR = process.env.DATA_DIR || path.join(__dirname, '..', 'data');
|
||||
|
||||
// Ensure the persisted data directory exists (future: SQLite db + token uploads).
|
||||
fs.mkdirSync(DATA_DIR, { recursive: true });
|
||||
|
||||
const app = express();
|
||||
app.use(express.json());
|
||||
|
||||
// --- Health check: lets the frontend (and you) confirm the server is up ---
|
||||
app.get('/api/health', (_req, res) => {
|
||||
res.json({
|
||||
ok: true,
|
||||
service: 'life-journey',
|
||||
phase: 0,
|
||||
version: '0.0.1',
|
||||
time: new Date().toISOString(),
|
||||
});
|
||||
});
|
||||
|
||||
// --- Static frontend ---
|
||||
const publicDir = path.join(__dirname, '..', 'public');
|
||||
app.use(express.static(publicDir));
|
||||
|
||||
const server = http.createServer(app);
|
||||
|
||||
// --- WebSocket smoke test on /ws ---
|
||||
// If this connects through your domain, Nginx Proxy Manager is passing the
|
||||
// Upgrade/Connection headers correctly ("Websockets Support" is ON). Phase 1
|
||||
// reuses this exact endpoint to push game state to each device.
|
||||
const wss = new WebSocketServer({ server, path: '/ws' });
|
||||
wss.on('connection', (ws) => {
|
||||
ws.send(JSON.stringify({ type: 'welcome', msg: 'WebSocket connected' }));
|
||||
ws.on('message', (raw) => {
|
||||
ws.send(JSON.stringify({ type: 'echo', received: raw.toString() }));
|
||||
});
|
||||
});
|
||||
|
||||
server.listen(PORT, () => {
|
||||
console.log(`Life Journey (Phase 0) listening on :${PORT}`);
|
||||
console.log(`Data directory: ${DATA_DIR}`);
|
||||
});
|
||||
Reference in New Issue
Block a user