logging and containerization setup

This commit is contained in:
2026-03-12 00:39:53 +03:00
parent d7352b818d
commit be22de56ca
5 changed files with 326 additions and 0 deletions
+42
View File
@@ -29,6 +29,48 @@ behavior while enabling modernization behind compatibility boundaries.
- Prefer a single entrypoint script or container orchestration for local dev. - Prefer a single entrypoint script or container orchestration for local dev.
- Add small smoke tests to validate service health and database connectivity. - Add small smoke tests to validate service health and database connectivity.
## Local Dev (C Services)
If Couchbase is running on `localhost:8091` with bucket `hbs` (password `aci`),
use the repo-local entrypoint to build and run the core servers:
```sh
./dev build
./dev start
./dev logs
```
Override targets via env vars:
```sh
HM_GAMESERVER_IP=127.0.0.1 HM_GAMESERVER_PORT=3724 ./dev start
```
Stop with:
```sh
./dev stop
```
For the full Ubuntu install flow (Couchbase + web + client), use
`hearthmod/host_ctl_ubuntu.sh`.
## Docker Dev
Docker runs Couchbase plus the C servers. Start with:
```sh
./dev docker-build
./dev docker-start
./dev docker-logs
```
Stop with:
```sh
./dev docker-stop
```
## Protocol Notes ## Protocol Notes
See `PROTOCOL-NOTES.md` for the current opcode decoder map and client-derived See `PROTOCOL-NOTES.md` for the current opcode decoder map and client-derived
Executable
+177
View File
@@ -0,0 +1,177 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
LOG_DIR=${HM_LOG_DIR:-"$ROOT_DIR/hm_log"}
GAMESERVER_IP=${HM_GAMESERVER_IP:-"127.0.0.1"}
GAMESERVER_PORT=${HM_GAMESERVER_PORT:-"3724"}
GAMESERVER_BIN="$ROOT_DIR/hm_gameserver/hm_gameserver"
LOBBYSERVER_BIN="$ROOT_DIR/hm_lobbyserver/hm_lobbyserver"
GAMESERVER_PID="$LOG_DIR/hm_gameserver.pid"
LOBBYSERVER_PID="$LOG_DIR/hm_lobbyserver.pid"
usage() {
cat <<EOF
Usage: ./dev <command>
Commands:
build Build gameserver and lobbyserver
start Start gameserver and lobbyserver
stop Stop running servers
status Show server status
logs Tail server logs
docker-build Build docker images
docker-start Start dockerized stack
docker-stop Stop dockerized stack
docker-status Show docker stack status
docker-logs Tail dockerized logs
Environment:
HM_LOG_DIR Log directory (default: ./hm_log)
HM_GAMESERVER_IP Lobby points to this IP (default: 127.0.0.1)
HM_GAMESERVER_PORT Lobby points to this port (default: 3724)
HM_SKIP_COUCHBASE_CHECK=1 Skip Couchbase availability check
EOF
}
docker_compose() {
if command -v docker >/dev/null 2>&1 && docker compose version >/dev/null 2>&1; then
docker compose "$@"
return
fi
if command -v docker-compose >/dev/null 2>&1; then
docker-compose "$@"
return
fi
echo "docker compose not found" >&2
exit 1
}
require_bin() {
if ! command -v "$1" >/dev/null 2>&1; then
echo "Missing required binary: $1" >&2
exit 1
fi
}
check_couchbase() {
if [ "${HM_SKIP_COUCHBASE_CHECK:-}" = "1" ]; then
return 0
fi
if command -v curl >/dev/null 2>&1; then
if ! curl -s --max-time 2 http://localhost:8091/pools >/dev/null; then
echo "Couchbase not reachable on localhost:8091." >&2
echo "Start Couchbase and restore bucket 'hbs' or set HM_SKIP_COUCHBASE_CHECK=1." >&2
exit 1
fi
else
echo "curl not found; cannot verify Couchbase availability." >&2
echo "Install curl or set HM_SKIP_COUCHBASE_CHECK=1." >&2
exit 1
fi
}
build() {
require_bin make
make -C "$ROOT_DIR/hm_gameserver"
make -C "$ROOT_DIR/hm_lobbyserver"
}
start() {
check_couchbase
mkdir -p "$LOG_DIR"
if [ ! -x "$GAMESERVER_BIN" ] || [ ! -x "$LOBBYSERVER_BIN" ]; then
echo "Binaries missing; run ./dev build first." >&2
exit 1
fi
if [ -f "$GAMESERVER_PID" ] || [ -f "$LOBBYSERVER_PID" ]; then
echo "PID files exist; run ./dev stop first." >&2
exit 1
fi
nohup "$GAMESERVER_BIN" > "$LOG_DIR/hm_gameserver.out" 2>&1 &
echo $! > "$GAMESERVER_PID"
nohup "$LOBBYSERVER_BIN" \
--gameserver="$GAMESERVER_IP" \
--gameserver_port="$GAMESERVER_PORT" \
> "$LOG_DIR/hm_lobbyserver.out" 2>&1 &
echo $! > "$LOBBYSERVER_PID"
echo "Servers started. Logs in $LOG_DIR"
}
stop() {
if [ -f "$GAMESERVER_PID" ]; then
kill "$(cat "$GAMESERVER_PID")" 2>/dev/null || true
rm -f "$GAMESERVER_PID"
fi
if [ -f "$LOBBYSERVER_PID" ]; then
kill "$(cat "$LOBBYSERVER_PID")" 2>/dev/null || true
rm -f "$LOBBYSERVER_PID"
fi
}
status() {
if [ -f "$GAMESERVER_PID" ] && kill -0 "$(cat "$GAMESERVER_PID")" 2>/dev/null; then
echo "hm_gameserver running (pid $(cat "$GAMESERVER_PID"))"
else
echo "hm_gameserver not running"
fi
if [ -f "$LOBBYSERVER_PID" ] && kill -0 "$(cat "$LOBBYSERVER_PID")" 2>/dev/null; then
echo "hm_lobbyserver running (pid $(cat "$LOBBYSERVER_PID"))"
else
echo "hm_lobbyserver not running"
fi
}
logs() {
tail -f "$LOG_DIR/hm_gameserver.out" "$LOG_DIR/hm_lobbyserver.out"
}
case "${1:-}" in
build)
build
;;
start)
start
;;
stop)
stop
;;
status)
status
;;
logs)
logs
;;
docker-build)
docker_compose build
;;
docker-start)
docker_compose up -d
;;
docker-stop)
docker_compose down
;;
docker-status)
docker_compose ps
;;
docker-logs)
docker_compose logs -f --tail=200 gameserver lobbyserver
;;
*)
usage
exit 1
;;
esac
+58
View File
@@ -0,0 +1,58 @@
version: "3.8"
services:
couchbase:
image: couchbase:community-6.6.0
ports:
- "8091-8096:8091-8096"
- "11210:11210"
volumes:
- couchbase-data:/opt/couchbase/var
couchbase-init:
image: couchbase:community-6.6.0
depends_on:
- couchbase
entrypoint: ["/bin/bash", "/init-couchbase.sh"]
volumes:
- ./docker/couchbase-init.sh:/init-couchbase.sh:ro
environment:
COUCHBASE_HOST: couchbase
COUCHBASE_ADMIN_USER: Administrator
COUCHBASE_ADMIN_PASS: password
COUCHBASE_BUCKET: hbs
COUCHBASE_BUCKET_PASS: aci
gameserver:
build:
context: .
dockerfile: docker/Dockerfile
depends_on:
- couchbase-init
working_dir: /workspace
volumes:
- .:/workspace
environment:
HM_COUCHBASE_HOST: couchbase
command: ["bash", "-lc", "make -C hm_gameserver && ./hm_gameserver/hm_gameserver"]
ports:
- "3724:3724"
lobbyserver:
build:
context: .
dockerfile: docker/Dockerfile
depends_on:
- couchbase-init
- gameserver
working_dir: /workspace
volumes:
- .:/workspace
environment:
HM_COUCHBASE_HOST: couchbase
command: ["bash", "-lc", "make -C hm_lobbyserver && ./hm_lobbyserver/hm_lobbyserver --gameserver=gameserver --gameserver_port=3724"]
ports:
- "45678:45678"
volumes:
couchbase-data:
+14
View File
@@ -0,0 +1,14 @@
FROM ubuntu:18.04
RUN apt-get update && apt-get install -y \
build-essential \
cmake \
curl \
libev-dev \
libjson-c-dev \
libcouchbase-dev \
python \
python-pip \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /workspace
+35
View File
@@ -0,0 +1,35 @@
#!/usr/bin/env bash
set -euo pipefail
HOST=${COUCHBASE_HOST:-couchbase}
ADMIN_USER=${COUCHBASE_ADMIN_USER:-Administrator}
ADMIN_PASS=${COUCHBASE_ADMIN_PASS:-password}
BUCKET=${COUCHBASE_BUCKET:-hbs}
BUCKET_PASS=${COUCHBASE_BUCKET_PASS:-aci}
echo "Waiting for Couchbase at ${HOST}:8091..."
until curl -s "http://${HOST}:8091/pools" >/dev/null; do
sleep 2
done
status=$(curl -s -o /dev/null -w "%{http_code}" "http://${HOST}:8091/pools/default")
if [ "$status" != "200" ]; then
couchbase-cli cluster-init -c "${HOST}:8091" \
--cluster-username "${ADMIN_USER}" \
--cluster-password "${ADMIN_PASS}" \
--cluster-ramsize 512 \
--services data
fi
if ! couchbase-cli bucket-list -c "${HOST}:8091" -u "${ADMIN_USER}" -p "${ADMIN_PASS}" | grep -q "${BUCKET}"; then
couchbase-cli bucket-create -c "${HOST}:8091" \
-u "${ADMIN_USER}" -p "${ADMIN_PASS}" \
--bucket="${BUCKET}" \
--bucket-password="${BUCKET_PASS}" \
--bucket-type=couchbase \
--bucket-ramsize=200 \
--bucket-replica=1 \
--wait
fi
echo "Couchbase initialized."