aboutsummaryrefslogtreecommitdiff
path: root/post/framework-server.typ
diff options
context:
space:
mode:
authorKumar Damani <me@kumardamani.net>2026-07-29 17:02:57 +0000
committerKumar Damani <me@kumardamani.net>2026-07-29 17:02:57 +0000
commit564ab84af7f69603e3658bce846168f2cfb91249 (patch)
tree1d0082161f294dac2eb1f53e91a9470b5ece236c /post/framework-server.typ
parentf2315a58fdaaa20c9e1300399ea8d528c80e2cc6 (diff)
normalized, and converted all images to webp
Diffstat (limited to 'post/framework-server.typ')
-rw-r--r--post/framework-server.typ74
1 files changed, 37 insertions, 37 deletions
diff --git a/post/framework-server.typ b/post/framework-server.typ
index 4e9d5b6..a8d82a3 100644
--- a/post/framework-server.typ
+++ b/post/framework-server.typ
@@ -11,12 +11,12 @@ How I re-purposed my Framework as a standalone server for my home-lab.
I \#feelsbad for abusing my lowly NAS -
-#img("framework-server/feelsbadman.png", alt: "feelsbadman", width: "150px")
+#img("framework-server/feelsbadman.webp", alt: "feelsbadman", width: "150px")
Its not it's fault that its owner expected it to run Collabora Online while
running all his other services without instantly crashing...
-#fig("framework-server/error.jpg", alt: "meme of error page")
+#fig("framework-server/error.webp", alt: "meme of error page")
Did I learn anything? Basically a NAS should just do NAS things like worry
about storage. Compute should be handled by something else.
@@ -52,14 +52,14 @@ over NFS from my NAS.
I'll setup a dedicated "workstation" VM for those 1%-of-the-time tasks.
-#fig("framework-server/physical.png", alt: "physical architecture image")
+#fig("framework-server/physical.webp", alt: "physical architecture image")
= Prior to starting!
To avoid making the same mistakes I made, do the following *while the mainboard
is still in the laptop chassis!*
-#fig("framework-server/mistakes.jpg", alt: "mistakes meme")
+#fig("framework-server/mistakes.webp", alt: "mistakes meme")
+ *Update your BIOS firmware to at least 3.17.* It is *impossible* to do so
once the battery is un-plugged from the board on older firmwares. I learned
@@ -70,7 +70,7 @@ is still in the laptop chassis!*
+ In your BIOS settings, enable "Standalone operation".
+ In your BIOS settings, under "Boot" enable the option to power-on on
power-attach.
- #fig("framework-server/bios.jpg", alt: "bios image")
+ #fig("framework-server/bios.webp", alt: "bios image")
+ Install Proxmox VE. Since this will require a screen, and keyboard input, you
might as well do it now. See the #link(<hypervisor>)[hypervisor] section
below.
@@ -85,7 +85,7 @@ I'm using my original
#extlink("https://frame.work/ca/en/products/mainboard-11th-gen-intel-core?v=FRANFG000B")[Framework
13] laptop.
-#fig("framework-server/case.jpg", alt: "case image")
+#fig("framework-server/case.webp", alt: "case image")
Its an i7-1165G7 - yes a "mobile" CPU. Am I asking for trouble? We'll see. Its
more than powerful enough for me (for now).
@@ -112,7 +112,7 @@ I opted for the 2.5G
#extlink("https://frame.work/ca/en/products/ethernet-expansion-card")[ethernet
expansion card] from Framework.
-#fig("framework-server/eth.jpg", alt: "framework eth adapter image")
+#fig("framework-server/eth.webp", alt: "framework eth adapter image")
I suppose one could also use a WiFi card, but it makes more sense to go wired
in a 24/7 "on" configuration.
@@ -127,7 +127,7 @@ So I opt for a cheap VPS from
#extlink("https://www.racknerd.com/kvm-vps")[Racknerd]. These are about a \$1/mo
for a public IPv4 IP, and a decent amount of network bandwidth.
-#fig("framework-server/vps.png", alt: "racknerd vps pricing image")
+#fig("framework-server/vps.webp", alt: "racknerd vps pricing image")
== Storage
@@ -139,7 +139,7 @@ I used the 1TB NVME drive I had on my Framework.
_You should have a storage solution (NAS) in place already!_
-#fig("framework-server/nas.jpg", alt: "nas image")
+#fig("framework-server/nas.webp", alt: "nas image")
Setting this up is beyond the scope of this post. You can check out my DIY ZFS
backed NAS setup
@@ -168,7 +168,7 @@ There are also many options for pre-made NAS appliances such as Synology.
Highly recommend a UPS such as
#extlink("https://www.amazon.ca/APC-BE600M1-Back-Uninterrupted-Electronics-Computers/dp/B01FWAZEIU/ref=sr_1_6?crid=28ZH7JP9IYXPU&keywords=ups&qid=1690928556&sprefix=ups%2Caps%2C172&sr=8-6")[this].
-#fig("framework-server/ups.jpg", alt: "ups image")
+#fig("framework-server/ups.webp", alt: "ups image")
Even if you don't care about uptime, *you should care about data integrity*
issues resulting from abrupt power-loss.
@@ -199,7 +199,7 @@ allowing provisioning of VMs, and LXC Containers through code. Neat!
- Under your host (mine's `pve`), under System, Network, create a bridge
`vmbr0` with:
-#fig("framework-server/net1.png", alt: "proxmox net image")
+#fig("framework-server/net1.webp", alt: "proxmox net image")
This will make your Proxmox host available in your home network. *Set this to
something else if you like.*
@@ -211,7 +211,7 @@ something else if you like.*
While you're here, create another bridge `vmbr1` with `VLAN Aware` checked:
-#fig("framework-server/net2.png", alt: "proxmox net image")
+#fig("framework-server/net2.webp", alt: "proxmox net image")
#quote(block: true)[
We are going to create our home-lab network primarily on `vmbr1`. Think of
@@ -238,7 +238,7 @@ _selectively_ routing a segment of my network over a VPN.
Here is what I would like:
-#fig("framework-server/network.png", alt: "network architecture")
+#fig("framework-server/network.webp", alt: "network architecture")
== Goals: 1,2
@@ -253,7 +253,7 @@ Then I decided to try out OpenWRT, and boy am I glad I did.
I gave it two networking interfaces, each `vbmrX` we created earlier:
-#fig("framework-server/pfnet.png", alt: "openwrt bridge image")
+#fig("framework-server/pfnet.webp", alt: "openwrt bridge image")
- `vmbr0` will be used to access our router from the home-network. It will also
be how our router gets access to the internet. Aka. *WAN*.
@@ -267,7 +267,7 @@ I gave it two networking interfaces, each `vbmrX` we created earlier:
I was able to setup a network with a few VLANs:
-#fig("framework-server/wrtnet.png", alt: "openwrt network image")
+#fig("framework-server/wrtnet.webp", alt: "openwrt network image")
#quote(block: true)[
This means that the next time we create a new VM or LXC container, we can
@@ -280,7 +280,7 @@ Few observations:
- The Luci web UI is much more minimal and to the point. The terminology used
for things are more in-line with what I'm familiar with.
- Soon I had the segregation I was looking for thanks to Firewall settings:
- #fig("framework-server/fw1.png", alt: "firewall settings image")
+ #fig("framework-server/fw1.webp", alt: "firewall settings image")
- DHCP, *and* DNS working as expected.
== Goals: 3
@@ -295,24 +295,24 @@ Then I started working on setting up my VPN (Wireguard) remote on my VPS.
- Then I enabled the "DMZ" setting (but *not* "Advanced DMZ" - which is
probably the _real_ DMZ) on my home ISP router settings, and added my OpenWRT
VM to it.
- #fig("framework-server/dmz.png", alt: "dmz image")
+ #fig("framework-server/dmz.webp", alt: "dmz image")
- I also setup a port-forward for the Wireguard port 51820 from my ISP router
settings, to point to my OpenWRT VM's internal port 51820.
- #fig("framework-server/port1.png", alt: "port forward image")
+ #fig("framework-server/port1.webp", alt: "port forward image")
After all that, I started setting up Wireguard on OpenWRT.
- The corresponding OpenWRT package is called `luci-app-wireguard`.
- This will give you the ability to create a Wireguard interface on OpenWRT.
- #fig("framework-server/wg.png", alt: "wg menu image")
+ #fig("framework-server/wg.webp", alt: "wg menu image")
- I followed the following excellent tutorial for setting up the Wireguard
interface, configured to use my VPS as its peer:
#extlink("https://www.youtube.com/watch?v=04q41GEPvKA")[Setting up Wireguard
on OpenWRT]
- Created the new interface and added the firewall settings:
- #fig("framework-server/wrtnet2.png", alt: "openwrt wg ifrace")
- #fig("framework-server/fw2.png", alt: "firewall wg settings image")
+ #fig("framework-server/wrtnet2.webp", alt: "openwrt wg ifrace")
+ #fig("framework-server/fw2.webp", alt: "firewall wg settings image")
- As is, this will mean that *only* LAB will have internet access (using the
Wireguard interface) - which is not what I want. I still want other subnets
@@ -327,18 +327,18 @@ After all that, I started setting up Wireguard on OpenWRT.
Luckily OpenWRT has a way to accomplish exactly this with a package called
`luci-app-pbr`. This will add the PBR setting to your menu:
-#fig("framework-server/pbr.png", alt: "pbr setting image")
+#fig("framework-server/pbr.webp", alt: "pbr setting image")
- I followed the following tutorial:
#extlink("https://www.youtube.com/watch?v=FN2qfxNIs2g")[Setting up PBR on
OpenWRT]
- Set up the rule for my PBR:
- #fig("framework-server/pbr2.png", alt: "pbr rule image")
+ #fig("framework-server/pbr2.webp", alt: "pbr rule image")
- The default interface is set to `wan`, so everything else should behave as
normal:
- #fig("framework-server/pbr1.png", alt: "pbr global gateways image")
+ #fig("framework-server/pbr1.webp", alt: "pbr global gateways image")
However, it did take many trail & error sessions (see the
#link(<pbr-dns-leakage>)[dns leakage issues] section below) to get this working
@@ -351,14 +351,14 @@ When I create a VM/container in my _Lab_ subnet,
- its external IP is that of my VPS
- when it reaches out to the internet, it goes through the Wireguard tunnel
encrypted, to the VPS, and out the VPS's ISP.
- #fig("framework-server/lab.png", alt: "lab flow image")
+ #fig("framework-server/lab.webp", alt: "lab flow image")
When I create a VM/container *not* in my Lab subnet,
- its external IP is the same as my home-network's public IP
- when it reaches out to the internet, it goes through my home ISP (NAT), just
like all other devices on my home-network.
- #fig("framework-server/lan.png", alt: "lan flow image")
+ #fig("framework-server/lan.webp", alt: "lan flow image")
PBR provides quite granular control over this, for example, if you run a Plex
server, it frequently needs to access the `plex.tv` domain. You can choose to
@@ -385,12 +385,12 @@ PostDown = iptables -t nat -D PREROUTING -p tcp -i eth0 --dport 443 -j DNAT --to
Then we also need to setup port-forwards for 80,443 on OpenWRT going to our
Reverse Proxy VM/Container.
-#fig("framework-server/port2.png", alt: "port forwards image")
+#fig("framework-server/port2.webp", alt: "port forwards image")
I just setup a temporary Caddy container in reverse-proxy mode to test this
out.
-#fig("framework-server/rproxy.png", alt: "reverse-proxy setup image")
+#fig("framework-server/rproxy.webp", alt: "reverse-proxy setup image")
Once this works, we can move on to building out our services :)
@@ -435,7 +435,7 @@ lxc.mount.entry: /dev/dri/renderD128 dev/renderD128 none bind,optional,create=fi
Then inside your LXC container do `ls -al /dev/dri/` and you should see some
devices.
-#fig("framework-server/dri.png", alt: "gpu devices image")
+#fig("framework-server/dri.webp", alt: "gpu devices image")
= Issues <issues>
@@ -456,7 +456,7 @@ BIOS update.
So I proceeded to give that a shot from within Proxmox using `fwupmgr`:
-#fig("framework-server/fail.png", alt: "bios up fail image")
+#fig("framework-server/fail.webp", alt: "bios up fail image")
And to my surprise it was complaining about _battery level_? Its not even
connected to the battery...
@@ -471,7 +471,7 @@ being connected.
- So I went ahead and pretty much attached the whole thing back into the laptop
chassis
- Updated to 3.17, and applied "Standalone operation"
- #fig("framework-server/bios2.png", alt: "bios update image")
+ #fig("framework-server/bios2.webp", alt: "bios update image")
- Thankfully, all my connectivity issues have gone away now.
- Framework support service is excellent!
@@ -483,7 +483,7 @@ This one kept me up for many nights. To summarize:
- in a host in the Lab network, doing an `apt update` the first time would
hang, mid-way through
- running it a few times again, would eventually succeed the operation
- #fig("framework-server/wtf.jpg", alt: "wtf meme")
+ #fig("framework-server/wtf.webp", alt: "wtf meme")
Could it be DNS? Could it be PBR? Could it be Wireguard?
@@ -509,20 +509,20 @@ Although my external IP would correctly report to being my VPS one, tests like
#extlink("https://github.com/macvk/dnsleaktest")[this] would show that DNS was
still being sent to my home ISP.
-#fig("framework-server/dns.jpg", alt: "dns meme image")
+#fig("framework-server/dns.webp", alt: "dns meme image")
To fix this, I had to:
- *Un-check* setting default route on the Lab interface.
- #fig("framework-server/fix1.png", alt: "dns fix 1 image")
+ #fig("framework-server/fix1.webp", alt: "dns fix 1 image")
- Explicitly set DHCP DNS settings for my Lab gateway interface to use my VPS's
`wg0` interface IP.
- #fig("framework-server/fix2.png", alt: "dns fix 2 image")
+ #fig("framework-server/fix2.webp", alt: "dns fix 2 image")
- Needed a static route defied for the `wg0` interface targeting the VPN
network via the OpenWRT local IP for `wg0` as a gateway.
- #fig("framework-server/fix3.png", alt: "dns fix 3 image")
+ #fig("framework-server/fix3.webp", alt: "dns fix 3 image")
== pfSense <pfsense>
@@ -551,7 +551,7 @@ so is my NAS as a storage server.
Since switching to this setup, I've observed a dramatic improvement in
responsiveness for all of my services.
-#fig("framework-server/imp.png", alt: "improvement meme image")
+#fig("framework-server/imp.webp", alt: "improvement meme image")
Overall I'm quite pleased with how everything turned out once the appropriate
BIOS was running on the Framework.