forked from mirrors_public/oddlama_nix-config
fix: add trusted proxy to mealie so Gunicorn trusts X-Forwarded-* headers, fix kanidm mealie groups
This commit is contained in:
parent
6ed22d37af
commit
f69fe83c42
4 changed files with 137 additions and 11 deletions
|
@ -169,14 +169,8 @@ in
|
||||||
"openid"
|
"openid"
|
||||||
"email"
|
"email"
|
||||||
"profile"
|
"profile"
|
||||||
|
"groups"
|
||||||
];
|
];
|
||||||
claimMaps.groups = {
|
|
||||||
joinType = "array";
|
|
||||||
valuesByGroup = {
|
|
||||||
"mealie.access" = [ "user" ];
|
|
||||||
"mealie.admins" = [ "admin" ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
# Paperless
|
# Paperless
|
||||||
|
|
|
@ -52,24 +52,24 @@ in
|
||||||
services.mealie = {
|
services.mealie = {
|
||||||
enable = true;
|
enable = true;
|
||||||
settings = rec {
|
settings = rec {
|
||||||
ALLOW_SIGNUP = "false";
|
|
||||||
BASE_URL = "https://${mealieDomain}";
|
BASE_URL = "https://${mealieDomain}";
|
||||||
TZ = config.time.timeZone;
|
TZ = config.time.timeZone;
|
||||||
TOKEN_TIME = 87600; # 10 years session time - this is only internal so who cares
|
TOKEN_TIME = 87600; # 10 years session time - this is only internal so who cares
|
||||||
|
|
||||||
|
ALLOW_SIGNUP = "false";
|
||||||
OIDC_AUTH_ENABLED = "true";
|
OIDC_AUTH_ENABLED = "true";
|
||||||
OIDC_SIGNUP_ENABLED = "true";
|
OIDC_SIGNUP_ENABLED = "true";
|
||||||
OIDC_AUTO_REDIRECT = "true";
|
OIDC_AUTO_REDIRECT = "true";
|
||||||
OIDC_REMEMBER_ME = "true";
|
OIDC_REMEMBER_ME = "true";
|
||||||
|
|
||||||
OIDC_CLIENT_ID = "mealie";
|
OIDC_CLIENT_ID = "mealie";
|
||||||
OIDC_SIGNING_ALGORITHM = "ES256";
|
|
||||||
OIDC_USER_CLAIM = "preferred_username";
|
OIDC_USER_CLAIM = "preferred_username";
|
||||||
OIDC_PROVIDER_NAME = "Kanidm";
|
OIDC_PROVIDER_NAME = "Kanidm";
|
||||||
OIDC_CONFIGURATION_URL = "https://${globals.services.kanidm.domain}/oauth2/openid/${OIDC_CLIENT_ID}/.well-known/openid-configuration";
|
OIDC_CONFIGURATION_URL = "https://${globals.services.kanidm.domain}/oauth2/openid/${OIDC_CLIENT_ID}/.well-known/openid-configuration";
|
||||||
OIDC_USER_GROUP = "user";
|
OIDC_USER_GROUP = "mealie.access@${globals.services.kanidm.domain}";
|
||||||
OIDC_ADMIN_GROUP = "admin";
|
OIDC_ADMIN_GROUP = "mealie.admins@${globals.services.kanidm.domain}";
|
||||||
};
|
};
|
||||||
|
trustedProxies = [ nodes.ward-web-proxy.config.wireguard.proxy-home.ipv4 ];
|
||||||
credentialsFile = config.age.secrets.oauth2-client-secret.path;
|
credentialsFile = config.age.secrets.oauth2-client-secret.path;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
{
|
{
|
||||||
|
disabledModules = [
|
||||||
|
"services/web-apps/mealie.nix"
|
||||||
|
];
|
||||||
imports = [
|
imports = [
|
||||||
./acme-wildcard.nix
|
./acme-wildcard.nix
|
||||||
./backups.nix
|
./backups.nix
|
||||||
|
@ -6,6 +9,7 @@
|
||||||
./distributed-config.nix
|
./distributed-config.nix
|
||||||
./ente.nix
|
./ente.nix
|
||||||
./globals.nix
|
./globals.nix
|
||||||
|
./mealie.nix
|
||||||
./meta.nix
|
./meta.nix
|
||||||
./nginx-upstream-monitoring.nix
|
./nginx-upstream-monitoring.nix
|
||||||
./oauth2-proxy.nix
|
./oauth2-proxy.nix
|
||||||
|
|
128
modules/mealie.nix
Normal file
128
modules/mealie.nix
Normal file
|
@ -0,0 +1,128 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
cfg = config.services.mealie;
|
||||||
|
pkg = cfg.package;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.services.mealie = {
|
||||||
|
enable = lib.mkEnableOption "Mealie, a recipe manager and meal planner";
|
||||||
|
|
||||||
|
package = lib.mkPackageOption pkgs "mealie" { };
|
||||||
|
|
||||||
|
listenAddress = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "0.0.0.0";
|
||||||
|
description = "Address on which the service should listen.";
|
||||||
|
};
|
||||||
|
|
||||||
|
port = lib.mkOption {
|
||||||
|
type = lib.types.port;
|
||||||
|
default = 9000;
|
||||||
|
description = "Port on which to serve the Mealie service.";
|
||||||
|
};
|
||||||
|
|
||||||
|
settings = lib.mkOption {
|
||||||
|
type = with lib.types; attrsOf anything;
|
||||||
|
default = { };
|
||||||
|
description = ''
|
||||||
|
Configuration of the Mealie service.
|
||||||
|
|
||||||
|
See [the mealie documentation](https://nightly.mealie.io/documentation/getting-started/installation/backend-config/) for available options and default values.
|
||||||
|
'';
|
||||||
|
example = {
|
||||||
|
ALLOW_SIGNUP = "false";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
extraOptions = lib.mkOption {
|
||||||
|
type = lib.types.listOf lib.types.str;
|
||||||
|
default = [ ];
|
||||||
|
example = [ "--forwarded-allow-ips=10.44.0.11" ];
|
||||||
|
description = ''
|
||||||
|
Specifies extra command line arguments to pass to mealie (Gunicorn).
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
credentialsFile = lib.mkOption {
|
||||||
|
type = with lib.types; nullOr path;
|
||||||
|
default = null;
|
||||||
|
example = "/run/secrets/mealie-credentials.env";
|
||||||
|
description = ''
|
||||||
|
File containing credentials used in mealie such as {env}`POSTGRES_PASSWORD`
|
||||||
|
or sensitive LDAP options.
|
||||||
|
|
||||||
|
Expects the format of an `EnvironmentFile=`, as described by {manpage}`systemd.exec(5)`.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
database = {
|
||||||
|
createLocally = lib.mkOption {
|
||||||
|
type = lib.types.bool;
|
||||||
|
default = false;
|
||||||
|
description = ''
|
||||||
|
Configure local PostgreSQL database server for Mealie.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
trustedProxies = lib.mkOption {
|
||||||
|
type = lib.types.listOf lib.types.str;
|
||||||
|
default = [ ];
|
||||||
|
description = "A list of trusted proxies. You must set this when you are using OIDC behind https, otherwise the generated redirect url will have the wrong url scheme.";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
systemd.services.mealie = {
|
||||||
|
description = "Mealie, a self hosted recipe manager and meal planner";
|
||||||
|
|
||||||
|
after = [ "network-online.target" ] ++ lib.optional cfg.database.createLocally "postgresql.service";
|
||||||
|
requires = lib.optional cfg.database.createLocally "postgresql.service";
|
||||||
|
wants = [ "network-online.target" ];
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
|
||||||
|
environment = {
|
||||||
|
PRODUCTION = "true";
|
||||||
|
API_PORT = toString cfg.port;
|
||||||
|
BASE_URL = "http://localhost:${toString cfg.port}";
|
||||||
|
DATA_DIR = "/var/lib/mealie";
|
||||||
|
NLTK_DATA = pkgs.nltk-data.averaged_perceptron_tagger_eng;
|
||||||
|
} // (builtins.mapAttrs (_: toString) cfg.settings);
|
||||||
|
|
||||||
|
serviceConfig = {
|
||||||
|
DynamicUser = true;
|
||||||
|
User = "mealie";
|
||||||
|
ExecStartPre = "${pkg}/libexec/init_db";
|
||||||
|
ExecStart = "${lib.getExe pkg} -b ${cfg.listenAddress}:${builtins.toString cfg.port} ${lib.escapeShellArgs cfg.extraOptions}";
|
||||||
|
EnvironmentFile = lib.mkIf (cfg.credentialsFile != null) cfg.credentialsFile;
|
||||||
|
StateDirectory = "mealie";
|
||||||
|
StandardOutput = "journal";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.mealie.settings = lib.mkIf cfg.database.createLocally {
|
||||||
|
DB_ENGINE = "postgres";
|
||||||
|
POSTGRES_URL_OVERRIDE = "postgresql://mealie:@/mealie?host=/run/postgresql";
|
||||||
|
};
|
||||||
|
|
||||||
|
services.mealie.extraOptions = lib.mkIf (cfg.trustedProxies != [ ]) [
|
||||||
|
"--forwarded-allow-ips=${lib.concatStringsSep "," cfg.trustedProxies}"
|
||||||
|
];
|
||||||
|
|
||||||
|
services.postgresql = lib.mkIf cfg.database.createLocally {
|
||||||
|
enable = true;
|
||||||
|
ensureDatabases = [ "mealie" ];
|
||||||
|
ensureUsers = [
|
||||||
|
{
|
||||||
|
name = "mealie";
|
||||||
|
ensureDBOwnership = true;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue