{moduleWithSystem, ...}: { flake.nixosModules.containerMatrix = moduleWithSystem ({pkgs, ...}: {config, ...}: { virtualisation.oci-containers.containers."matrix-mjolnir" = { image = "matrixdotorg/mjolnir:latest"; volumes = [ "/containers/synapse/mjolnir:/data:rw" ]; log-driver = "journald"; extraOptions = [ "--network-alias=mjolnir" "--network=matrix_default" ]; }; systemd.services."podman-matrix-mjolnir" = { serviceConfig = { Restart = pkgs.lib.mkOverride 90 "always"; }; after = [ "podman-network-matrix_default.service" ]; requires = [ "podman-network-matrix_default.service" ]; partOf = [ "podman-compose-matrix-root.target" ]; wantedBy = [ "podman-compose-matrix-root.target" ]; }; virtualisation.oci-containers.containers."synapse" = { image = "matrixdotorg/synapse:latest"; environment = { "SYNAPSE_CONFIG_PATH" = "/data/homeserver.yaml"; }; volumes = [ "/containers/synapse/synapse-data:/data:rw" ]; ports = [ "8008:8008/tcp" ]; dependsOn = [ "synapse-db" ]; log-driver = "journald"; extraOptions = [ "--network-alias=synapse" "--network=matrix_default" ]; }; systemd.services."podman-synapse" = { serviceConfig = { Restart = pkgs.lib.mkOverride 90 "always"; }; after = [ "podman-network-matrix_default.service" ]; requires = [ "podman-network-matrix_default.service" ]; partOf = [ "podman-compose-matrix-root.target" ]; wantedBy = [ "podman-compose-matrix-root.target" ]; }; # Networks systemd.services."podman-network-matrix_default" = { path = [pkgs.podman]; serviceConfig = { Type = "oneshot"; RemainAfterExit = true; ExecStop = "podman network rm -f matrix_default"; }; script = '' podman network inspect matrix_default || podman network create matrix_default ''; partOf = ["podman-compose-matrix-root.target"]; wantedBy = ["podman-compose-matrix-root.target"]; }; # Root service # When started, this will automatically create all resources and start # the containers. When stopped, this will teardown all resources. systemd.targets."podman-compose-matrix-root" = { unitConfig = { Description = "Root target generated by compose2nix."; }; wantedBy = ["multi-user.target"]; }; }); }