202 lines
4.6 KiB
Markdown
202 lines
4.6 KiB
Markdown
# Building for Raspberry Pi 4 (ARM64)
|
|
|
|
## Quick Start
|
|
|
|
The web-gateway is **fully compatible** with Raspberry Pi 4 running K3s! 🎉
|
|
|
|
### Option 1: Build Multi-Arch Image (Recommended)
|
|
|
|
Build once, run on both x86_64 and ARM64:
|
|
|
|
```bash
|
|
chmod +x build-multiarch.sh
|
|
|
|
# Build and push to Docker Hub
|
|
IMAGE_NAME=yourusername/web-gateway IMAGE_TAG=1.0.0 ./build-multiarch.sh
|
|
|
|
# Or use default (easylinux/web-gateway:latest)
|
|
./build-multiarch.sh
|
|
```
|
|
|
|
### Option 2: Build ARM64 Only
|
|
|
|
Faster if you only need ARM64:
|
|
|
|
```bash
|
|
chmod +x build-arm64.sh
|
|
|
|
# Build for ARM64
|
|
IMAGE_NAME=yourusername/web-gateway IMAGE_TAG=1.0.0 ./build-arm64.sh
|
|
|
|
# Push to registry
|
|
docker push yourusername/web-gateway:1.0.0
|
|
```
|
|
|
|
### Option 3: Build Natively on Raspberry Pi
|
|
|
|
Build directly on your RPi 4 (slower but simpler):
|
|
|
|
```bash
|
|
# On your Raspberry Pi 4
|
|
docker build -t yourusername/web-gateway:1.0.0 .
|
|
docker push yourusername/web-gateway:1.0.0
|
|
```
|
|
|
|
## Deploy to K3s on Raspberry Pi
|
|
|
|
```bash
|
|
# Update values.yaml or use --set
|
|
helm install rdp-web-gateway ./chart/rdp-web-gateway \
|
|
--namespace rdpbroker \
|
|
--create-namespace \
|
|
--set image.repository=yourusername/web-gateway \
|
|
--set image.tag=1.0.0 \
|
|
--set service.type=ClusterIP \
|
|
--set traefik.enabled=true \
|
|
--set traefik.host=rdp.yourdomain.com \
|
|
--set traefik.tls.enabled=true \
|
|
--set traefik.tls.certResolver=letsencrypt
|
|
```
|
|
|
|
## Resource Recommendations for Raspberry Pi 4
|
|
|
|
The default values.yaml may be too high for RPi 4. Use this configuration:
|
|
|
|
```yaml
|
|
# values-rpi4.yaml
|
|
resources:
|
|
limits:
|
|
cpu: 500m # Down from 1000m
|
|
memory: 512Mi # Down from 1Gi
|
|
requests:
|
|
cpu: 100m # Down from 200m
|
|
memory: 128Mi # Down from 256Mi
|
|
|
|
autoscaling:
|
|
enabled: true
|
|
minReplicas: 1 # Down from 2 (save memory)
|
|
maxReplicas: 3 # Down from 10
|
|
targetCPUUtilizationPercentage: 70
|
|
targetMemoryUtilizationPercentage: 80
|
|
|
|
replicaCount: 1 # Start with 1 replica
|
|
```
|
|
|
|
Deploy with adjusted resources:
|
|
|
|
```bash
|
|
helm install rdp-web-gateway ./chart/rdp-web-gateway \
|
|
--namespace rdpbroker \
|
|
-f chart/rdp-web-gateway/examples/traefik-letsencrypt.yaml \
|
|
-f values-rpi4.yaml
|
|
```
|
|
|
|
## Performance Notes
|
|
|
|
- **Node.js Alpine** images are very lightweight (~50MB compressed)
|
|
- **Memory footprint**: ~100-200MB per pod under normal load
|
|
- **CPU usage**: Very low when idle, spikes during RDP streaming
|
|
- **Network**: WebSocket is efficient, ~1-5Mbps per active session
|
|
- **Recommended**: 2-4GB RAM Raspberry Pi 4 can handle 3-5 concurrent sessions
|
|
|
|
## Verify Architecture
|
|
|
|
After building, verify the image supports ARM64:
|
|
|
|
```bash
|
|
docker buildx imagetools inspect yourusername/web-gateway:1.0.0
|
|
```
|
|
|
|
Expected output:
|
|
```
|
|
MediaType: application/vnd.docker.distribution.manifest.list.v2+json
|
|
Digest: sha256:...
|
|
|
|
Manifests:
|
|
Name: linux/amd64
|
|
Digest: sha256:...
|
|
Platform: linux/amd64
|
|
|
|
Name: linux/arm64
|
|
Digest: sha256:...
|
|
Platform: linux/arm64
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Image pull fails on ARM64
|
|
|
|
```bash
|
|
# Check current architecture
|
|
uname -m # Should show: aarch64
|
|
|
|
# Verify image manifest
|
|
docker manifest inspect yourusername/web-gateway:1.0.0 | grep architecture
|
|
```
|
|
|
|
### OOMKilled (Out of Memory)
|
|
|
|
Reduce memory limits or number of replicas:
|
|
|
|
```yaml
|
|
resources:
|
|
limits:
|
|
memory: 256Mi # Lower if needed
|
|
autoscaling:
|
|
minReplicas: 1
|
|
```
|
|
|
|
### Build too slow
|
|
|
|
- Use `build-arm64.sh` instead of `build-multiarch.sh`
|
|
- Build on Raspberry Pi 4 itself (native build)
|
|
- Use GitHub Actions or CI/CD to build multi-arch images
|
|
|
|
## GitHub Actions Example
|
|
|
|
Add `.github/workflows/build.yml`:
|
|
|
|
```yaml
|
|
name: Build Multi-Arch
|
|
|
|
on:
|
|
push:
|
|
tags:
|
|
- 'v*'
|
|
|
|
jobs:
|
|
build:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
|
|
- name: Set up QEMU
|
|
uses: docker/setup-qemu-action@v2
|
|
|
|
- name: Set up Docker Buildx
|
|
uses: docker/setup-buildx-action@v2
|
|
|
|
- name: Login to DockerHub
|
|
uses: docker/login-action@v2
|
|
with:
|
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
|
|
- name: Build and push
|
|
uses: docker/build-push-action@v4
|
|
with:
|
|
context: ./web-gateway
|
|
platforms: linux/amd64,linux/arm64
|
|
push: true
|
|
tags: |
|
|
yourusername/web-gateway:latest
|
|
yourusername/web-gateway:${{ github.ref_name }}
|
|
```
|
|
|
|
## Additional Notes
|
|
|
|
- **K3s on RPi 4**: Works perfectly! K3s is optimized for ARM
|
|
- **Storage**: Use SSD instead of SD card for better I/O performance
|
|
- **Network**: Gigabit Ethernet recommended for RDP streaming
|
|
- **Cooling**: Consider a fan/heatsink for sustained load
|