Change master node on k3s

Nov 15, 2022

Today, I found myself needing to change the master/leader node on my k3s cluster. Or rather, I found myself needing to enable full-disk encryption on the hard disk attached to the master node. After trying and failing to add luks encryption to one of the worker nodes (it wouldn’t finish booting up after) I ended up starting from scratch with a fresh OS installation on all the workers. I didn’t want to do this on the master since that would have (maybe?) forced me to start my cluster from scratch.

If you’re running an HA cluster, you can create a new node, add it to the control plane, and then remove the old master node. I’m running a single-master cluster, so that option was out. The way I ended up achieving this result was by following this sequence of steps:

  1. Attach a new hard disk to the master node
  2. Boot from a live cd and install a fresh copy of the OS to the new hard disk, this time with full-disk encryption
  3. Boot into the new OS
  4. Mount the old hard disk
  5. Copy over the following files and folders from the old disk to the new one:
    1. The k3s binary, usually at /usr/local/bin/k3s
    2. /etc/rancher
    3. /var/lib/rancher
    4. /etc/systemd/system/k3s.service
  6. Once all of the above are copied over, enable and start the service with:
    sudo systemctl enable k3s
    sudo systemctl start k3s
    
  7. Shutdown and remove the old hard disk
  8. Boot up the master node

With this, your cluster should be up and running once more. While I followed these steps for changing the hard disk, if you want to additionally change the node too, just make sure that the new master node has the same hostname and IP address as the old master node.

Postgresql Ingress using Traefik Kubernetes K3s

Jul 4, 2022

I found it rather tricky to set up a Traefik TCP ingress for connecting directly to a PostgreSQL server running inside Kubernetes. There are a few moving parts, and they all need to be right for the ingress to work, but most resources I found on the internet left out one (or more), so here they all are in one place. While I’ve only tried this with PostgreSQL, it’s likely that other database ingresses will work the same way.

Traefik values.yaml

Two additions are needed:

  • We need to add an entryPoint for the port that PostgreSQL listens on so that it will route traffic entering on that port
  • We need to expose that port from the control node so that clients can actually connect to it
additionalArguments:
  - "--entryPoints.postgresql.address=:5432/tcp"
ports:
  postgresql:
    expose: true
    port: 5432
    exposedPort: 5432
    protocol: TCP

On k3s, Traefik is installed in the kube-system namespace via Helm, so if you use Helm to modify the values above, make sure you use the same namespace. I didn’t want to risk changing whatever values Rancher had used by default, so I specified the full set:

rbac:
  enabled: true
ports:
  websecure:
    tls:
      enabled: true
podAnnotations:
  prometheus.io/port: "8082"
  prometheus.io/scrape: "true"
providers:
  kubernetesIngress:
    publishedService:
      enabled: true
priorityClassName: "system-cluster-critical"
image:
  name: "rancher/mirrored-library-traefik"
  tag: "2.6.2"
tolerations:
- key: "CriticalAddonsOnly"
  operator: "Exists"
- key: "node-role.kubernetes.io/control-plane"
  operator: "Exists"
  effect: "NoSchedule"
- key: "node-role.kubernetes.io/master"
  operator: "Exists"
  effect: "NoSchedule"
service:
  ipFamilyPolicy: "PreferDualStack"

I used Terraform to install the Helm release, but if you use the CLI, run:

helm repo add traefik https://helm.traefik.io/traefik
helm repo update
helm upgrade --install traefik traefik/traefik \
  -n kube-system -f values.yaml

Traefik Ingress

  • The HostSNI needs to match *, apparently most database protocols - and especially PostgreSQL - don’t support SNI over TLS. Additionally, TLS needs to be disabled since the protocol used by the client and server use their own TLS, so Ingress doesn’t need to handle or terminate it. That’s why there needs to be no tls section in the spec.
  • The namespace needs to be the same as the one in which you installed PostgreSQL and its service.
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteTCP
metadata:
  name: postgresql-ingress
  namespace: postgresql
