-
Notifications
You must be signed in to change notification settings - Fork 0
/
svelte.nix
119 lines (109 loc) · 2.78 KB
/
svelte.nix
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
{
config,
host,
inputs,
lib,
pkgs,
...
}:
let
inherit (lib)
elemAt
filterAttrs
mapAttrs
mapAttrs'
mkEnableOption
mkIf
mkOption
nameValuePair
splitString
types
;
lib' = (import ../lib.nix) { inherit lib pkgs; };
cfg = config.my-nixos.svelte;
eachSite = filterAttrs (hostname: cfg: cfg.enable) cfg.sites;
siteOpts = {
options = with types; {
enable = mkEnableOption "svelte-app for this host.";
location = mkOption {
description = "URL path to serve the application.";
default = "/";
type = str;
};
port = mkOption {
description = "Port to serve the application.";
type = port;
};
ssl = mkOption {
description = "Whether the svelte-app can assume https or not.";
type = bool;
};
api = mkOption {
description = "URL for the API endpoint";
type = str;
};
api_ssr = mkOption {
description = "Server side URL for the API endpoint";
type = str;
};
user = mkOption {
description = "Username for app owner";
type = str;
};
};
};
sveltePkgs = hostname: inputs.${elemAt (splitString "." hostname) 0}.packages.${host.system}.svelte;
envs = mapAttrs (
hostname: cfg:
(lib'.mkEnv hostname {
ORIGIN = "${if cfg.ssl then "https" else "http"}://${hostname}";
PUBLIC_API = cfg.api;
PUBLIC_API_SSR = cfg.api_ssr;
PORT = toString cfg.port;
})
) eachSite;
in
{
options = {
my-nixos.svelte = {
sites = mkOption {
type = types.attrsOf (types.submodule siteOpts);
default = { };
description = "Specification of one or more Svelte sites to serve";
};
};
};
config = mkIf (eachSite != { }) {
users = lib'.mergeAttrs (hostname: cfg: {
users.${cfg.user} = {
isSystemUser = true;
group = cfg.user;
};
groups.${cfg.user} = { };
}) eachSite;
services.nginx.virtualHosts = mapAttrs (hostname: cfg: {
serverName = hostname;
forceSSL = cfg.ssl;
enableACME = cfg.ssl;
locations."${cfg.location}" = {
recommendedProxySettings = true;
proxyPass = "http://localhost:${toString cfg.port}";
};
}) eachSite;
systemd.services = mapAttrs' (
hostname: cfg:
(nameValuePair "${hostname}-svelte" {
description = "serve ${hostname}-svelte";
serviceConfig = {
ExecStart = "${pkgs.nodejs_20}/bin/node ${
(sveltePkgs hostname).app.overrideAttrs { env = envs.${hostname}; }
}/build";
User = cfg.user;
Group = cfg.user;
EnvironmentFile = "${envs.${hostname}}";
};
wantedBy = [ "multi-user.target" ];
})
) eachSite;
};
}