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'}