diff --git a/nixos/doc/manual/from_md/release-notes/rl-2205.section.xml b/nixos/doc/manual/from_md/release-notes/rl-2205.section.xml
index dd8266ef1ba..d195c1c22fc 100644
--- a/nixos/doc/manual/from_md/release-notes/rl-2205.section.xml
+++ b/nixos/doc/manual/from_md/release-notes/rl-2205.section.xml
@@ -82,6 +82,13 @@
services.heisenbridge.
+
+
+ ergochat, a modern
+ IRC with IRCv3 features. Available as
+ services.ergochat.
+
+
PowerDNS-Admin,
diff --git a/nixos/doc/manual/release-notes/rl-2205.section.md b/nixos/doc/manual/release-notes/rl-2205.section.md
index 7af73dbaf5a..a656b0b2860 100644
--- a/nixos/doc/manual/release-notes/rl-2205.section.md
+++ b/nixos/doc/manual/release-notes/rl-2205.section.md
@@ -27,6 +27,8 @@ In addition to numerous new and upgraded packages, this release has the followin
- [heisenbridge](https://github.com/hifi/heisenbridge), a bouncer-style Matrix IRC bridge. Available as [services.heisenbridge](options.html#opt-services.heisenbridge.enable).
+- [ergochat](https://ergo.chat), a modern IRC with IRCv3 features. Available as [services.ergochat](options.html#opt-services.ergochat.enable).
+
- [PowerDNS-Admin](https://github.com/ngoduykhanh/PowerDNS-Admin), a web interface for the PowerDNS server. Available at [services.powerdns-admin](options.html#opt-services.powerdns-admin.enable).
- [maddy](https://maddy.email), a composable all-in-one mail server. Available as [services.maddy](options.html#opt-services.maddy.enable).
diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix
index e67496c185d..db1d014bcc1 100644
--- a/nixos/modules/module-list.nix
+++ b/nixos/modules/module-list.nix
@@ -739,6 +739,7 @@
./services/networking/ejabberd.nix
./services/networking/epmd.nix
./services/networking/ergo.nix
+ ./services/networking/ergochat.nix
./services/networking/eternal-terminal.nix
./services/networking/fakeroute.nix
./services/networking/ferm.nix
diff --git a/nixos/modules/services/networking/ergochat.nix b/nixos/modules/services/networking/ergochat.nix
new file mode 100644
index 00000000000..cfaf69fc613
--- /dev/null
+++ b/nixos/modules/services/networking/ergochat.nix
@@ -0,0 +1,155 @@
+{ config, lib, options, pkgs, ... }: let
+ cfg = config.services.ergochat;
+in {
+ options = {
+ services.ergochat = {
+
+ enable = lib.mkEnableOption "Ergo IRC daemon";
+
+ openFilesLimit = lib.mkOption {
+ type = lib.types.int;
+ default = 1024;
+ description = ''
+ Maximum number of open files. Limits the clients and server connections.
+ '';
+ };
+
+ configFile = lib.mkOption {
+ type = lib.types.path;
+ default = (pkgs.formats.yaml {}).generate "ergo.conf" cfg.settings;
+ defaultText = "generated config file from .settings";
+ description = ''
+ Path to configuration file.
+ Setting this will skip any configuration done via .settings
+ '';
+ };
+
+ settings = lib.mkOption {
+ type = (pkgs.formats.yaml {}).type;
+ description = ''
+ Ergo IRC daemon configuration file.
+ https://raw.githubusercontent.com/ergochat/ergo/master/default.yaml
+ '';
+ default = {
+ network = {
+ name = "testnetwork";
+ };
+ server = {
+ name = "example.com";
+ listeners = {
+ ":6667" = {};
+ };
+ casemapping = "permissive";
+ enforce-utf = true;
+ lookup-hostnames = false;
+ ip-cloaking = {
+ enabled = false;
+ };
+ forward-confirm-hostnames = false;
+ check-ident = false;
+ relaymsg = {
+ enabled = false;
+ };
+ max-sendq = "1M";
+ ip-limits = {
+ count = false;
+ throttle = false;
+ };
+ };
+ datastore = {
+ autoupgrade = true;
+ # this points to the StateDirectory of the systemd service
+ path = "/var/lib/ergo/ircd.db";
+ };
+ accounts = {
+ authentication-enabled = true;
+ registration = {
+ enabled = true;
+ allow-before-connect = true;
+ throttling = {
+ enabled = true;
+ duration = "10m";
+ max-attempts = 30;
+ };
+ bcrypt-cost = 4;
+ email-verification.enabled = false;
+ };
+ multiclient = {
+ enabled = true;
+ allowed-by-default = true;
+ always-on = "opt-out";
+ auto-away = "opt-out";
+ };
+ };
+ channels = {
+ default-modes = "+ntC";
+ registration = {
+ enabled = true;
+ };
+ };
+ limits = {
+ nicklen = 32;
+ identlen = 20;
+ channellen = 64;
+ awaylen = 390;
+ kicklen = 390;
+ topiclen = 390;
+ };
+ history = {
+ enabled = true;
+ channel-length = 2048;
+ client-length = 256;
+ autoresize-window = "3d";
+ autoreplay-on-join = 0;
+ chathistory-maxmessages = 100;
+ znc-maxmessages = 2048;
+ restrictions = {
+ expire-time = "1w";
+ query-cutoff = "none";
+ grace-period = "1h";
+ };
+ retention = {
+ allow-individual-delete = false;
+ enable-account-indexing = false;
+ };
+ tagmsg-storage = {
+ default = false;
+ whitelist = [
+ "+draft/react"
+ "+react"
+ ];
+ };
+ };
+ };
+ };
+
+ };
+ };
+ config = lib.mkIf cfg.enable {
+
+ environment.etc."ergo.yaml".source = cfg.configFile;
+
+ # merge configured values with default values
+ services.ergochat.settings =
+ lib.mapAttrsRecursive (_: lib.mkDefault) options.services.ergochat.settings.default;
+
+ systemd.services.ergochat = {
+ description = "Ergo IRC daemon";
+ wantedBy = [ "multi-user.target" ];
+ # reload is not applying the changed config. further investigation is needed
+ # at some point this should be enabled, since we don't want to restart for
+ # every config change
+ # reloadIfChanged = true;
+ restartTriggers = [ cfg.configFile ];
+ serviceConfig = {
+ ExecStart = "${pkgs.ergochat}/bin/ergo run --conf /etc/ergo.yaml";
+ ExecReload = "${pkgs.util-linux}/bin/kill -HUP $MAINPID";
+ DynamicUser = true;
+ StateDirectory = "ergo";
+ LimitNOFILE = toString cfg.openFilesLimit;
+ };
+ };
+
+ };
+ meta.maintainers = with lib.maintainers; [ lassulus tv ];
+}