Bare Metal
Get the Binary
Section titled “Get the Binary”Download the latest release from GitHub:
curl -L -o containment-chamber \ https://github.com/unforeseen-consequences/containment-chamber/releases/latest/download/containment-chamber-linux-amd64
chmod +x containment-chamberBinaries are available for linux-amd64 and linux-arm64.
Build an optimized production binary:
just build-maxperfThe binary is at target/maxperf/containment-chamber. It is statically linked — no runtime dependencies required.
cp target/maxperf/containment-chamber .Create a System User
Section titled “Create a System User”Create a dedicated unprivileged user with no home directory and no login shell:
sudo useradd --system --no-create-home --shell /usr/sbin/nologin containment-chamberInstall Binary and Config
Section titled “Install Binary and Config”# Install the binarysudo install -m 755 containment-chamber /usr/local/bin/
# Create directoriessudo mkdir -p /etc/containment-chamber /var/lib/containment-chamber/keystores
# Install config filesudo cp config.yaml /etc/containment-chamber/config.yamlsudo chmod 600 /etc/containment-chamber/config.yaml
# Set ownershipsudo chown -R containment-chamber:containment-chamber \ /etc/containment-chamber \ /var/lib/containment-chamberCopy your validator keystores into /var/lib/containment-chamber/keystores/ and update the key_sources.filesystem.paths in your config:
server: listen_address: "0.0.0.0" listen_port: 9000
metrics: listen_address: "0.0.0.0" listen_port: 3000
network: mainnet
key_sources: filesystem: paths: - /var/lib/containment-chamber/keystores
antislashing: backend: postgres url: "postgresql://user:password@localhost:5432/slashing"systemd Service Unit
Section titled “systemd Service Unit”Create /etc/systemd/system/containment-chamber.service:
[Unit]Description=Containment Chamber — Ethereum Remote SignerAfter=network-online.targetWants=network-online.target
[Service]Type=simpleUser=containment-chamberGroup=containment-chamberExecStart=/usr/local/bin/containment-chamber -c /etc/containment-chamber/config.yamlRestart=on-failureRestartSec=5s
# Security hardeningNoNewPrivileges=yesProtectSystem=strictProtectHome=yesPrivateTmp=yesReadOnlyPaths=/ReadWritePaths=/var/lib/containment-chamber
[Install]WantedBy=multi-user.targetEnable and Start
Section titled “Enable and Start”sudo systemctl daemon-reloadsudo systemctl enable containment-chambersudo systemctl start containment-chambersudo systemctl status containment-chamber# Follow logsjournalctl -u containment-chamber -f
# Last 100 linesjournalctl -u containment-chamber -n 100
# Since last bootjournalctl -u containment-chamber -bVerify
Section titled “Verify”# Health checkcurl http://localhost:9000/upcheck
# List loaded keyscurl http://localhost:9000/api/v1/eth2/publicKeys
# Check metricscurl http://localhost:3000/metricsUpgrading
Section titled “Upgrading”For detailed upgrade procedures including zero-downtime and rollback, see the Upgrade Guide.