Compare commits
No commits in common. "06ad805206e5af2deb0dca62a954902fa76efd63" and "bb94e3632a90319f28d9f21bb4b1d91c3ed8140e" have entirely different histories.
06ad805206
...
bb94e3632a
19 changed files with 107 additions and 291 deletions
|
@ -15,26 +15,5 @@ in
|
||||||
home.sessionVariables = {
|
home.sessionVariables = {
|
||||||
MOZ_ENABLE_WAYLAND = "1";
|
MOZ_ENABLE_WAYLAND = "1";
|
||||||
};
|
};
|
||||||
|
|
||||||
programs.zen-browser = {
|
|
||||||
policies = {
|
|
||||||
AutofillAddressEnabled = true;
|
|
||||||
AutofillCreditCardEnabled = false;
|
|
||||||
DisableAppUpdate = true;
|
|
||||||
DisableFeedbackCommands = true;
|
|
||||||
DisableFirefoxStudies = true;
|
|
||||||
DisablePocket = true;
|
|
||||||
DisableTelemetry = true;
|
|
||||||
# DontCheckDefaultBrowser = false;
|
|
||||||
NoDefaultBookmarks = true;
|
|
||||||
# OfferToSaveLogins = false;
|
|
||||||
EnableTrackingProtection = {
|
|
||||||
Value = true;
|
|
||||||
Locked = true;
|
|
||||||
Cryptomining = true;
|
|
||||||
Fingerprinting = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,12 +37,11 @@ in {
|
||||||
|
|
||||||
config = {
|
config = {
|
||||||
home.sessionVariables = {
|
home.sessionVariables = {
|
||||||
SHELL = cfg.shell;
|
|
||||||
EDITOR = cfg.editor;
|
EDITOR = cfg.editor;
|
||||||
TERMINAL = cfg.terminal;
|
TERMINAL = cfg.terminal;
|
||||||
BROWSER = cfg.browser;
|
BROWSER = cfg.browser;
|
||||||
};
|
};
|
||||||
|
|
||||||
# users.defaultUserShell = pkgs.${cfg.shell};
|
# home.shell = pkgs.${cfg.shell};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,11 +20,6 @@ in
|
||||||
panels = import ./panels.nix;
|
panels = import ./panels.nix;
|
||||||
powerdevil = import ./power.nix;
|
powerdevil = import ./power.nix;
|
||||||
|
|
||||||
kwin = {
|
|
||||||
edgeBarrier = 0;
|
|
||||||
cornerBarrier = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
session = {
|
session = {
|
||||||
general.askForConfirmationOnLogout = false;
|
general.askForConfirmationOnLogout = false;
|
||||||
sessionRestore.restoreOpenApplicationsOnLogin = "onLastLogout";
|
sessionRestore.restoreOpenApplicationsOnLogin = "onLastLogout";
|
||||||
|
|
|
@ -13,7 +13,6 @@ in
|
||||||
programs.ghostty = {
|
programs.ghostty = {
|
||||||
enable = true;
|
enable = true;
|
||||||
settings = {
|
settings = {
|
||||||
command = config.${namespace}.defaults.shell;
|
|
||||||
background-blur-radius = 20;
|
background-blur-radius = 20;
|
||||||
theme = "dark:stylix,light:stylix";
|
theme = "dark:stylix,light:stylix";
|
||||||
window-theme = (config.${namespace}.themes.polarity or "dark");
|
window-theme = (config.${namespace}.themes.polarity or "dark");
|
||||||
|
|
|
@ -17,12 +17,18 @@ in
|
||||||
example = "plasma";
|
example = "plasma";
|
||||||
description = "Which desktop to enable";
|
description = "Which desktop to enable";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
autoLogin = mkEnableOption "Enable plasma's auto login feature.";
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkMerge [
|
config = mkMerge [
|
||||||
({
|
({
|
||||||
services.displayManager = {
|
services.displayManager = {
|
||||||
enable = true;
|
enable = true;
|
||||||
|
|
||||||
|
autoLogin = mkIf cfg.autoLogin {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -11,9 +11,6 @@ in
|
||||||
hardware.bluetooth = {
|
hardware.bluetooth = {
|
||||||
enable = true;
|
enable = true;
|
||||||
powerOnBoot = true;
|
powerOnBoot = true;
|
||||||
settings = {
|
|
||||||
General.Experimental = true; # Show battery charge of Bluetooth devices
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
services.pipewire.wireplumber.extraConfig.bluetoothEnhancements = {
|
services.pipewire.wireplumber.extraConfig.bluetoothEnhancements = {
|
||||||
|
|
|
@ -130,23 +130,6 @@ in
|
||||||
scopes = [ "offline_access" "openid" "email" "picture" "profile" "groups" ];
|
scopes = [ "offline_access" "openid" "email" "picture" "profile" "groups" ];
|
||||||
redirect_uris = [ "http://localhost:3000/api/auth/oauth2/callback/authelia" ];
|
redirect_uris = [ "http://localhost:3000/api/auth/oauth2/callback/authelia" ];
|
||||||
}
|
}
|
||||||
{
|
|
||||||
client_id = "forgejo";
|
|
||||||
client_name = "forgejo";
|
|
||||||
# ZPuiW2gpVV6MGXIJFk5P3EeSW8V_ICgqduF.hJVCKkrnVmRqIQXRk0o~HSA8ZdCf8joA4m_F
|
|
||||||
client_secret = "$pbkdf2-sha512$310000$CzZjvJT75bz5z7MjwxsEtg$JtOiIgaY5/HcLLxJgyX4zvsQV9jIoow0e4JdlFsk/LWRDOJ0kc.PzstlYfw7QERTXtJILoWsDqPzmvpneK5Leg";
|
|
||||||
public = false;
|
|
||||||
require_pkce = true;
|
|
||||||
pkce_challenge_method = "S256";
|
|
||||||
token_endpoint_auth_method = "client_secret_post";
|
|
||||||
authorization_policy = "one_factor";
|
|
||||||
userinfo_signed_response_alg = "none";
|
|
||||||
consent_mode = "implicit";
|
|
||||||
scopes = [ "offline_access" "openid" "email" "picture" "profile" "groups" ];
|
|
||||||
response_types = [ "code" ];
|
|
||||||
grant_types = [ "authorization_code" ];
|
|
||||||
redirect_uris = [ "http://localhost:5002/user/oauth2/authelia/callback" ];
|
|
||||||
}
|
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
1
modules/nixos/services/authentication/default.nix
Normal file
1
modules/nixos/services/authentication/default.nix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{ ... }: {}
|
86
modules/nixos/services/authentication/zitadel.nix
Normal file
86
modules/nixos/services/authentication/zitadel.nix
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
{ config, lib, pkgs, namespace, ... }:
|
||||||
|
let
|
||||||
|
inherit (lib) mkIf mkEnableOption;
|
||||||
|
|
||||||
|
cfg = config.${namespace}.services.authentication.zitadel;
|
||||||
|
|
||||||
|
db_name = "zitadel";
|
||||||
|
db_user = "zitadel";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.${namespace}.services.authentication.zitadel = {
|
||||||
|
enable = mkEnableOption "Zitadel";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
zitadel
|
||||||
|
];
|
||||||
|
|
||||||
|
services = {
|
||||||
|
zitadel = {
|
||||||
|
enable = true;
|
||||||
|
openFirewall = true;
|
||||||
|
masterKeyFile = config.sops.secrets."zitadel/masterKey".path;
|
||||||
|
tlsMode = "external";
|
||||||
|
settings = {
|
||||||
|
Port = 9092;
|
||||||
|
Database = {
|
||||||
|
Host = "/run/postgresql";
|
||||||
|
# Zitadel will report error if port is not set
|
||||||
|
Port = 5432;
|
||||||
|
Database = db_name;
|
||||||
|
User.Username = db_user;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
steps = {
|
||||||
|
TestInstance = {
|
||||||
|
InstanceName = "Zitadel test";
|
||||||
|
Org = {
|
||||||
|
Name = "Kruining.eu";
|
||||||
|
Human = {
|
||||||
|
UserName = "admin";
|
||||||
|
Password = "kaas";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
postgresql = {
|
||||||
|
enable = true;
|
||||||
|
ensureDatabases = [ db_name ];
|
||||||
|
ensureUsers = [
|
||||||
|
{
|
||||||
|
name = db_user;
|
||||||
|
ensureDBOwnership = true;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
caddy = {
|
||||||
|
enable = true;
|
||||||
|
virtualHosts = {
|
||||||
|
"auth-z.kruining.eu".extraConfig = ''
|
||||||
|
reverse_proxy h2c://127.0.0.1:9092
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
# extraConfig = ''
|
||||||
|
# (auth) {
|
||||||
|
# forward_auth h2c://127.0.0.1:9092 {
|
||||||
|
# uri /api/authz/forward-auth
|
||||||
|
# copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
# '';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Secrets
|
||||||
|
sops.secrets."zitadel/masterKey" = {
|
||||||
|
owner = "zitadel";
|
||||||
|
group = "zitadel";
|
||||||
|
restartUnits = [ "zitadel.service" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -1,111 +0,0 @@
|
||||||
{ config, lib, pkgs, namespace, ... }:
|
|
||||||
let
|
|
||||||
inherit (lib) mkIf mkEnableOption mkForce;
|
|
||||||
|
|
||||||
cfg = config.${namespace}.services.authentication.zitadel;
|
|
||||||
|
|
||||||
db_name = "zitadel";
|
|
||||||
db_user = "zitadel";
|
|
||||||
in
|
|
||||||
{
|
|
||||||
options.${namespace}.services.authentication.zitadel = {
|
|
||||||
enable = mkEnableOption "Zitadel";
|
|
||||||
};
|
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
|
||||||
environment.systemPackages = with pkgs; [
|
|
||||||
zitadel
|
|
||||||
];
|
|
||||||
|
|
||||||
services = {
|
|
||||||
zitadel = {
|
|
||||||
enable = true;
|
|
||||||
openFirewall = true;
|
|
||||||
# masterKeyFile = config.sops.secrets."zitadel/masterKey".path;
|
|
||||||
masterKeyFile = "/var/lib/zitadel/master_key";
|
|
||||||
tlsMode = "external";
|
|
||||||
settings = {
|
|
||||||
Port = 9092;
|
|
||||||
ExternalDomain = "auth-z.kruining.eu";
|
|
||||||
ExternalPort = 443;
|
|
||||||
ExternalSecure = true;
|
|
||||||
|
|
||||||
Database.postgres = {
|
|
||||||
Host = "localhost";
|
|
||||||
# Zitadel will report error if port is not set
|
|
||||||
Port = 5432;
|
|
||||||
Database = db_name;
|
|
||||||
User = {
|
|
||||||
Username = db_user;
|
|
||||||
SSL.Mode = "disable";
|
|
||||||
};
|
|
||||||
Admin = {
|
|
||||||
Username = "postgres";
|
|
||||||
SSL.Mode = "disable";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
steps = {
|
|
||||||
FirstInstance = {
|
|
||||||
InstanceName = "auth-z.kruining.eu";
|
|
||||||
Org = {
|
|
||||||
Name = "Default";
|
|
||||||
Human = {
|
|
||||||
UserName = "chris";
|
|
||||||
FirstName = "Chris";
|
|
||||||
LastName = "Kruining";
|
|
||||||
Email = {
|
|
||||||
Address = "chris@kruining.eu";
|
|
||||||
Verified = true;
|
|
||||||
};
|
|
||||||
Password = "KaasIsAwesome1!";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
postgresql = {
|
|
||||||
enable = true;
|
|
||||||
ensureDatabases = [ db_name ];
|
|
||||||
ensureUsers = [
|
|
||||||
{
|
|
||||||
name = db_user;
|
|
||||||
ensureDBOwnership = true;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
authentication = mkForce ''
|
|
||||||
# Generated file, do not edit!
|
|
||||||
# TYPE DATABASE USER ADDRESS METHOD
|
|
||||||
local all all trust
|
|
||||||
host all all 127.0.0.1/32 trust
|
|
||||||
host all all ::1/128 trust
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
caddy = {
|
|
||||||
enable = true;
|
|
||||||
virtualHosts = {
|
|
||||||
"auth-z.kruining.eu".extraConfig = ''
|
|
||||||
reverse_proxy h2c://127.0.0.1:9092
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
extraConfig = ''
|
|
||||||
(auth-z) {
|
|
||||||
forward_auth h2c://127.0.0.1:9092 {
|
|
||||||
uri /api/authz/forward-auth
|
|
||||||
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
|
|
||||||
}
|
|
||||||
}
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# Secrets
|
|
||||||
sops.secrets."zitadel/masterKey" = {
|
|
||||||
owner = "zitadel";
|
|
||||||
group = "zitadel";
|
|
||||||
restartUnits = [ "zitadel.service" ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -1,101 +0,0 @@
|
||||||
{ config, lib, pkgs, namespace, ... }:
|
|
||||||
let
|
|
||||||
inherit (lib) mkIf mkEnableOption;
|
|
||||||
|
|
||||||
cfg = config.${namespace}.services.development.forgejo;
|
|
||||||
domain = "git.kruining.eu";
|
|
||||||
in
|
|
||||||
{
|
|
||||||
options.${namespace}.services.development.forgejo = {
|
|
||||||
enable = mkEnableOption "Forgejo";
|
|
||||||
};
|
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
|
||||||
environment.systemPackages = with pkgs; [ forgejo ];
|
|
||||||
|
|
||||||
services = {
|
|
||||||
forgejo = {
|
|
||||||
enable = true;
|
|
||||||
useWizard = false;
|
|
||||||
database.type = "postgres";
|
|
||||||
|
|
||||||
settings = {
|
|
||||||
DEFAULT = {
|
|
||||||
APP_NAME = "Chris' Forge";
|
|
||||||
};
|
|
||||||
|
|
||||||
server = {
|
|
||||||
DOMAIN = domain;
|
|
||||||
ROOT_URL = "https://${domain}/";
|
|
||||||
HTTP_PORT = 5002;
|
|
||||||
};
|
|
||||||
|
|
||||||
security = {
|
|
||||||
PASSWORD_HASH_ALGO = "argon2";
|
|
||||||
};
|
|
||||||
|
|
||||||
service = {
|
|
||||||
REQUIRE_SIGNIN_VIEW = true; # must be signed in to see anything
|
|
||||||
DISABLE_REGISTRATION = true;
|
|
||||||
ALLOW_ONLY_EXTERNAL_REGISTRATION = true;
|
|
||||||
SHOW_REGISTRATION_BUTTON = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
openid = {
|
|
||||||
ENABLE_OPENID_SIGNIN = true;
|
|
||||||
ENABLE_OPENID_SIGNUP = true;
|
|
||||||
WHITELISTED_URIS = "https://auth-z.kruining.eu";
|
|
||||||
};
|
|
||||||
|
|
||||||
oauth2_client = {
|
|
||||||
ENABLE_AUTO_REGISTRATION = true;
|
|
||||||
UPDATE_AVATAR = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
# actions = {
|
|
||||||
# ENABLED = true;
|
|
||||||
# DEFAULT_ACTIONS_URL = "forgejo";
|
|
||||||
# };
|
|
||||||
|
|
||||||
session = {
|
|
||||||
COOKIE_SECURE = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# gitea-actions-runner = {
|
|
||||||
# package = pkgs.forgejo-actions-runner;
|
|
||||||
# instances.default = {
|
|
||||||
# enable = true;
|
|
||||||
# name = "monolith";
|
|
||||||
# url = "https://git.kruining.eu";
|
|
||||||
# # Obtaining the path to the runner token file may differ
|
|
||||||
# # tokenFile should be in format TOKEN=<secret>, since it's EnvironmentFile for systemd
|
|
||||||
# tokenFile = config.age.secrets.forgejo-runner-token.path;
|
|
||||||
# labels = [
|
|
||||||
# "ubuntu-latest:docker://node:16-bullseye"
|
|
||||||
# "ubuntu-22.04:docker://node:16-bullseye"
|
|
||||||
# "ubuntu-20.04:docker://node:16-bullseye"
|
|
||||||
# "ubuntu-18.04:docker://node:16-buster"
|
|
||||||
# "native:host"
|
|
||||||
# ];
|
|
||||||
# };
|
|
||||||
# };
|
|
||||||
|
|
||||||
caddy = {
|
|
||||||
enable = true;
|
|
||||||
virtualHosts = {
|
|
||||||
${domain}.extraConfig = ''
|
|
||||||
# import auth-z
|
|
||||||
|
|
||||||
# stupid dumb way to prevent the login page and go to zitadel instead
|
|
||||||
# be aware that this does not disable local login at all!
|
|
||||||
rewrite /user/login /user/oauth2/Zitadel
|
|
||||||
|
|
||||||
reverse_proxy http://127.0.0.1:5002
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -79,11 +79,6 @@ in
|
||||||
bazarr = serviceConf;
|
bazarr = serviceConf;
|
||||||
lidarr = serviceConf;
|
lidarr = serviceConf;
|
||||||
|
|
||||||
flaresolverr = {
|
|
||||||
enable = true;
|
|
||||||
openFirewall = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
jellyseerr = {
|
jellyseerr = {
|
||||||
enable = true;
|
enable = true;
|
||||||
openFirewall = true;
|
openFirewall = true;
|
||||||
|
@ -140,11 +135,11 @@ in
|
||||||
backend = "podman";
|
backend = "podman";
|
||||||
|
|
||||||
containers = {
|
containers = {
|
||||||
# flaresolverr = {
|
flaresolverr = {
|
||||||
# image = "flaresolverr/flaresolverr";
|
image = "flaresolverr/flaresolverr";
|
||||||
# autoStart = true;
|
autoStart = true;
|
||||||
# ports = [ "127.0.0.1:8191:8191" ];
|
ports = [ "127.0.0.1:8191:8191" ];
|
||||||
# };
|
};
|
||||||
|
|
||||||
reiverr = {
|
reiverr = {
|
||||||
image = "ghcr.io/aleksilassila/reiverr:v2.2.0";
|
image = "ghcr.io/aleksilassila/reiverr:v2.2.0";
|
||||||
|
|
|
@ -6,7 +6,7 @@ let
|
||||||
cfg = config.${namespace}.services.media.nextcloud;
|
cfg = config.${namespace}.services.media.nextcloud;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
options.${namespace}.services.media.nextcloud = {
|
options.modules.services.nextcloud = {
|
||||||
enable = mkEnableOption "Nextcloud";
|
enable = mkEnableOption "Nextcloud";
|
||||||
|
|
||||||
user = mkOption {
|
user = mkOption {
|
||||||
|
@ -40,7 +40,7 @@ in
|
||||||
|
|
||||||
services.nextcloud = {
|
services.nextcloud = {
|
||||||
enable = true;
|
enable = true;
|
||||||
# webserver = "caddy";
|
webserver = "caddy";
|
||||||
package = pkgs.nextcloud31;
|
package = pkgs.nextcloud31;
|
||||||
hostName = "localhost";
|
hostName = "localhost";
|
||||||
|
|
|
@ -2,10 +2,10 @@
|
||||||
let
|
let
|
||||||
inherit (lib) mkIf mkEnableOption;
|
inherit (lib) mkIf mkEnableOption;
|
||||||
|
|
||||||
cfg = config.${namespace}.services.media.nfs;
|
cfg = config.${namespace}.media.nfs;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
options.${namespace}.services.media.nfs = {
|
options.${namespace}.media.nfs = {
|
||||||
enable = mkEnableOption "Enable NFS";
|
enable = mkEnableOption "Enable NFS";
|
||||||
};
|
};
|
||||||
|
|
|
@ -13,7 +13,7 @@ in
|
||||||
environment.systemPackages = with pkgs; [ sops ];
|
environment.systemPackages = with pkgs; [ sops ];
|
||||||
|
|
||||||
sops = {
|
sops = {
|
||||||
defaultSopsFile = ../../../../../_secrets/secrets.yaml;
|
defaultSopsFile = ../../../../secrets/secrets.yaml;
|
||||||
defaultSopsFormat = "yaml";
|
defaultSopsFormat = "yaml";
|
||||||
|
|
||||||
age.keyFile = "/home/";
|
age.keyFile = "/home/";
|
||||||
|
|
|
@ -14,8 +14,9 @@ in
|
||||||
|
|
||||||
sudo-rs = {
|
sudo-rs = {
|
||||||
enable = true;
|
enable = true;
|
||||||
execWheelOnly = true;
|
extraConfig = ''
|
||||||
extraConfig = ''Defaults env_keep += "EDITOR PATH DISPLAY"'';
|
Defaults env_keep += "EDITOR PATH DISPLAY"
|
||||||
|
'';
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -28,11 +28,5 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
services.displayManager.autoLogin = {
|
|
||||||
enable = true;
|
|
||||||
user = "chris";
|
|
||||||
};
|
|
||||||
|
|
||||||
system.stateVersion = "23.11";
|
system.stateVersion = "23.11";
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,15 +7,8 @@
|
||||||
|
|
||||||
sneeuwvlok = {
|
sneeuwvlok = {
|
||||||
services = {
|
services = {
|
||||||
authentication.authelia.enable = true;
|
|
||||||
authentication.zitadel.enable = true;
|
|
||||||
|
|
||||||
networking.ssh.enable = true;
|
networking.ssh.enable = true;
|
||||||
|
|
||||||
media.enable = true;
|
media.enable = true;
|
||||||
media.nfs.enable = true;
|
|
||||||
|
|
||||||
development.forgejo.enable = true;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
editor = {
|
editor = {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue