Satisfactory

Satisfactory dedicated server on steam.

Ansible Role: steam

Satisfactory dedicated server.

  • Role handles all steps that are provided in this documentation.

None

Role Details: Updated: 2022-10-16 service docs PRIVATE

Ports

---
###############################################################################
# Ports Configuration
###############################################################################
# Ports should be managed externally via an OS role.
#
# Reference:
# * https://satisfactory.fandom.com/wiki/Dedicated_servers#Port_forwarding_and_firewall_settings

ports:
  - {proto: 'udp', from_ip: 'any', to_port: 15777, direction: 'in', comment: 'satisfactory server query port'}
  - {proto: 'udp', from_ip: 'any', to_port: 15000, direction: 'in', comment: 'satisfactory server beacon port'}
  - {proto: 'udp', from_ip: 'any', to_port: 7777,  direction: 'in', comment: 'satisfactory server game port'}

Defaults

---
###############################################################################
# Satisfactory (+10GB)
###############################################################################
# Requirements:
# * CPU:     i5-3570/Ryzen 5 3600 x64 favors single core speed over multiple
#            cores.
# * Memory:  Min 12GB, Recommended 16GB RAM (4+ players).
# * Storage: 10GB.
#
# Reference:
# * https://satisfactory.fandom.com/wiki/Dedicated_servers

# Install preconfigured satisfactory server?
steam_satisfactory_enable: false

# Root install location.
steam_satisfactory_dir: '/home/steam/satisfactory'

# Additional steamcmd options to use during app_update. Default: ''.
steam_satisfactory_app_extras: ''

# Update steamcmd. Default: true.
steam_satisfactory_update_steamcmd: true

# Update satisfactory server. Default: true.
steam_satisfactory_update_server: true

# Server version to use: public, experimental. Default: 'public'.
steam_satisfactory_server_version: 'public'

# Log to journal or file (/var/log/steam/satisfactory)? Default: true.
steam_satisfactory_log_journal: true

# Full path to Backup Satisfactory Saves (daily). Default: '' (disabled).
steam_satisfactory_backup_dir: ''

###############################################################################
# ServerSettings.ini Settings
###############################################################################
# Only defined values are enforced in the configuration file.
#
# steam_satisfactory_settings_server:
#   - {section: '{SECTION}', key: '{KEY}', value: '{VALUE}', state: '{STATE}'
#
#   * state: must be 'present' or 'absent'.
#   * empty values may be used for value, creation or deletion.
#   * Use vault for passwords.

steam_satisfactory_settings_server:
  - {section: '/Script/FactoryGame.FGServerSubsystem', key: 'mAutoPause',            value: 'True', state: 'present'}
  - {section: '/Script/FactoryGame.FGServerSubsystem', key: 'mAutoSaveOnDisconnect', value: 'True', state: 'present'}

###############################################################################
# Scalability.ini Settings
###############################################################################
# Only defined values are enforced in the configuration file.
#
# steam_satisfactory_settings_server:
#   - {section: '{SECTION}', key: '{KEY}', value: '{VALUE}', state: '{STATE}'
#
#   * state: must be 'present' or 'absent'.
#   * empty values may be used for value, creation or deletion.
#   * Use vault for passwords.

steam_satisfactory_settings_scalability:
  - {section: 'NetworkQuality@3', key: 'TotalNetBandwidth',   value: '104857600', state: 'present'}
  - {section: 'NetworkQuality@3', key: 'MaxDynamicBandwidth', value: '104857600', state: 'present'}
  - {section: 'NetworkQuality@3', key: 'MinDynamicBandwidth', value: '10485760',  state: 'present'}

###############################################################################
# GameUserSettings.ini Settings
###############################################################################
# Only defined values are enforced in the configuration file.
#
# steam_satisfactory_settings_server:
#   - {section: '{SECTION}', key: '{KEY}', value: '{VALUE}', state: '{STATE}'
#
#   * state: must be 'present' or 'absent'.
#   * empty values may be used for value, creation or deletion.
#   * Use vault for passwords.