spec:
  entryPoints:
    - postgresql
  routes:
    match: HostSNI(`*`)
    services:
      - name: postgresql
        port: 5432

With both sets of changes, you should be able to connect to the PostgreSQL instance on port 5432 of your control node’s IP, or any hostname that resolves to that IP. If you want to run other databases and expose them on the same host, they’ll need to listen on a different port.

K2 Build Log Part Eleven: Drive Tests

Apr 21, 2022

In the last part, we wired up the backpack and all drives. Now, you might be tempted to keep building and - say - wire the toolhead. If so, you may skip to the next part of this build log. However, I would strongly recommend taking a break to turn on your printer and verify both the assembly as well as your wiring. You’d be surprised at the issues you find, ranging from something as simple as the wrong motor being wired, to the Z drives being upside down (yes, the latter happened to me). In fact, after this section I recommend iteratively testing each time you wire up something new to your printer: bed heater, thermistor, extruder etc.

In order to actually run your printer and do this testing, you’re going to need firmware. The most logical (and the only officially supported) choice is Klipper. There are two popular “frameworks” that bundle Klipper, Moonraker (a Web Server for Klipper) and their own UI: Fluidd and Mainsail. I ran Mainsail for a while until I ran into a number of performance issues. The devs weren’t very receptive, so I switched to Fluidd and have been using that on all my printers ever since. I believe the performance issues with Mainsail have been resolved, so you can pick either one. Both have excellent installation instructions, I recommend you follow those till you get to the point where you need to upload a printer config file.

The K2 repository comes with Klipper configs for three supported combinations of controllers. However, those configs are meant to be used when everything in your printer is fully wired up. At this stage, we don’t have any thermistors connected, and using one of those configs will cause Klipper to stop at bootup since the temperatures for the missing thermistors will be outside the allowed range. Additionally, those configs use a Klipper module for dockable probes, and that module does a Z hop at the start of homing. Since we don’t know whether our Z drives work yet, it’s unsafe to do Z hops. Plus, that module assumes that you have a probe wired up, and we don’t have that. As such, I took the config for Spider and BTT Expander and made the following changes:

  • Removed the use of the dockable probe module
  • Added a homing_override that homes X and Y and pretends that Z is already homed
  • Increased the range of thermistor temperatures.

You can use my config, or you can download the official config file and make the same set of changes there. Whichever option you choose, read the entire config file and make changes to X, Y and Z coordinates as needed based on the size of your printer.

⚠️ As before, use my config file at your own risk. I accept no responsibility for any damage that might be caused as a result of using this config.

Once you have your desired config in place, restart the firmware and verify that your UI loads up correctly, with negative temperatures being shown for the bed and extruder. If you run into issues, ask for help on the Annex or Klipper discord servers. Once everything’s up and running, let’s start our testing.

Buzzing the motors

A motor “buzz” is functionality that Klipper provides to ensure that your motor is wired up correctly. The command is:

STEPPER_BUZZ STEPPER=<stepper name>

For example, the front left X stepper can be buzzed with

STEPPER_BUZZ STEPPER=stepper_x

When you issue the buzz command, klipper will move the motor back and forth 10 times - first in the positive direction, then in the negative direction. For X, you’ll see the corresponding end of the Y cross extrusion move first to the right, then back to the left. For Y, you’ll see the X cross extrusion move first to the back, then to the front. And for Z, you’ll see that bed corner move first down, then up. Buzz all eight motors:

  1. stepper_x
  2. stepper_x1
  3. stepper_y
  4. stepper_y1
  5. stepper_z
  6. stepper_z1
  7. stepper_z2
  8. stepper_z3

Here are some issues you might encounter at this stage:

Nothing happens

Verify that your motor is actually wired up to the controller, that a stepper driver is plugged in, and that the right ports are in the config file. If all of the above are valid, and you have another motor that buzzes correctly, try swapping slots: the slot for this motor might be faulty. If that’s the case, you’ll need to either use a different free slot or replace the controller.

Motor makes a weird noise and doesn’t move

