Factorio: Difference between revisions

From NixOS Wiki
Klinger (talk | contribs)
m →‎Mods: : Update upstream link.
 
(4 intermediate revisions by the same user not shown)
Line 1: Line 1:
[https://en.wikipedia.org/wiki/Factorio Factorio] is a video game created by Wube Software. Factorio has a multiplayer mode that requires a dedicated server, which is what this guide is about. If you have tips for installing the Factorio client, please feel free to expand this wiki page.
<strong>[https://www.factorio.com Factorio]</strong> is a video game created by [https://www.factorio.com/game/about Wube Software]. Factorio has a multiplayer mode that requires a dedicated server, which is available on Nixpkgs and can be installed on NixOS.


For more specific information about Factorio multiplayer, see: https://wiki.factorio.com/Multiplayer
== Installation ==


== Default Server Installation ==
{{Unfree}}


To install the Factorio server, add "factorio-headless" to your "systemPackages" in your NixOS configuration:  
To install the Factorio server, add the following to your [[Overview_of_the_NixOS_Linux_distribution#Declarative_Configuration|NixOS configuration]]:


<syntaxhighlight lang=nix>
{{file|configuration.nix|nix|
environment.systemPackages = with pkgs; [
<nowiki>
  factorio-headless
{
];
  environment.systemPackages = [ pkgs.factorio-headless ];
# Also enable non-free packages or else the factorio download will fail:
  nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
nixpkgs.config.allowUnfree = true;
    "factorio-headless"
</syntaxhighlight>
  ];
}
</nowiki>
}}
{{Evaluate}}


It's important to only install "factorio-headless" instead of "factorio" because the headless version is a free download that does not require login credentials.
It is important to only install <code>factorio-headless</code> instead of <code>factorio</code> because the headless version is a redistributable download that does not require login credentials.


== Configuration ==
== Configuration ==


Here is a minimum viable configuration for the Factorio server (add this to your NixOS configuration):
Here is a minimum viable configuration for the Factorio server:


<syntaxhighlight lang=nix>
{{file|configuration.nix|nix|
services.factorio = {
<nowiki>
  enable = true;
{
  openFirewall = true;
  services.factorio = {
};
    enable = true;
</syntaxhighlight>
    openFirewall = true;
  };
}
</nowiki>
}}


This will run a non-password-protected server that binds to "0.0.0.0" and uses the default UDP port of 34197, with an auto-generated save file. Factorio servers support IPv6 by setting <code>bind = "[::]";</code>. All default settings can be seen here: https://search.nixos.org/options?&query=factorio
This will run a unprotected server that binds to the <code>0.0.0.0</code> local IP address and uses the default UDP port of <code>34197</code>, with an auto-generated save file. Factorio servers support IPv6 by setting <code>bind = "[::]";</code>. All default settings can be seen here: {{nixos:option|services.factorio.*}}


== Mods ==
=== Mods ===


The NixOS module for Factorio supports [https://wiki.factorio.com/Modding Factorio mods], which are just zip files. While technically you can create a full derivation for mods, in practice this can get complicated, especially since authentication is required to download mods from the official mod site.
The NixOS module for Factorio supports [https://wiki.factorio.com/Modding third-party modifications], or <i>mods</i>, which are just compressed archives with extra game content. While technically you can create a full derivation for mods, in practice this can get complicated, especially since authentication is required to download mods from the official mod site.


Instead, you can download the mods you need separately from https://mods.factorio.com/, place them in a folder such as <code>/home/username/factorio-mods</code>, and put this code in your configuration.nix (credit to [https://github.com/nicball/nuc-nixos-configuration/blob/f70f2c4d8da1f2648b5e595d9058e0f105409fd7/factorio.nix#L16 nicball]):
Instead, you can download the mods you need imperatively from https://mods.factorio.com/, place them in a folder such as <code>/etc/nixos/factorio-mods</code>, and put this code in your [[Overview_of_the_NixOS_Linux_distribution#Declarative_Configuration|NixOS configuration]]:


<syntaxhighlight lang=nix>
{{file|configuration.nix|nix|
services.factorio = {
<nowiki>
  # --omitted--
{
  mods =
  services.factorio = {
    let
    mods =
      inherit (pkgs) lib;
      let
      modDir = /home/username/factorio-mods;
        modDir = ./factorio-mods;
      modList = lib.pipe modDir [
        modList = lib.pipe modDir [
        builtins.readDir
          builtins.readDir
        (lib.filterAttrs (k: v: v == "regular"))
          (lib.filterAttrs (k: v: v == "regular"))
        (lib.mapAttrsToList (k: v: k))
          (lib.mapAttrsToList (k: v: k))
        (builtins.filter (lib.hasSuffix ".zip"))
          (builtins.filter (lib.hasSuffix ".zip"))
      ];
        ];
      modToDrv = modFileName:
        validPath = modFileName:
        pkgs.runCommand "copy-factorio-mods" {} ''
          builtins.path {
          mkdir $out
            path = modDir + "/${modFileName}";
          cp ${modDir + "/${modFileName}"} $out/${modFileName}
            name = lib.strings.sanitizeDerivationName modFileName;
        ''
          };
        // { deps = []; };
        modToDrv = modFileName:
    in
          pkgs.runCommand "copy-factorio-mods" {} ''
      builtins.map modToDrv modList;
            mkdir $out
};
            ln -s '${validPath modFileName}' $out/'${modFileName}'
</syntaxhighlight>
          ''
          // { deps = []; };
      in
        builtins.map modToDrv modList;
  };
}
</nowiki>
}}
This code was developed by [https://github.com/nicball/nuc-nixos-configuration/blob/fccfa8441cba60c835aa2eb4238ae6f53bb781bb/factorio.nix#L16-L37 nicball].


Note that any changes to the list of mods in the "factorio-mods" folder require running <code>nixos-rebuild switch</code>.
== See also ==
 
* [https://wiki.factorio.com/Multiplayer The Factorio wiki page on Multiplayer]


[[Category:Gaming]]
[[Category:Gaming]]
[[Category:Server]]
[[Category:Server]]

Latest revision as of 03:45, 2 November 2024

Factorio is a video game created by Wube Software. Factorio has a multiplayer mode that requires a dedicated server, which is available on Nixpkgs and can be installed on NixOS.

Installation

Note: This package is unfree and requires extra steps to install.

To install the Factorio server, add the following to your NixOS configuration:

configuration.nix
{
  environment.systemPackages = [ pkgs.factorio-headless ];
  nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
    "factorio-headless"
  ];
}

It is important to only install factorio-headless instead of factorio because the headless version is a redistributable download that does not require login credentials.

Configuration

Here is a minimum viable configuration for the Factorio server:

configuration.nix
{
  services.factorio = {
    enable = true;
    openFirewall = true;
  };
}

This will run a unprotected server that binds to the 0.0.0.0 local IP address and uses the default UDP port of 34197, with an auto-generated save file. Factorio servers support IPv6 by setting bind = "[::]";. All default settings can be seen here: services.factorio.*

Mods

The NixOS module for Factorio supports third-party modifications, or mods, which are just compressed archives with extra game content. While technically you can create a full derivation for mods, in practice this can get complicated, especially since authentication is required to download mods from the official mod site.

Instead, you can download the mods you need imperatively from https://mods.factorio.com/, place them in a folder such as /etc/nixos/factorio-mods, and put this code in your NixOS configuration:

configuration.nix
{
  services.factorio = {
    mods =
      let
        modDir = ./factorio-mods;
        modList = lib.pipe modDir [
          builtins.readDir
          (lib.filterAttrs (k: v: v == "regular"))
          (lib.mapAttrsToList (k: v: k))
          (builtins.filter (lib.hasSuffix ".zip"))
        ];
        validPath = modFileName:
          builtins.path {
            path = modDir + "/${modFileName}";
            name = lib.strings.sanitizeDerivationName modFileName;
          };
        modToDrv = modFileName:
          pkgs.runCommand "copy-factorio-mods" {} ''
            mkdir $out
            ln -s '${validPath modFileName}' $out/'${modFileName}'
          ''
          // { deps = []; };
      in
        builtins.map modToDrv modList;
  };
}

This code was developed by nicball.

See also