# PXE Server Quick Start Guide

This is a condensed guide for getting the PXE boot server running quickly.

## Prerequisites

- NixOS server
- Root access
- Network connectivity to bare-metal servers

## 5-Minute Setup

### 1. Run Setup Script

```bash
cd baremetal/pxe-server
sudo ./setup.sh --install --download --validate
```

### 2. Configure NixOS

Add to `/etc/nixos/configuration.nix`:

```nix
imports = [ /path/to/baremetal/pxe-server/nixos-module.nix ];

services.centra-pxe-server = {
  enable = true;
  interface = "eth0";               # YOUR NETWORK INTERFACE
  serverAddress = "10.0.100.10";   # YOUR PXE SERVER IP

  dhcp = {
    subnet = "10.0.100.0";         # YOUR SUBNET
    netmask = "255.255.255.0";
    broadcast = "10.0.100.255";
    range = {
      start = "10.0.100.100";      # DHCP RANGE START
      end = "10.0.100.200";        # DHCP RANGE END
    };
    router = "10.0.100.1";         # YOUR GATEWAY
  };
};
```

### 3. Deploy

```bash
sudo nixos-rebuild switch
```

### 4. Verify

```bash
sudo ./setup.sh --test
```

You should see:
- TFTP server running
- HTTP server running
- DHCP server running

### 5. Boot a Server

1. Configure server BIOS for PXE boot
2. Connect to same network
3. Power on
4. Watch for boot menu

## Adding Nodes

### Quick Add (No Auto-Selection)

Just boot the server and select profile from menu.

### With Auto-Selection

1. Get MAC address from server
2. Edit `ipxe/boot.ipxe`, add line:
   ```ipxe
   iseq ${mac} AA:BB:CC:DD:EE:FF && set profile worker && set hostname worker-05 && goto boot ||
   ```
3. Optionally add to `dhcp/dhcpd.conf`:
   ```conf
   host worker-05 {
       hardware ethernet AA:BB:CC:DD:EE:FF;
       fixed-address 10.0.100.65;
       option host-name "worker-05";
   }
   ```
4. Restart DHCP: `sudo systemctl restart dhcpd4`

## Troubleshooting

### Server doesn't get IP

```bash
sudo tcpdump -i eth0 port 67 or port 68
sudo journalctl -u dhcpd4 -f
```

Check:
- DHCP server running on correct interface
- Network connectivity
- Firewall allows UDP 67/68

### Server gets IP but no bootloader

```bash
sudo tcpdump -i eth0 port 69
sudo journalctl -u atftpd -f
```

Check:
- TFTP server running
- Bootloaders exist: `ls /var/lib/tftpboot/`
- Firewall allows UDP 69

### iPXE loads but can't get boot script

```bash
curl http://localhost/boot/ipxe/boot.ipxe
sudo tail -f /var/log/nginx/access.log
```

Check:
- Nginx running
- boot.ipxe exists: `ls /var/lib/pxe-boot/ipxe/`
- Firewall allows TCP 80

### Boot script loads but can't get kernel

This is expected until T032.S3 (Image Builder) is complete.

Check: `ls /var/lib/pxe-boot/nixos/`

Should have:
- bzImage
- initrd

These will be generated by the image builder.

## Common Commands

```bash
# Check all services
sudo systemctl status dhcpd4 atftpd nginx

# View logs
sudo journalctl -u dhcpd4 -u atftpd -u nginx -f

# Test connectivity
curl http://localhost/health
tftp localhost -c get undionly.kpxe /tmp/test.kpxe

# Restart services
sudo systemctl restart dhcpd4 atftpd nginx

# Check firewall
sudo iptables -L -n | grep -E "67|68|69|80"
```

## Boot Profiles

- **control-plane**: All services (FlareDB, IAM, PlasmaVMC, K8sHost, etc.)
- **worker**: Compute services (K8sHost, PlasmaVMC, ChainFire)
- **all-in-one**: Everything on one node (testing/homelab)

## Next Steps

- Add more nodes (see "Adding Nodes" above)
- Wait for T032.S3 to generate NixOS boot images
- Configure monitoring for boot activity
- Set up DHCP relay for multi-segment networks

## Full Documentation

See [README.md](README.md) for complete documentation.