Verify that the port mappings are correct in the config file. Also verify - by looking at the spec sheet for your motor - that you have wired up the right pairs together. Motors come with four wires, internally they are two pairs of two wires each. If you mixed up the pairs while wiring, the motor will not work. Config that the order of your wires matches the spec sheet.

A different motor moves

Either swap the wires with the motor that moved, or change the ports in your config file

Motor moves in the wrong direction

Flip the dir pin for that stepper in your config file with a !. For example, PA0 will be flipped as !PA0 and vice versa.

Z drive motor makes a clicking, banging or knocking sound

I ran into this on all four Z drives. Verify that the worm gear is meshed correctly with the wheel on the shaft. Verify that the motor is sitting high enough that the set screw on the worm isn’t touching the wheel. And verify that the fat printed part with a T on it is the top half of the drive. A slight knocking sound seems okay, we’ll test the Z drives further in a latter section in this post.

Home X and Y

If you’re not using my config file, make sure that you haven’t downloaded the dockable probe module to klippyer/klippy/extras and confirm that you have a homing_override section in your config. We’re about to move things under power for the first time, and we need a way to quickly kill Klipper if something goes wrong. Both Mainsail and Fluidd come with Emergency Stop (henceforth referred to as EStop) buttons in their UI. I don’t know what Mainsail’s looks like, but for Fluidd it’s a red circle with an exclamation mark inside it. In desktop mode, it’s in the top right corner; on phones, it’s in the bottom left corner. Familiarize yourself with its location, be ready to press it, and click on the Home icon.

Ideally, your toolhead will move to the left until the X carts hit the drives, and stop. Then, the toolhead will move towards the front of the printer till the Y carts hit the drives, and stop. With my config, the toolhead will then move to the middle of your print volume, and stop.

  • If you find that the toolhead stops before reaching either the extreme left or the extreme front of the printer, reduce the driver_SGTHRS for the corresponding steppers in the printer config, restart and try again
  • If you find that the toolhead gets to the end of its path and then vibrates instead of stopping right away, increase the driver_SGTHRS for the corresponding steppers in the printer config, restart and try again

Ideally, you should hear a mild thunk, but not a loud one. Tuning the thresholds is important - if they’re too high, your printer might think it’s homed without actually reaching X0 or Y0, causing a crash later. If they’re too low, your printer might vibrate itself and damage the printed parts or rails.

Once you get to the point where X and Y both home reliably, move the drive to the middle of your print volume. Push the toolhead against the X cross rail cart till you feel it lying flat against the cart, and tighten the four bolts attaching the toolhead to the cart. Repeat the process for the Y cross rail cart and the four corresponding bolts. You can then place your extruder onto the toolhead and bolt it in. For the Sherpa Mini, that’s 2x M3x12 BHCS on the sides, and 1x M3x10 SHCS at the front.

Force moves for Z

Unfortunately, I discovered that successful buzzing doesn’t guarantee correct functioning for the Z drives. So, we’re going to use force moves. Since contortion is bad for the bed and the bed frame, remove the four shoulder bolts holding the bed frame to the Z joints, and remove the frame from your printer. Now, we’re going to move each Z drive 10 mm at a time at a very slow speed, and listen to how it sounds. The command to do this is:

FORCE_MOVE STEPPER=<stepper_name> DISTANCE=10 VELOCITY=5

Distance and velocity are both in mm. Ideally, you should see the Z joint move down 10mm, and the Z drive should sound smooth. As before, if you hear any knocking, clicking or banging sounds, adjust the worm gear meshing and verify the motor height. If your mesh is fine and the drive is built correctly, but the worm gear looks low, you might have to add shims between the motor and the printed part to raise the height of your worm and motor relative to the rest of the drive. If you encounter this issue, I recommend asking for help on the Annex discord server before adding any shims.

Repeat this process for all four Z drives, and you’re done with this part of testing. In the next post, we’ll wire up the toolhead and bed, LEDs if you have them, and test them all too.

K2 Build Log Part Ten: Wiring Part One

Apr 7, 2022

