[factorio]: add chart for factorio server (#1500)

This commit is contained in:
Truxnell 2022-04-14 15:46:30 +10:00 committed by GitHub
parent b9ebbd8b93
commit 246c7f41a8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 772 additions and 0 deletions

View File

@ -11,6 +11,7 @@ excluded-charts:
- charts/stable/alertmanager-discord
- charts/stable/amcrest2mqtt
- charts/stable/facebox
- charts/stable/factorio
- charts/stable/foundryvtt
- charts/stable/heimdall
- charts/stable/multus

View File

@ -0,0 +1,26 @@
# Patterns to ignore when building packages.
# This supports shell glob matching, relative path matching, and
# negation (prefixed with !). Only one pattern per line.
.DS_Store
# Common VCS dirs
.git/
.gitignore
.bzr/
.bzrignore
.hg/
.hgignore
.svn/
# Common backup files
*.swp
*.bak
*.tmp
*~
# Various IDEs
.project
.idea/
*.tmproj
.vscode/
# OWNERS file for Kubernetes
OWNERS
# helm-docs templates
*.gotmpl

View File

@ -0,0 +1,24 @@
apiVersion: v2
appVersion: stable
description: Factorio dedicated steam game server
name: factorio
version: 1.0.0
kubeVersion: ">=1.16.0-0"
keywords:
- factorio
- steam
home: https://github.com/k8s-at-home/charts/tree/master/charts/stable/factorio
icon: https://factorio.com/static/img/factorio-wheel.png
sources:
- https://github.com/factoriotools/factorio-docker
maintainers:
- name: Truxnell
email: nat@natallan.com
dependencies:
- name: common
repository: https://library-charts.k8s-at-home.com
version: 4.3.0
annotations:
artifacthub.io/changes: |
- kind: added
description: Initial version

View File

@ -0,0 +1,111 @@
# factorio
![Version: 1.0.0](https://img.shields.io/badge/Version-1.0.0-informational?style=flat-square) ![AppVersion: 1.0.0](https://img.shields.io/badge/AppVersion-1.0.0-informational?style=flat-square)
factorio helm package
**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/k8s-at-home/charts/issues/new/choose)**
## Source Code
* <https://github.com/factorio/factorio-docker>
## Requirements
Kubernetes: `>=1.16.0-0`
## Dependencies
| Repository | Name | Version |
|------------|------|---------|
| https://library-charts.k8s-at-home.com | common | 4.0.0 |
## TL;DR
```console
helm repo add k8s-at-home https://k8s-at-home.com/charts/
helm repo update
helm install factorio k8s-at-home/factorio
```
## Installing the Chart
To install the chart with the release name `factorio`
```console
helm install factorio k8s-at-home/factorio
```
## Uninstalling the Chart
To uninstall the `factorio` deployment
```console
helm uninstall factorio
```
The command removes all the Kubernetes components associated with the chart **including persistent volumes** and deletes the release.
## Configuration
Read through the [values.yaml](./values.yaml) file. It has several commented out suggested values.
Other values may be used from the [values.yaml](https://github.com/k8s-at-home/library-charts/tree/main/charts/stable/common/values.yaml) from the [common library](https://github.com/k8s-at-home/library-charts/tree/main/charts/stable/common).
Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`.
```console
helm install factorio \
--set env.TZ="America/New York" \
k8s-at-home/factorio
```
Alternatively, a YAML file that specifies the values for the above parameters can be provided while installing the chart.
```console
helm install factorio k8s-at-home/factorio -f values.yaml
```
## Custom configuration
N/A
## Values
**Important**: When deploying an application Helm chart you can add more values from our common library chart [here](https://github.com/k8s-at-home/library-charts/tree/main/charts/stable/common)
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| env | object | See below | environment variables. See more environment variables in the [factorio documentation](https://factorio.org/docs). |
| env.TZ | string | `"UTC"` | Set the container timezone |
| image.pullPolicy | string | `"IfNotPresent"` | image pull policy |
| image.repository | string | `"factorio/factorio"` | image repository |
| image.tag | string | `"1.0.0"` | image tag |
| ingress.main | object | See values.yaml | Enable and configure ingress settings for the chart under this key. |
| persistence | object | See values.yaml | Configure persistence settings for the chart under this key. |
| service | object | See values.yaml | Configures service settings for the chart. |
## Changelog
### Version 1.0.0
#### Added
- Initial version
#### Changed
N/A
#### Fixed
N/A
## Support
- See the [Docs](https://docs.k8s-at-home.com/our-helm-charts/getting-started/)
- Open an [issue](https://github.com/k8s-at-home/charts/issues/new/choose)
- Ask a [question](https://github.com/k8s-at-home/organization/discussions)
- Join our [Discord](https://discord.gg/sTMX7Vh) community
----------------------------------------------
Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)

View File

@ -0,0 +1,79 @@
{{- define "custom.custom.configuration.header" -}}
## Custom configuration
{{- end -}}
{{- define "custom.custom.configuration" -}}
{{ template "custom.custom.configuration.header" . }}
### Cart credits
This chart is partially inspired by [https://github.com/SQLJames/factorio-server-charts](https://github.com/SQLJames/factorio-server-charts) and the yaml for the server settings defaults is sourced from here. Many thanks to @SQLJames for his work on that chart and the inspiration.
### Keeping server up to date
By default, this helm chart will follow `Factoriotools/Factorio:stable`. Game servers need to be kept up to date regularly, but you might not want it updating during gameplay with traffic being forwarded from your router through open ports
The author recommends a approach of setting a `tag:` in your values.yaml to pin a specific version, and using a solution like [Renovate-bot](https://github.com/renovatebot/renovate) to control updates.
This can be best achieved to pinning to a specific sha release, which allows you to set the tag to follow.
Note that by default renovate follows latest which can sometimes be undesirable for this image. The author notes that `stable` follows the version declared stable on [Factorio.com[(https://Factorio.com)] and on Steam, and `latest` can at times diverge into testing/beta releases (which require a Steam opt-in for downloading with traffic being forwarded from your router through open ports
### Pinning to one node
Whilst not best practice in k8s, it may be desirable to pin a game server to a node, so it is getting a paticular CPU (i.e. targeting best core performance).
```yaml
# Prefer higher single core speed node
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- <yourhostname>
```
### Map generation
This chart has yaml to allow you to pick map gen settings for first load. One way that *may* be eaiser to get a map howver, is to generate the map in your local game with the UI, ensure you are happy with it. You can run this helm once with default settings (to generate the folder structure in a PVC), spin it back down and mount the pvc in a test pod. You can then copy your generated `map.zip` to the container and spin it back up - the server will load the 'latest' save and run your map.
### Networking
Networking may be a challenge as Factorio uses UDP. One approach can be to use a load balancer in front of the service, with traffic being forwarded from your router through open ports pointed at the load balancer. A load balancer could be set in this chart, for example with this addition (using metallb for load-balancing):
```yaml
service:
main:
ports:
http:
server:
enabled: true
type: LoadBalancer # Setting Ip external to cluster for easy port forward
externalTrafficPolicy: Cluster
loadBalancerIP: "192.168.2.100" # Set a IP here to ensure the game server is given a static internal IP
annotations:
metallb.universe.tf/allow-shared-ip: factorio
ports:
factorio-game:
port: 34201
protocol: UDP
targetPort: 34197
rcon:
enabled: false
type: LoadBalancer # Setting Ip external to cluster for easy port forward
externalTrafficPolicy: Cluster
loadBalancerIP: "192.168.2.100" # Set a IP here to ensure the game server is given a static internal IP
annotations:
metallb.universe.tf/allow-shared-ip: factorio
ports:
factorio-rcon:
enabled: true
port: 27015
protocol: TCP
targetPort: 27015
```
{{- end -}}

View File

@ -0,0 +1 @@
{{- include "common.notes.defaultNotes" . -}}

View File

@ -0,0 +1,106 @@
{{/* Make sure all variables are set properly */}}
{{- include "common.values.setup" . }}
{{/* Append the configMap volume to the volumes */}}
{{- define "factorio.server-settings.json" -}}
enabled: "true"
mountPath: "/helmconfig/server-settings.json"
subPath: "server-settings.json"
type: "custom"
volumeSpec:
configMap:
name: {{ include "common.names.fullname" . }}-settings
{{- end -}}
{{- if .Values.config.factorioServer -}}
{{- $_ := set .Values.persistence "factorio-config" (include "factorio.server-settings.json" . | fromYaml) -}}
{{- end -}}
{{/* Append the configMap volume to the volumes */}}
{{- define "factorio.rconPassword" -}}
enabled: "true"
mountPath: "/helmconfig/rconpw"
subPath: "rconpw"
type: "custom"
volumeSpec:
configMap:
name: {{ include "common.names.fullname" . }}-settings
{{- end -}}
{{- if .Values.config.rcon.password -}}
{{- $_ := set .Values.persistence "factorio-config" (include "factorio.rconPassword" . | fromYaml) -}}
{{- end -}}
{{/* Append the configMap volume to the volumes */}}
{{- define "factorio.map_gen_settings" -}}
enabled: "true"
mountPath: "/helmconfig/map_gen_settings.json"
subPath: "map_gen_settings.json"
type: "custom"
volumeSpec:
configMap:
name: {{ include "common.names.fullname" . }}-settings
{{- end -}}
{{- if .Values.config.map_gen_settings -}}
{{- $_ := set .Values.persistence "factorio-config" (include "factorio.map_gen_settings" . | fromYaml) -}}
{{- end -}}
{{/* Append the configMap volume to the volumes */}}
{{- define "factorio.map_settings" -}}
enabled: "true"
mountPath: "/helmconfig/map_settings.json"
subPath: "map_settings.json"
type: "custom"
volumeSpec:
configMap:
name: {{ include "common.names.fullname" . }}-settings
{{- end -}}
{{- if .Values.config.map_settings -}}
{{- $_ := set .Values.persistence "factorio-config" (include "factorio.map_settings" . | fromYaml) -}}
{{- end -}}
{{/* Append the configMap volume to the volumes */}}
{{- define "factorio.server-adminlist" -}}
enabled: "true"
mountPath: "/helmconfig/server-adminlist.json"
subPath: "server-adminlist.json"
type: "custom"
volumeSpec:
configMap:
name: {{ include "common.names.fullname" . }}-settings
{{- end -}}
{{- if .Values.config.adminlist -}}
{{- $_ := set .Values.persistence "factorio-config" (include "factorio.server-adminlist" . | fromYaml) -}}
{{- end -}}
{{/* Append the configMap volume to the volumes */}}
{{- define "factorio.server-whitelist" -}}
enabled: "true"
mountPath: "/helmconfig/server-whitelist.json"
subPath: "server-whitelist.json"
type: "custom"
volumeSpec:
configMap:
name: {{ include "common.names.fullname" . }}-settings
{{- end -}}
{{- if .Values.config.whitelist -}}
{{- $_ := set .Values.persistence "factorio-config" (include "factorio.server-whitelist" . | fromYaml) -}}
{{- end -}}
{{/* Append the configMap volume to the volumes */}}
{{- define "factorio.server-banlist" -}}
enabled: "true"
mountPath: "/helmconfig/server-banlist.json"
subPath: "server-banlist.json"
type: "custom"
volumeSpec:
configMap:
name: {{ include "common.names.fullname" . }}-settings
{{- end -}}
{{- if .Values.config.banlist -}}
{{- $_ := set .Values.persistence "factorio-config" (include "factorio.server-banlist" . | fromYaml) -}}
{{- end -}}
{{/* Render the templates */}}
{{ include "common.all" . }}

View File

@ -0,0 +1,51 @@
{{- if .Values.config -}}
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ template "common.names.fullname" . }}-settings
labels:
{{- include "common.labels" . | nindent 4 }}
data:
{{- with .Values.config.server_settings -}}
{{- if . }}
server-settings.json: |
{{ toPrettyJson . | indent 4 }}
{{- end -}}
{{- end -}}
{{- with .Values.config.rcon.password -}}
{{- if . }}
rconpw: |
{{ . | indent 4 }}
{{- end -}}
{{- end -}}
{{- with .Values.config.map_gen_settings -}}
{{- if . }}
map-gen-settings.json: |
{{ toPrettyJson . | indent 4 }}
{{- end -}}
{{- end -}}
{{- with .Values.config.map_settings -}}
{{- if . }}
map-settings.json: |
{{ toPrettyJson . | indent 4 }}
{{- end -}}
{{- end -}}
{{- with .Values.config.admin_list -}}
{{- if . }}
server-adminlist.json: |
{{ toPrettyJson . | indent 4 }}
{{- end -}}
{{- end -}}
{{- with .Values.config.white_list -}}
{{- if . }}
server-whitelist.json: |
{{ toPrettyJson . | indent 4 }}
{{- end -}}
{{- end -}}
{{- with .Values.config.ban_list -}}
{{- if . }}
server-banlist.json: |
{{ toPrettyJson . | indent 4 }}
{{- end -}}
{{- end -}}
{{- end -}}

View File

@ -0,0 +1,373 @@
#
# IMPORTANT NOTE
#
# This chart inherits from our common library chart. You can check the default values/options here:
# https://github.com/k8s-at-home/library-charts/tree/main/charts/stable/common/values.yaml
#
image:
# -- image repository
repository: factoriotools/factorio
# -- image tag
# @default -- chart.appVersion
tag:
# -- image pull policy
pullPolicy: IfNotPresent
initContainers:
# -- Configures an initContainer that copies the configmap to the factorio conf directory
# @default -- See values.yaml
copy-configmap:
image: busybox
imagePullPolicy: IfNotPresent
command:
- "sh"
- "-c"
- |
mkdir -p /factorio/config
cp -vL /helmconfig/* /factorio/config/
volumeMounts:
- name: factorio-config
mountPath: /helmconfig/
- name: config
mountPath: /factorio/
securityContext:
runAsUser: 0
# -- environment variables. See more environment variables in the [factorio documentation](https://factorio.org/docs).
# @default -- See below
env:
# -- Set the container timezone
TZ: UTC
# -- Generate a new save if one does not exist before starting the server
GENERATE_NEW_SAVE: "{{ .Values.config.factorioServer.generate_new_save }}"
# -- Load latest when true. Otherwise load SAVE_NAME
LOAD_LATEST_SAVE: "{{ .Values.config.factorioServer.load_latest_save }}"
# -- UDP port the server listens on
PORT: "{{ .Values.service.main.ports.server.port }}"
# -- TCP port the rcon server listens on
RCON_PORT: "{{ .Values.service.main.ports.rcon.port }}"
# -- Name to use for the save file
SAVE_NAME: "{{ .Values.config.factorioServer.save_name }}"
# -- factorio.com token
TOKEN: "{{ .Values.config.factorioServer.token }}"
# -- If mods should be updated befoqre starting the server
UPDATE_MODS_ON_START: "{{ .Values.config.factorioServer.update_mods_on_start }}"
# -- factorio.com username
USERNAME: "{{ .Values.config.factorioServer.username }}"
# -- Configures service settings for the chart.
# @default -- See values.yaml
service:
main:
ports:
http:
enabled: false
primary: false
server:
enabled: true
port: 34197
protocol: UDP
rcon:
enabled: true
primary: true
port: 27015
protocol: TCP
ingress:
# -- Enable and configure ingress settings for the chart under this key.
# @default -- See values.yaml
main:
enabled: false
# -- Configure persistence settings for the chart under this key.
# @default -- See values.yaml
persistence:
config:
enabled: true
mountPath: /factorio
# -- Configure server settings. Can be disabled if you wish to configure in the container in the json config files.
# -- See values.yaml for descriptions for many config options, ore refer to https://wiki.factorio.com/Multiplayer.
# @default -- See values.yaml
config:
factorioServer:
# -- name to be used for save
save_name: "_autosave1"
# -- Generate a New Save
generate_new_save: false
# -- Update mods on start
update_mods_on_start: false
# -- lets the game know if you want to load the latest save
load_latest_save: true
# -- factorio.com token
token:
# -- factorio.com password
username:
server_settings:
# -- Your Instance Name
name: Factorio
# -- Your Instance Description
description: "Factorio running on Kubernetes"
tags:
- game
- tags
# -- Maximum number of players allowed, admins can join even a full server. 0 means unlimited.
max_players: 0
# -- Game visibility
visibility:
# -- Game will be published on the official Factorio matching server
public: false
# -- Game will be broadcast on LAN
lan: true
# -- Your factorio.com login credentials. Required for games with visibility public
username: ""
password: ""
# -- Authentication token. May be used instead of password above.
token: ""
# -- password required to log into the factorio server
game_password: ""
# -- When set to true, the server will only allow clients that have a valid Factorio.com account
require_user_verification: false
# -- optional, default value is 0. 0 means unlimited.
max_upload_in_kilobytes_per_second: 0
# -- optional, default value is 5. 0 means unlimited.
max_upload_slots: 5
# -- optional one tick is 16ms in default speed, default value is 0. 0 means no minimum.
minimum_latency_in_ticks: 0
# -- Players that played on this map already can join even when the max player limit was reached.
ignore_player_limit_for_returning_players: false
# -- possible values are, true, false and admins-only
allow_commands: admins-only
# -- Autosave interval in minutes
autosave_interval: 10
# -- server autosave slots, it is cycled through when the server autosaves.
autosave_slots: 5
# -- How many minutes until someone is kicked when doing nothing, 0 for never.
afk_autokick_interval: 0
# -- Whether should the server be paused when no players are present.
auto_pause: true
# -- specifies if anyone can pause or only admins
only_admins_can_pause_the_game: true
# -- Whether autosaves should be saved only on server or also on all connected clients. Default is true.
autosave_only_on_server: true
# -- Highly experimental feature, enable only at your own
# -- risk of losing your saves. On UNIX systems, server will fork itself to create an
# -- autosave. Autosaving on connected Windows clients will be disabled regardless of
# -- autosave_only_on_server option.
non_blocking_saving: false
# -- Long network messages are split into segments that are sent
# -- over multiple ticks. Their size depends on the number of peers currently connected.
# -- Increasing the segment size will increase upload bandwidth requirement for the server
# -- and download bandwidth requirement for clients. This setting only affects server
# -- outbound messages. Changing these settings can have a negative impact on connection
# -- stability for some clients.
minimum_segment_size: 25
minimum_segment_size_peer_count: 20
maximum_segment_size: 100
maximum_segment_size_peer_count: 10
# -- Password and port for the rcon service
rcon:
external: true
type: LoadBalancer
password: "replaceme"
port: 30100
map_gen_settings:
# --The inverse of water scale in the map generator GUI.
terrain_segmentation: 1
# -- The equivalent to water coverage in the map generator GUI. Higher coverage means
# -- more water in larger oceans.
# -- Water level = 10 * log2(this value)
water: 1
# -- Width and height of map, in tiles; 0 means infinite
width: 0
# -- Width and height of map, in tiles; 0 means infinite
height: 0
# -- Multiplier for biter free zone radius
starting_area: 1
peaceful_mode: false
autoplace_controls:
coal:
frequency: 1
size: 1
richness: 1
stone:
frequency: 1
size: 1
richness: 1
copper-ore:
frequency: 1
size: 1
richness: 1
iron-ore:
frequency: 1
size: 1
richness: 1
uranium-ore:
frequency: 1
size: 1
richness: 1
crude-oil:
frequency: 1
size: 1
richness: 1
trees:
frequency: 1
size: 1
richness: 1
enemy-base:
frequency: 1
size: 1
richness: 1
cliff_settings:
# -- Name of the cliff prototype
name: cliff
# -- Elevation of first row of cliffs
cliff_elevation_0: 10
# -- Elevation difference between successive rows of cliffs.
# -- This is inversely proportional to frequency in the map generation GUI. Specifically, when set from the GUI the value is 40 / frequency.
cliff_elevation_interval: 40
# -- Called cliff continuity in the map generator GUI. 0 will result in no cliffs, 10 will make all cliff rows completely solid
richness: 1
# -- Overrides for property value generators (map type)
# -- Leave elevation blank to get normal terrain.
# -- Use ''elevation'': ''0_16-elevation'' to reproduce terrain from 0.16.
# -- Use ''elevation'': ''0_17-island'' to get an island.
# -- Moisture and terrain type are also controlled via this.
# -- "control-setting:moisture:frequency:multiplier is the inverse of the moisture scale in the map generator GUI."
# -- "control-setting:moisture:bias is the moisture bias in the map generator GUI."
# -- "control-setting:aux:frequency:multiplier is the inverse of the terrain type scale in the map generator GUI."
# -- "control-setting:aux:bias is the teraain type bias in the map generator GUI."
property_expression_names:
control-setting:moisture:frequency:multiplier: "1"
control-setting:moisture:bias: "0"
control-setting:aux:frequency:multiplier: "1"
control-setting:aux:bias: "0"
starting_points:
- "x": 0
"y": 0
# -- Use null for a random seed, number for a specific seed.
seed: null
map_settings:
difficulty_settings:
recipe_difficulty: 0
technology_difficulty: 0
technology_price_multiplier: 1
research_queue_setting: after-victory
pollution:
enabled: true
# -- these are values for 60 ticks (1 simulated second)
# -- amount that is diffused to neighboring chunk
diffusion_ratio: 0.02
min_to_diffuse: 15
ageing: 1
expected_max_per_chunk: 150
min_to_show_per_chunk: 50
min_pollution_to_damage_trees: 60
pollution_with_max_forest_damage: 150
pollution_per_tree_damage: 50
pollution_restored_per_tree_damage: 10
max_pollution_to_restore_trees: 20
enemy_attack_pollution_consumption_modifier: 1
enemy_evolution:
enabled: true
time_factor: 0.000004
destroy_factor: 0.002
pollution_factor: 0.0000009
enemy_expansion:
enabled: true
min_base_spacing: 3
max_expansion_distance: 7
friendly_base_influence_radius: 2
enemy_building_influence_radius: 2
building_coefficient: 0.1
other_base_coefficient: 2
neighbouring_chunk_coefficient: 0.5
neighbouring_base_chunk_coefficient: 0.4
max_colliding_tiles_coefficient: 0.9
settler_group_min_size: 5
settler_group_max_size: 20
min_expansion_cooldown: 14400
max_expansion_cooldown: 216000
unit_group:
min_group_gathering_time: 3600
max_group_gathering_time: 36000
max_wait_time_for_late_members: 7200
max_group_radius: 30
min_group_radius: 5
max_member_speedup_when_behind: 1.4
max_member_slowdown_when_ahead: 0.6
max_group_slowdown_factor: 0.3
max_group_member_fallback_factor: 3
member_disown_distance: 10
tick_tolerance_when_member_arrives: 60
max_gathering_unit_groups: 30
max_unit_group_size: 200
steering:
default:
radius: 1.2
separation_force: 0.005
separation_factor: 1.2
force_unit_fuzzy_goto_behavior: false
moving:
radius: 3
separation_force: 0.01
separation_factor: 3
force_unit_fuzzy_goto_behavior: false
path_finder:
fwd2bwd_ratio: 5
goal_pressure_ratio: 2
max_steps_worked_per_tick: 100
max_work_done_per_tick: 8000
use_path_cache: true
short_cache_size: 5
long_cache_size: 25
short_cache_min_cacheable_distance: 10
short_cache_min_algo_steps_to_cache: 50
long_cache_min_cacheable_distance: 30
cache_max_connect_to_cache_steps_multiplier: 100
cache_accept_path_start_distance_ratio: 0.2
cache_accept_path_end_distance_ratio: 0.15
negative_cache_accept_path_start_distance_ratio: 0.3
negative_cache_accept_path_end_distance_ratio: 0.3
cache_path_start_distance_rating_multiplier: 10
cache_path_end_distance_rating_multiplier: 20
stale_enemy_with_same_destination_collision_penalty: 30
ignore_moving_enemy_collision_distance: 5
enemy_with_different_destination_collision_penalty: 30
general_entity_collision_penalty: 10
general_entity_subsequent_collision_penalty: 3
extended_collision_penalty: 3
max_clients_to_accept_any_new_request: 10
max_clients_to_accept_short_new_request: 100
direct_distance_to_consider_short_request: 100
short_request_max_steps: 1000
short_request_ratio: 0.5
min_steps_to_check_path_find_termination: 2000
start_to_goal_cost_multiplier_to_terminate_path_find: 500
overload_levels:
- 0
- 100
- 500
overload_multipliers:
- 2
- 3
- 4
negative_path_cache_delay_interval: 20
max_failed_behavior_count: 3
admin_list:
# - "john_doe"
# - "jane_doe"
white_list:
# - "john_doe"
# - "jane_doe"
ban_list:
# - "john_doe"
# - "jane_doe"