Compare commits
10 Commits
9ae63ef1cd
...
a50383021f
| Author | SHA1 | Date | |
|---|---|---|---|
| a50383021f | |||
| 055c8fcf8f | |||
| 4de19ee70d | |||
| d5b6788ca5 | |||
| ed14d9da80 | |||
| e87d7fddc7 | |||
| 4a4ebf3bd9 | |||
| 6c999f07e8 | |||
| 004ca50738 | |||
| fcff57fc6d |
@@ -26,6 +26,6 @@ ansible-playbook -i inventory.ini ansible-playbook.yml --skip-tags wazuh --ask-b
|
||||
# Full run (no --tags) — unchanged behavior
|
||||
```
|
||||
|
||||
Tags: `packages`, `directories`, `sysctl`, `network`, `wireguard`, `npm`, `gitea`, `jellyfin`, `wazuh`, `minecraft`, `images`
|
||||
Tags: `packages`, `directories`, `sysctl`, `network`, `wireguard`, `npm`, `gitea`, `jellyfin`, `wazuh`, `minecraft`, `zomboid`, `7dtd`, `images`
|
||||
|
||||
Note: `--tags` runs skip the bulk image pull (tagged `images`); containers auto-pull their image on deploy (`podman_container` pull policy defaults to `missing`).
|
||||
@@ -32,4 +32,8 @@
|
||||
tags: [wazuh]
|
||||
- role: minecraft
|
||||
tags: [minecraft]
|
||||
- role: 7dtd
|
||||
tags: [7dtd]
|
||||
# - role: zomboid
|
||||
# tags: [zomboid]
|
||||
|
||||
|
||||
BIN
roles/7dtd/files/mods/No-Respawn-Near-Backpack-2-0-0-0.zip
Normal file
BIN
roles/7dtd/files/mods/No-Respawn-Near-Backpack-2-0-0-0.zip
Normal file
Binary file not shown.
BIN
roles/7dtd/files/mods/Singularity-v4.1.3.zip
Normal file
BIN
roles/7dtd/files/mods/Singularity-v4.1.3.zip
Normal file
Binary file not shown.
119
roles/7dtd/tasks/main.yml
Normal file
119
roles/7dtd/tasks/main.yml
Normal file
@@ -0,0 +1,119 @@
|
||||
---
|
||||
# 7 Days to Die dedicated server (vinanrra/7dtd-server container, LinuxGSM-based, SteamCMD-installed).
|
||||
# PUBLIC server: players connect to 7dtd.boxswapper.io:26900 (TCP+UDP) and enter the join password
|
||||
# (sdtd_server_password). Server config is rendered from roles/7dtd/templates/sdtdserver.xml.j2 on
|
||||
# every deploy - vars.yml is the source of truth for the server config.
|
||||
# External prerequisites (NOT managed by this repo):
|
||||
# - Cloudflare A record 7dtd.boxswapper.io -> public IP (grey-cloud, like mc.boxswapper.io)
|
||||
# - Router port forwards: TCP+UDP 26900, UDP 26901-26902 + TCP 8081 (telnet) -> 10.10.0.47
|
||||
# - CHANGED sdtd_server_password / sdtd_telnet_password in vars.yml before first deploy
|
||||
- name: Create 7 Days to Die data directory
|
||||
ansible.builtin.file:
|
||||
path: /opt/apps/7dtd/data
|
||||
state: directory
|
||||
mode: '0755'
|
||||
|
||||
# The container (linuxserver-style base) runs as uid/gid 1000 (PUID/PGID) and chowns its volumes on
|
||||
# start; pre-seeding with that ownership lets the init script and server write alongside our xml.
|
||||
# NOTE: NO /etc/timezone or /etc/localtime bind mounts here (unlike minecraft/zomboid) - the image's
|
||||
# user.sh writes BOTH paths itself to apply the TimeZone env var, so ro binds crash-loop the container.
|
||||
- name: Create 7 Days to Die saves dir (container user)
|
||||
ansible.builtin.file:
|
||||
path: /opt/apps/7dtd/data/7DaysToDie
|
||||
state: directory
|
||||
owner: '1000'
|
||||
group: '1000'
|
||||
mode: '0755'
|
||||
|
||||
- name: Create 7 Days to Die serverfiles directory (container user)
|
||||
ansible.builtin.file:
|
||||
path: /opt/apps/7dtd/serverfiles
|
||||
state: directory
|
||||
owner: '1000'
|
||||
group: '1000'
|
||||
mode: '0755'
|
||||
|
||||
# Mods live in the bind-mounted serverfiles; the container loads them on its next start
|
||||
# (recreate on every deploy re-reads them). zips come from roles/7dtd/files/mods (sdtd_mods
|
||||
# in vars.yml), extracted one level deep (the zips already carry their own _Singularity/
|
||||
# and zByteblazarsNoRespawnNearBackpack/ subfolders, which fix load order by name).
|
||||
- name: Create 7 Days to Die Mods directory (container user)
|
||||
ansible.builtin.file:
|
||||
path: /opt/apps/7dtd/serverfiles/Mods
|
||||
state: directory
|
||||
owner: '1000'
|
||||
group: '1000'
|
||||
mode: '0755'
|
||||
|
||||
- name: Deploy 7 Days to Die mods from vendored zips
|
||||
ansible.builtin.unarchive:
|
||||
src: "{{ item }}"
|
||||
dest: /opt/apps/7dtd/serverfiles/Mods
|
||||
owner: '1000'
|
||||
group: '1000'
|
||||
mode: '0755'
|
||||
loop: "{{ sdtd_mods }}"
|
||||
|
||||
- name: Template 7 Days to Die serverconfig from vars.yml
|
||||
ansible.builtin.template:
|
||||
src: sdtdserver.xml.j2
|
||||
dest: /opt/apps/7dtd/serverfiles/sdtdserver.xml
|
||||
owner: '1000'
|
||||
group: '1000'
|
||||
mode: '0644'
|
||||
|
||||
# LinuxGSM reads config-lgsm/sdtdserver/sdtdserver.cfg on EVERY invocation (start/monitor/stop).
|
||||
# Bind-mounting it makes the role the owner of that config (see vars.yml sdtd_lgsm_querymode);
|
||||
# a previously unmanaged podman volume left defaults in place, causing the monitor crash-loop.
|
||||
- name: Create 7 Days to Die LGSM config directory (container user)
|
||||
ansible.builtin.file:
|
||||
path: /opt/apps/7dtd/lgsm
|
||||
state: directory
|
||||
owner: '1000'
|
||||
group: '1000'
|
||||
mode: '0755'
|
||||
|
||||
- name: Template 7 Days to Die LGSM config from vars.yml
|
||||
ansible.builtin.template:
|
||||
src: sdtdserver.cfg.j2
|
||||
dest: /opt/apps/7dtd/lgsm/sdtdserver.cfg
|
||||
owner: '1000'
|
||||
group: '1000'
|
||||
mode: '0644'
|
||||
|
||||
- name: Deploy 7 Days to Die Server
|
||||
containers.podman.podman_container:
|
||||
image: "{{ sdtd_image }}"
|
||||
name: 7dtd
|
||||
env: "{{ sdtd_env_base }}"
|
||||
restart_policy: always
|
||||
recreate: true
|
||||
state: started
|
||||
volumes:
|
||||
- /opt/apps/7dtd/data:/home/sdtdserver/.local/share/7DaysToDie:z
|
||||
- /opt/apps/7dtd/serverfiles:/home/sdtdserver/serverfiles:z
|
||||
- /opt/apps/7dtd/lgsm:/home/sdtdserver/lgsm/config-lgsm/sdtdserver:z
|
||||
ports:
|
||||
# Required: game port (TCP+UDP), Steam query/beacon ports (UDP)
|
||||
- "26900:26900/tcp"
|
||||
- "26900:26900/udp"
|
||||
- "26901:26901/udp"
|
||||
- "26902:26902/udp"
|
||||
# Optional: telnet admin console (gated by sdtd_telnet_password)
|
||||
- "8081:8081/tcp"
|
||||
network:
|
||||
- npm_internal
|
||||
ip: '{{ sdtd_ip }}'
|
||||
vars:
|
||||
# sdtd_env_base: START_MODE=1 starts the server; PUID/PGID match the pre-seeded dir ownership;
|
||||
# MONITOR=YES restarts the game process if it crashes (LinuxGSM cron).
|
||||
# IMPORTANT: restart_policy: always is only valid with START_MODE=1 (never 0/2/4 per image docs).
|
||||
sdtd_env_base:
|
||||
START_MODE: "{{ sdtd_start_mode }}"
|
||||
VERSION: "{{ sdtd_version }}"
|
||||
PUID: "{{ sdtd_puid }}"
|
||||
PGID: "{{ sdtd_pgid }}"
|
||||
TimeZone: "{{ sdtd_timezone }}"
|
||||
BACKUP: "{{ sdtd_backup }}"
|
||||
MONITOR: "{{ sdtd_monitor }}"
|
||||
TEST_ALERT: "NO"
|
||||
14
roles/7dtd/templates/sdtdserver.cfg.j2
Normal file
14
roles/7dtd/templates/sdtdserver.cfg.j2
Normal file
@@ -0,0 +1,14 @@
|
||||
##################################
|
||||
####### Instance Settings ########
|
||||
##################################
|
||||
# Managed by Ansible (roles/7dtd/templates/sdtdserver.cfg.j2) - local edits are overwritten on re-run.
|
||||
# Source of truth: sdtd_* variables in vars.yml.
|
||||
|
||||
## 7dtd answers NO A2S query on the game port (ServerVisibility=0 + SteamNetworking disabled),
|
||||
## so the default gamedig-based monitor (querymode=2) always fails and force-restarts the healthy
|
||||
## server every ~5 min. querymode=1 checks the tmux session instead.
|
||||
querymode="{{ sdtd_lgsm_querymode }}"
|
||||
|
||||
## LGSM graceful stop reads ${telnetpassword} from this cfg (the game XML TelnetPassword is parsed
|
||||
## into ${telnetpass}, a different var). Without it, stop falls back to a hard tmux kill.
|
||||
telnetpassword="{{ sdtd_telnet_password }}"
|
||||
134
roles/7dtd/templates/sdtdserver.xml.j2
Normal file
134
roles/7dtd/templates/sdtdserver.xml.j2
Normal file
@@ -0,0 +1,134 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- Managed by Ansible (roles/7dtd/templates/sdtdserver.xml.j2) - local edits are overwritten on re-run. -->
|
||||
<!-- Source of truth: sdtd_* variables in vars.yml. Applied on every deploy (template task runs each time). -->
|
||||
<ServerSettings>
|
||||
<!-- GENERAL SERVER SETTINGS -->
|
||||
|
||||
<!-- Server representation -->
|
||||
<property name="ServerName" value="{{ sdtd_servername }}" />
|
||||
<property name="ServerDescription" value="{{ sdtd_server_description }}" />
|
||||
<property name="ServerWebsiteURL" value="{{ sdtd_website_url }}" />
|
||||
<property name="ServerPassword" value="{{ sdtd_server_password }}" />
|
||||
<property name="ServerLoginConfirmationText" value="" />
|
||||
<property name="Region" value="{{ sdtd_region }}" />
|
||||
<property name="Language" value="{{ sdtd_language }}" />
|
||||
|
||||
<!-- Networking -->
|
||||
<property name="ServerPort" value="{{ sdtd_port }}" />
|
||||
<!-- Visibility: 2 = public, 1 = shown to friends only, 0 = not listed (private, direct-connect only) -->
|
||||
<property name="ServerVisibility" value="{{ sdtd_visibility }}" />
|
||||
<!-- Public servers behind correct port forwards should disable SteamNetworking (no NAT relay needed) -->
|
||||
<property name="ServerDisabledNetworkProtocols" value="{{ sdtd_disabled_network_protocols }}" />
|
||||
<property name="ServerMaxWorldTransferSpeedKiBs" value="512" />
|
||||
|
||||
<!-- Slots -->
|
||||
<property name="ServerMaxPlayerCount" value="{{ sdtd_max_players }}" />
|
||||
<property name="ServerReservedSlots" value="0" />
|
||||
<property name="ServerReservedSlotsPermission" value="100" />
|
||||
<property name="ServerAdminSlots" value="0" />
|
||||
<property name="ServerAdminSlotsPermission" value="0" />
|
||||
|
||||
<!-- Admin interfaces -->
|
||||
<property name="WebDashboardEnabled" value="false" />
|
||||
<property name="WebDashboardPort" value="8080" />
|
||||
<property name="WebDashboardUrl" value="" />
|
||||
<property name="EnableMapRendering" value="false" />
|
||||
|
||||
<property name="TelnetEnabled" value="{{ sdtd_telnet_enabled | lower }}" />
|
||||
<property name="TelnetPort" value="8081" />
|
||||
<property name="TelnetPassword" value="{{ sdtd_telnet_password }}" />
|
||||
<property name="TelnetFailedLoginLimit" value="10" />
|
||||
<property name="TelnetFailedLoginsBlocktime" value="10" />
|
||||
|
||||
<property name="TerminalWindowEnabled" value="true" />
|
||||
|
||||
<!-- Folder and file locations -->
|
||||
<property name="AdminFileName" value="serveradmin.xml" />
|
||||
|
||||
<!-- Other technical settings -->
|
||||
<property name="EACEnabled" value="{{ sdtd_eac_enabled | lower }}" />
|
||||
<property name="HideCommandExecutionLog" value="0" />
|
||||
<property name="MaxUncoveredMapChunksPerPlayer" value="131072" />
|
||||
<property name="PersistentPlayerProfiles" value="false" />
|
||||
|
||||
|
||||
<!-- GAMEPLAY -->
|
||||
|
||||
<!-- World. GameWorld: "RWG" for random gen (uses WorldGenSeed/WorldGenSize below) or an existing
|
||||
world name ("Navezgane", "PREGEN01", ...). GameName sets the save/decoration seed name. -->
|
||||
<property name="GameWorld" value="{{ sdtd_game_world }}" />
|
||||
<property name="WorldGenSeed" value="{{ sdtd_worldgen_seed }}" />
|
||||
<property name="WorldGenSize" value="{{ sdtd_worldgen_size }}" />
|
||||
<property name="GameName" value="{{ sdtd_game_name }}" />
|
||||
<property name="GameMode" value="{{ sdtd_game_mode }}" />
|
||||
|
||||
<!-- Difficulty: 0 = Scavenger, 1 = Adventurer, 2 = Nomad, 3 = Warrior, 4 = Survivalist, 5 = Insane -->
|
||||
<property name="GameDifficulty" value="{{ sdtd_difficulty }}" />
|
||||
<property name="BlockDamagePlayer" value="100" />
|
||||
<property name="BlockDamageAI" value="100" />
|
||||
<property name="BlockDamageAIBM" value="100" />
|
||||
<property name="XPMultiplier" value="{{ sdtd_xp_multiplier }}" />
|
||||
<property name="PlayerSafeZoneLevel" value="5" />
|
||||
<property name="PlayerSafeZoneHours" value="5" />
|
||||
|
||||
<!-- Day/night: DayNightLength = real minutes per in-game day, DayLightLength = in-game hours of daylight -->
|
||||
<property name="BuildCreate" value="false" />
|
||||
<property name="DayNightLength" value="{{ sdtd_day_night_length }}" />
|
||||
<property name="DayLightLength" value="{{ sdtd_day_light_length }}" />
|
||||
<property name="DeathPenalty" value="1" />
|
||||
<!-- DropOnDeath: 0 = nothing, 1 = everything, 2 = toolbelt only, 3 = backpack only, 4 = delete all -->
|
||||
<property name="DropOnDeath" value="{{ sdtd_drop_on_death }}" />
|
||||
<property name="DropOnQuit" value="0" />
|
||||
<property name="BedrollDeadZoneSize" value="15" />
|
||||
<property name="BedrollExpiryTime" value="45" />
|
||||
|
||||
<!-- Performance related -->
|
||||
<property name="MaxSpawnedZombies" value="{{ sdtd_max_spawned_zombies }}" />
|
||||
<property name="MaxSpawnedAnimals" value="50" />
|
||||
<property name="ServerMaxAllowedViewDistance" value="12" />
|
||||
<property name="MaxQueuedMeshLayers" value="1000" />
|
||||
|
||||
<!-- Zombie settings. ZombieMove: 0 = walk, 1 = jog, 2 = run, 3 = sprint, 4 = nightmare -->
|
||||
<property name="EnemySpawnMode" value="true" />
|
||||
<property name="EnemyDifficulty" value="0" />
|
||||
<property name="ZombieFeralSense" value="0" />
|
||||
<property name="ZombieMove" value="{{ sdtd_zombie_move }}" />
|
||||
<property name="ZombieMoveNight" value="{{ sdtd_zombie_move_night }}" />
|
||||
<property name="ZombieFeralMove" value="3" />
|
||||
<property name="ZombieBMMove" value="3" />
|
||||
<property name="BloodMoonFrequency" value="{{ sdtd_bloodmoon_frequency }}" />
|
||||
<property name="BloodMoonRange" value="0" />
|
||||
<property name="BloodMoonWarning" value="8" />
|
||||
<property name="BloodMoonEnemyCount" value="{{ sdtd_bloodmoon_enemy_count }}" />
|
||||
|
||||
<!-- Loot -->
|
||||
<property name="LootAbundance" value="{{ sdtd_loot_abundance }}" />
|
||||
<property name="LootRespawnDays" value="7" />
|
||||
<property name="AirDropFrequency" value="{{ sdtd_airdrop_frequency }}" />
|
||||
<property name="AirDropMarker" value="true" />
|
||||
|
||||
<!-- Multiplayer. PlayerKillingMode: 0 = no killing, 1 = kill allies only, 2 = kill strangers only, 3 = kill everyone -->
|
||||
<property name="PartySharedKillRange" value="100" />
|
||||
<property name="PlayerKillingMode" value="{{ sdtd_player_killing_mode }}" />
|
||||
|
||||
<!-- Land claim options -->
|
||||
<property name="LandClaimCount" value="3" />
|
||||
<property name="LandClaimSize" value="41" />
|
||||
<property name="LandClaimDeadZone" value="30" />
|
||||
<property name="LandClaimExpiryTime" value="7" />
|
||||
<property name="LandClaimDecayMode" value="0" />
|
||||
<property name="LandClaimOnlineDurabilityModifier" value="4" />
|
||||
<property name="LandClaimOfflineDurabilityModifier" value="4" />
|
||||
<property name="LandClaimOfflineDelay" value="0" />
|
||||
|
||||
<property name="DynamicMeshEnabled" value="true" />
|
||||
<property name="DynamicMeshLandClaimOnly" value="true" />
|
||||
<property name="DynamicMeshLandClaimBuffer" value="3" />
|
||||
<property name="DynamicMeshMaxItemCache" value="3" />
|
||||
|
||||
<property name="TwitchServerPermission" value="90" />
|
||||
<property name="TwitchBloodMoonAllowed" value="false" />
|
||||
|
||||
<property name="MaxChunkAge" value="-1" />
|
||||
<property name="SaveDataLimit" value="-1" />
|
||||
</ServerSettings>
|
||||
75
roles/zomboid/tasks/main.yml
Normal file
75
roles/zomboid/tasks/main.yml
Normal file
@@ -0,0 +1,75 @@
|
||||
---
|
||||
# Project Zomboid dedicated server (danixu86 container, SteamCMD-based, B42-ready).
|
||||
# PRIVATE server: players direct-connect to zomboid.boxswapper.io:16261 (UDP) and enter the join
|
||||
# password (zomboid_password). Not listed in the in-game server browser (PUBLIC=false).
|
||||
# External prerequisites (NOT managed by this repo):
|
||||
# - Cloudflare A record zomboid.boxswapper.io -> public IP (grey-cloud, like mc.boxswapper.io)
|
||||
# - Router port forwards: UDP 16261-16276 + TCP 27015 (RCON) -> 10.10.0.46
|
||||
# - CHANGED zomboid_admin_password / zomboid_rcon_password in vars.yml before first deploy
|
||||
- name: Create Project Zomboid data directory
|
||||
ansible.builtin.file:
|
||||
path: /opt/apps/zomboid/data
|
||||
state: directory
|
||||
mode: '0755'
|
||||
|
||||
# The image (cm2network/steamcmd:root base) owns files in /home/steam as the steam user, uid/gid 1000.
|
||||
# Pre-seeding dirs with that ownership lets the entry script and server write alongside our ini.
|
||||
- name: Create Project Zomboid server data dir
|
||||
ansible.builtin.file:
|
||||
path: /opt/apps/zomboid/data/Zomboid
|
||||
state: directory
|
||||
owner: '1000'
|
||||
group: '1000'
|
||||
mode: '0755'
|
||||
|
||||
- name: Create Project Zomboid server config directory
|
||||
ansible.builtin.file:
|
||||
path: /opt/apps/zomboid/data/Zomboid/Server
|
||||
state: directory
|
||||
owner: '1000'
|
||||
group: '1000'
|
||||
mode: '0755'
|
||||
|
||||
- name: Template Project Zomboid server ini from vars.yml
|
||||
ansible.builtin.template:
|
||||
src: zomboid.ini.j2
|
||||
dest: "/opt/apps/zomboid/data/Zomboid/Server/{{ zomboid_servername }}.ini"
|
||||
owner: '1000'
|
||||
group: '1000'
|
||||
mode: '0644'
|
||||
|
||||
- name: Deploy Project Zomboid Server
|
||||
containers.podman.podman_container:
|
||||
image: "{{ zomboid_image }}"
|
||||
name: zomboid
|
||||
env: "{{ zomboid_env_base }}"
|
||||
restart_policy: always
|
||||
recreate: true
|
||||
state: started
|
||||
volumes:
|
||||
- /opt/apps/zomboid/data:/home/steam/Zomboid:z
|
||||
- /usr/share/zoneinfo/America/Denver:/etc/timezone:ro
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
ports:
|
||||
# Steam query ports (8766/8767) required for public server-list visibility; harmless when private
|
||||
- "8766-8767:8766-8767/udp"
|
||||
- "16261-16276:16261-16276/udp"
|
||||
- "27015:27015/tcp"
|
||||
network:
|
||||
- npm_internal
|
||||
ip: '{{ zomboid_ip }}'
|
||||
vars:
|
||||
zomboid_env_base:
|
||||
# CACHEDIR fixed to the bind-mounted path so saves/configs/logs persist
|
||||
CACHEDIR: "/home/steam/Zomboid"
|
||||
ADMINUSERNAME: "{{ zomboid_admin_username }}"
|
||||
ADMINPASSWORD: "{{ zomboid_admin_password }}"
|
||||
RCONPASSWORD: "{{ zomboid_rcon_password }}"
|
||||
SERVERNAME: "{{ zomboid_servername }}"
|
||||
DISPLAYNAME: "{{ zomboid_displayname }}"
|
||||
PASSWORD: "{{ zomboid_password }}"
|
||||
PUBLIC: "{{ zomboid_public }}"
|
||||
MEMORY: "{{ zomboid_memory }}"
|
||||
SERVERPRESET: "{{ zomboid_preset }}"
|
||||
FORCEUPDATE: "{{ zomboid_force_update }}"
|
||||
LANG: "en_US.UTF-8"
|
||||
15
roles/zomboid/templates/zomboid.ini.j2
Normal file
15
roles/zomboid/templates/zomboid.ini.j2
Normal file
@@ -0,0 +1,15 @@
|
||||
# Managed by Ansible (roles/zomboid/templates/zomboid.ini.j2) — local edits are overwritten on re-run.
|
||||
# Source of truth: zomboid_* variables in vars.yml.
|
||||
DefaultPort=16261
|
||||
UDPPort=16262
|
||||
Public={{ zomboid_public | lower }}
|
||||
PublicName={{ zomboid_displayname }}
|
||||
Password={{ zomboid_password }}
|
||||
MaxPlayers={{ zomboid_max_players }}
|
||||
PVP={{ zomboid_pvp | lower }}
|
||||
PauseEmpty={{ zomboid_pause_empty | lower }}
|
||||
RCONPassword={{ zomboid_rcon_password }}
|
||||
RCONPort=27015
|
||||
# Steam networking follows the visibility mode: public servers use the Steam
|
||||
# backend (browser listing + relay), private ones fall back to plain UDP direct-connect.
|
||||
UseSteamNetworking={{ 'true' if zomboid_public|lower == 'true' else 'false' }}
|
||||
134
vars.yml
134
vars.yml
@@ -17,6 +17,11 @@ directories:
|
||||
- /opt/apps/wazuh/config/wazuh_indexer
|
||||
- /opt/apps/minecraft
|
||||
- /opt/apps/minecraft/data
|
||||
- /opt/apps/zomboid
|
||||
- /opt/apps/zomboid/data
|
||||
- /opt/apps/7dtd
|
||||
- /opt/apps/7dtd/data
|
||||
- /opt/apps/7dtd/serverfiles
|
||||
|
||||
|
||||
## Jellyfin directories for media
|
||||
@@ -34,6 +39,8 @@ images:
|
||||
- docker.io/wazuh/wazuh-indexer:{{ wazuh_version }}
|
||||
- docker.io/wazuh/wazuh-manager:{{ wazuh_version }}
|
||||
- docker.io/itzg/minecraft-server:latest
|
||||
- docker.io/danixu86/project-zomboid-dedicated-server:latest
|
||||
- docker.io/vinanrra/7dtd-server:latest
|
||||
|
||||
|
||||
wazuh_version: 4.14.1
|
||||
@@ -74,7 +81,7 @@ wazuh_server_address: wazuh.boxswapper.io
|
||||
minecraft_host: mc.boxswapper.io
|
||||
minecraft_ip: 10.10.0.45
|
||||
minecraft_version: latest
|
||||
minecraft_memory: 2G
|
||||
minecraft_memory: 8G
|
||||
minecraft_motd: "Welcome Retards"
|
||||
minecraft_difficulty: normal
|
||||
minecraft_gamemode: survival
|
||||
@@ -85,3 +92,128 @@ minecraft_plugins:
|
||||
- https://download.geysermc.org/v2/projects/geyser/versions/latest/builds/latest/downloads/spigot
|
||||
- https://download.geysermc.org/v2/projects/floodgate/versions/latest/builds/latest/downloads/spigot
|
||||
|
||||
## Project Zomboid dedicated server (danixu86 container, SteamCMD-based, B42-ready)
|
||||
## PRIVATE server: not shown in the in-game server browser (zomboid_public: false) — friends must
|
||||
## direct-connect to zomboid.boxswapper.io:16261 and enter the join password (zomboid_password) once.
|
||||
## External DNS (not managed here): Cloudflare A record zomboid.boxswapper.io -> public IP (grey-cloud,
|
||||
## same as mc.boxswapper.io / vpn.boxswapper.io). Router MUST forward UDP 16261-16276 + TCP 27015 (RCON)
|
||||
## -> 10.10.0.46. Server ini is rendered from roles/zomboid/templates/zomboid.ini.j2 on deploy; the
|
||||
## published UDP range (16261-16276) covers zomboid_max_players=16 (game 16261 + query 16262 + per-slot ports).
|
||||
## PUBLIC mode (zomboid_public: "true") also requires router forwards UDP 8766-8767 (Steam query) and
|
||||
## publishes them; PRIVATE mode (the original design) needs only 16261-16276 — clients direct-connect
|
||||
## (server browser never lists private servers).
|
||||
zomboid_host: zomboid.boxswapper.io
|
||||
zomboid_ip: 10.10.0.46
|
||||
zomboid_image: docker.io/danixu86/project-zomboid-dedicated-server:latest
|
||||
## SERVERNAME becomes the config folder/file name — must NOT contain spaces or special characters.
|
||||
zomboid_servername: Boxswapper
|
||||
zomboid_displayname: "Boxswapper Zomboid Server"
|
||||
zomboid_admin_username: admin
|
||||
## CHANGE THESE before first deploy — ADMINPASSWORD is mandatory on first startup (server fails to boot without it),
|
||||
## RCONPASSWORD gates the 27015/tcp admin console, and zomboid_password is the join password players must enter
|
||||
## when connecting (leave empty to allow password-less joins).
|
||||
zomboid_admin_password: 9QmvIhCPOUcWeV9W
|
||||
zomboid_rcon_password: lnaScHaCnB2z8k7D
|
||||
zomboid_password: DOvNml9VCyeXlJx2
|
||||
zomboid_public: "true"
|
||||
## Server ini is rendered from roles/zomboid/templates/zomboid.ini.j2 on every deploy —
|
||||
## vars.yml is the source of truth for the ini, so edits to these vars re-apply on re-run.
|
||||
## MaxPlayers must fit the published/forwarded UDP range (16261-16276 = 16 slots); raise the range
|
||||
## in the role and router forwards if you bump it.
|
||||
zomboid_max_players: 16
|
||||
zomboid_pvp: "true"
|
||||
zomboid_pause_empty: "true"
|
||||
## "true" makes the container re-verify the full 7.2GB Steam install on EVERY start (slow boots).
|
||||
## Leave "false" for fast boots; flip to "true" when a new PZ build drops and re-run once.
|
||||
zomboid_force_update: "false"
|
||||
zomboid_memory: 8g
|
||||
zomboid_preset: Apocalypse
|
||||
|
||||
## 7 Days to Die dedicated server (vinanrra/7dtd-server container, LinuxGSM-based)
|
||||
## PUBLIC server: listed in the in-game server browser; players connect to
|
||||
## 7dtd.boxswapper.io:26900 (TCP+UDP) and enter the join password (sdtd_server_password).
|
||||
## Server config is rendered from roles/7dtd/templates/sdtdserver.xml.j2 on every deploy —
|
||||
## vars.yml is the source of truth for the server config (edits here re-apply on re-run).
|
||||
## External DNS (not managed here): Cloudflare A record 7dtd.boxswapper.io -> public IP (grey-cloud,
|
||||
## same as mc.boxswapper.io / zomboid.boxswapper.io). Router MUST forward TCP+UDP 26900, UDP
|
||||
## 26901-26902 (Steam query) + TCP 8081 (telnet) -> 10.10.0.47.
|
||||
## VERSION=stable tracks the current public build; the container auto-installs/updates via SteamCMD
|
||||
## on first start. START_MODE must stay 1 with restart_policy always (see role comment).
|
||||
sdtd_host: 7dtd.boxswapper.io
|
||||
sdtd_ip: 10.10.0.47
|
||||
sdtd_image: docker.io/vinanrra/7dtd-server:latest
|
||||
sdtd_version: stable
|
||||
sdtd_start_mode: "1"
|
||||
sdtd_puid: 1000
|
||||
sdtd_pgid: 1000
|
||||
sdtd_timezone: America/Denver
|
||||
sdtd_backup: "NO"
|
||||
sdtd_monitor: "YES"
|
||||
## LinuxGSM config overrides (roles/7dtd/templates/sdtdserver.cfg.j2):
|
||||
## - querymode=1: this server answers NO A2S query on 26900 (ServerVisibility=0 + SteamNetworking
|
||||
## disabled), so the default gamedig-based monitor (querymode=2) always fails its query and
|
||||
## force-restarts the HEALTHY server every ~5 min. Session-only check avoids that loop.
|
||||
## - telnetpassword mirrors sdtd_telnet_password because LGSM's graceful stop reads
|
||||
## ${telnetpassword} from its OWN cfg; the XML value is parsed into ${telnetpass} (different
|
||||
## var) so without this the stop falls back to a hard tmux kill. Keep in sync below.
|
||||
sdtd_lgsm_querymode: "1"
|
||||
## CHANGE THESE before first deploy — the server is public and both passwords gate real access:
|
||||
## sdtd_server_password is the join password players must enter; if it is empty the server has NO
|
||||
## join password. sdtd_telnet_password guards the 8081/tcp admin console; if empty telnet only
|
||||
## listens on loopback.
|
||||
sdtd_server_password: h8zvU3v7WUEgLSYG
|
||||
sdtd_telnet_password: HDRSEsueredu3rf3
|
||||
## Change the seed + set sdtd_game_world: RWG for a fresh random-gen world on first boot
|
||||
## (Navezgane = built-in map, instant start, no generation time).
|
||||
sdtd_servername: "Boxswapper 7DTD"
|
||||
sdtd_server_description: "You wiill die in 7 Days, retard"
|
||||
sdtd_website_url: ""
|
||||
sdtd_region: NorthAmericaEast
|
||||
sdtd_language: English
|
||||
## Visibility of this server: 2 = public, 1 = only shown to friends, 0 = not listed. As you are never friend of a dedicated server setting this to "1" will only work when the first player connects manually by IP.
|
||||
sdtd_visibility: "0"
|
||||
## SteamNetworking disabled = direct connect via forwarded ports (correct setup for this box);
|
||||
## leave empty ("" ) to allow the Steam relay fallback if port forwards break.
|
||||
sdtd_disabled_network_protocols: SteamNetworking
|
||||
sdtd_port: 26900
|
||||
sdtd_max_players: 8
|
||||
sdtd_game_mode: GameModeSurvival
|
||||
sdtd_game_world: Navezgane
|
||||
sdtd_worldgen_seed: boxswapper
|
||||
sdtd_worldgen_size: 8192
|
||||
sdtd_game_name: Boxswapper
|
||||
## Difficulty: 0 = Scavenger, 1 = Adventurer, 2 = Nomad, 3 = Warrior, 4 = Survivalist, 5 = Insane
|
||||
sdtd_difficulty: "2"
|
||||
sdtd_day_night_length: 60
|
||||
sdtd_day_light_length: 18
|
||||
## DropOnDeath: 0 = nothing, 1 = everything, 2 = toolbelt only, 3 = backpack only, 4 = delete all
|
||||
sdtd_drop_on_death: "1"
|
||||
## ZombieMove: 0 = walk, 1 = jog, 2 = run, 3 = sprint, 4 = nightmare
|
||||
sdtd_zombie_move: "0"
|
||||
sdtd_zombie_move_night: "3"
|
||||
sdtd_bloodmoon_frequency: 7
|
||||
sdtd_bloodmoon_enemy_count: 8
|
||||
sdtd_loot_abundance: 100
|
||||
sdtd_airdrop_frequency: 72
|
||||
## PlayerKillingMode: 0 = no killing, 1 = kill allies only, 2 = kill strangers only, 3 = kill everyone
|
||||
sdtd_player_killing_mode: "3"
|
||||
sdtd_max_spawned_zombies: 64
|
||||
## EAC must be OFF because we deploy code mods (Singularity framework + the No Respawn Near
|
||||
## Backpack patch below) — EAC blocks their Harmony hooks. Keep "false" while mods are installed.
|
||||
sdtd_eac_enabled: "false"
|
||||
## Game mods, vendored under roles/7dtd/files/mods/ and extracted into serverfiles/Mods (the
|
||||
## container's bind-mounted Mods dir) by the role. Source of truth: add the zip name here AND
|
||||
## drop the file into the role's files/mods dir. Load order is handled by folder prefixes —
|
||||
## Singularity's leading underscore loads FIRST, the mod's z- prefix loads LAST (7dtd sorts
|
||||
## Mods alphabetically).
|
||||
## - Singularity (4.1.3): Byteblazar's core framework; No Respawn Near Backpack is a server
|
||||
## policy implemented here, disabled by default, enabled via XML (the mod below).
|
||||
## - No Respawn Near Backpack for V2 (2.0.0.0): server-side XML patch that sets Singularity's
|
||||
## ServerPolicies.NoRespawnNearBackpack=true -> players CANNOT respawn near their backpack,
|
||||
## they respawn at a world starting point instead. Requires EAC off (see above).
|
||||
sdtd_mods:
|
||||
- Singularity-v4.1.3.zip
|
||||
- No-Respawn-Near-Backpack-2-0-0-0.zip
|
||||
sdtd_xp_multiplier: 100
|
||||
sdtd_telnet_enabled: "true"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user