⚠️ DISCLAIMER - Incorrect wiring can pose a serious health risk. The instructions in this post are my effort to be helpful, but they should not be taken as expert device. I accept no responsibility for any damages you might experience by following these instructions.

You could choose to finish all wiring before turning on your printer. I recommend that you not do this, and instead test things incrementally. I chose to keep my printer powered off while wiring things, and then would turn it on to test each new thing that was wired up. I also took a break once all my gantry and Z motors were wired up, and buzzed them to verify my wiring and their directions. As such, I’ve split up wiring into two parts, with an intermission in the middle for motor testing.

Mains inlet and rocker switch

Make sure you use wires of a sufficient gauge. I used 18 awg for all wires connected to AC or 24V DC.

Crimp insulated spade connectors onto wires and connect the L and N plugs of the inlet to the rocker switch. It’s important that you connect them to the plugs in the lower half of the switch as shown in the picture below.

Wires connecting the mains inlet and rocker switch

Connect the plugs in the upper half of the switch and the ground plug to the mains WAGOs. Important things to note here:

  • Be consistent with colors. I picked White for Live/Load, Black for Neutral, and Green for Ground. Note the colors of wires coming into the rocker switch and exiting it.
  • I was told on the Annex discord that AC works by detecting the difference between input signals, so there’s no real “Live” or “Neutral”. As such, treat all mains wires as being LIVE.
  • Strip about 1 inch off wires that go into WAGO terminals. As far as I know, it is recommended that you not twist the strands before inserting them into the terminals.
Wires connecting the mains inlet to the WAGOS

UHP PSU input wiring

The UHP PSU I bought does not have an input voltage selector. Check if yours has an input selector switch, and choose the right input voltage if it does.

The BOM has two different kinds of fork spade terminals. Pick the kind that fits your terminals. I had to use the ones on the right for UHP inputs and the ones on the left for UHP outputs.

Two kinds of fork spade terminals

Connect L, N and G wires from the mains WAGOs to the UHP power supply.

Wires connected from main WAGOs to the UHP inputs

Place the terminal cover on.

Wires connected from main WAGOs to the UHP inputs, close-up

Double-check all of your wiring so far and then power on the printer. Verify that the green light on the power supply turns on.

UHP power supply powered on

Turn the printer off before proceeding.

RS input wiring

Connect L, N and G wires from the mains WAGOs to the RS power supply.

Wires connected from main WAGOs to the RS inputs

SSR input wiring (partial)

Connect L to terminal 1 of your SSR. Terminal 2 will be connected to the bed later.

Wire connected from main WAGOs to the SSR

Controllers DC input wiring

Connect wires from the UHP PSU outputs to the 24V WAGOs. Connect wires from the 24V WAGOs to your controllers (and expander if you have one). Refer to the labels on your controllers and ensure you’re connecting + to + and - to -. Use Ferrule connectors for the ends going into the controllers.

DC inputs connected to controller and expander

Double-check all of your wiring so far and then power on the printer. Verify that the controller and expander power on.

Controller and expander powered on

Turn the printer off. Connect ribbon cables from your controller to your expander. For a Spider v1, I had to connect EXP2 to EXP1 and vice versa, and I had to connect them upside down at the expander end. You should check the pinout for your controller and expander to determine whether swapping and/or flipping is necessary for you.

Controller and expander connected by flat expansion cables

Pi input wiring

Connect a micro USB cable to the input of your Pi, determine how long it needs to be in order to reach the output terminals of your RS PSU, and cut it at the right length. If you have fork spade terminals that are the right size, you can crimp the ends. I didn’t have small enough spade terminals, so I just stripped the insulation and screwed the bare wires into the RS PSU’s output terminals.

As before, double-check all wiring and power on the printer. Verify that the Pi powers on, and then turn the printer off.

Pi powered on

Ignore the green wire bolted to the extrusion in the above picture. I had grounded that extrusion, but then realized that I didn’t have enough ground WAGO terminals left to ground the main printer frame and the bed, and grounding those is paramount, so I took it off later. Connect your controller(s) to the Pi using USB cables. The expander doesn’t need to be connected to the Pi, it communicates instead with the controller that it expands.