steam_satisfactory_settings_game_user:
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'mFloatValues',                value: '(("FG.AutosaveInterval", 300))',             state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'mIntValues',                  value: '(("FG.DisableSeasonalEvents", 0))',          state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'mAudioVolumes',               value: '(Name="Master_Bus_Volume",Value=1.000000)',  state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'mAudioVolumes',               value: '(Name="Ambient_Bus_Volume",Value=1.000000)', state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'mAudioVolumes',               value: '(Name="Factory_Bus_Volume",Value=1.000000)', state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'mAudioVolumes',               value: '(Name="Music_Bus_Volume",Value=0.500000)',   state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'mAudioVolumes',               value: '(Name="SFX_Bus_Volume",Value=1.000000)',     state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'mAudioVolumes',               value: '(Name="VO_Bus_Volume",Value=1.000000)',      state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'mNetworkQuality',             value: '3',            state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'mIsArachnophobiaMode',        value: 'False',        state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'mInvertY',                    value: 'False',        state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'mAutoSortInventory',          value: 'False',        state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'mPrimaryLanguage',            value: '',             state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'CurrentFGGameUserSettingsVersion', value: '0',       state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'bUseVSync',                   value: 'False',        state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'bUseDynamicResolution',       value: 'False',        state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'ResolutionSizeX',             value: '1280',         state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'ResolutionSizeY',             value: '720',          state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'LastUserConfirmedResolutionSizeX', value: '1280',    state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'LastUserConfirmedResolutionSizeY', value: '720',     state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'WindowPosX',                  value: '-1',           state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'WindowPosY',                  value: '-1',           state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'FullscreenMode',              value: '1',            state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'LastConfirmedFullscreenMode', value: '1',            state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'PreferredFullscreenMode',     value: '1',            state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'Version',                     value: '5',            state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'AudioQualityLevel',           value: '0',            state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'LastConfirmedAudioQualityLevel', value: '0',         state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'FrameRateLimit',              value: '0.000000',     state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'DesiredScreenWidth',          value: '1280',         state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'DesiredScreenHeight',         value: '720',          state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'LastUserConfirmedDesiredScreenWidth', value: '1280', state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'LastUserConfirmedDesiredScreenHeight', value: '720', state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'LastRecommendedScreenWidth',  value: '-1.000000',    state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'LastRecommendedScreenHeight', value: '-1.000000',    state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'LastCPUBenchmarkResult',      value: '-1.000000',    state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'LastGPUBenchmarkResult',      value: '-1.000000',    state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'LastGPUBenchmarkMultiplier',  value: '1.000000',     state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'bUseHDRDisplayOutput',        value: 'False',        state: 'present'}
  - {section: '/Script/FactoryGame.FGGameUserSettings', key: 'HDRDisplayOutputNits',        value: '1000',         state: 'present'}
  - {section: 'ScalabilityGroups', key: 'sg.ResolutionQuality',   value: '100.000000', state: 'present'}
  - {section: 'ScalabilityGroups', key: 'sg.ViewDistanceQuality', value: '3',          state: 'present'}
  - {section: 'ScalabilityGroups', key: 'sg.AntiAliasingQuality', value: '3',          state: 'present'}
  - {section: 'ScalabilityGroups', key: 'sg.ShadowQuality',       value: '3',          state: 'present'}
  - {section: 'ScalabilityGroups', key: 'sg.PostProcessQuality',  value: '3',          state: 'present'}
  - {section: 'ScalabilityGroups', key: 'sg.TextureQuality',      value: '3',          state: 'present'}
  - {section: 'ScalabilityGroups', key: 'sg.EffectsQuality',      value: '3',          state: 'present'}
  - {section: 'ScalabilityGroups', key: 'sg.FoliageQuality',      value: '3',          state: 'present'}
  - {section: 'ScalabilityGroups', key: 'sg.ShadingQuality',      value: '3',          state: 'present'}
  - {section: '/Script/Engine.GameUserSettings', key: 'bUseDesiredScreenHeight', value: 'False', state: 'present'}

###############################################################################
# Game.ini Settings
###############################################################################
# Only defined values are enforced in the configuration file.
#
# steam_satisfactory_settings_server:
#   - {section: '{SECTION}', key: '{KEY}', value: '{VALUE}', state: '{STATE}'
#
#   * state: must be 'present' or 'absent'.
#   * empty values may be used for value, creation or deletion.
#   * Use vault for passwords.

