1{
2 config,
3 lib,
4 ...
5}: let
6 name = "glance";
7 cfg = config.myNixOS.services.${name};
8
9 inherit (config.mySnippets) aylac-top;
10 inherit (config.mySnippets) tailnet;
11
12 network = config.mySnippets.tailnet;
13
14 service = network.networkMap.${name};
15in {
16 options.myNixOS.services.${name} = {
17 enable = lib.mkEnableOption "${name} server";
18 autoProxy = lib.mkOption {
19 default = true;
20 example = false;
21 description = "${name} auto proxy";
22 type = lib.types.bool;
23 };
24 };
25
26 config = lib.mkIf cfg.enable {
27 services = {
28 caddy.virtualHosts."${service.vHost}".extraConfig = lib.mkIf cfg.autoProxy ''
29 bind tailscale/${name}
30 encode zstd gzip
31 reverse_proxy ${service.hostName}:${toString service.port}
32 '';
33
34 glance = {
35 enable = true;
36 openFirewall = true;
37
38 settings = {
39 pages = [
40 {
41 name = service.vHost;
42 width = "slim";
43 hide-desktop-navigation = true;
44 center-vertically = true;
45 columns = [
46 {
47 size = "full";
48 widgets = [
49 {
50 type = "monitor";
51 cache = "1m";
52 title = "Public Services";
53
54 sites = [
55 {
56 title = "Forgejo";
57 url = "https://${aylac-top.networkMap.forgejo.vHost}/";
58 check-url = "http://${aylac-top.networkMap.forgejo.hostName}:${toString aylac-top.networkMap.forgejo.port}/";
59 icon = "di:forgejo";
60 }
61 {
62 title = "PDS";
63 url = "https://${aylac-top.networkMap.pds.vHost}/";
64 check-url = "http://${aylac-top.networkMap.pds.hostName}:${toString aylac-top.networkMap.pds.port}/";
65 icon = "di:bluesky";
66 }
67 {
68 title = "ntfy";
69 url = "https://${aylac-top.networkMap.ntfy.vHost}/";
70 check-url = "http://${aylac-top.networkMap.ntfy.hostName}:${toString aylac-top.networkMap.ntfy.port}/";
71 icon = "di:ntfy";
72 }
73 ];
74 }
75 {
76 type = "monitor";
77 cache = "1m";
78 title = "Private Services";
79
80 sites = [
81 {
82 title = "Vaultwarden";
83 url = "https://${tailnet.networkMap.vaultwarden.vHost}/";
84 check-url = "http://${tailnet.networkMap.vaultwarden.hostName}:${toString tailnet.networkMap.vaultwarden.port}/";
85 icon = "di:vaultwarden";
86 }
87 #{
88 # title = "Karakeep";
89 # url = "https://${tailnet.networkMap.karakeep.vHost}/";
90 # check-url = "http://${tailnet.networkMap.karakeep.hostName}:${toString tailnet.networkMap.karakeep.port}/";
91 # icon = "di:karakeep";
92 #}
93 {
94 title = "Jellyfin";
95 url = "https://${tailnet.networkMap.jellyfin.vHost}/";
96 check-url = "http://${tailnet.networkMap.jellyfin.hostName}:${toString tailnet.networkMap.jellyfin.port}/web/index.html";
97 icon = "di:jellyfin";
98 }
99 {
100 title = "Jellyseerr";
101 url = "https://${tailnet.networkMap.jellyseerr.vHost}/";
102 check-url = "http://${tailnet.networkMap.jellyseerr.hostName}:${toString tailnet.networkMap.jellyseerr.port}/";
103 icon = "di:jellyseerr";
104 }
105 {
106 title = "Sonarr";
107 url = "https://${tailnet.networkMap.sonarr.vHost}/";
108 check-url = "http://${tailnet.networkMap.sonarr.hostName}:${toString tailnet.networkMap.sonarr.port}/";
109 icon = "di:sonarr";
110 }
111 {
112 title = "Radarr";
113 url = "https://${tailnet.networkMap.radarr.vHost}/";
114 check-url = "http://${tailnet.networkMap.radarr.hostName}:${toString tailnet.networkMap.radarr.port}/";
115 icon = "di:radarr";
116 }
117 {
118 title = "Prowlarr";
119 url = "https://${tailnet.networkMap.prowlarr.vHost}/";
120 check-url = "http://${tailnet.networkMap.prowlarr.hostName}:${toString tailnet.networkMap.prowlarr.port}/";
121 icon = "di:prowlarr";
122 }
123 #{
124 # title = "Bazarr";
125 # url = "https://${tailnet.networkMap.bazarr.vHost}/";
126 # check-url = "http://${tailnet.networkMap.bazarr.hostName}:${toString tailnet.networkMap.bazarr.port}/";
127 # icon = "di:bazarr";
128 #}
129 {
130 title = "Autobrr";
131 url = "https://${tailnet.networkMap.autobrr.vHost}/";
132 check-url = "http://${tailnet.networkMap.autobrr.hostName}:${toString tailnet.networkMap.autobrr.port}/";
133 icon = "di:autobrr";
134 }
135 {
136 title = "qBittorrent";
137 url = "https://${tailnet.networkMap.qbittorrent.vHost}/";
138 check-url = "http://${tailnet.networkMap.qbittorrent.hostName}:${toString tailnet.networkMap.qbittorrent.port}/";
139 icon = "di:qbittorrent";
140 alt-status-codes = [401];
141 }
142 {
143 title = "Uptime Kuma";
144 url = "https://${tailnet.networkMap.uptime-kuma.vHost}/";
145 check-url = "http://${tailnet.networkMap.uptime-kuma.hostName}:${toString tailnet.networkMap.uptime-kuma.port}/";
146 icon = "di:uptime-kuma";
147 }
148 {
149 title = "Radicale";
150 url = "https://${tailnet.networkMap.radicale.vHost}/";
151 check-url = "http://${tailnet.networkMap.radicale.hostName}:${toString tailnet.networkMap.radicale.port}/";
152 icon = "di:radicale";
153 }
154 {
155 title = "Copyparty";
156 url = "https://${tailnet.networkMap.copyparty.vHost}/";
157 check-url = "http://${tailnet.networkMap.copyparty.hostName}:${toString tailnet.networkMap.copyparty.port}/";
158 icon = "di:copyparty";
159 }
160 {
161 title = "Redlib";
162 url = "https://${tailnet.networkMap.redlib.vHost}/";
163 check-url = "http://${tailnet.networkMap.redlib.hostName}:${toString tailnet.networkMap.redlib.port}/";
164 icon = "di:redlib";
165 }
166 {
167 title = "Miniflux";
168 url = "https://${tailnet.networkMap.miniflux.vHost}/";
169 check-url = "http://${tailnet.networkMap.miniflux.hostName}:${toString tailnet.networkMap.miniflux.port}/";
170 icon = "di:miniflux";
171 }
172 {
173 title = "audiobookshelf";
174 url = "https://${tailnet.networkMap.audiobookshelf.vHost}/";
175 check-url = "http://${tailnet.networkMap.audiobookshelf.hostName}:${toString tailnet.networkMap.audiobookshelf.port}/";
176 icon = "di:audiobookshelf";
177 }
178 ];
179 }
180 {
181 type = "split-column";
182 max-columns = 3;
183 widgets = [
184 {
185 type = "hacker-news";
186 limit = 30;
187 collapse-after = 10;
188 }
189 {
190 type = "lobsters";
191 limit = 30;
192 collapse-after = 10;
193 }
194 {
195 type = "rss";
196 title = "Tildes";
197 limit = 30;
198 collapse-after = 10;
199 cache = "1h";
200 feeds = [
201 {
202 url = "https://tildes.net/topics.rss";
203 title = "tildes.net";
204 }
205 ];
206 }
207 ];
208 }
209 ];
210 }
211 ];
212 }
213 ];
214
215 server = {
216 host = "0.0.0.0";
217 inherit (tailnet.networkMap.glance) port;
218 };
219 };
220 };
221 };
222 };
223}