move everything top level so it can be used by the k3s built-in helm-controller. add woodpecker ci config.

This commit is contained in:
Madison Grubb
2025-07-10 10:21:39 -04:00
parent 85ff210135
commit bc2debdea0
58 changed files with 188 additions and 704 deletions

View File

@@ -0,0 +1,26 @@
# https://github.com/kgrubb/helm-chart-freetak
apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
name: freetak
namespace: freetak
spec:
chart: freetak
targetNamespace: freetak
repo: https://kgrubb.github.io/helm-chart-freetak/
version: 0.1.2
valuesContent: |-
ingress:
enabled: true
className: nginx
hosts:
- host: tak.keligrubb.com
paths:
- path: /
pathType: Prefix
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-cluster-issuer"
tls:
- secretName: freetak-tls
hosts:
- tak.keligrubb.com

View File

@@ -0,0 +1,4 @@
kind: Namespace
apiVersion: v1
metadata:
name: freetak

View File

@@ -0,0 +1,60 @@
apiVersion: v1
kind: Service
metadata:
name: kiwix
namespace: ingress-nginx
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8080
clusterIP: None
type: ClusterIP
---
apiVersion: discovery.k8s.io/v1
kind: EndpointSlice
metadata:
name: kiwix
namespace: ingress-nginx
labels:
kubernetes.io/service-name: kiwix
addressType: IPv4
ports:
- name: http
protocol: TCP
port: 8080
endpoints:
- addresses:
- "192.168.1.178"
conditions:
ready: true
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: kiwix
namespace: ingress-nginx
annotations:
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
cert-manager.io/cluster-issuer: "letsencrypt-cluster-issuer"
spec:
ingressClassName: "nginx"
tls:
- secretName: kiwix-tls
hosts:
- wiki.keligrubb.com
rules:
- host: wiki.keligrubb.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: kiwix
port:
number: 80

View File

@@ -0,0 +1,60 @@
apiVersion: v1
kind: Service
metadata:
name: media
namespace: ingress-nginx
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8096
clusterIP: None
type: ClusterIP
---
apiVersion: discovery.k8s.io/v1
kind: EndpointSlice
metadata:
name: media
namespace: ingress-nginx
labels:
kubernetes.io/service-name: media
addressType: IPv4
ports:
- name: http
protocol: TCP
port: 8096
endpoints:
- addresses:
- "192.168.1.178"
conditions:
ready: true
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: media
namespace: ingress-nginx
annotations:
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
cert-manager.io/cluster-issuer: "letsencrypt-cluster-issuer"
spec:
ingressClassName: "nginx"
tls:
- secretName: media-tls
hosts:
- media.keligrubb.com
rules:
- host: media.keligrubb.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: media
port:
number: 80

View File

