andrew.scm (15858B)
1 (define-module (system andrew) 2 #:use-module (system andrew ci) 3 #:use-module (system andrew minecraft) 4 #:use-module (guix gexp) 5 #:use-module (guix packages) 6 #:use-module (guix modules) 7 #:use-module (guix git) 8 #:use-module (gnu bootloader) 9 #:use-module (gnu bootloader grub) 10 #:use-module (gnu services) 11 #:use-module (gnu services base) 12 #:use-module (gnu services certbot) 13 #:use-module (gnu services networking) 14 #:use-module (gnu services version-control) 15 #:use-module (gnu services shepherd) 16 #:use-module (gnu services web) 17 #:use-module (gnu system) 18 #:use-module (gnu system keyboard) 19 #:use-module (gnu system shadow) 20 #:use-module (gnu packages rsync) 21 #:use-module (gnu packages version-control) 22 #:use-module (gnu packages wget) 23 #:use-module (nongnu packages linux) 24 #:use-module (nongnu system linux-initrd) 25 #:use-module (mt services) 26 #:use-module (mt services version-control) 27 #:use-module (mt system) 28 #:use-module (mt artwork) 29 #:use-module (mt utils) 30 #:export (andrew-os)) 31 32 ;;; 33 ;;; OS Configuration 34 ;;; 35 36 (define %issue " 37 Welcome to \"andrew\" the, first MonasTech server. 38 ") 39 40 (define %nftables-ruleset 41 (plain-file "nftables.conf" "\ 42 # A simple and safe firewall 43 table inet filter { 44 chain input { 45 type filter hook input priority 0; policy drop; 46 47 # early drop of invalid connections 48 ct state invalid drop 49 50 # allow established/related connections 51 ct state { established, related } accept 52 53 # allow from loopback 54 iif lo accept 55 # drop connections to lo not coming from lo 56 iif != lo ip daddr 127.0.0.1/8 drop 57 iif != lo ip6 daddr ::1/128 drop 58 59 # allow icmp 60 ip protocol icmp accept 61 ip6 nexthdr icmpv6 accept 62 63 # allow ssh 64 tcp dport ssh accept 65 66 # allow git 67 tcp dport 9418 accept 68 69 # allow ngninx 70 tcp dport { 80, 443 } accept 71 72 # allow minecraft java (TCP) 73 tcp dport 25565 accept 74 75 # allow minecraft bedrock & voice chat (UDP) 76 udp dport 19132 accept 77 78 # reject everything else 79 reject with icmpx type port-unreachable 80 } 81 chain forward { 82 type filter hook forward priority 0; policy drop; 83 } 84 chain output { 85 type filter hook output priority 0; policy accept; 86 } 87 } 88 ")) 89 90 (define %mod-list 91 (list 92 (minecraft-mod 93 (url "https://cdn.modrinth.com/data/P7dR8mSH/versions/q87Wssd1/fabric-api-0.148.2+26.1.2.jar") 94 (sha256 (base32 "1ar6f4f94yxk06flpknh10y6q8k5yibm6nzjzzrd738jnvyviicr"))) 95 (minecraft-mod 96 (url "https://cdn.modrinth.com/data/aZj58GfX/versions/h9nSM2ZF/easyauth-mc26.1-3.4.3-SNAPSHOT.48.jar") 97 (sha256 (base32 "01v14b7r0b95idjqimqa0q3wdyzqmyi3j03bw3n8jpbsqzni613n"))) 98 (minecraft-mod 99 (url "https://cdn.modrinth.com/data/qpPoAL6m/versions/lOYCVRCp/trade-cycling-fabric-1.0.21+26.1.2.jar") 100 (sha256 (base32 "0b42a8xdmh9mkriz81jdfhr0j80zf9rxmmhl1fswhymmlhj4hg8y"))) 101 (minecraft-mod 102 (url "https://cdn.modrinth.com/data/zQhsx8KF/versions/eu63Kj9A/servux-fabric-26.1.2-0.10.2.jar") 103 (sha256 (base32 "1vv00hrr2sgadlqb7lxl66ncaa9vy5yyaasga43i3yyi77yi20af"))) 104 ;; TODO: Make a helper function for Xaero's 105 (minecraft-mod 106 (url "https://cdn.modrinth.com/data/ohNO6lps/versions/mwAOaKnn/ForgeConfigAPIPort-v26.1.4-mc26.1.x-Fabric.jar") 107 (sha256 (base32 "10k0ki8m6kjz5dsj2jq70v8pj0n9n4z7afi5503z3j8vvhpiyqvv"))) 108 (minecraft-mod 109 (url "https://cdn.modrinth.com/data/1bokaNcj/versions/65OfA4xM/xaerominimap-fabric-26.1.2-25.3.14.jar") 110 (sha256 (base32 "00gyxshrc445ridyhl37pljxk3c9c4nc46rgshi3as8fh1zcz410"))) 111 (minecraft-mod 112 (url "https://cdn.modrinth.com/data/NcUtCpym/versions/nvmFod7S/xaeroworldmap-fabric-26.1.2-1.40.18.jar") 113 (sha256 (base32 "1mqn2hqhzb0qhvhz2jbfb7zjzsnsvdkwxfbrvlp831alr78m0gq9"))) 114 (minecraft-mod 115 (url "https://cdn.modrinth.com/data/gF3BGWvG/versions/CHfI2OKD/open-parties-and-claims-fabric-26.1.2-0.26.3.jar") 116 (sha256 (base32 "07m9mdsiqxyici24cmh75lppnl8hwfpl8cp4248a5074ikra8mig"))) 117 ;; TODO: Make a helper function for geyser 118 (minecraft-mod 119 (url "https://cdn.modrinth.com/data/wKkoqHrH/versions/q4Pg0AcC/Geyser-Fabric-2.10.0-b1138.jar") 120 (sha256 (base32 "1j1gs3kpnp4wfa8sj9s7j3c4aqx4cn33pqcfwz3iska88k54h88i")) 121 (config (plain-file "config.yml" 122 "\ 123 bedrock: 124 address: 0.0.0.0 125 port: 19132 126 clone-remote-port: false 127 128 java: 129 auth-type: floodgate 130 131 # MOTD settings 132 motd: 133 primary-motd: Geyser 134 secondary-motd: Another Geyser server. 135 passthrough-motd: true 136 max-players: 100 137 passthrough-player-counts: true 138 integrated-ping-passthrough: true 139 ping-passthrough-interval: 3 140 141 gameplay: 142 server-name: Geyser 143 cooldown-type: crosshair 144 command-suggestions: true 145 show-coordinates: true 146 disable-bedrock-scaffolding: false 147 nether-roof-workaround: true 148 emotes-enabled: true 149 block-legacy-codes: true 150 unusable-space-block: minecraft:barrier 151 enable-custom-content: true 152 force-resource-packs: true 153 enable-integrated-pack: true 154 forward-player-ping: false 155 xbox-achievements-enabled: false 156 max-visible-custom-skulls: 128 157 custom-skull-render-distance: 32 158 159 default-locale: system 160 log-player-ip-addresses: true 161 162 saved-user-logins: 163 - ThisExampleUsernameShouldBeLongEnoughToNeverBeAnXboxUsername 164 - ThisOtherExampleUsernameShouldAlsoBeLongEnough 165 166 pending-authentication-timeout: 120 167 notify-on-new-bedrock-update: true 168 169 advanced: 170 cache-images: 0 171 scoreboard-packet-threshold: 20 172 add-team-suggestions: true 173 resource-pack-urls: [] 174 floodgate-key-file: key.pem 175 176 java: 177 use-haproxy-protocol: false 178 use-direct-connection: true 179 disable-compression: true 180 181 bedrock: 182 broadcast-port: 0 183 compression-level: 6 184 use-haproxy-protocol: false 185 haproxy-protocol-whitelisted-ips: [] 186 use-waterdogpe-forwarding: false 187 mtu: 1400 188 validate-bedrock-login: true 189 190 enable-metrics: false 191 debug-mode: false 192 config-version: 7 193 ")) 194 (config-subdir "Geyser-Fabric")) 195 (minecraft-mod 196 (url "https://cdn.modrinth.com/data/bWrNNfkb/versions/fD4J9lnX/Floodgate-Fabric-2.2.6-b63.jar") 197 (sha256 (base32 "0bazalawy2md8x1q51vgns4p9847k0bgcs4pnnhvbnp53wljpapl"))) 198 (minecraft-mod 199 (url "https://cdn.modrinth.com/data/gvQqBUqZ/versions/R7MxYvuW/lithium-fabric-0.24.2+mc26.1.2.jar") 200 (sha256 (base32 "002fvncv6g6122ark6748lj4b3za0ffa8raz6sdp9qphlbqqjli2"))) 201 (minecraft-mod 202 (url "https://cdn.modrinth.com/data/fhTDuo6c/versions/YKP6d9vM/TreeTimberFabric-26.1.2-1.0.2.jar") 203 (sha256 (base32 "1dz5klmsjm12ndlggchhwy5nxcdr6j1hgcf5c1gbhqhpyr6iv42r"))))) 204 205 (define andrew-os 206 (operating-system 207 (host-name "andrew") 208 (timezone "America/New_York") ;; Located in vinthill 209 (locale "en_US.utf8") 210 211 (issue %issue) 212 213 (keyboard-layout (keyboard-layout "us")) 214 215 (kernel linux-lts) 216 (initrd microcode-initrd) 217 (firmware (list linux-firmware)) 218 219 (bootloader (bootloader-configuration 220 (bootloader grub-efi-bootloader) 221 (targets '("/boot/efi")) 222 (keyboard-layout keyboard-layout))) 223 224 (kernel-arguments '("net.ipv6.conf.all.autoconf=0" 225 "net.ipv6.conf.all.accept_ra=0")) 226 227 (swap-devices %mt-swap-devices) 228 229 (file-systems %mt-file-systems) 230 231 (users 232 (cons* 233 (user-account 234 (name "lukejw") 235 (comment "Luke Willis") 236 (group "users") 237 (home-directory "/home/lukejw") 238 (supplementary-groups '("wheel"))) 239 %base-user-accounts)) 240 241 (packages 242 (cons* 243 rsync 244 %mt-base-packages)) 245 246 (services 247 (append 248 (list (service static-networking-service-type 249 (list (static-networking 250 (addresses 251 (list (network-address 252 (value "147.135.11.131/24") 253 (device "eno1")) 254 (network-address 255 (value "2604:2dc0:100:283::1/128") 256 (device "eno1")))) 257 (routes 258 (list (network-route 259 (destination "default") 260 (gateway "147.135.11.254")) 261 (network-route 262 (destination "2604:2dc0:100:2ff:ff:ff:ff:ff/128") 263 (device "eno1") 264 (ipv6? #t) 265 (scope 'link)) 266 (network-route 267 (destination "default") 268 (gateway "2604:2dc0:100:2ff:ff:ff:ff:ff")))) 269 (name-servers '("8.8.8.8" "8.8.4.4" "1.1.1.1"))))) 270 (service nftables-service-type 271 (nftables-configuration 272 (ruleset %nftables-ruleset))) 273 (service minecraft-service-type 274 (minecraft-configuration 275 (properties `(("motd" . "HolyCross SMP - CHADS ONLY") 276 ("level-seed" . "-3181141381111340746") 277 ("difficulty" . "hard") 278 ("allow-flight" . "true") 279 ("white-list" . "true") 280 ("spawn-protection" . "0") 281 ("online-mode" . "true") 282 ("enforce-secure-profile" . "false"))) 283 (mods %mod-list))) 284 (service update-channels-locked-service-type '()) 285 (service nginx-service-type 286 (nginx-configuration 287 (server-blocks 288 (list (nginx-server-configuration 289 (server-name '("monastech.xyz" "www.monastech.xyz")) 290 (listen '("443 ssl")) 291 (root "/var/www/monastech.xyz") 292 (ssl-certificate "/etc/dehydrated/certs/monastech.xyz/fullchain.pem") 293 (ssl-certificate-key "/etc/dehydrated/certs/monastech.xyz/privkey.pem")) 294 (nginx-server-configuration 295 (server-name '("git.monastech.xyz" "www.git.monastech.xyz")) 296 (listen '("443 ssl")) 297 (root "/var/www/git.monastech.xyz") 298 (ssl-certificate "/etc/dehydrated/certs/monastech.xyz/fullchain.pem") 299 (ssl-certificate-key "/etc/dehydrated/certs/monastech.xyz/privkey.pem")) 300 (nginx-server-configuration 301 (server-name '("files.monastech.xyz" "www.files.monastech.xyz")) 302 (listen '("443 ssl")) 303 (root "/var/www/files.monastech.xyz") 304 (ssl-certificate "/etc/dehydrated/certs/monastech.xyz/fullchain.pem") 305 (ssl-certificate-key "/etc/dehydrated/certs/monastech.xyz/privkey.pem")) 306 (nginx-server-configuration 307 (server-name '("loquat.dev" "www.loquat.dev")) 308 (listen '("443 ssl")) 309 (root "/var/www/loquat.dev") 310 (ssl-certificate "/etc/dehydrated/certs/loquat.dev/fullchain.pem") 311 (ssl-certificate-key "/etc/dehydrated/certs/loquat.dev/privkey.pem")) 312 (nginx-server-configuration 313 (server-name '("orthodox.kitchen" "www.orthodox.kitchen")) 314 (listen '("443 ssl")) 315 (root "/var/www/orthodox.kitchen") 316 (ssl-certificate "/etc/dehydrated/certs/orthodox.kitchen/fullchain.pem") 317 (ssl-certificate-key "/etc/dehydrated/certs/orthodox.kitchen/privkey.pem")) 318 (nginx-server-configuration 319 (server-name '("substitutes.monastech.xyz")) 320 (listen '("443 ssl")) 321 (ssl-certificate "/etc/dehydrated/certs/monastech.xyz/fullchain.pem") 322 (ssl-certificate-key "/etc/dehydrated/certs/monastech.xyz/privkey.pem") 323 (locations 324 (list (nginx-location-configuration 325 (uri "/") 326 (body (list "proxy_pass http://127.0.0.1:8080;")))))) 327 ;; Default HTTP server 328 (nginx-server-configuration 329 (server-name '("_")) 330 (listen '("80 default_server")) 331 (root "/var/www/monastech.xyz") 332 (locations 333 (list ;; Serve ACME challenges 334 (nginx-location-configuration 335 (uri "^~ /.well-known/acme-challenge") 336 (body (list "alias /var/www/dehydrated;"))) 337 ;; Redirect to HTTPS 338 (nginx-location-configuration 339 (uri "/") 340 (body (list "return 301 https://$host$request_uri;"))))))))))) 341 (stagit-services 342 (stagit-configuration 343 (admin-pubkey (plain-file 344 "lukejw.pub" 345 "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEZ2qcwpwPdMmrXNrrqjqtuBw8lG9gxlAE+vwcZAHM3L lukejw@moses")) 346 (www-home "/var/www/git.monastech.xyz") 347 (clone-domain "monastech.xyz") 348 (logo (file-append %mt-artwork "/logo-dynamic.svg")) 349 (stylesheet (plain-file "stylesheet.css" "\ 350 :root { 351 --bg: #FFFCF0; 352 --bg-2: #F2F0E5; 353 --ui: #E6E4D9; 354 --ui-2: #DAD8CE; 355 --ui-3: #CECDC3; 356 --tx: #100F0F; 357 --tx-2: #6F6E69; 358 --ye: #AD8301; 359 --ye-2: #D0A215; 360 --cy: #24837B; 361 --cy-2: #3AA99F; 362 } 363 364 @media (prefers-color-scheme: dark) { 365 :root { 366 --bg: #100F0F; 367 --bg-2: #1C1B1A; 368 --ui: #282726; 369 --ui-2: #343331; 370 --ui-3: #403E3C; 371 --tx: #CECDC3; 372 --tx-2: #878580; 373 --ye: #D0A215; 374 --ye-2: #AD8301; 375 --cy: #3AA99F; 376 --cy-2: #24837B; 377 } 378 } 379 380 html { 381 background-color: var(--bg); 382 color: var(--tx); 383 font-family: serif; 384 } 385 386 body { 387 width: 100%; 388 max-width: 72rem; 389 margin-inline: auto; 390 } 391 392 #header { 393 margin-inline: 1rem; 394 } 395 396 hr { 397 border: 0.1rem solid var(--ui); 398 margin-inline: 1rem; 399 } 400 401 #content { 402 margin-inline: 1rem; 403 } 404 405 a { 406 color: var(--cy); 407 text-decoration: none; 408 } 409 410 a:hover { 411 color: var(--cy-2); 412 text-decoration: underline; 413 } 414 415 #header img { 416 width: 6.75rem; 417 height: 4.5rem; 418 } 419 420 #header h1 { 421 margin: 0 0 0.5rem 0; 422 font-size: 2rem; 423 font-weight: normal; 424 border-bottom: 2px solid var(--ui); 425 } 426 427 #header .desc { 428 color: var(--tx-2); 429 } 430 431 #header tbody tr:last-child td { 432 padding-top: 0.4rem; 433 } 434 435 #header .url > td:nth-child(2) { 436 font-family: monospace; 437 padding: 0.2rem 0.6rem; 438 border-radius: 0.5rem; 439 background-color: var(--bg-2); 440 } 441 442 #files tbody { 443 font-family: monospace; 444 } 445 446 #files tbody > tr td:first-child { 447 width: 0; 448 white-space: nowrap; 449 padding-right: 1rem; 450 } 451 452 #content table { 453 width: 100%; 454 border-collapse: collapse; 455 } 456 457 #content td { 458 padding: 1rem; 459 } 460 461 #content tbody tr:hover { 462 background: var(--bg-2); 463 } 464 465 #content td { 466 padding: 0.3rem; 467 } 468 ")))) 469 %mt-bishop-services)))) 470 471 andrew-os