commit 261f0aaa97c6680dfb611ac0b0d9e5846d4c2344 Author: Oskar Szkudło Date: Sat Apr 18 23:59:02 2026 +0200 Initial Jedi Academy server implementation via docker/docker compose diff --git a/jedi-academy/.gitignore b/jedi-academy/.gitignore new file mode 100644 index 0000000..54a45fa --- /dev/null +++ b/jedi-academy/.gitignore @@ -0,0 +1 @@ +forcemod.log \ No newline at end of file diff --git a/jedi-academy/Dockerfile b/jedi-academy/Dockerfile new file mode 100644 index 0000000..139de6d --- /dev/null +++ b/jedi-academy/Dockerfile @@ -0,0 +1,36 @@ +FROM debian:bookworm-slim + +# Enable 32-bit architecture (Wine needs it) +RUN dpkg --add-architecture i386 + +RUN apt-get update && apt-get install -y \ + wine \ + wine32 \ + wine64 \ + winbind \ + cabextract \ + xvfb \ + --no-install-recommends \ + && rm -rf /var/lib/apt/lists/* + +# Create a non-root user +RUN useradd -m -s /bin/bash jamp +USER jamp +WORKDIR /home/jamp + +# Initialize Wine prefix silently +ENV WINEPREFIX=/home/jamp/.wine +ENV WINEDEBUG=-all +RUN wineboot --init 2>/dev/null || true + +# Game mode (default - ForceMod_III) +ENV FS_GAME=ForceMod_III + +# Copy server files +COPY --chown=jamp:jamp server/ /home/jamp/server/ +COPY --chown=jamp:jamp entrypoint.sh /home/jamp/entrypoint.sh +RUN chmod +x /home/jamp/entrypoint.sh + +EXPOSE 29070/udp + +ENTRYPOINT ["/home/jamp/entrypoint.sh"] \ No newline at end of file diff --git a/jedi-academy/README.md b/jedi-academy/README.md new file mode 100644 index 0000000..48e7ee7 --- /dev/null +++ b/jedi-academy/README.md @@ -0,0 +1,93 @@ +# Jedi Academy Dedicated Server (Docker) + +Runs a Jedi Academy dedicated server for Jedi Academy inside a Docker container using Wine. + +## Requirements + +- [Docker](https://docs.docker.com/get-docker/) and [Docker Compose](https://docs.docker.com/compose/) + + +## Directory Structure + +``` +jka-server/ +|── config/ + |── snvos.cfg # Main server config (ForceMod III server configuration used by default) +├── Dockerfile +├── docker-compose.yml +├── entrypoint.sh +└── server/ + ├── base/ # Jedi Academy base game files (assets*.pk3, etc.) + ├── ForceMod_III/ # ForceMod III pk3s and and .dll for the dedicated server + └── jampded.exe # Jedi Academy dedicated server binary +``` + +## Configuration + +Server behaviour is controlled via environment variables and bind mounts. Defaults are defined in the `Dockerfile` and can be overridden in `docker-compose.yml` or with `docker run -e`. + +| Variable | Default | Description | +|------------|----------------|--------------------------------------------------| +| `FS_GAME` | `ForceMod_III` | The mod directory to load (`fs_game`) | + + +To override, edit the `environment` section in `docker-compose.yml`: + +The config for the server is passed via a bind mount. Adjust this to point to your .cfg file. + +```yaml +volumes: + # Mount config externally so you can edit without rebuilding + - ./config/snvos.cfg:/home/jamp/server/base/server.cfg:ro +``` + +```yaml +environment: + - FS_GAME=ForceMod_III +``` + +## Usage + +### Build and start + +First build the image, adjust the version in the docker compose file, and then run it using docker compose. + +```bash +docker build -t jamp-server: . +touch ./forcemod.log +docker compose up -d +``` + +### View logs + +```bash +docker compose logs -f +``` + +### Stop the server + +```bash +docker compose down +``` + +## Ports + +The following port must be open on your firewall/router: + +| Port | Protocol | Description | +|---------|----------|------------------------------| +| `29070` | UDP | Jedi Academy game traffic | + +The port mapping can be changed in `docker-compose.yml`: + +```yaml +ports: + - "29070:29070/udp" +``` + +## How It Works + +1. The container is based on `debian:bookworm-slim` with Wine installed. +2. On first run, `entrypoint.sh` initialises the Wine prefix if it doesn't exist yet. +3. `jampded.exe` is launched via Wine with the configured `fs_game` and the mounted config file. +4. The server registers itself with the Jedi Academy master server (`+set dedicated 2`). diff --git a/jedi-academy/config/snvos.cfg b/jedi-academy/config/snvos.cfg new file mode 100644 index 0000000..3c2354f --- /dev/null +++ b/jedi-academy/config/snvos.cfg @@ -0,0 +1,86 @@ +seta sv_hostname "^1SNV^4OS ^7Server" +seta g_motd "Potworne lagi na laczu Oskara..." +seta rconpassword "polaris" + + +sets "Admin E-Mail" "unpleasant@e-mail.net.pl" +sets "Website" "www.google.pl" + +seta bot_enable "1" +seta bot_minplayers "0" + +seta f_defaultclass "d" +seta f_disabledClasses "o" +seta f_forceClassModels "1" +seta f_modelScaling "1" +seta f_debugModelName "0" +seta f_gunDamageScale "1.0" +seta f_bombDamageScale "1.0" +//seta f_allowDroidekaModel "1" // allows +seta f_allowTroopLeaders "0" // allows NPC troops ( +seta f_allowSaberBreaks "60" // allows dual/staff sabers to be destroyed +seta f_allowJetpackBreaks "60" // allows jetpack to be destroyed +seta f_allowCloakBreaks "1" // allows cloaking device to be destroyed +seta f_maxTroopLeaders "0" //"#" Number of players that can have NPC troops. + + + +seta g_allowvote "0" +seta g_dismember "70" +seta g_forcepowerDisable "0" +seta g_forceRegenTime "125" +seta g_friendlyfire "0" +seta g_gametype "0" +seta g_maxForceRank "8" +seta g_log "forcemod.log" +seta g_filterBan "1" +seta g_inactivity "300" +seta g_logClientInfo "1" +seta g_password "" +seta g_privateduel "0" +seta g_speed "250" +seta g_teamAutoJoin "0" +seta g_teamForceBalance "0" +seta g_doWarmup "1" +seta g_warmup "45" +seta g_weaponDisable "0" + +seta sv_reconnectlimit "5" +seta sv_zombietime "10" +seta sv_minclients "0" +seta sv_privateClients "2" +seta sv_privatePassword "yourPrivatePassword" +seta sv_pure "0" +seta sv_allowDownload "0" +seta sv_allowAnonymous "0" +seta sv_timeout "300" +seta sv_maxPing "500" +seta sv_master1 "masterjk3.ravensoft.com" +seta sv_master2 "master.qtracker.com" +seta sv_master3 "63.146.124.53" +seta sv_maxclients "26" +seta sv_maxRate 15000 + +seta capturelimit "10" +seta fraglimit "200" +seta timelimit "15" + +seta g_autoMapCycle "0" +map "mp/ffa2" + +addbot dak_fett +addbot RAB-24 +addbot desann +addbot alora +addbot jedi +addbot stormtrooper +addbot weequay +addbot gran +addbot yuuzhanvong +addbot reborn +addbot cultist +addbot gungan +addbot trandoshan +// +// +// \ No newline at end of file diff --git a/jedi-academy/docker-compose.yml b/jedi-academy/docker-compose.yml new file mode 100644 index 0000000..fb617a9 --- /dev/null +++ b/jedi-academy/docker-compose.yml @@ -0,0 +1,14 @@ +services: + forcemod-server: + image: jamp-server:1.6 + container_name: forcemod-iii-server + restart: unless-stopped + ports: + - "29070:29070/udp" + volumes: + # Mount config externally so you can edit without rebuilding + - ./config/snvos.cfg:/home/jamp/server/base/server.cfg:ro + # Persist game logs + - ./forcemod.log:/home/jamp/server/ForceMod_III/forcemod.log + environment: + - FS_GAME=ForceMod_III \ No newline at end of file diff --git a/jedi-academy/entrypoint.sh b/jedi-academy/entrypoint.sh new file mode 100644 index 0000000..b115351 --- /dev/null +++ b/jedi-academy/entrypoint.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -e + +# Init Wine prefix at runtime if not already done +if [ ! -f "$WINEPREFIX/system.reg" ]; then + echo "Initializing Wine prefix..." + wineboot --init + sleep 3 +fi + +exec wine /home/jamp/server/jampded.exe \ + +set dedicated 2 \ + +set fs_game "$FS_GAME"\ + +set fs_basepath /home/jamp/server \ + +set fs_homepath /home/jamp/server \ + +exec server.cfg \ No newline at end of file diff --git a/jedi-academy/server/ForceMod_III/jampgamex86.dll b/jedi-academy/server/ForceMod_III/jampgamex86.dll new file mode 100755 index 0000000..4a61dec Binary files /dev/null and b/jedi-academy/server/ForceMod_III/jampgamex86.dll differ diff --git a/jedi-academy/server/ForceMod_III/zzzForceMod_III_Assets.pk3 b/jedi-academy/server/ForceMod_III/zzzForceMod_III_Assets.pk3 new file mode 100755 index 0000000..1c98069 Binary files /dev/null and b/jedi-academy/server/ForceMod_III/zzzForceMod_III_Assets.pk3 differ diff --git a/jedi-academy/server/ForceMod_III/zzzForceMod_III_Game.pk3 b/jedi-academy/server/ForceMod_III/zzzForceMod_III_Game.pk3 new file mode 100644 index 0000000..e323c58 Binary files /dev/null and b/jedi-academy/server/ForceMod_III/zzzForceMod_III_Game.pk3 differ diff --git a/jedi-academy/server/ForceMod_III/zzzForceMod_III_ModelPack.pk3 b/jedi-academy/server/ForceMod_III/zzzForceMod_III_ModelPack.pk3 new file mode 100644 index 0000000..f000fc9 Binary files /dev/null and b/jedi-academy/server/ForceMod_III/zzzForceMod_III_ModelPack.pk3 differ diff --git a/jedi-academy/server/ForceMod_III/zzzForceMod_III_Patch.pk3 b/jedi-academy/server/ForceMod_III/zzzForceMod_III_Patch.pk3 new file mode 100644 index 0000000..799b76e Binary files /dev/null and b/jedi-academy/server/ForceMod_III/zzzForceMod_III_Patch.pk3 differ diff --git a/jedi-academy/server/ForceMod_III/zzzForceMod_III_xINI_files.pk3 b/jedi-academy/server/ForceMod_III/zzzForceMod_III_xINI_files.pk3 new file mode 100644 index 0000000..9fa7d7f Binary files /dev/null and b/jedi-academy/server/ForceMod_III/zzzForceMod_III_xINI_files.pk3 differ diff --git a/jedi-academy/server/base/assets0.pk3 b/jedi-academy/server/base/assets0.pk3 new file mode 100644 index 0000000..176e182 Binary files /dev/null and b/jedi-academy/server/base/assets0.pk3 differ diff --git a/jedi-academy/server/base/assets1.pk3 b/jedi-academy/server/base/assets1.pk3 new file mode 100644 index 0000000..f853f83 Binary files /dev/null and b/jedi-academy/server/base/assets1.pk3 differ diff --git a/jedi-academy/server/base/assets2.pk3 b/jedi-academy/server/base/assets2.pk3 new file mode 100644 index 0000000..628b716 Binary files /dev/null and b/jedi-academy/server/base/assets2.pk3 differ diff --git a/jedi-academy/server/base/assets3.pk3 b/jedi-academy/server/base/assets3.pk3 new file mode 100644 index 0000000..36a6766 Binary files /dev/null and b/jedi-academy/server/base/assets3.pk3 differ diff --git a/jedi-academy/server/jampDed.exe b/jedi-academy/server/jampDed.exe new file mode 100644 index 0000000..8d5d53e Binary files /dev/null and b/jedi-academy/server/jampDed.exe differ