SPP bot world as of 2026-08-26: merged state of all Cowork sessions (brain, combat data, chat seams 2.0, idiolect, heard/context, headless players, name generator, crests, seeds)
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
# Лёгкий образ: только среда запуска. Файлы сервера НЕ копируются внутрь —
|
||||
# папка server/ монтируется при старте (см. docker-compose.yml).
|
||||
# Благодаря этому пересборка образа почти никогда не нужна, а обновление
|
||||
# сервера = замена файлов на диске + docker compose restart.
|
||||
FROM eclipse-temurin:25-jdk-noble
|
||||
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends mariadb-client && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
WORKDIR /opt/l2
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh && sed -i 's/\r$//' /entrypoint.sh
|
||||
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
@@ -0,0 +1,57 @@
|
||||
# Папка server/ монтируется в контейнеры, а не копируется в образ:
|
||||
# образ ~200 МБ вместо 900 МБ, сборка нужна только при правке entrypoint.sh,
|
||||
# обновление сервера = положить новые файлы и сделать restart.
|
||||
services:
|
||||
db:
|
||||
image: mariadb:11.4
|
||||
environment:
|
||||
MARIADB_ROOT_PASSWORD: l2j
|
||||
MARIADB_DATABASE: l2jmobiusinterlude
|
||||
volumes:
|
||||
- l2db:/var/lib/mysql
|
||||
healthcheck:
|
||||
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
|
||||
interval: 5s
|
||||
timeout: 5s
|
||||
retries: 20
|
||||
|
||||
login:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
image: l2-spp
|
||||
command: ["login"]
|
||||
environment:
|
||||
DB_HOST: db
|
||||
DB_PASS: l2j
|
||||
volumes:
|
||||
- ..:/opt/l2
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
ports:
|
||||
- "2106:2106"
|
||||
restart: unless-stopped
|
||||
|
||||
game:
|
||||
image: l2-spp
|
||||
command: ["game"]
|
||||
environment:
|
||||
DB_HOST: db
|
||||
DB_PASS: l2j
|
||||
# Ollama на хосте (Windows). Если не запущена - боты говорят шаблонами.
|
||||
FAKE_LLM_URL: http://host.docker.internal:11434/api/generate
|
||||
volumes:
|
||||
- ..:/opt/l2
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
login:
|
||||
condition: service_started
|
||||
ports:
|
||||
- "7777:7777"
|
||||
- "7780:7780"
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
l2db:
|
||||
@@ -0,0 +1,55 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
ROLE="$1" # login | game
|
||||
DB_HOST="${DB_HOST:-db}"
|
||||
DB_PASS="${DB_PASS:-l2j}"
|
||||
DB_NAME="l2jmobiusinterlude"
|
||||
FAKE_LLM_URL="${FAKE_LLM_URL:-http://host.docker.internal:11434/api/generate}"
|
||||
|
||||
M() { mariadb -h "$DB_HOST" -uroot -p"$DB_PASS" "$@"; }
|
||||
|
||||
# MOUNTED: файлы сервера примонтированы с диска, а не вшиты в образ.
|
||||
echo "[entrypoint] waiting for database at $DB_HOST..."
|
||||
until M -e "SELECT 1" >/dev/null 2>&1; do sleep 2; done
|
||||
|
||||
# Patch configs for the container network.
|
||||
for f in /opt/l2/login/config/Database.ini /opt/l2/game/config/Database.ini; do
|
||||
sed -i "s|jdbc:mysql://localhost|jdbc:mysql://$DB_HOST|" "$f"
|
||||
sed -i "s|^Password *=.*|Password = $DB_PASS|" "$f"
|
||||
done
|
||||
sed -i "s|^LoginHostname *=.*|LoginHostname = 0.0.0.0|" /opt/l2/login/config/Server.ini
|
||||
sed -i "s|^LoginHost *=.*|LoginHost = login|" /opt/l2/game/config/Server.ini
|
||||
sed -i "s|^FakePlayerLlmUrl *=.*|FakePlayerLlmUrl = $FAKE_LLM_URL|" /opt/l2/game/config/Custom/FakePlayers.ini
|
||||
# Client-facing IP: everything is published on localhost of the host machine.
|
||||
cp -f /opt/l2/game/config/default-ipconfig.xml /opt/l2/game/config/ipconfig.xml
|
||||
|
||||
if [ "$ROLE" = "login" ]; then
|
||||
TABLES=$(M -N -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='$DB_NAME'")
|
||||
if [ "$TABLES" -eq 0 ]; then
|
||||
echo "[entrypoint] empty database, importing sql..."
|
||||
for f in /opt/l2/db_installer/sql/login/*.sql /opt/l2/db_installer/sql/game/*.sql; do
|
||||
M "$DB_NAME" < "$f"
|
||||
done
|
||||
echo "[entrypoint] import done."
|
||||
fi
|
||||
for seed in /opt/l2/db_installer/sql/spp_*.sql; do
|
||||
[ -f "$seed" ] || continue
|
||||
M "$DB_NAME" < "$seed" && echo "[entrypoint] applied $(basename "$seed")"
|
||||
done
|
||||
cd /opt/l2/login
|
||||
exec java -Xmx256m -cp "../libs/*" org.l2jmobius.loginserver.LoginServer
|
||||
fi
|
||||
|
||||
if [ "$ROLE" = "game" ]; then
|
||||
# Wait until login finished the import.
|
||||
until [ "$(M -N -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='$DB_NAME'")" -gt 50 ]; do
|
||||
echo "[entrypoint] waiting for database schema..."
|
||||
sleep 3
|
||||
done
|
||||
cd /opt/l2/game
|
||||
exec java $(cat java.cfg) -cp "../libs/*" org.l2jmobius.gameserver.GameServer
|
||||
fi
|
||||
|
||||
echo "Usage: entrypoint.sh login|game" >&2
|
||||
exit 1
|
||||
Reference in New Issue
Block a user