flux
flux copied to clipboard
Create and deploy game servers with nix
Flux
With flux you can build servers as packages with a simple interface and deploy them with the included module.
- 🏗️ Builders that make packaging and running servers simple:
- mkGenericServer (builder for any server)
- mkMinecraftServer (builder for mcman based servers)
- mkSteamServer (wrapper for steamcmd and steam-run)
- ⚙️ A module for running servers with additional tools:
- 🏭 Runs the server
- 🌐 Sets up proxy (playit.gg, ngrok, cloudflare tunnels)
- 🫙 Works great on host, nixos-containers, and microvms
- 📦 Packages not present in nixpkgs (yet) that are useful for servers.
Why?
I set up servers for my friends all of the time, and I became frustrated at the amount of work it took change a vanilla minecraft server to a modded one. So I integrated mcman to make this easy, then I decided to make servers for steam and other random projects.
📦 Installation and Usage
Installation is simple:
- Add flux as an input to your flake
inputs.flux.url = "github:IogaMaster/flux"; - Add the exposed overlay to your global pkgs definition, so the builder functions are available.
nixpkgs.overlays = [ flux.overlays.default ]; - Import the NixOS module
flux.nixosModules.defaultin your host config.nixosConfigurations.host1 = lib.nixosSystem { system = "x86_64-linux"; modules = [ ./host1/configuration.nix flux.nixosModules.default ]; }; - Define a server using the module.
flux = { enable = true; servers = { vanilla-minecraft = { package = pkgs.mkMinecraftServer { name = "myminecraftserver"; src = ./mcmanconfig; # Path to a mcman config hash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; }; proxy.enable = true; }; }; };
Example flake.nix
{
inputs = {
flake-utils.url = "github:numtide/flake-utils";
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flux.url = "github:oddlama/nix-flux";
flux.inputs.nixpkgs.follows = "nixpkgs";
};
outputs = { self, flake-utils, nixpkgs, flux, ... }: {
# Example. Use your own hosts and add the module to them
nixosConfigurations.host1 = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
{
flux = {
enable = true;
servers = {
vanilla-minecraft = {
package = pkgs.mkMinecraftServer {
name = "myminecraftserver";
src = ./mcmanconfig; # Path to a mcman config
hash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
};
proxy.enable = true;
};
};
};
}
flux.nixosModules.default
];
};
}
// flake-utils.lib.eachDefaultSystem (system: rec {
pkgs = import nixpkgs {
inherit system;
overlays = [ flux.overlays.default ];
};
});
}
🌱 Using the builder functions:
You can create packages that run the server instead of using them in the module:
Example minecraft server:
{lib, pkgs, ... }:
pkgs.mkMinecraftServer {
name = "myminecraftserver";
src = ./mcmanconfig; # Path to a mcman config
hash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
}
Example generic server:
{
lib,
mkGenericServer,
fetchzip,
...
}:
mkGenericServer {
name = "myserver";
src = fetchzip {
url = "http://www.example.org/server.tar.gz";
hash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
};
nativeBuildInputs = [];
buildInputs = [];
buildPhase = ''
HOME=$TMPDIR
cd $src
cp -r . $out
'';
startCmd = "./start.sh";
}
Example steam server:
{lib, pkgs, ... }:
pkgs.mkSteamServer rec {
name = "mygameserver";
src = pkgs.fetchSteam {
inherit name;
appId = ""; # Dedicated server app id, can be found with https://steamdb.info/
hash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
};
startCmd = "./FactoryServer.sh";
hash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
}
🔨 TODO
There is still a lot to do.
- Examples
❤️ Contributing
Contributions are whole-heartedly welcome! Please feel free to suggest new features, implement additional builders, helpers, or generally assist if you'd like. We'd be happy to have you. There's more information in CONTRIBUTING.md.
📜 License
Licensed under the MIT license (LICENSE or https://opensource.org/licenses/MIT). Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this project by you, shall be licensed as above, without any additional terms or conditions.
