logging and containerization setup
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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:
|
||||||
@@ -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
|
||||||
Executable
+35
@@ -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."
|
||||||
Reference in New Issue
Block a user