diff options
Diffstat (limited to 'bragi.nix')
-rw-r--r-- | bragi.nix | 157 |
1 files changed, 86 insertions, 71 deletions
@@ -3,6 +3,7 @@ | |||
3 | let | 3 | let |
4 | trivmixService = opts: (pkgs.callPackage ./custom/trivmix-service.nix opts).out; | 4 | trivmixService = opts: (pkgs.callPackage ./custom/trivmix-service.nix opts).out; |
5 | thermoprint-servant = (pkgs.callPackage ./custom/thermoprint {}).thermoprint-servant; | 5 | thermoprint-servant = (pkgs.callPackage ./custom/thermoprint {}).thermoprint-servant; |
6 | inherit (pkgs) lib; | ||
6 | in rec { | 7 | in rec { |
7 | imports = | 8 | imports = |
8 | [ ./musnix | 9 | [ ./musnix |
@@ -31,29 +32,22 @@ in rec { | |||
31 | overrides = self: super: let | 32 | overrides = self: super: let |
32 | callPackage = pkgs.lib.callPackageWith ( pkgs // self ); | 33 | callPackage = pkgs.lib.callPackageWith ( pkgs // self ); |
33 | in { | 34 | in { |
34 | trivmix = callPackage ./custom/trivmix.nix {}; | 35 | trivmix = callPackage ./custom/trivmix {}; |
35 | # filelock = callPackage ./custom/filelock.nix {}; | ||
36 | }; | 36 | }; |
37 | } | 37 | } |
38 | ); | 38 | ); |
39 | 39 | ||
40 | jack2Full = pkgs.jack2Full.override { dbus = null; }; | 40 | jack2Full = pkgs.jack2Full.override { dbus = null; }; |
41 | 41 | ||
42 | mpd = pkgs.symlinkJoin { | 42 | mpd = pkgs.mpd.override { gmeSupport = false; pulseaudioSupport = false; }; |
43 | name = "mpd"; | ||
44 | paths = [ (pkgs.mpd.override { gmeSupport = false; pulseaudioSupport = false; }) ]; | ||
45 | buildInputs = [ pkgs.makeWrapper ]; | ||
46 | postBuild = '' | ||
47 | wrapProgram $out/bin/mpd \ | ||
48 | --run "umask 0" | ||
49 | ''; | ||
50 | }; | ||
51 | 43 | ||
52 | inherit (pkgs.callPackage ./custom/thermoprint {}) thermoprint-server thermoprint-webgui tprint; | 44 | inherit (pkgs.callPackage ./custom/thermoprint { extraPackages = (p: with p; [ persistent-postgresql ]); }) thermoprint-server thermoprint-webgui tprint; |
53 | 45 | ||
54 | inherit (haskellPackages) trivmix; | 46 | inherit (haskellPackages) trivmix; |
55 | }; | 47 | }; |
56 | 48 | ||
49 | nixpkgs.config.allowUnfree = true; | ||
50 | |||
57 | environment.systemPackages = with pkgs; [ | 51 | environment.systemPackages = with pkgs; [ |
58 | git | 52 | git |
59 | mosh | 53 | mosh |
@@ -124,17 +118,20 @@ in rec { | |||
124 | }; | 118 | }; |
125 | }; | 119 | }; |
126 | 120 | ||
127 | systemd.services."mpdmix0" = trivmixService { name = "mpdmix0"; connectOut = "system:playback_3"; group = "mpd"; }; | 121 | systemd.services."mpdmix0" = trivmixService { name = "mpdmix0"; connectOut = "system:playback_3"; group = "mpd"; initial = "-35dB"; }; |
128 | systemd.services."mpdmix1" = trivmixService { name = "mpdmix1"; connectOut = "system:playback_4"; group = "mpd"; }; | 122 | systemd.services."mpdmix1" = trivmixService { name = "mpdmix1"; connectOut = "system:playback_4"; group = "mpd"; initial = "-35dB"; }; |
123 | |||
124 | systemd.services."passmix0" = trivmixService { name = "passmix0"; connectOut = "system:playback_3"; connectIn = "system:capture_5"; group = "vali_out"; initial = "-20dB"; }; | ||
125 | systemd.services."passmix1" = trivmixService { name = "passmix1"; connectOut = "system:playback_4"; connectIn = "system:capture_6"; group = "vali_out"; initial = "-20dB"; }; | ||
129 | 126 | ||
130 | systemd.services."passmix0" = trivmixService { name = "passmix0"; connectOut = "system:playback_3"; connectIn = "system:capture_5"; group = "vali_out"; }; | 127 | systemd.services."passmix2" = trivmixService { name = "passmix2"; connectOut = "system:playback_5"; connectIn = "system:capture_1"; group = "vali_in"; initial = "1"; }; |
131 | systemd.services."passmix1" = trivmixService { name = "passmix1"; connectOut = "system:playback_4"; connectIn = "system:capture_6"; group = "vali_out"; }; | 128 | systemd.services."passmix3" = trivmixService { name = "passmix3"; connectOut = "system:playback_6"; connectIn = "system:capture_1"; group = "vali_in"; initial = "1"; }; |
132 | 129 | ||
133 | systemd.services."passmix2" = trivmixService { name = "passmix2"; connectOut = "system:playback_5"; connectIn = "system:capture_1"; group = "vali_in"; }; | 130 | systemd.services."passmix4" = trivmixService { name = "passmix4"; connectOut = "system:playback_3"; connectIn = "system:capture_7"; group = "hel_out"; initial = "-17.5dB"; }; |
134 | systemd.services."passmix3" = trivmixService { name = "passmix3"; connectOut = "system:playback_6"; connectIn = "system:capture_1"; group = "vali_in"; }; | 131 | systemd.services."passmix5" = trivmixService { name = "passmix5"; connectOut = "system:playback_4"; connectIn = "system:capture_8"; group = "hel_out"; initial = "-17.5dB"; }; |
135 | 132 | ||
136 | systemd.services."passmix4" = trivmixService { name = "passmix4"; connectOut = "system:playback_3"; connectIn = "system:capture_7"; group = "hel_out"; }; | 133 | systemd.services."passmix6" = trivmixService { name = "passmix6"; connectOut = "system:playback_7"; connectIn = "system:capture_1"; group = "hel_in"; initial = "1"; }; |
137 | systemd.services."passmix5" = trivmixService { name = "passmix5"; connectOut = "system:playback_4"; connectIn = "system:capture_8"; group = "hel_out"; }; | 134 | systemd.services."passmix7" = trivmixService { name = "passmix7"; connectOut = "system:playback_8"; connectIn = "system:capture_1"; group = "hel_in"; initial = "1"; }; |
138 | 135 | ||
139 | services.mpd = { | 136 | services.mpd = { |
140 | enable = true; | 137 | enable = true; |
@@ -159,6 +156,9 @@ in rec { | |||
159 | systemd.services."mpd".requires = [ "jack.service" ]; | 156 | systemd.services."mpd".requires = [ "jack.service" ]; |
160 | systemd.services."mpd".serviceConfig = { | 157 | systemd.services."mpd".serviceConfig = { |
161 | LimitMEMLOCK = "infinity"; | 158 | LimitMEMLOCK = "infinity"; |
159 | Nice = "-5"; | ||
160 | LimitRTPRIO = "95:95"; | ||
161 | UMask = "0000"; | ||
162 | }; | 162 | }; |
163 | 163 | ||
164 | users.extraUsers.jack = { | 164 | users.extraUsers.jack = { |
@@ -167,7 +167,7 @@ in rec { | |||
167 | group = "audio"; | 167 | group = "audio"; |
168 | }; | 168 | }; |
169 | 169 | ||
170 | security.setuidPrograms = ["mount.nfs"]; | 170 | security.wrappers = { "mount.nfs".source = "${pkgs.nfs-utils}/bin/mount.nfs"; }; |
171 | 171 | ||
172 | programs.bash.promptInit = '' | 172 | programs.bash.promptInit = '' |
173 | PROMPT_COLOR="1;31m" | 173 | PROMPT_COLOR="1;31m" |
@@ -208,6 +208,7 @@ in rec { | |||
208 | allowPing = true; | 208 | allowPing = true; |
209 | allowedTCPPorts = [ 22 # SSH | 209 | allowedTCPPorts = [ 22 # SSH |
210 | 80 # HTTP | 210 | 80 # HTTP |
211 | 5432 # PostgreSQL | ||
211 | 6600 # MPD | 212 | 6600 # MPD |
212 | ]; | 213 | ]; |
213 | allowedUDPPortRanges = [ { from = 60000; to = 61000; } # mosh | 214 | allowedUDPPortRanges = [ { from = 60000; to = 61000; } # mosh |
@@ -220,7 +221,14 @@ in rec { | |||
220 | ''; | 221 | ''; |
221 | }; | 222 | }; |
222 | 223 | ||
223 | services.dhcpd = { | 224 | networking.defaultMailServer = { |
225 | directDelivery = true; | ||
226 | hostName = "ymir.niflheim.yggdrasil"; | ||
227 | useSTARTTLS = true; | ||
228 | setSendmail = true; | ||
229 | }; | ||
230 | |||
231 | services.dhcpd4 = { | ||
224 | enable = true; | 232 | enable = true; |
225 | interfaces = [ "enp1s0" | 233 | interfaces = [ "enp1s0" |
226 | ]; | 234 | ]; |
@@ -249,14 +257,6 @@ in rec { | |||
249 | ''; | 257 | ''; |
250 | }; | 258 | }; |
251 | 259 | ||
252 | services.ntp = { | ||
253 | enable = false; | ||
254 | }; | ||
255 | |||
256 | services.chrony = { | ||
257 | enable = true; | ||
258 | }; | ||
259 | |||
260 | users.extraUsers.root = let | 260 | users.extraUsers.root = let |
261 | template = (import users/gkleen.nix); | 261 | template = (import users/gkleen.nix); |
262 | in { | 262 | in { |
@@ -272,56 +272,19 @@ in rec { | |||
272 | home = "/var/lib/thermoprint"; | 272 | home = "/var/lib/thermoprint"; |
273 | }; | 273 | }; |
274 | 274 | ||
275 | environment.etc."thermoprint-server/thermoprint-server.hs" = { | ||
276 | text = '' | ||
277 | {-# LANGUAGE OverloadedStrings #-} | ||
278 | {-# LANGUAGE ImpredicativeTypes #-} | ||
279 | |||
280 | module Main (main) where | ||
281 | |||
282 | import Thermoprint.Server | ||
283 | |||
284 | import Thermoprint.Server.Printer.Generic | ||
285 | |||
286 | import Control.Monad.Trans.Resource | ||
287 | import Control.Monad.Logger | ||
288 | import Control.Monad.Reader | ||
289 | |||
290 | import Database.Persist.Sqlite | ||
291 | |||
292 | import qualified Network.Wai.Handler.Warp as Warp | ||
293 | |||
294 | main :: IO () | ||
295 | main = thermoprintServer True (Nat runSqlite) $ (\c -> c { queueManagers = queueManagers, warpSettings = wSettings }) <$> def `withPrinters` printers | ||
296 | where | ||
297 | runSqlite :: ReaderT ConnectionPool (LoggingT IO) a -> IO a | ||
298 | runSqlite = runStderrLoggingT . withSqlitePool "${users.extraUsers."thermoprint".home}/thermoprint.sqlite" 1 . runReaderT | ||
299 | |||
300 | printers = [ (pure $ genericPrint "/dev/usb/lp0", def :: QMConfig (ResourceT (ReaderT ConnectionPool (LoggingT IO)))) | ||
301 | ] | ||
302 | |||
303 | queueManagers _ = QMConfig | ||
304 | { manager = union [ limitHistorySize 100 | ||
305 | , limitHistoryAge 3600 | ||
306 | ] | ||
307 | , collapse = standardCollapse | ||
308 | } | ||
309 | |||
310 | wSettings = Warp.setHost "127.0.0.1" . Warp.setPort 8080 $ Warp.defaultSettings | ||
311 | ''; | ||
312 | }; | ||
313 | |||
314 | systemd.services."thermoprint" = { | 275 | systemd.services."thermoprint" = { |
315 | environment = { | 276 | environment = { |
316 | THERMOPRINT_CONFIG = "/etc/thermoprint-server"; | 277 | THERMOPRINT_CONFIG = ./bragi/thermoprint-server; |
317 | THERMOPRINT_CACHE = ''${users.extraUsers."thermoprint".home}/dyre''; | 278 | THERMOPRINT_CACHE = ''${users.extraUsers."thermoprint".home}/dyre''; |
318 | }; | 279 | }; |
280 | requires = [ "postgresql.service" ]; | ||
319 | wantedBy = [ "default.target" ]; | 281 | wantedBy = [ "default.target" ]; |
320 | serviceConfig = { | 282 | serviceConfig = { |
321 | Type = "simple"; | 283 | Type = "simple"; |
322 | ExecStart = ''${pkgs.thermoprint-server}/bin/thermoprint-server --force-reconf''; | 284 | ExecStart = ''${pkgs.thermoprint-server}/bin/thermoprint-server --force-reconf''; |
323 | User = users.extraUsers."thermoprint".name; | 285 | User = users.extraUsers."thermoprint".name; |
324 | Group = users.extraUsers."thermoprint".group; | 286 | Group = users.extraUsers."thermoprint".group; |
287 | WorkingDirectory = "~"; | ||
325 | }; | 288 | }; |
326 | }; | 289 | }; |
327 | 290 | ||
@@ -332,6 +295,35 @@ in rec { | |||
332 | ExecStart = ''${pkgs.thermoprint-webgui}/bin/thermoprint-webgui -P 80 -A localhost -F /thermoprint/api/ -a "localhost" -p 8081''; | 295 | ExecStart = ''${pkgs.thermoprint-webgui}/bin/thermoprint-webgui -P 80 -A localhost -F /thermoprint/api/ -a "localhost" -p 8081''; |
333 | User = users.extraUsers."thermoprint".name; | 296 | User = users.extraUsers."thermoprint".name; |
334 | Group = users.extraUsers."thermoprint".group; | 297 | Group = users.extraUsers."thermoprint".group; |
298 | WorkingDirectory = "~"; | ||
299 | }; | ||
300 | }; | ||
301 | |||
302 | users.extraUsers."bar" = { | ||
303 | name = "bar"; | ||
304 | group = "nogroup"; | ||
305 | isSystemUser = true; | ||
306 | createHome = true; | ||
307 | home = "/var/lib/bar"; | ||
308 | }; | ||
309 | |||
310 | systemd.services."bar" = let | ||
311 | ghc = pkgs.haskellPackages.ghcWithPackages (p: with p; [yesod persistent-postgresql]); | ||
312 | in { | ||
313 | environment = { | ||
314 | PORT = "8082"; | ||
315 | HOST = "::1"; | ||
316 | }; | ||
317 | requires = [ "postgresql.service" ]; | ||
318 | wantedBy = [ "default.target" ]; | ||
319 | serviceConfig = { | ||
320 | Type = "simple"; | ||
321 | ExecStart = '' | ||
322 | ${pkgs.callPackage ./bragi/bar {}}/bin/bar | ||
323 | ''; | ||
324 | User = users.extraUsers."bar".name; | ||
325 | Group = users.extraUsers."bar".group; | ||
326 | WorkingDirectory = "~"; | ||
335 | }; | 327 | }; |
336 | }; | 328 | }; |
337 | 329 | ||
@@ -379,7 +371,7 @@ in rec { | |||
379 | server_name _; | 371 | server_name _; |
380 | 372 | ||
381 | location /thermoprint/api/ { | 373 | location /thermoprint/api/ { |
382 | proxy_pass http://localhost:8080/; | 374 | proxy_pass http://[::1]:8080/; |
383 | proxy_http_version 1.1; | 375 | proxy_http_version 1.1; |
384 | proxy_set_header Upgrade $http_upgrade; | 376 | proxy_set_header Upgrade $http_upgrade; |
385 | proxy_set_header Connection "upgrade"; | 377 | proxy_set_header Connection "upgrade"; |
@@ -388,10 +380,33 @@ in rec { | |||
388 | location /thermoprint/ { | 380 | location /thermoprint/ { |
389 | proxy_pass http://localhost:8081/; | 381 | proxy_pass http://localhost:8081/; |
390 | } | 382 | } |
383 | |||
384 | location /bar/ { | ||
385 | proxy_set_header AppRoot "http://$host/bar"; | ||
386 | proxy_pass http://[::1]:8082/; | ||
387 | } | ||
391 | } | 388 | } |
392 | ''; | 389 | ''; |
393 | }; | 390 | }; |
394 | 391 | ||
392 | services.postgresql = { | ||
393 | enable = true; | ||
394 | enableTCPIP = true; | ||
395 | authentication = lib.mkForce '' | ||
396 | local all all peer | ||
397 | host all all 10.141.0.0/16 md5 | ||
398 | ''; | ||
399 | initialScript = pkgs.writeText "schema.sql" '' | ||
400 | CREATE USER thermoprint; | ||
401 | CREATE DATABASE thermoprint WITH OWNER = thermoprint; | ||
402 | GRANT ALL ON DATABASE thermoprint TO thermoprint; | ||
403 | |||
404 | CREATE USER bar; | ||
405 | CREATE DATABASE bar WITH OWNER = bar; | ||
406 | GRANT ALL ON DATABASE bar TO bar; | ||
407 | ''; | ||
408 | }; | ||
409 | |||
395 | nix = { | 410 | nix = { |
396 | daemonIONiceLevel = 3; | 411 | daemonIONiceLevel = 3; |
397 | daemonNiceLevel = 10; | 412 | daemonNiceLevel = 10; |