Automated Setup
The setup script installs all dependencies, registers the server, and configures systemd services.
Interactive
curl -sSL https://your-control-plane.com/setup.sh | sudo bash
The script prompts for the control plane URL, registration token, and node type.
Non-Interactive
export CONTROL_PLANE_URL=https://your-control-plane.com
export REGISTRATION_TOKEN=your-token
export IS_PROXY=false
curl -sSL $CONTROL_PLANE_URL/setup.sh | sudo bash
What Gets Installed
All Nodes
- WireGuard — encrypted mesh networking
- Podman — container runtime
- BuildKit — container image builds
- Railpack — build plan generation
Proxy Nodes Only
- Traefik — reverse proxy and TLS termination
- CrowdSec — automated threat detection and IP banning
The script also enables IP forwarding and configures firewall rules for ports 80, 443, and 51820 (WireGuard).
Registration
Servers register with the control plane using a one-time token. Generate a token from the web UI, then pass it during the first run.
On registration, the agent:
- Generates an Ed25519 signing key pair and a WireGuard key pair.
- Sends its public keys and IP addresses to the control plane.
- Receives a server ID, WireGuard subnet, and encryption key.
- Saves configuration to
/var/lib/techulus-agent/config.json.
After registration, the token is invalidated. Subsequent runs do not require a token.
Manual Setup
Worker Node
sudo apt update && sudo apt upgrade -y
sudo apt install wireguard wireguard-tools podman git -y
# Install Railpack
curl -sSL https://railpack.com/install.sh | sh
sudo ln -s ~/.railpack/bin/railpack /usr/local/bin/railpack
# Install BuildKit
curl -sSL https://github.com/moby/buildkit/releases/download/v0.26.3/buildkit-v0.26.3.linux-amd64.tar.gz \
| sudo tar -xz -C /usr/local
Proxy Node
Install everything above, plus Traefik:
TRAEFIK_VERSION="v3.2.3"
curl -fsSL "https://github.com/traefik/traefik/releases/download/${TRAEFIK_VERSION}/traefik_${TRAEFIK_VERSION}_linux_amd64.tar.gz" \
-o /tmp/traefik.tar.gz
sudo tar -xzf /tmp/traefik.tar.gz -C /usr/local/bin traefik
rm /tmp/traefik.tar.gz
First Run
Worker node:
sudo ./agent --url <control-plane-url> --token <registration-token>
Proxy node:
sudo ./agent --url <control-plane-url> --token <registration-token> --proxy
Running as a Service
Worker Node
Create /etc/systemd/system/techulus-agent.service:
[Unit]
Description=Techulus Cloud Agent
After=network.target buildkitd.service
[Service]
Type=simple
ExecStart=/usr/local/bin/agent --url <control-plane-url>
Restart=always
RestartSec=5
KillMode=process
[Install]
WantedBy=multi-user.target
Proxy Node
[Unit]
Description=Techulus Cloud Agent
After=network.target traefik.service buildkitd.service
[Service]
Type=simple
ExecStart=/usr/local/bin/agent --url <control-plane-url> --proxy
Restart=always
RestartSec=5
KillMode=process
[Install]
WantedBy=multi-user.target
Enable and start the service:
sudo systemctl daemon-reload
sudo systemctl enable techulus-agent
sudo systemctl start techulus-agent
KillMode=process ensures only the agent process is stopped on restart, not the containers it manages.
Troubleshooting
Agent restart kills containers
Ensure KillMode=process is set in the systemd service file.
Containers stuck in “created” state
This is normal after a restart. The agent detects drift and starts them automatically.
Checking agent logs
sudo journalctl -u techulus-agent -f
Inspecting containers
podman ps -a --format "table {{.Names}}\t{{.State}}\t{{.Labels}}"