@@ -0,0 +1,211 @@
# Copyright 2018 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
apiVersion: v1
kind: ServiceAccount
metadata:
name: node-local-dns
namespace: kube-system
labels:
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
---
apiVersion: v1
kind: Service
metadata:
name: kube-dns-upstream
namespace: kube-system
labels:
k8s-app: kube-dns
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
kubernetes.io/name: "KubeDNSUpstream"
spec:
ports:
- name: dns
port: 53
protocol: UDP
targetPort: 53
- name: dns-tcp
port: 53
protocol: TCP
targetPort: 53
selector:
k8s-app: kube-dns
---
apiVersion: v1
kind: ConfigMap
metadata:
name: node-local-dns
namespace: kube-system
labels:
addonmanager.kubernetes.io/mode: Reconcile
data:
Corefile: |
cluster.local:53 {
errors
cache {
success 9984 30
denial 9984 5
}
reload
loop
bind 169.254.20.10 10.43.0.10
forward . __PILLAR__CLUSTER__DNS__ {
force_tcp
}
prometheus :9253
health 169.254.20.10:8080
}
in-addr.arpa:53 {
errors
cache 30
reload
loop
bind 169.254.20.10 10.43.0.10
forward . __PILLAR__CLUSTER__DNS__ {
force_tcp
}
prometheus :9253
}
ip6.arpa:53 {
errors
cache 30
reload
loop
bind 169.254.20.10 10.43.0.10
forward . __PILLAR__CLUSTER__DNS__ {
force_tcp
}
prometheus :9253
}
.:53 {
errors
cache 30
reload
loop
bind 169.254.20.10 10.43.0.10
forward . __PILLAR__UPSTREAM__SERVERS__
prometheus :9253
}
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-local-dns
namespace: kube-system
labels:
k8s-app: node-local-dns
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
spec:
updateStrategy:
rollingUpdate:
maxUnavailable: 10%
selector:
matchLabels:
k8s-app: node-local-dns
template:
metadata:
labels:
k8s-app: node-local-dns
annotations:
prometheus.io/port: "9253"
prometheus.io/scrape: "true"
spec:
priorityClassName: system-node-critical
serviceAccountName: node-local-dns
hostNetwork: true
dnsPolicy: Default # Don't use cluster DNS.
tolerations:
- key: "CriticalAddonsOnly"
operator: "Exists"
- effect: "NoExecute"
operator: "Exists"
- effect: "NoSchedule"
operator: "Exists"
containers:
- name: node-cache
image: registry.k8s.io/dns/k8s-dns-node-cache:1.25.0
resources:
requests:
cpu: 25m
memory: 5Mi
args: [ "-localip", "169.254.20.10,10.43.0.10", "-conf", "/etc/Corefile", "-upstreamsvc", "kube-dns-upstream" ]
securityContext:
capabilities:
add:
- NET_ADMIN
ports:
- containerPort: 53
name: dns
protocol: UDP
- containerPort: 53
name: dns-tcp
protocol: TCP
- containerPort: 9253
name: metrics
protocol: TCP
livenessProbe:
httpGet:
host: 169.254.20.10
path: /health
port: 8080
initialDelaySeconds: 60
timeoutSeconds: 5
volumeMounts:
- mountPath: /run/xtables.lock
name: xtables-lock
readOnly: false
- name: config-volume
mountPath: /etc/coredns
- name: kube-dns-config
mountPath: /etc/kube-dns
volumes:
- name: xtables-lock
hostPath:
path: /run/xtables.lock
type: FileOrCreate
- name: kube-dns-config
configMap:
name: kube-dns
optional: true
- name: config-volume
configMap:
name: node-local-dns
items:
- key: Corefile
path: Corefile.base
---
# A headless service is a service with a service IP but instead of load-balancing it will return the IPs of our associated Pods.
# We use this to expose metrics to Prometheus.
apiVersion: v1
kind: Service
metadata:
annotations:
prometheus.io/port: "9253"
prometheus.io/scrape: "true"
labels:
k8s-app: node-local-dns
name: node-local-dns
namespace: kube-system
spec:
clusterIP: None
ports:
- name: metrics
port: 9253
targetPort: 9253
selector:
k8s-app: node-local-dns

View File

@@ -0,0 +1,38 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: mineclonia-config
namespace: mineclonia
data:
minetest.conf: |
enable_server = true
default_game = mineclonia
game_id = mineclonia
mapgen = mineclonia
server_name = Runestone
worldname = Runestone
server_description = "Explore vast landscapes, uncover ancient secrets, and shape your legacy in the land of Runestone."
server_address = 0.0.0.0
server_port = 30000
max_users = 50
debug_log_level = warning
time_speed = 72 # set to 20 minutes day/night cycles like minecraft.
worldname = Runestone
# network optimizations
enable_ipv6 = false
max_packets_per_iteration = 1024
chat_message_max_length = 200
# Authentication
name = socialsyndrome
require_password = true
password_hashing = true
enable_mods = true
player_name = true
auth_backend = sqlite3
auth_fail_ban_time = 10
enable_password_protection = true
admin.txt: |
socialsyndrome

View File

