openmu/src/Startup/Readme.md
Lucas Van Vonderen 612d4dc992 feat(startup): support externally-provisioned databases
Add an opt-in `Database:AssumeExternallyProvisioned` setting (appsettings.json,
or the `Database__AssumeExternallyProvisioned` environment variable). When it is
enabled and the database has no schema yet, the server keeps the existing
(empty) database and builds its schema via migrations, instead of dropping and
recreating it.

This makes it possible to run the server as a least-privilege role that owns
only its own database — e.g. a database provisioned by a Kubernetes operator,
infrastructure-as-code, or a managed cloud service — where the connecting role
is not permitted to create or drop databases. The default (false) preserves the
original drop-and-recreate behaviour; an explicit -reinit always recreates.

ReCreateDatabaseAsync gains a backward-compatible `dropExistingDatabase = true`
parameter which skips the EnsureDeleted step when set to false.
2026-07-21 20:13:29 -04:00

5.6 KiB

Startup

The startup console program is basically what glues all components together and starts the server as a single process.

Logging

Logging can be configured by the appsettings.json file. By default, not a lot is configured. If you want to extend the configuration, have a look a the serilog documentation. The server makes good use of scopes, so you can configure it to log only actions of certain players, for example.

In the future, it might be possible to change logging settings over the admin panel, too.

Externally-provisioned database

By default, when no database exists yet, the server drops and (re-)creates it before building the schema. This requires the connecting database role to be allowed to create and drop databases (upstream the connection strings use the postgres superuser, optionally overridden via DB_ADMIN_USER/DB_ADMIN_PW).

In managed environments — a Kubernetes operator, infrastructure-as-code, or a managed cloud database — the database is often provisioned ahead of time and the connecting role is intentionally not permitted to create or drop databases (least privilege; it only owns its own database). In that case, set:

"Database": {
  "AssumeExternallyProvisioned": true
}

or, equivalently, the environment variable Database__AssumeExternallyProvisioned=true. The server then keeps the existing (empty) database and only builds its schema via migrations, instead of dropping and recreating it. The default (false) preserves the original behaviour. An explicit -reinit always drops and recreates, regardless of this setting.

Parameters

Please note, that the most of these parameters (except -demo and -adminpanel) are not necessary anymore, because these settings/actions can be done more conveniently over the admin panel, too.

You can start the server with the following parameters:

Parameter Description
-autostart It automatically initializes the game servers and starts the tcp listeners of all (sub-)servers
-reinit It recreates and reinitializes the database. It doesn't have any effect when -demo is used.
-version:[season6|0.75|0.95d] Defines the version of the game client. Has only effect with -reinit or -demo and affects the initial data creation. Default: season6
-demo Instead of using an external database, it uses in-memory repositories and data is initialized at each start. Only for testing, not for production usage, as player progress is not saved to a database or file.
-deamon Deactivates handling of console inputs
-adminpanel:[enabled|disabled] Defines if the admin panel is available. If disabled, -autostart is applied automatically. Default: enabled

-resolveIP

Defines how the own ip address is determined which is reported back to the game client in case it requests to connect to a selected game server (server selection screen) or the chat server (when starting a chat with the in-game messenger). This may be helpful, if the server is started in an environment where the public IP is not reachable from the outside (e.g. because you share your IPv4-Address or behind a firewall) and you want to use it within your computer or private network.

It supports the following values:

Value Description Example
public Default value, if nothing is specified. The public ip is automatically determined by an external API. -resolveIP:public
local Determines a local ip. If none is found, a loopback IP is used (127.127.127.127). -resolveIP:local
loopback For testing on the same machine, a loopback IP is used (127.127.127.127). -resolveIP:loopback
[An IPv4-Address] Defines a custom and constant IP address or a host name. -resolveIP:140.82.118.4

Environment variables

Additionally (and optionally), there are some settings which can be controlled with environment variables. They may be helpful when running the server in a container or under linux.

Variable Description
RESOLVE_IP See -resolveIP parameter. Same description and values applies here. Is only considered, when there is no -resolveIP parameter.
ASPNETCORE_ENVIRONMENT If no -resolveIP parameter and no RESOLVE_IP variable is defined, the variable ASPNETCORE_ENVIRONMENT is considered to find the optimal ip resolver. If the value is "Development", it uses 'loopback'; Otherwise, it uses 'public'.
ASPNETCORE_URLS Defines the address of the admin panel. Example: 'http://+:80'
DB_HOST Host name/address of the postgres database
DB_ADMIN_USER User name of the admin user of the postgres database
DB_ADMIN_PW Password of the admin user of the postgres database
Database__AssumeExternallyProvisioned When true, keep an already-provisioned (empty) database and only build its schema via migrations, instead of dropping and recreating it. Useful when the connecting role may not create/drop databases. Default: false. See Externally-provisioned database above.

Settings priority

As you noticed, you can set some options in different ways. Therefore, a clear priority has been worked out to make the most sense:

  1. Start parameters
  2. Environment variables
  3. Settings over the admin panel (Configuration -> System)

Start parameters have the highest priority, then environment variables and then the settings over the admin panel. The idea is, that start parameters and environment variables should only be used in special cases by experienced users.