steam_satisfactory_settings_game:
  - {section: '/Script/Engine.GameNetworkManager', key: 'TotalNetBandwidth',                    value: '104857600', state: 'present'}
  - {section: '/Script/Engine.GameNetworkManager', key: 'MaxDynamicBandwidth',                  value: '104857600', state: 'present'}
  - {section: '/Script/Engine.GameNetworkManager', key: 'MinDynamicBandwidth',                  value: '104857600', state: 'present'}
  - {section: '/Script/Engine.GameNetworkManager', key: 'MAXPOSITIONERRORSQUARED',              value: '32.00f',    state: 'present'}
  - {section: '/Script/Engine.GameNetworkManager', key: 'MoveRepSize',                          value: '512.0f',    state: 'present'}
  - {section: '/Script/Engine.GameNetworkManager', key: 'CLIENTADJUSTUPDATECOST',               value: '512.0f',    state: 'present'}
  - {section: '/Script/Engine.GameNetworkManager', key: 'bMovementTimeDiscrepancyDetection',    value: 'False',     state: 'present'}
  - {section: '/Script/Engine.GameNetworkManager', key: 'bMovementTimeDiscrepancyResolution',   value: 'False',     state: 'present'}
  - {section: '/Script/Engine.GameNetworkManager', key: 'bMovementTimeDiscrepancyForceCorrectionsDuringResolution', value: 'False', state: 'present'}
  - {section: '/Script/Engine.GameNetworkManager', key: 'MAXCLIENTUPDATEINTERVAL',              value: '2.20f',     state: 'present'}
  - {section: '/Script/Engine.GameNetworkManager', key: 'MaxMoveDeltaTime',                     value: '0.700f',    state: 'present'}
  - {section: '/Script/Engine.GameNetworkManager', key: 'MaxClientSmoothingDeltaTime',          value: '2.20f',     state: 'present'}
  - {section: '/Script/Engine.GameNetworkManager', key: 'MaxClientForcedUpdateDuration',        value: '1.0f',      state: 'present'}
  - {section: '/Script/Engine.GameNetworkManager', key: 'ClientNetSendMoveDeltaTime',           value: '0.0332',    state: 'present'}
  - {section: '/Script/Engine.GameNetworkManager', key: 'ClientNetSendMoveDeltaTimeStationary', value: '0.0664',    state: 'present'}
  - {section: '/Script/Engine.GameNetworkManager', key: 'ClientNetSendMoveThrottleOverPlayerCount', value: '99',    state: 'present'}
  - {section: '/Script/Engine.GameNetworkManager', key: 'ServerForcedUpdateHitchThreshold',     value: '2.800f',    state: 'present'}
  - {section: '/Script/Engine.GameSession', key: 'MaxPlayers', value: '4', state: 'present'}

###############################################################################
# Engine.ini Settings
###############################################################################
# Only defined values are enforced in the configuration file.
#
# steam_satisfactory_settings_server:
#   - {section: '{SECTION}', key: '{KEY}', value: '{VALUE}', state: '{STATE}'
#
#   * state: must be 'present' or 'absent'.
#   * empty values may be used for value, creation or deletion.
#   * Use vault for passwords.

