Skip to content

Commit 390fa27

Browse files
committed
env mode deferred
1 parent fd44282 commit 390fa27

6 files changed

Lines changed: 31 additions & 4 deletions

File tree

README.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,13 +260,19 @@ Common adjustments:
260260
| `-e PUID/PGID` | In this tutorial: `-e PUID=$(id -u enshrouded) -e PGID=$(id -g enshrouded)`; you can also set them directly, e.g. `-e PUID=1001 -e PGID=1001`. |
261261
| `-e EN_PROFILE` | `-e EN_PROFILE=default` (selects Enshrouded profile template on first bootstrap for fresh/missing config). |
262262
| `-e MANAGER_PROFILE` | `-e MANAGER_PROFILE=default` (selects Server Manager profile template on first bootstrap for fresh/missing config). |
263-
| `-e ENSHROUDED_QUERY_PORT` | `-e ENSHROUDED_QUERY_PORT=15637` (must match the internal port in `-p ...:<internal>/udp`). |
263+
| `-e ENSHROUDED_QUERY_PORT` | `-e ENSHROUDED_QUERY_PORT=15637` (must match the internal port in `-p ...:<internal>/udp`; `env_mode=deferred`, so runtime can also resolve from config/profile fallback). |
264264
| `-e ENSHROUDED_NAME` | `-e ENSHROUDED_NAME="My Enshrouded Server"` (server name shown in the in-game server browser). |
265265
| `-v <host_path>:/home/enshrouded/server` | `-v /home/enshrouded/server_1:/home/enshrouded/server` |
266266
| `bonsaibauer/enshrouded_server_docker:<tag>` | `bonsaibauer/enshrouded_server_docker:dev_latest` (or `latest`; see [Docker Hub tags](https://hub.docker.com/r/bonsaibauer/enshrouded_server_docker/tags)). |
267267

268268
</details>
269269

270+
> [!NOTE]
271+
> `ENSHROUDED_QUERY_PORT` uses `env_mode=deferred`:
272+
> - startup validation does not hard-fail if it is initially empty,
273+
> - runtime init still requires a final resolved value (ENV or valid config/profile fallback),
274+
> - the menu treats this field as hard ENV-managed (locked in editors).
275+
270276
<details>
271277
<summary><strong>Profiles Explained</strong></summary>
272278

docs/README_DOCKER_HUB.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ docker run \
4141
bonsaibauer/enshrouded_server_docker:dev_latest
4242
```
4343

44+
> [!NOTE]
45+
> `ENSHROUDED_QUERY_PORT` is `env_mode=deferred`: early startup validation can proceed when empty, but runtime still needs a resolved value (ENV or valid config/profile fallback). In menu editors this field is treated as hard ENV-managed (locked).
46+
4447
> [!TIP]
4548
> 🎛️ Open the control center with: `docker exec -it enshroudedserver menu`
4649

docs/commands.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,10 @@ docker exec enshroudedserver env-validation [verify|init-runtime|check <name> <v
260260
- `verify`: Full ENV validation.
261261
- `init-runtime`: Initializes runtime values/defaults.
262262
- `check <name> <value>`: Validates one variable.
263+
- ENV policy modes from spec:
264+
- `soft`: Optional ENV (fallbacks allowed).
265+
- `hard`: Required ENV at validation time (no fallback when empty/missing).
266+
- `deferred`: May be empty during early `verify`, but must resolve during `init-runtime` (from ENV or valid config/profile fallback).
263267

264268
### 4.2 `bootstrap`
265269

docs/enshrouded_server.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ This document includes:
1717
| **saveDirectory** | Directory where savegames are stored | "./savegame" | File path (`ENSHROUDED_SAVE_DIR`) |
1818
| **logDirectory** | Directory for log files | "./logs" | File path (`ENSHROUDED_LOG_DIR`). Also hosts `server_manager.log` and `server_manager_backup/`. |
1919
| **ip** | Server IP binding | "0.0.0.0" | Server IPv4 address (`ENSHROUDED_IP`) |
20-
| **queryPort** | Port used for server queries | 15637 | Integer 1..65535 (`ENSHROUDED_QUERY_PORT`) |
20+
| **queryPort** | Port used for server queries | 15637 | Integer 1..65535 (`ENSHROUDED_QUERY_PORT`, `env_mode=deferred`: can initialize from ENV or config/profile fallback at runtime). |
2121
| **slotCount** | Max number of players | 16 | Integer 1..16 (`ENSHROUDED_SLOT_COUNT`) |
2222
| **tags** | Optional server browser tags | [] | Comma-separated tags in ENV (`ENSHROUDED_TAGS`), each tag: `A-Z a-z 0-9 . _ -` |
2323
| **voiceChatMode** | Voice chat type | Proximity | Proximity / Global (`ENSHROUDED_VOICE_CHAT_MODE`) |

docs/menu.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ Top-level selections:
4444
- `x` = Exit menu.
4545
- Prompts use `yes/no` (also accepts `y/n`).
4646
- `[ENV]` marks settings controlled by container environment variables (locked in the editors).
47+
- Fields with `env_mode=hard` and `env_mode=deferred` are treated as hard ENV-managed in the editors and cannot be changed there.
4748

4849
Logging:
4950

server_manager/jobs/env-validation

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1179,7 +1179,7 @@ manager_profile_value_for_var() {
11791179
}
11801180

11811181
update_or_create_manager_config() {
1182-
local config_file profile value env_value var created_config env_mode env_is_set env_rule
1182+
local config_file profile value env_value var created_config env_mode env_is_set env_rule deferred_fallback_attempted
11831183
created_config="false"
11841184

11851185
if ! command -v jq >/dev/null 2>&1; then
@@ -1210,6 +1210,7 @@ update_or_create_manager_config() {
12101210

12111211
while IFS= read -r var; do
12121212
[[ -z "$var" ]] && continue
1213+
deferred_fallback_attempted="false"
12131214
if ! validation_rule_json_read env_rule "$var"; then
12141215
fatal "Validation unavailable for $var: ${VALIDATION_LAST_ERROR:-rule_lookup_failed}"
12151216
fi
@@ -1241,13 +1242,21 @@ update_or_create_manager_config() {
12411242
if [[ "$env_is_set" == "true" ]]; then
12421243
if manager_value_is_valid "$var" "$env_value"; then
12431244
value="$env_value"
1245+
if [[ "$env_mode" == "deferred" ]]; then
1246+
success "Resolved deferred runtime value for $var via ENV."
1247+
fi
12441248
else
12451249
fatal "Invalid ENV value for $var (actual: $env_value). ${VALIDATION_LAST_ERROR:-Validation failed.}"
12461250
fi
12471251
elif [[ "$env_mode" == "hard" ]]; then
12481252
fatal "Missing required ENV $var (env_mode=hard). No fallback from config/profile is allowed."
12491253
fi
12501254

1255+
if [[ -z "$value" && "$env_mode" == "deferred" ]]; then
1256+
warn "ENV $var is not available at this stage (env_mode=deferred). Trying config/profile fallback during init-runtime."
1257+
deferred_fallback_attempted="true"
1258+
fi
1259+
12511260
# Fallback: active config -> profile template.
12521261
if [[ -z "$value" && "$env_mode" != "hard" ]]; then
12531262
value="$(manager_json_get "$config_file" "$var")"
@@ -1264,8 +1273,12 @@ update_or_create_manager_config() {
12641273
fi
12651274
fi
12661275

1276+
if [[ -n "$value" && "$env_mode" == "deferred" && "$deferred_fallback_attempted" == "true" ]]; then
1277+
info "Resolved deferred runtime value for $var via config/profile fallback."
1278+
fi
1279+
12671280
if [[ -z "$value" && "$env_mode" == "deferred" ]]; then
1268-
fatal "Missing runtime value for $var (env_mode=deferred). Provide ENV or a valid config/profile fallback."
1281+
fatal "Missing runtime value for $var (env_mode=deferred): ENV not set and no valid config/profile fallback found."
12691282
fi
12701283

12711284
printf -v "$var" '%s' "$value"

0 commit comments

Comments
 (0)