Motor wiring

Here’s an overview of how the motors are named in the klipper config and where they’re all located relative to the front of your printer. This is a top-down view:

Motor wiring overview

And the motors are connected to the following ports on a Spider v1.0 controller board:

Motor X  - Controller X
Motor Y  - Controller Y
Motor X1 - Controller Z1
Motor Y1 - Controller E0
Motor Z  - Controller E1
Motor Z1 - Controller E2
Motor Z2 - Controller E3
Motor Z3 - Controller E4

If you intend to use the printed cable channels, install them now. Let’s get started with the motors, I started with Y1 and Z4. Strip a few inches of insulation off your multi-conductor cable. I’m using a 4-pair cable here.

Multi conductor cable with a few inches of insulator

Feed it in from the front of the printer through the left grommet, and figure out how much slack you need. Crimp JST connectors on to four wires and insert them into a connector, keeping cables from a pair adjacent to each other. Plug the connector into the E0 port of your Spider v1.0 (or whatever the correct port is for your controller).

Wires plugged into E0 of Spider v1.0 controller

The remaining four wires will go into a connector that plugs into E4, so position them accordingly and snip off any excess. Crimp and plug in.

Wires plugged into Z3 of Spider v1.0 controller

For the other end of the cable, run it down the side vertical extrusion and through the printed cable channels next to the Z drives on the side horizontal gantry exrtusion.

Cable path for Z3 and Y1 motors

Figure out how long you want it to be (I terminated mine shortly past the front right cable channel, in the front right corner of the gantry) and snip it there. Crimp all eight wires and insert four into one connector, giving you two connectors. Ensure that the Z3 wires go into one connector and the Y1 wires go into the other. Also ensure that the order of the wires matches at both connectors: Microfit 3 and JST. For example, if you have the wires plugged into Z3 on your controller in the order Red-Blue-White-Brown, ensure that you insert them in the same order into your Microfit connector.

4 pair cable with connectors

Now, snip your Y1 and Z3 motor wires to an appropriate length so that they’ll plug into the connectors you just made with a minimum of slack. Crimp them and add mating connectors.

Y1 and Z3 motor wires with connectors

Plug in the connectors, once again paying attention to which is which. I used printed cable clips to hold the wires in place.

Y1 and Z3 motors connected and wires held in place with clips

Repeat this for the X1 and Z2 motors. Connect to Z1 and E3 on your Spider.

X1 and Z2 motor wires plugged into Z1 and E3 of Spider v1.0 controller

I terminated the 4-pair cable in the back right corner. As before, attach connectors, snip motor wires at the appropriate length and attach mating connectors, connect them.

X1 and Z2 motor wires connected to the cable

And then use printed clips to hold them in place if desired.

X1 and Z2 motor wires attached to extrusion using printed clips

Repeat the process on the front left X and Z motors, connect them to X and E1 on the controller:

X and Z motor wires plugged into X and E1 of Spider v1.0 controller

Connect the motors and use printed clips

X and Z motor wires connected to extrusion using printed clips

And lastly, the Y and Z1 motors in the back left, connected to Y and E2 on the controller:

Y and Z1 motor wires plugged into Y and E2 of Spider v1.0 controller

Connect the motors and use printed clips.

Y and Z1 motor wires connected to the cable

And that’s the motors all wired. Before wiring up the toolhead, we’re going to take a break to verify our wiring, and home X and Y so that we can fasten the bolts attaching the toolhead carriage to the cross rail carriages. We’ll get to that in the next part of the build log.

K2 Build Log Part Nine: Backpack

Apr 6, 2022

Take a look at the eDrawing to see where everything goes inside the backpack.

Mounts

Let’s get all the mounts attached first.

UHP power supply

Insert 1x M3 tall heatset insert into each mount as shown below

First heatset insert installed into uhp mounts

Hold your power supply next to a mount to figure out which of the two adjacent holes the second heatset insert needs to go into.

Figuring out hole for second uhp mount heatset insert