steam_satisfactory_settings_engine:
  - {section: '/Script/EngineSettings.GameMapsSettings',  key: 'GameDefaultMap',  value: '/Game/FactoryGame/Map/GameLevel01/Persistent_Level', state: 'present'}
  - {section: '/Script/EngineSettings.GameMapsSettings',  key: 'LocalMapOptions', value: '?sessionName=SatisfactoryServer?Visibility=SV_FriendsOnly?loadgame=savefile?listen?bUseIpSockets?name=Host', state: 'present'}
  - {section: '/Script/Engine.Engine', key: 'bSmoothFrameRate',        value: 'True',      state: 'present'}
  - {section: '/Script/Engine.Engine', key: 'bUseFixedFrameRate',      value: 'False',     state: 'present'}
  - {section: '/Script/Engine.Engine', key: 'SmoothedFrameRateRange',  value: '(LowerBound=(Type=Inclusive,Value=5.000000),UpperBound=(Type=Exclusive,Value=15.000000))', state: 'present'}
  - {section: '/Script/Engine.Engine', key: 'MinDesiredFrameRate',     value: '8.000000',  state: 'present'}
  - {section: '/Script/Engine.Engine', key: 'FixedFrameRate',          value: '15.000000', state: 'present'}
  - {section: '/Script/Engine.Engine', key: 'NetClientTicksPerSecond', value: '15',        state: 'present'}
  - {section: '/Script/Engine.GarbageCollectionSettings', key: 'gc.MaxObjectsInEditor',          value: '2162688',   state: 'present'}
  - {section: '/Script/Engine.GarbageCollectionSettings', key: 'gc.MaxObjectsInGame',            value: '2162688',   state: 'present'}
  - {section: '/Script/Engine.GarbageCollectionSettings', key: 'gc.MaxObjectsNotConsideredByGC', value: '476499',    state: 'present'}
  - {section: '/Script/Engine.GarbageCollectionSettings', key: 'gc.SizeOfPermanentObjectPool',   value: '100378488', state: 'present'}
  - {section: '/Script/Engine.GarbageCollectionSettings', key: 'gc.ActorClusteringEnabled',      value: 'True',      state: 'present'}
  - {section: '/Script/Engine.GarbageCollectionSettings', key: 'gc.BlueprintClusteringEnabled',  value: 'True',      state: 'present'}
  - {section: '/Script/Engine.Player', key: 'ConfiguredInternetSpeed', value: '104857600', state: 'present'}
  - {section: '/Script/Engine.Player', key: 'ConfiguredLanSpeed',      value: '104857600', state: 'present'}
  - {section: '/script/Engine.StreamingSettings', key: 's.AsyncLoadingThreadEnabled',    value: 'True',      state: 'present'}
  - {section: '/script/Engine.StreamingSettings', key: 's.EventDrivenLoaderEnabled',     value: 'True',      state: 'present'}
  - {section: '/Script/OnlineSubsystemUtils.IpNetDriver',  key: 'NetServerMaxTickRate',  value: '120',       state: 'present'}
  - {section: '/Script/OnlineSubsystemUtils.IpNetDriver',  key: 'MaxNetTickRate',        value: '400',       state: 'present'}
  - {section: '/Script/OnlineSubsystemUtils.IpNetDriver',  key: 'MaxInternetClientRate', value: '104857600', state: 'present'}
  - {section: '/Script/OnlineSubsystemUtils.IpNetDriver',  key: 'MaxClientRate',         value: '104857600', state: 'present'}
  - {section: '/Script/OnlineSubsystemUtils.IpNetDriver',  key: 'LanServerMaxTickRate',  value: '120',       state: 'present'}
  - {section: '/Script/OnlineSubsystemUtils.IpNetDriver',  key: 'InitialConnectTimeout', value: '300.0',     state: 'present'}
  - {section: '/Script/OnlineSubsystemUtils.IpNetDriver',  key: 'ConnectionTimeout',     value: '300.0',     state: 'present'}
  - {section: '/Script/SocketSubsystemEpic.EpicNetDriver', key: 'MaxClientRate',         value: '104857600', state: 'present'}
  - {section: '/Script/SocketSubsystemEpic.EpicNetDriver', key: 'MaxInternetClientRate', value: '104857600', state: 'present'}
  - {section: '/Script/FactoryGame.FGSaveSession', key: 'mNumRotatingAutosaves', value: '5', state: 'present'}
  - {section: 'CrashReportClient', key: 'bAgreeToCrashUpload', value: 'False', state: 'present'}
  - {section: 'CrashReportClient', key: 'bImplicitSend',       value: 'False', state: 'present'}
  - {section: 'SystemSettings', key: 't',    value: 'MaxFPS=15', state: 'present'}
  - {section: 'SystemSettings', key: 'AllowAsyncRenderThreadUpdates', value: '1', state: 'present'}
  - {section: 'SystemSettings', key: 'AllowAsyncRenderThreadUpdatesDuringGamethreadUpdates', value: '1', state: 'present'}
  - {section: 'SystemSettings', key: 'net',  value: 'UseRecvMulti=0',             state: 'present'}
  - {section: 'SystemSettings', key: 'net',  value: 'RecvMultiCapacity=8192',     state: 'present'}
  - {section: 'SystemSettings', key: 'net',  value: 'IpNetDriverUseReceiveThread=0', state: 'present'}
  - {section: 'SystemSettings', key: 'net',  value: 'IpConnectionUseSendTasks=1', state: 'present'}
  - {section: 'SystemSettings', key: 'net',  value: 'IpNetDriverReceiveThreadQueueMaxPackets=8192', state: 'present'}
  - {section: 'SystemSettings', key: 'net',  value: 'MaxNetStringSize=67108864',  state: 'present'}
  - {section: 'SystemSettings', key: 'net',  value: 'MaxRPCPerNetUpdate=8',       state: 'present'}
  - {section: 'SystemSettings', key: 'tick', value: 'AllowAsyncComponentTicks=1', state: 'present'}
  - {section: 'SystemSettings', key: 'tick', value: 'AllowConcurrentTickQueue=1', state: 'present'}
  - {section: 'SystemSettings', key: 'tick', value: 'AllowAsyncTickDispatch=1',   state: 'present'}
  - {section: 'SystemSettings', key: 'tick', value: 'AllowAsyncTickCleanup=1',    state: 'present'}