me like nix
1{ inputs, ... }: {
2 flake.modules.nixos.mira-extras =
3 { pkgs, config, lib, ... }:
4 let
5 bambu-studio =
6 let
7 pname = "bambu-studio";
8 version = "02.05.02.51";
9
10 src = pkgs.fetchurl {
11 url = "https://github.com/bambulab/BambuStudio/releases/download/v${version}/BambuStudio_ubuntu-24.04_v${version}-20260327222803.AppImage";
12 hash = "sha256-tWda80M3cV5hztEoYkZVGabQMgg6pyc/OniPJfghN0Q=";
13 };
14
15 appimage-contents = pkgs.appimageTools.extractType2 {
16 inherit src pname version;
17 };
18
19 wrapped = pkgs.appimageTools.wrapType2 {
20 inherit src pname version;
21
22 profile = ''
23 export SSL_CERT_FILE="${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt"
24 export GIO_MODULE_DIR="${pkgs.glib-networking}/lib/gio/modules/"
25 export __GLX_VENDOR_LIBRARY_NAME=nvidia
26 '';
27
28 extraPkgs =
29 p: with p; [
30 cacert
31 glib
32 glib-networking
33 gst_all_1.gst-plugins-bad
34 gst_all_1.gst-plugins-base
35 gst_all_1.gst-plugins-good
36 webkitgtk_4_1
37 ];
38 };
39 in
40 pkgs.runCommand "bambu-studio-${version}" { } ''
41 mkdir -p $out/bin
42 ln -s ${wrapped}/bin/${pname} $out/bin/bambu-studio
43 ln -s ${wrapped}/bin/${pname} $out/bin/BambuStudio
44
45 mkdir -p $out/share/applications
46 substitute ${appimage-contents}/BambuStudio.desktop $out/share/applications/BambuStudio.desktop \
47 --replace-fail "Exec=AppRun" "Exec=$out/bin/BambuStudio"
48
49 if [ -d ${appimage-contents}/usr/share/icons ]; then
50 cp -r ${appimage-contents}/usr/share/icons $out/share/
51 fi
52 '';
53 in
54 {
55 networking.hostName = "mira";
56
57 # Enable QEMU emulation for aarch64 (for building Pi images)
58 boot.binfmt.emulatedSystems = [ "aarch64-linux" ];
59
60 # Prevent NetworkManager from managing USB Ethernet
61 networking.networkmanager.unmanaged = [ "interface-name:enp0s20f0u4u3" ];
62
63 # Avahi (mDNS discovery)
64 services.avahi = {
65 enable = true;
66 nssmdns4 = true;
67 openFirewall = true;
68 };
69
70 services.copyparty.enable = true;
71
72 # SSH
73 services.openssh = {
74 enable = true;
75 settings = {
76 PasswordAuthentication = false;
77 KbdInteractiveAuthentication = false;
78 PermitRootLogin = "no";
79 AllowUsers = [ "sean" ];
80 };
81 };
82
83 # trmnl-rs server
84 systemd.services.trmnl-rs = {
85 description = "TRMNL Server";
86 wantedBy = [ "multi-user.target" ];
87 wants = [ "network-online.target" ];
88 after = [
89 "network-online.target"
90 "nss-lookup.target"
91 ];
92 serviceConfig = {
93 ExecStart = "${inputs.trmnl-rs.packages.x86_64-linux.default}/bin/server";
94 Restart = "on-failure";
95 RestartSec = 5;
96 DynamicUser = true;
97 StateDirectory = "trmnl-rs";
98 WorkingDirectory = "/var/lib/trmnl-rs";
99 };
100 };
101
102 environment.systemPackages = [
103 pkgs.lm_sensors
104 bambu-studio
105 ];
106
107 # Firewall
108 networking.firewall.allowedTCPPorts = [
109 8096 # jellyfin
110 5055 # jellyseer
111 3000 # vite dev port
112 3001
113 1883 # MQTT for Tasmota devices
114 2300 # trmnl
115 5000 # Frigate web UI
116 8971 # Frigate API
117 config.services.home-assistant.config.http.server_port
118 ];
119 networking.firewall.allowedUDPPorts = [ ];
120
121 system.stateVersion = "25.05";
122 };
123}