Put the heatset insert into the correct second hole.

Second heatset insert installed into uhp mount

Use 4x M3x10 SHCS to attach both mounts to the power supply. Mind the orientation of the power supply, I oriented mine such that the input was on the left and output on the right with mounts pointing up. I originally had it oriented with the input on the right and fixed it later, so don’t get confused if the orientation looks different in later pictures.

Mounts attached to the power supply

Bolt the mounts to a backpack extrusion using 2x M5x10 BHCS on the top

Mounts attached to the extrusion at the top

and two on the side

Mounts attached to the extrusion at the side

RS power supply

Attach the mounts to the power supply using 2x M3x8 SHCS.

Mounts attached to RS power supply

Attach the mounts to the extrusion using 2x M5x10 BHCS on the top

Mounts attached to the extrusion at the top

and two on the side

Mounts attached to the extrusion at the side

SSR

Attach the SSR to the extrusion using 2x M3x8 SHCS. Mind the orientation.

SSR attached to the extrusion

WAGOs

Let’s prepare the WAGO mounts. Place the WAGO mount in place

WAGO mount placed in the slot in the 24V mount

And slide it in. It should click into place.

WAGO mounts slid into the slots in the 24V mount

Repeat for the other WAGO in this mount and the WAGOs in the other mount.

WAGO mounts slid into the slots in the 120V mount

Attach the 24V WAGO mount to the extrusion using 2x M5x10 BHCS.

24V WAGO mount attached to the extrusion

Attach the 120V WAGO mount to the extrusion using 2x M5x10 BHCS.

120V WAGO mount attached to the extrusion

Raspberry Pi

The controller mounts are assembled identical to the Raspberry Pi mounts, so I’ll explain it here and not repeat the instructions for the other controllers.

Note - Specifically for the Pi mount, you might have to shave a bit off of the corner in the picture below. On my Raspberry Pi 3B+, that corner overlapped with one of the components soldered to the board. You’ll find out whether you need to shave yours once you’ve assembled both mounts and aligned your Pi on them.

Corner shaved off one of the accent pieces

Place the accent pieces on the slots.

Mount accent pieces placed in place on the mounts

Twist the accent pieces, they’ll get locked into the slot and can be slid back and forth in the slot.

Mount accent pieces twisted in their slots

Place the top half of the heatsink onto the Pi, place the Pi on top of the mounts, and bolt it in using 4x M2.5x16 SHCS.

Pi attached to the mounts

Attach the Pi mounts to the extrusion. You’ll have to use a long hex driver and a lot of patience. I don’t have pictures of this because I attached mine after mounting the extrusion to the back panel.

Controller

Insert 2x Tall M3 inserts into the main mounts, and 2x Tall M3 inserts into the accent pieces.

Heatset inserts in the controller mounts

Insert the accent pieces and twist as before.

Accent pieces inserted into controller mounts

Slide the accent pieces to the ends of their slots and attach the controller to the accent pieces using 2x M3x8 SHCS. Attach the mounts to the extrusion using 2x M5x8 BHCS.

Controller attached to extrusion for alignment

Slide the controller up and into place, and attach it to the main pieces using 2x M3x8 SHCS.

Controller completely attached to the extrusion

Repeat this process for the expander board. Insert your USB cable into the main controller to make sure that you leave enough room between it and the expander board.

Controller and expander attached to the extrusion with enough space between them

Corners

Insert 6x M5 heatset inserts into these holes:

M5 heatset inserts for backpack corners

Insert 1x M3 tall heatset insert into the remaining hole:

M3 heatset inserts for backpack corners

Attach the corners to the back panel with 2x M5x10 BHCS each.

Backpack corners attached to back panel

Installing the back panel

Note I did this backwards during my build and attached the electronics-mounting extrusions to the panel before attaching the panel to the printer, so the following pictures will have the extrusions already installed. Just ignore that part and focus on the panel. I thought about the entire process while I was writing this build log, and I believe that you’ll have an easier time if you install the panel first, so that’s how I’m structuring this post.

