{ lib, config, ... }: let inherit (builtins) toString; inherit (lib) mkOption mkEnableOption mkForce; inherit (lib.types) types; in { imports = [ ./garage.nix ./mastodon.nix ./pixelfed.nix ./peertube.nix ]; options = { fediversity = { enable = mkEnableOption "the collection of services bundled under Fediversity"; domain = mkOption { type = types.str; description = '' root domain for the Fediversity services For instance, if this option is set to `foo.example.com`, then Pixelfed might be under `pixelfed.foo.example.com`. ''; }; mastodon.enable = mkEnableOption "default Fediversity Mastodon configuration"; pixelfed.enable = mkEnableOption "default Fediversity Pixelfed configuration"; peertube.enable = mkEnableOption "default Fediversity PeerTube configuration"; internal = mkOption { description = "options that are only meant to be used internally; change at your own risk"; default = {}; type = types.submodule { options = { garage = { api = { domain = mkOption { type = types.str; default = "s3.garage.${config.fediversity.domain}"; }; port = mkOption { type = types.int; default = 3900; }; url = mkOption { type = types.str; default = "http://${config.fediversity.internal.garage.api.domain}:${toString config.fediversity.internal.garage.api.port}"; }; }; rpc = { port = mkOption { type = types.int; default = 3901; }; }; web = { rootDomain = mkOption { type = types.str; default = "web.garage.${config.fediversity.domain}"; }; internalPort = mkOption { type = types.int; default = 3902; }; domainForBucket = mkOption { type = types.functionTo types.str; default = bucket: "${bucket}.${config.fediversity.internal.garage.web.rootDomain}"; }; urlForBucket = mkOption { type = types.functionTo types.str; default = bucket: "http://${config.fediversity.internal.garage.web.domainForBucket bucket}"; }; }; }; ## REVIEW: Do we want to recreate options under ## `fediversity.internal` or would we rather use the options from ## the respective services? See Taeer's comment: ## https://git.fediversity.eu/taeer/simple-nixos-fediverse/pulls/22#issuecomment-124 pixelfed.domain = mkOption { type = types.str; default = "pixelfed.${config.fediversity.domain}"; }; mastodon.domain = mkOption { type = types.str; default = "mastdodon.${config.fediversity.domain}"; }; peertube.domain = mkOption { type = types.str; default = "peertube.${config.fediversity.domain}"; }; }; }; }; }; }; config = { ## FIXME: This should clearly go somewhere else; and we should have a ## `staging` vs. `production` setting somewhere. security.acme = { acceptTerms = true; defaults.email = "nicolas.jeannerod+fediversity@moduscreate.com"; # defaults.server = "https://acme-staging-v02.api.letsencrypt.org/directory"; }; ## NOTE: For a one-machine deployment, this removes the need to provide an ## `s3.garage.` domain. However, this will quickly stop working once ## we go to multi-machines deployment. fediversity.internal.garage.api.domain = mkForce "s3.garage.localhost"; }; }