diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..5b69463 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,7 @@ +.git +config.js +Dockerfile +docker-compose.yml +node_modules +package-lock.json +servers.json diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 0000000..5612e5b --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,24 @@ +name: Docker + +on: + push: + branches: + - master + pull_request: + branches: + - master + +jobs: + build: + name: Build + runs-on: ubuntu-20.04 + + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Docker build + run: docker build . --tag arma-server-web-admin + + - name: Docker run tests + run: docker run --env GAME_TYPE=arma3 --env GAME_PATH=/arma3 arma-server-web-admin npm test diff --git a/.github/workflows/node.yml b/.github/workflows/node.yml index 5b90bce..85b4c18 100644 --- a/.github/workflows/node.yml +++ b/.github/workflows/node.yml @@ -16,6 +16,7 @@ jobs: strategy: matrix: node-version: + - 16.x - 14.x - 12.x - 10.x diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..996e679 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,25 @@ +FROM node:16-slim + +# Install arma dependencies +RUN dpkg --add-architecture i386 && apt-get update && apt-get install -y git lib32stdc++6 zlib1g:i386 && apt-get clean && rm -rf /var/lib/apt/lists/* + +# Install node dependencies for the application +RUN mkdir /app +COPY package.json /app/package.json +WORKDIR /app +RUN npm install + +# Install Docker config +COPY config.docker.js /app/config.js + +# Create empty servers config +RUN echo '[]' > /app/servers.json + +# Copy rest of application to image +COPY . /app/ + +# Start application +CMD npm start + +# Declare application port +EXPOSE 3000 diff --git a/README.md b/README.md index a6463c2..cb31db5 100644 --- a/README.md +++ b/README.md @@ -78,3 +78,62 @@ Make sure to disable Wine GUI Crash Dialog or server control will be stuck on a This is easiest solved using `winetricks` by running `winetricks nocrashdialog`. It can also be disabled manually. [Read more at Wine FAQ](http://wiki.winehq.org/FAQ#head-c857c433cf9fc1dcd90b8369ef75c325483c91d6). + +## Docker + +### Example + +To host an Arma 3 x64 server with an existing Arma 3 Server install in subfolder `arma3` with persisted profiles in `profiles` and shared network with host, + +```sh +mkdir -p arma3 profiles +touch servers.json +docker run \ + --network=host \ + --env GAME_TYPE=arma3_x64 \ + --env GAME_PATH=/arma3 \ + --volume $PWD/arma3:/arma3 \ + --volume $PWD/servers.json:/app/servers.json \ + --volume $PWD/profiles:"/root/.local/share/Arma 3 - Other Profiles" \ + dahlgren/arma-server-web-admin +``` + +### Required setup + +Mount a preinstalled Arma server folder to the container, currently only the linux server is supported. +Set GAME_TYPE to your desired arma server, for example `--env GAME_TYPE=arma3` or `--env GAME_TYPE=arma3_x64`. +Set GAME_PATH to your mounted volume, for example `--env GAME_PATH=/arma3` and `--volume $PWD/arma3:/arma3`. + +### Networking +Host preferably needs to share network with the container or all game ports used will need to be forwarded to the container. +Use `--network=host` to use same network as the host machine. + +Web Admin UI is available at port 3000. +If you use `--network=host` you can reach the web ui at `http://localhost:3000` by default. + +### Persistence + +#### Servers + +Mount a file at `/app/servers.json` to persist the servers config. +For example `--volume $PWD/servers.json:/app/servers.json` to use a file named `servers.json` in current folder as persistent servers config file. + +#### Profiles + +If you need to persist the server profiles such as vars file make sure to mount a volume. +For Arma 3 the default profiles directory will be located at `/root/.local/share/Arma 3 - Other Profiles` + +### Environment Variables + +Key | Description +--- | --- +GAME_PATH | Required. Absolute folder path to game server in docker container +GAME_TYPE | Required. Type of game server, see above +AUTH_USERNAME | Username used for HTTP Basic Auth +AUTH_PASSWORD | Password used for HTTP Basic Auth +SERVER_ADMINS | Steam IDs that should be set as admins +SERVER_ADDITIONAL_CONFIG | Additional content to add into server.cfg +SERVER_MODS | Mods to be loaded as server side only mods +SERVER_PARAMETERS | Additional parameters to pass on server launch +SERVER_PREFIX | Prefix on all server names +SERVER_SUFFIX | Suffix on all server names diff --git a/config.docker.js b/config.docker.js new file mode 100644 index 0000000..e235de3 --- /dev/null +++ b/config.docker.js @@ -0,0 +1,25 @@ +for (var environmentVariable of ['GAME_TYPE', 'GAME_PATH']) { + if (!process.env[environmentVariable]) { + console.log('Missing required environment variable "' + environmentVariable + '"') + process.exit(1) + } +} + +module.exports = { + game: process.env.GAME_TYPE, + path: process.env.GAME_PATH, + port: process.env.PORT || 3000, + host: process.env.HOST || '0.0.0.0', + type: 'linux', + additionalConfigurationOptions: process.env.SERVER_ADDITIONAL_CONFIG, + parameters: (process.env.SERVER_PARAMETERS || '').split(','), + serverMods: (process.env.SERVER_MODS || '').split(','), + admins: (process.env.SERVER_ADMINS || '').split(','), + auth: { + username: process.env.AUTH_USERNAME, + password: process.env.AUTH_PROCESS + }, + prefix: process.env.SERVER_PREFIX, + suffix: process.env.SERVER_SUFFIX, + logFormat: process.env.LOG_FORMAT || 'dev' +}