Compare commits

...

10 commits

Author SHA1 Message Date
dedd95c442
fix: resolve conflicting module options
Apparently you aren't allowed to define the same option in multiple
modules, even if the definitions are identical.
2025-04-01 22:36:14 -04:00
5965922b57
refactor: generalize flake input injection 2025-04-01 22:36:05 -04:00
c559bf629f
tweak(forgejo)!: switch to postgres database 2025-03-29 07:25:41 -04:00
5b602799f6
fix(forgejo): fix possible duplicate user creation 2025-03-29 07:25:16 -04:00
f7e030244b
fix: correct config option names 2025-01-10 22:33:10 -05:00
80834ea71c
fix: refactor improper use of mkIf
Apparently you should NOT do this, because not only will it not work, it
will also break the entire module!
2025-01-10 22:02:53 -05:00
79c0dfa162
feat: enable new theme 2025-01-10 21:12:59 -05:00
11398c5a84
chore: bump inputs 2025-01-10 17:31:41 -05:00
159980a6f8
fix: invalid special args 2025-01-10 17:25:38 -05:00
711a83b8e0
feat: new custom Tokyo Night forgejo theme 2025-01-10 03:11:04 -05:00
7 changed files with 94 additions and 48 deletions

View file

@ -1,4 +1,4 @@
{ config, lib, pkgs, aether, ... }:
{ config, lib, pkgs, aether, forgejo-tokyo-night, ... }:
{
networking.hostName = "toki-aether";
time.timeZone = "America/New_York";
@ -30,6 +30,7 @@
aether.domain = "tokinanpa.dev";
aether.acmeEmail = "kiana.a.sheibani@gmail.com";
aether.forgejo.theme = "${forgejo-tokyo-night}/public/assets";
aether.forgejo.templates = ./forgejo-templates;
services.forgejo.settings = {
DEFAULT.APP_NAME = "Code by toki!";
@ -50,7 +51,8 @@
};
ui = {
DEFAULT_THEME = "forgejo-dark";
DEFAULT_THEME = "forgejo-tokyo-night";
THEMES = "forgejo-tokyo-night";
GRAPH_MAX_COMMIT_NUM = 250;
};
"ui.meta" = {

View file

@ -1,9 +1,11 @@
{ config, lib, ... }:
{
options.aether.deploy.rpi5 = {
kernelPackages = lib.mkOption {
_internal.kernelPackages = lib.mkOption {
type = lib.types.raw;
description = "Kernel package to use for Raspberry Pi 5 support";
description = ''
Kernel package to use for Raspberry Pi 5 support.
'';
};
};
@ -11,7 +13,7 @@
let cfg = config.aether.deploy.rpi5;
in {
nixpkgs.system = "aarch64-linux";
boot.kernelPackages = cfg.kernelPackages;
boot.kernelPackages = cfg._internal.kernelPackages;
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = false;
};

21
flake.lock generated
View file

@ -37,6 +37,20 @@
"url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz"
}
},
"forgejo-tokyo-night": {
"flake": false,
"locked": {
"lastModified": 1736496165,
"narHash": "sha256-WVVAK1pnyu7s7Wsh/FO7DQrU6FDbmgMfXeqAOBwGC50=",
"rev": "dcb107d2015eed36c74c9efddc97f0327b6c2bea",
"type": "tarball",
"url": "https://git.tokinanpa.dev/api/v1/repos/toki/forgejo-tokyo-night/archive/dcb107d2015eed36c74c9efddc97f0327b6c2bea.tar.gz"
},
"original": {
"type": "tarball",
"url": "https://git.tokinanpa.dev/toki/forgejo-tokyo-night/archive/main.tar.gz"
}
},
"home-manager": {
"inputs": {
"nixpkgs": [
@ -60,11 +74,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1729413321,
"narHash": "sha256-I4tuhRpZFa6Fu6dcH9Dlo5LlH17peT79vx1y1SpeKt0=",
"lastModified": 1736344531,
"narHash": "sha256-8YVQ9ZbSfuUk2bUf2KRj60NRraLPKPS0Q4QFTbc+c2c=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "1997e4aa514312c1af7e2bda7fad1644e778ff26",
"rev": "bffc22eb12172e6db3c5dde9e3e5628f8e3e7912",
"type": "github"
},
"original": {
@ -77,6 +91,7 @@
"root": {
"inputs": {
"agenix": "agenix",
"forgejo-tokyo-night": "forgejo-tokyo-night",
"nixpkgs": "nixpkgs",
"rpi5-kernel": "rpi5-kernel"
}

View file

@ -10,34 +10,59 @@ inputs = {
agenix.url = "github:ryantm/agenix";
agenix.inputs.nixpkgs.follows = "nixpkgs";
agenix.inputs.darwin.follows = "";
forgejo-tokyo-night.url = "https://git.tokinanpa.dev/toki/forgejo-tokyo-night/archive/main.tar.gz";
forgejo-tokyo-night.flake = false;
};
outputs = inputs@{ self, nixpkgs, agenix, rpi5-kernel, ... }:
let
inherit (nixpkgs) lib;
# Extra config applied to each module
# (Mostly used for injecting flake inputs)
extraConfig = {
deploy-rpi5 = {
aether.deploy.rpi5._internal.kernelPackages = lib.mkDefault
rpi5-kernel.legacyPackages.aarch64-linux.linuxPackages_rpi5;
};
};
moduleNames =
let sub = builtins.readDir ./modules;
in builtins.filter
(d: sub.${d} == "directory")
(builtins.attrNames sub);
modules = lib.genAttrs moduleNames (name: ./modules/${name});
deployNames =
let sub = builtins.readDir ./deploy;
in builtins.map (d: "deploy-${d}")
(builtins.filter
(d: sub.${d} == "directory")
(builtins.attrNames sub));
modules = lib.genAttrs moduleNames
(name: ./modules/${name});
deployments = lib.genAttrs deployNames
(name: ./deploy/${lib.removePrefix "deploy-" name});
modulesWithCfg = builtins.mapAttrs (k: v: {
imports = [ v ];
} // extraConfig.${k} or {}) modules;
deploymentsWithCfg = builtins.mapAttrs (k: v: {
imports = [ v ];
} // extraConfig.${k} or {}) deployments;
in {
nixosModules =
modules
// {
all.imports = lib.attrValues modules;
deploy-rpi5 = { lib, ... }: {
imports = [ ./deploy/rpi5 ];
aether.deploy.rpi5.kernelPackages = lib.mkDefault
rpi5-kernel.legacyPackages.aarch64-linux.linuxPackages_rpi5;
};
modulesWithCfg // deploymentsWithCfg // {
all.imports = lib.attrValues modulesWithCfg;
};
nixosConfigurations."toki-aether" =
nixpkgs.lib.nixosSystem {
specialArgs.aether = self.nixosModules;
specialArgs = inputs // {
aether = self.nixosModules;
};
modules = [
agenix.nixosModules.default
./aether/hardware-configuration.nix

View file

@ -21,7 +21,7 @@ in {
};
security.acme.acceptTerms = config.aether.https;
security.acme.defaults.email = cfg.acmeEmail;
security.acme.defaults.email = config.aether.acmeEmail;
networking.firewall.allowedTCPPorts = [ 80 443 ];
@ -31,7 +31,9 @@ in {
enable = true;
user = cfg.user;
group = forgejo.user;
database.name = forgejo.user;
database.user = forgejo.user;
database.type = "postgres";
settings.server = {
DOMAIN = lib.optionalString useSubdomain "${cfg.subdomain}."
@ -41,17 +43,20 @@ in {
};
systemd.tmpfiles.rules =
lib.optional (!(builtins.isNull cfg.themes))
lib.optional (!(builtins.isNull cfg.theme))
"L+ ${forgejo.stateDir}/custom/public/assets - - - - ${cfg.theme}"
++ lib.optional (!(builtins.isNull cfg.templates))
"L+ ${forgejo.stateDir}/custom/templates - - - - ${cfg.templates}";
}
// lib.mkIf cfg.createUser {
users.users.${forgejo.user} = {
home = forgejo.stateDir;
useDefaultShell = true;
group = forgejo.group;
isSystemUser = true;
users.users = lib.mkIf (cfg.createUser && forgejo.user != "forgejo") {
${forgejo.user} = {
home = forgejo.stateDir;
useDefaultShell = true;
group = forgejo.group;
isSystemUser = true;
};
};
users.groups = lib.mkIf (cfg.createUser && forgejo.group != "forgejo") {
${forgejo.group} = {};
};
users.groups.${forgejo.group} = {};
}

View file

@ -1,13 +1,8 @@
args@{ config, lib, ... }:
{
options.aether = {
# Referenced general options
inherit (import ../options.nix args)
domain
https
acmeEmail;
imports = [ ../options.nix ];
# Module-specific options
options.aether = {
forgejo = {
subdomain = lib.mkOption {
type = lib.types.nullOr lib.types.str;

View file

@ -1,19 +1,21 @@
{ lib, ... }:
{
domain = lib.mkOption {
type = lib.types.str;
description = "The domain name the server is hosted on.";
};
options.aether = {
domain = lib.mkOption {
type = lib.types.str;
description = "The domain name the server is hosted on.";
};
https = lib.mkOption {
type = lib.types.boolByOr;
default = true;
description = "Whether to force HTTPS connections for websites.";
};
https = lib.mkOption {
type = lib.types.boolByOr;
default = true;
description = "Whether to force HTTPS connections for websites.";
};
acmeEmail = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
description = "Email address for ACME.";
acmeEmail = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
description = "Email address for ACME.";
};
};
}