I wanted my back panel to be held in using roll-in nuts, but starting off the installation with roll-ins is hard because it’s a heavy panel, and holding it in place with one hand while adjusting roll-ins with the other is cumbersome. I recommend you start with hammer head nuts, and then - if desired - you can switch to roll-ins later, once the panel is partially attached to the frame.

Close up of a hammer head nut

Place spacers along the top and bottom sides and insert 4x M5x10 BHCS bolts through the panel and spacers into hammer head nuts. If you plan to use hammer heads long term for the back panel (as opposed to switching them out with roll-ins) then put the side spacers as well as all required bolts at this stage.

Back panel with top and bottom spacers held together with hammer head nuts and M5 bolts

Insert the nut side of the panel into the back face of your printer, secure the top and bottom sides by tightening the bolts. Start inserting roll-in nuts into the left and right vertical extrusions and position them by gently flexing the back panel. You won’t be able to roll them past the through holes made into the extrusions at gantry height, so the lower ones will have to be inserted at the bottom of the printer.

Positioning roll-in nuts for side extrusions by flexing the back panel

Insert the spacers and use M5x10 BHCS to secure the sides, and then you can remove the top and bottom bolts and nuts, place roll-ins in and replace the bolts. Positioning the roll-ins is similar to the previous step, you’ll have to gently flex the panel.

Positioning roll-in nuts for top and bottom extrusions by flexing the back panel

Installing the extrusions

Note - Ignore the square black printed pieces you see on my panels in the following pictures. The backpanel DXF changed after I’d placed an order for my panels, so mine came with holes that overlap with motor locations. I drilled holes at the right locations, and printed pieces to plug the faulty holes, those printed pieces are what you’ll see in my pictures.

I recommend using hammer head nuts instead of roll-ins for this. You’ll have a really hard time positioning roll-ins correctly. Insert 4x M5x8 BHCS (eDrawing says M5x10 while I’m writing this, and it’s incorrect) through the back panel and lightly screw hammer head nuts onto them.

Bolts and hammer head nuts through back panel

Slide one of the electronics-mounting extrusions onto the nuts.

First electronics extrusion attached to back panel

Position it so that the ends don’t stick past the corners. Tighten the bolts.

Close up of one end of the just-installed extrusion

Install the second one in an identical fashion.

Second electronics extrusion attached to back panel

Your panel should already be on the frame if you followed my advice and did that first. If you didn’t, go follow the advice in the last section to install your panel.

Backpack attached to back panel

Grommets

Insert the grommets into the back panel. The hex side should be inside the backpack

Grommets inserted into the back panel

Screw in the other halves of the grommets

Other halves screwed onto grommets

Power inlet

Insert 2x M3 tall heatset inserts into the printed part.

Heatset inserts installed into power panel

Insert the power inlet and rocker switch into the panel.

Power inlet and rocker switch inserted into the panel, rear view

Use 2x M3 tapping screws to attach the plug to the panel. Pop the fuse holder out, I used a flat head screw driver to lever it out.

Fuse holder removed from the power inlet

Put two fuses into the fuse holder and pop it back into the power inlet.

Fuse holder with fuses inserted

Blanking plates

By default, the side panel with the power inlet has two blanking plates. You can substitute either with a plate of your choice. I substituted one with a plate that has space for an hour counter, a keystone jack and a bowden inlet. It’s this mod with some added holes so that I can screw the hour counter in. Insert 4x M3 Tall heatset inserts into each plate

Heatset inserts installed into electronics blanking plates

Populate the plate(s) if applicable

Hour counter and keystone jack inserted into blanking plate

Installing the side panels

Attach the power inlet plate and blanking plates to the laser cut side panel piece using 4x M3x10 SHCS each on the inside, then attach the panel to the corners using 4x M5x10 BHCS.

Side panel with power inlet installed on backpack

Should you choose to, you can also install the other three side panels at this time. However, I recommend doing that after you’re done with wiring. I broke a chunk out of one of my side panels by accidentally smacking it with wire strippers.

Other side panels installed on back