# soft3 phase-1 root chain โ one instance per chain: soft3-chain@pussy, soft3-chain@bostrom.
# Parameters come from /etc/soft3/<chain>.env (template: chain.env.example).
# Install: sudo cp soft3-chain@.service /etc/systemd/system/ && sudo systemctl daemon-reload
# Start: sudo systemctl enable --now soft3-chain@pussy (genesis day only โ see README.md)
[Unit]
Description=soft3 root chain node (%i) โ cybergraph + bbg + radio
Documentation=https://github.com/cyberia-to/soft3/tree/main/deploy/chain
After=network-online.target time-sync.target
Wants=network-online.target time-sync.target
# PoW timestamp rules assume a sane clock: refuse to start when the clock is not NTP-synchronized.
ConditionPathExists=/etc/soft3/%i.env
StartLimitIntervalSec=300
StartLimitBurst=5
[Service]
Type=simple
User=cyber
Group=cyber
EnvironmentFile=/etc/soft3/%i.env
Environment=HOME=/home/cyber
Environment=PATH=/home/cyber/.cargo/bin:/usr/local/bin:/usr/bin:/bin
Environment=RUST_LOG=info
# State lives in /var/lib/soft3/<chain>; on deimos symlink /var/lib/soft3 to the raid before the first start.
StateDirectory=soft3/%i
StateDirectoryMode=0750
WorkingDirectory=/var/lib/soft3/%i
ExecStartPre=/usr/local/bin/soft3-chain-check --pre %i
# The executable path is fixed (systemd does not expand variables in the first token).
ExecStart=/home/cyber/.cargo/bin/soft3 node \
--chain ${SOFT3_CHAIN} \
--home /var/lib/soft3/%i \
--bind ${SOFT3_BIND} \
--radio ${SOFT3_RADIO} \
--peers /etc/soft3/%i.peers.toml \
--moniker ${SOFT3_MONIKER}
Restart=always
RestartSec=5
TimeoutStopSec=60
KillSignal=SIGTERM
# resource guards โ the 0.10.0 chaosnet node reached 1,800 threads under a request convoy (2026-10-15)
# MemoryMax is per machine: drop-in /etc/systemd/system/soft3-chain@<chain>.service.d/limits.conf
# (template: limits.conf.example) โ systemd does not expand variables in MemoryMax.
LimitNOFILE=65536
TasksMax=2048
LogRateLimitIntervalSec=30
LogRateLimitBurst=2000
# hardening
NoNewPrivileges=true
ProtectSystem=full
ProtectHome=read-only
PrivateTmp=true
ProtectKernelTunables=true
ProtectControlGroups=true
RestrictSUIDSGID=true
[Install]
WantedBy=multi-user.target