@@ -0,0 +1,69 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: mineclonia
namespace: mineclonia
spec:
replicas: 1
selector:
matchLabels:
app: mineclonia
template:
metadata:
labels:
app: mineclonia
spec:
initContainers:
- name: mineclonia-updater
image: alpine
command: ["/bin/sh", "-c"]
args:
- |
set -e
apk add --no-cache curl unzip jq
mkdir -p /var/lib/minetest/.minetest
latest_release=$(curl -s https://codeberg.org/api/v1/repos/mineclonia/mineclonia/releases/latest | jq -r '.tag_name')
if [ ! -d "/var/lib/minetest/.minetest/games/mineclonia" ] || [ "$(cat /var/lib/minetest/.minetest/games/mineclonia/version.txt)" != "$latest_release" ]; then
echo "Updating Mineclonia to version $latest_release"
rm -rf /var/lib/minetest/.minetest/games/mineclonia
curl -L https://codeberg.org/mineclonia/mineclonia/archive/$latest_release.zip -o /tmp/mineclonia.zip
unzip /tmp/mineclonia.zip -d /var/lib/minetest/.minetest/games/
echo "$latest_release" > /var/lib/minetest/.minetest/games/mineclonia/version.txt
else
echo "Mineclonia is up to date"
fi
# Ensure ownership of all data
chown -R 30000:30000 /var/lib/minetest
ls -ahl /var/lib/minetest
volumeMounts:
- name: data
mountPath: /var/lib/minetest
containers:
- name: mineclonia
image: ghcr.io/luanti-org/luanti
ports:
- containerPort: 30000
protocol: UDP
- containerPort: 30000
protocol: TCP
volumeMounts:
- name: data
mountPath: /var/lib/minetest
- name: config
mountPath: /etc/minetest
- name: admins
mountPath: /var/lib/minetest/worlds/Runestone/admin.txt
subPath: admin.txt
args: ["minetest", "--gameid", "mineclonia"]
stdin: true
tty: true
volumes:
- name: config
configMap:
name: mineclonia-config
- name: data
persistentVolumeClaim:
claimName: mineclonia-data
- name: admins
configMap:
name: mineclonia-config

View File

@@ -0,0 +1,12 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mineclonia-data
namespace: mineclonia
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 64Gi
storageClassName: longhorn

View File

@@ -0,0 +1,19 @@
apiVersion: v1
kind: Service
metadata:
name: mineclonia
namespace: mineclonia
annotations:
metallb.universe.tf/allow-shared-ip: mineclonia
spec:
selector:
app: mineclonia
ports:
- protocol: UDP
port: 30000
targetPort: 30000
- protocol: TCP
port: 30000
targetPort: 30000
type: LoadBalancer
loadBalancerIP: 192.168.1.4

View File

@@ -0,0 +1,4 @@
kind: Namespace
apiVersion: v1
metadata:
name: mineclonia

View File

@@ -0,0 +1,27 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minecraft-ingress
namespace: minecraft
labels:
name: minecraft-ingress
spec:
ingressClassName: nginx
rules:
- host: mc.keligrubb.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: minecraft
port:
number: 25565
- pathType: Prefix
path: "/"
backend:
service:
name: minecraft-voice
port:
number: 24454

View File

@@ -0,0 +1,39 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: minecraft
labels:
app: minecraft
namespace: minecraft
spec:
replicas: 1
selector:
matchLabels:
app: minecraft
template:
metadata:
labels:
app: minecraft
spec:
containers:
- name: minecraft-forge
image: kgrubb/forge:1.19
imagePullPolicy: Always
resources:
requests:
memory: "6144Mi"
cpu: "2"
limits:
memory: "8192Mi"
cpu: "4"
ports:
- containerPort: 25565
securityContext:
readOnlyRootFilesystem: false
volumeMounts:
- name: minecraft-world-saves
mountPath: /forge/world
volumes:
- name: minecraft-world-saves
persistentVolumeClaim:
claimName: minecraft-world-saves

View File

@@ -0,0 +1,15 @@
apiVersion: v1
kind: Service
metadata:
name: minecraft
annotations:
metallb.universe.tf/allow-shared-ip: minecraft
spec:
selector:
app: minecraft
ports:
- protocol: TCP
port: 25565
targetPort: 25565
type: LoadBalancer
loadBalancerIP: 192.168.1.4

View File

@@ -0,0 +1,15 @@
apiVersion: v1
kind: Service
metadata:
name: minecraft-voice
annotations:
metallb.universe.tf/allow-shared-ip: minecraft
spec:
selector:
app: minecraft
ports:
- protocol: UDP
port: 24454
targetPort: 24454
type: LoadBalancer
loadBalancerIP: 192.168.1.4

View File

@@ -0,0 +1,4 @@
kind: Namespace
apiVersion: v1
metadata:
name: minecraft

12
unused/minecraft/pvc.yml Normal file
View File

@@ -0,0 +1,12 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: minecraft-world-saves
namespace: minecraft
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn
resources:
requests:
storage: 20Gi

View File

@@ -0,0 +1,60 @@
apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
name: loki
namespace: monitoring
spec:
chart: loki
targetNamespace: monitoring
repo: https://grafana.github.io/helm-charts
# https://artifacthub.io/packages/helm/grafana/loki
version: 6.29.0
valuesContent: |-
loki:
commonConfig:
replication_factor: 1
schemaConfig:
configs:
- from: "2024-04-01"
store: tsdb
object_store: s3
schema: v13
index:
prefix: loki_index_
period: 24h
pattern_ingester:
enabled: true
limits_config:
allow_structured_metadata: true
volume_enabled: true
ruler:
enable_api: true
minio:
enabled: true
deploymentMode: SingleBinary
singleBinary:
replicas: 1
backend:
replicas: 0
read:
replicas: 0
write:
replicas: 0
ingester:
replicas: 0
querier:
replicas: 0
queryFrontend:
replicas: 0
queryScheduler:
replicas: 0
distributor:
replicas: 0
compactor:
replicas: 0
indexGateway:
replicas: 0
bloomCompactor:
replicas: 0
bloomGateway:
replicas: 0

13
unused/tes3mp/ingress.yml Normal file
View File

@@ -0,0 +1,13 @@
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteUDP
metadata:
name: tes3mp-ingress
namespace: tes3mp
spec:
entryPoints:
- tes3mpudp
routes:
- services:
- name: tes3mp
port: 25566

View File

@@ -0,0 +1,4 @@
kind: Namespace
apiVersion: v1
metadata:
name: tes3mp

12
unused/tes3mp/pvc.yml Normal file
View File

@@ -0,0 +1,12 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: server-data
namespace: tes3mp
spec:
accessModes:
- ReadWriteOnce
storageClassName: local-path
resources:
requests:
storage: 20Gi

View File

@@ -0,0 +1,39 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: tes3mp-config
namespace: tes3mp
data:
requiredDataFiles.json: |-
// This file lets you enforce a certain plugin list and order for all clients
// attempting to join this server
//
// By default, only the English and Russian editions of Morrowind are allowed,
// because the German and French editions have hardcoded translations, whereas
// the Russian edition has localization files that make it compatible with the
// English edition
[
{"Morrowind.esm": ["0x7B6AF5B9","0x34282D67"]},
{"Tribunal.esm": ["0xF481F334","0x211329EF"]},
{"Bloodmoon.esm": ["0x43DD2132","0x9EB62F26"]},
{"Tamriel_Data.esm": ["0x2E8EC19F"]},
{"TR_Mainland.esm": ["0xA78714D4"]},
{"Sky_Main.esm": ["0xE5648B71"]},
{"Cyrodiil_Main.esm": ["0x14D56E88"]},
{"TR_Travels.esp": ["0xC24DC7C6"]},
{"TR_Preview.esp": ["0xB1D688B3"]},
{"TR_Factions.esp": ["0x84C19D6F"]},
{"Sky_Main_Grass.esp": ["0x9820BE61"]},
{"Cyrodiil_Grass.ESP": ["0x4A3E1381"]},
{"adamantiumarmor.esp": ["0x4DDF4A34"]},
{"AreaEffectArrows.esp": ["0xB29A46C5"]},
{"bcsounds.esp": ["0x7772EBC8"]},
{"Siege at Firemoth.esp": ["0xFD12AACE"]},
{"EBQ_Artifact.esp": ["0x4AD30387"]},
{"entertainers.esp": ["0xCD1A732C"]},
{"LeFemmArmor.esp": ["0xE0FDB999"]},
{"master_index.esp": ["0xD26DFC35"]},
{"Better Balanced Combat.esp": ["0xD85D3885"]},
{"Better Balanced Combat - Tamriel Rebuilt Patch.esp": ["0x5C95169D"]},
{"Better Balanced Combat - Siege at Firemoth Patch.esp": ["0x40B0572"]},
]

View File

@@ -0,0 +1,55 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: tes3mp
labels:
app: tes3mp
spec:
replicas: 1
selector:
matchLabels:
app: tes3mp
template:
metadata:
labels:
app: tes3mp
spec:
containers:
- name: tes3mp
image: tes3mp/server
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
env:
- name: TES3MP_SERVER_HOSTNAME
value: "Tes3mp Server"
- name: TES3MP_SERVER_PORT
value: "25566"
ports:
- containerPort: 25566
protocol: UDP
securityContext:
readOnlyRootFilesystem: false
volumeMounts:
- name: tes3mp-config-volume
mountPath: /server/CoreScripts/data/requiredDataFiles.json
subPath: requiredDataFiles.json
- name: tes3mp-lua-config-volume
mountPath: /server/CoreScripts/scripts/config.lua
subPath: config.lua
- name: server-data
mountPath: /server/data
volumes:
- name: tes3mp-config-volume
configMap:
name: tes3mp-config
- name: tes3mp-lua-config-volume
configMap:
name: tes3mp-lua-config
- name: server-data
persistentVolumeClaim:
claimName: server-data

View File

@@ -0,0 +1,347 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: tes3mp-lua-config
namespace: tes3mp
data:
config.lua: |-
config = {}
-- The path used by the server for its data folder
config.dataPath = tes3mp.GetDataPath()
-- The game mode displayed for this server in the server browser
config.gameMode = "Default"
-- Time to login, in seconds
config.loginTime = 60
-- How many clients are allowed to connect from the same IP address
config.maxClientsPerIP = 3
-- The difficulty level used by default
-- Note: In OpenMW, the difficulty slider goes between -100 and 100, with 0 as the default,
-- though you can use any integer value here
config.difficulty = 0
-- The world time used for a newly created world
config.defaultTimeTable = { year = 427, month = 7, day = 16, hour = 9,
daysPassed = 1, dayTimeScale = 30, nightTimeScale = 40 }
-- The chat window instructions that show up when players join the server
config.chatWindowInstructions = "Use " .. color.Yellow .. "Y" .. color.White .. " by default to chat or change it" ..
" from your client config. Type in " .. color.Yellow .. "/help" .. color.White .. " to see the commands" ..
" available to you. Use " .. color.Yellow .. "F2" .. color.White .. " by default to hide the chat window.\n"
-- Whether the world time should continue passing when there are no players on the server
config.passTimeWhenEmpty = false
-- The hours at which night is regarded as starting and ending, used to pass time using a
-- different timescale when it's night
config.nightStartHour = 20
config.nightEndHour = 6
-- Whether players should be allowed to use the ingame tilde (~) console by default
config.allowConsole = false
-- Whether players should be allowed to rest in bed by default
config.allowBedRest = true
-- Whether players should be allowed to rest in the wilderness by default
config.allowWildernessRest = true
-- Whether players should be allowed to wait by default
config.allowWait = true
-- Whether journal entries should be shared across the players on the server or not
config.shareJournal = false
-- Whether faction ranks should be shared across the players on the server or not
config.shareFactionRanks = false
-- Whether faction expulsion should be shared across the players on the server or not
config.shareFactionExpulsion = false
-- Whether faction reputation should be shared across the players on the server or not
config.shareFactionReputation = false
-- Whether dialogue topics should be shared across the players on the server or not
config.shareTopics = false
-- Whether crime bounties should be shared across players on the server or not
config.shareBounty = false
-- Whether reputation should be shared across players on the server or not
config.shareReputation = false
-- Whether map exploration should be shared across players on the server or not
config.shareMapExploration = false
-- Whether ingame videos should be played for other players when triggered by one player
config.shareVideos = false
-- The cell that newly created players are teleported to
config.defaultSpawnCell = "-3, -2"
-- The X, Y and Z position that newly created players are teleported to
config.defaultSpawnPos = {-23894.0, -15079.0, 505}
-- The X and Z rotation that newly created players are assigned
config.defaultSpawnRot = {0, 1.2}
-- The cell that players respawn in, unless overridden below by other respawn options
config.defaultRespawnCell = "Balmora, Temple"
-- The X, Y and Z position that players respawn in
config.defaultRespawnPos = {4700.5673828125, 3874.7416992188, 14758.990234375}
-- The X and Z rotation that respawned players are assigned
config.defaultRespawnRot = {0.25314688682556, 1.570611000061}
-- Whether the default respawn location should be ignored in favor of respawning the
-- player at the nearest Imperial shrine
config.respawnAtImperialShrine = true
-- Whether the default respawn location should be ignored in favor of respawning the
-- player at the nearest Tribunal temple
-- Note: When both this and the Imperial shrine option are enabled, there is a 50%
-- chance of the player being respawned at either
config.respawnAtTribunalTemple = true
-- The maximum value that any attribute except Speed is allowed to have
config.maxAttributeValue = 200
-- The maximum value that Speed is allowed to have
-- Note: Speed is given special treatment because of the Boots of Blinding Speed
config.maxSpeedValue = 365
-- The maximum value that any skill except Acrobatics is allowed to have
config.maxSkillValue = 200
-- The maximum value that Acrobatics is allowed to have
-- Note: Acrobatics is given special treatment because of the Scroll of Icarian Flight
config.maxAcrobaticsValue = 1200
-- Allow modifier values to bypass allowed skill values
config.ignoreModifierWithMaxSkill = false
-- The refIds of items that players are not allowed to equip for balancing reasons
config.bannedEquipmentItems = { "helseth's ring" }
-- Whether players should respawn when dying
config.playersRespawn = true
-- Time to stay dead before being respawned, in seconds
config.deathTime = 5
-- The number of days spent in jail as a penalty for dying, when respawning
config.deathPenaltyJailDays = 5
-- Whether players' bounties are reset to 0 after dying
config.bountyResetOnDeath = false
-- Whether players spend time in jail proportional to their bounty after dying
-- Note: If deathPenaltyJailDays is also enabled, that penalty will be added to
-- this one
config.bountyDeathPenalty = true
-- Whether players should be allowed to use the /suicide command
config.allowSuicideCommand = true
-- Whether players should be allowed to use the /fixme command
config.allowFixmeCommand = true
-- How many seconds need to pass between uses of the /fixme command by a player
config.fixmeInterval = 30
-- The colors used for different ranks on the server
config.rankColors = { serverOwner = color.Orange, admin = color.Red, moderator = color.Green }
-- Which numerical IDs should be used by custom menus implemented in the Lua scripts,
-- to prevent other menu inputs from being taken into account for them
config.customMenuIds = { menuHelper = 9001, confiscate = 9002, recordPrint = 9003 }
-- The menu files that should be loaded for menuHelper, from the scripts/menu subfolder
config.menuHelperFiles = { "help", "defaultCrafting", "advancedExample" }
-- What the difference in ping needs to be in favor of a new arrival to a cell or region
-- compared to that cell or region's current player authority for the new arrival to become
-- the authority there
-- Note: Setting this too low will lead to constant authority changes which cause more lag
config.pingDifferenceRequiredForAuthority = 40
-- The log level enforced on clients by default, determining how much debug information
-- is displayed in their debug window and logs
-- Note 1: Set this to -1 to allow clients to use whatever log level they have set in
-- their client settings
-- Note 2: If you set this to 0 or 1, clients will be able to read about the movements
-- and actions of other players that they would otherwise not know about,
-- while also incurring a framerate loss on highly populated servers
config.enforcedLogLevel = -1
-- The physics framerate used by default
-- Note: In OpenMW, the physics framerate is 60 by default, but TES3MP has slightly higher
-- system requirements that make a default of 30 more appropriate.
config.physicsFramerate = 30
-- Whether players are allowed to interact with containers located in unloaded cells.
config.allowOnContainerForUnloadedCells = false
-- Whether players should collide with other actors
config.enablePlayerCollision = true
-- Whether actors should collide with other actors
config.enableActorCollision = true
-- Whether placed objects should collide with actors
config.enablePlacedObjectCollision = false
-- Enforce collision for certain placed object refIds even when enablePlacedObjectCollision
-- is false
config.enforcedCollisionRefIds = { "misc_uni_pillow_01", "misc_uni_pillow_02" }
-- Whether placed object collision (when turned on) resembles actor collision, in that it
-- prevents players from standing on top of the placed objects without slipping
config.useActorCollisionForPlacedObjects = false
-- Prevent certain object refIds from being deleted as a result of player-sent packets
config.disallowedDeleteRefIds = { "m'aiq" }
-- Prevent certain object refIds from being placed or spawned as a result of player-sent packets
config.disallowedCreateRefIds = {}
-- Prevent certain object refIds from being locked or unlocked as a result of player-sent packets
config.disallowedLockRefIds = {}
-- Prevent certain object refIds from being trapped or untrapped as a result of player-sent packets
config.disallowedTrapRefIds = {}
-- Prevent certain object refIds from being enabled or disabled as a result of player-sent packets
config.disallowedStateRefIds = {}
-- Prevent object scales from being set this high
config.maximumObjectScale = 20
-- The prefix used for automatically generated record IDs
-- Note 1: Records with automatically generated IDs get erased when there are no more instances of
-- them in player inventories/spellbooks or in cells
-- Note 2: By default, records created through regular gameplay (i.e. player-created spells, potions,
-- enchantments and enchanted items) use automatically generated record IDs, as do records created
-- via the /createrecord command when no ID is specified there
config.generatedRecordIdPrefix = "$custom"
-- The types of record stores used on this server in the order in which they should be loaded for
-- players, with the correct order ensuring that enchantments are loaded before items that might be
-- using those enchantments or ensuring that NPCs are loaded after the items they might have in their
-- inventories
config.recordStoreLoadOrder = { "spell", "potion", "enchantment", "armor", "book", "clothing", "weapon",
"miscellaneous", "creature", "npc" }
-- The types of records that can be enchanted and therefore have links to enchantment records
config.enchantableRecordTypes = { "armor", "book", "clothing", "weapon" }
-- The types of records that can be stored by players and therefore have links to players,
-- listed in the order in which they should be loaded
config.carriableRecordTypes = { "spell", "potion", "armor", "book", "clothing", "weapon", "miscellaneous" }
-- The settings which are accepted as input for different record types when using /storerecord
config.validRecordSettings = {
armor = { "baseId", "id", "name", "model", "icon", "script", "enchantmentId", "enchantmentCharge",
"subtype", "weight", "value", "health", "armorRating" },
book = { "baseId", "id", "name", "model", "icon", "script", "enchantmentId", "enchantmentCharge",
"text", "weight", "value", "scrollState", "skillId" },
clothing = { "baseId", "id", "name", "model", "icon", "script", "enchantmentId", "enchantmentCharge",
"subtype", "weight", "value" },
creature = { "baseId", "id", "name", "model", "script", "subtype", "level", "health", "magicka",
"fatigue", "aiFight", "flags" },
enchantment = { "baseId", "id", "subtype", "cost", "charge", "autoCalc", "effects" },
miscellaneous = { "baseId", "id", "name", "model", "icon", "script", "weight", "value", "keyState" },
npc = { "baseId", "inventoryBaseId", "id", "name", "script", "flags", "gender", "race", "model", "hair",
"head", "class", "faction", "level", "health", "magicka", "fatigue", "aiFight", "autoCalc" },
potion = { "baseId", "id", "name", "model", "icon", "script", "weight", "value", "autoCalc" },
spell = { "baseId", "id", "name", "subtype", "cost", "flags", "effects" },
weapon = { "baseId", "id", "name", "model", "icon", "script", "enchantmentId", "enchantmentCharge",
"subtype", "weight", "value", "health", "speed", "reach", "damageChop", "damageSlash", "damageThrust",
"flags" }
}
-- The settings which need to be provided when creating a new record that isn't based at all
-- on an existing one, i.e. a new record that is missing a baseId
config.requiredRecordSettings = {
armor = { "name", "model" },
book = { "name", "model" },
clothing = { "name", "model" },
creature = { "name", "model" },
enchantment = {},
miscellaneous = { "name", "model" },
npc = { "name", "race", "class" },
potion = { "name", "model" },
spell = { "name" },
weapon = { "name", "model" }
}
-- The record type settings whose input should be converted to numerical values when using /storerecord
config.numericalRecordSettings = { "subtype", "weight", "value", "cost", "charge", "health", "armorRating",
"speed", "reach", "level", "magicka", "fatigue", "aiFight", "autoCalc", "gender", "flags", "enchantmentCharge" }
-- The record type settings whose input should be converted to booleans when using /storerecord
config.booleanRecordSettings = { "scrollState", "keyState" }
-- The record type settings whose input should be converted to tables with a min and a max numerical value
config.minMaxRecordSettings = { "damageChop", "damageSlash", "damageThrust" }
-- The types of object and actor packets stored in cell data
config.cellPacketTypes = { "delete", "place", "spawn", "lock", "trap", "scale", "state", "doorState",
"container", "equipment", "ai", "death", "actorList", "position", "statsDynamic", "cellChangeTo",
"cellChangeFrom" }
-- Whether the server should enforce that all clients connect with a specific list of data files
-- defined in data/requiredDataFiles.json
-- Warning: Only set this to false if you trust the people connecting and are sure they know
-- what they're doing. Otherwise, you risk getting corrupt server data from
-- their usage of unshared plugins.
config.enforceDataFiles = true
-- Whether the server should avoid crashing when Lua script errors occur
-- Warning: Only set this to true if you want to have a highly experimental server where
-- important data can potentially stay unloaded or get overwritten
config.ignoreScriptErrors = false
-- The type of database or data format used by the server
-- Valid values: json, sqlite3
-- Note: The latter is only partially implemented as of now
config.databaseType = "json"
-- The location of the database file
-- Note: Not applicable when using json
config.databasePath = config.dataPath .. "/database.db" -- Path where database is stored
-- Disallow players from including the following in their own names or the names of their custom items
-- Note: Unfortunately, these are based on real names that trolls have been using on servers
config.disallowedNameStrings = { "bitch", "blowjob", "blow job", "cocksuck", "cunt", "ejaculat",
"faggot", "fellatio", "fuck", "gas the ", "Hitler", "jizz", "nigga", "nigger", "smegma", "vagina", "whore" }
-- The order in which table keys should be saved to JSON files
config.playerKeyOrder = { "login", "settings", "character", "customClass", "location", "stats",
"fame", "shapeshift", "attributes", "attributeSkillIncreases", "skills", "skillProgress",
"recordLinks", "equipment", "inventory", "spellbook", "books", "factionRanks", "factionReputation",
"factionExpulsion", "mapExplored", "ipAddresses", "customVariables", "admin", "difficulty",
"enforcedLogLevel", "physicsFramerate", "consoleAllowed", "bedRestAllowed",
"wildernessRestAllowed", "waitAllowed", "gender", "race", "head", "hair", "class", "birthsign",
"cell", "posX", "posY", "posZ", "rotX", "rotZ", "healthBase", "healthCurrent", "magickaBase",
"magickaCurrent", "fatigueBase", "fatigueCurrent" }
config.cellKeyOrder = { "packets", "entry", "lastVisit", "recordLinks", "objectData", "refId", "count",
"charge", "enchantmentCharge", "location", "actorList", "ai", "summon", "stats", "cellChangeFrom",
"cellChangeTo", "container", "death", "delete", "doorState", "equipment", "inventory", "lock",
"place", "position", "scale", "spawn", "state", "statsDynamic", "trap" }
config.recordstoreKeyOrder = { "general", "permanentRecords", "generatedRecords", "recordLinks",
"id", "baseId", "name", "subtype", "gender", "race", "hair", "head", "class", "faction", "cost",
"value", "charge", "weight", "autoCalc", "flags", "icon", "model", "script", "attribute", "skill",
"rangeType", "area", "duration", "magnitudeMax", "magnitudeMin", "effects", "players", "cells", "global" }
config.worldKeyOrder = { "general", "time", "topics", "kills", "journal", "customVariables", "type",
"index", "quest", "actorRefId", "year", "month", "day", "hour", "daysPassed", "timeScale" }
return config

View File

@@ -0,0 +1,12 @@
apiVersion: v1
kind: Service
metadata:
name: tes3mp
spec:
selector:
app: tes3mp
ports:
- protocol: UDP
port: 25566
targetPort: 25566
type: LoadBalancer