This repository contains the necessary files and scripts to easily set up and manage a COTI Full Node for the COTI blockchain network.
Visit the Running a COTI Node section of the COTI Documentation for full instructions. The node ecosystem installation guides describe wizard flows in more detail.
Run from an empty directory. Set <network> to testnet or mainnet.
Linux / WSL (Ubuntu 24.04 LTS, or WSL with a Linux home path — not /mnt/c/) — as root:
curl -sL https://fullnode.<network>.coti.io/install-linux | sudo bash -s -- "0x<PRIVATE_KEY>" "<FQDN>" [options]macOS — do not use sudo:
curl -sL https://fullnode.<network>.coti.io/install-mac | bash -s -- "0x<PRIVATE_KEY>" "<FQDN>" [options]Required arguments: 64-character hex private key (optional 0x prefix) and FQDN hostname.
| Flag | Purpose |
|---|---|
--with-frp |
COTI wizard tunnel: enables FRPC, disables host Nginx/Let’s Encrypt, relaxes inbound 80/443/7400 firewall checks. |
--with-nginx |
Your domain: Nginx + Let’s Encrypt on the host (/rpc, /ws, /metrics). |
--staging |
Let’s Encrypt staging CA (with --with-nginx only). |
--frpc-custom-domain=, --frpc-auth-token=, --frps-server-addr-1=, etc. |
Optional FRPC tuning (see script). |
Nginx/TLS and FRPC are off by default. Use --with-nginx or --with-frp to enable them (not both on one install).
macOS: use install_coti-full-node-mac.sh (see script header for curl examples).
After install, two env files live in the clone:
| File | Purpose |
|---|---|
installer.env |
Installation / packaging defaults: DOCKER_FULL_NODE_IMAGE_VERSION, NETWORK, CLONE_BRANCH, disk requirement. |
.env |
This host: FULLNODE_FQDN, FULLNODE_EXT_IP, NGINX_ENABLED, FRPC_ENABLED, FRPS hosts, keys. |
start_coti-full-node.sh and stop_coti-full-node.sh load installer.env first, then .env (host values win on overlap).
Upgrade the node image: edit DOCKER_FULL_NODE_IMAGE_VERSION or set IMAGE= in installer.env, then ./stop_coti-full-node.sh and ./start_coti-full-node.sh.
Per-variable reference: .env.example and installer.env (template beside the install script before clone).
To update your node to the latest version, follow these steps:
-
Clone or Pull Changes: If you don't have the repository cloned, clone it. If you already have it, navigate to the directory and pull the latest changes.
- Clone:
git clone https://github.com/coti-io/coti-full-node.git - Pull:
cd ~/coti-full-nodeand thengit pull
- Clone:
-
Checkout the Tag: Ensure you are on the correct version by checking out the new tag.
git checkout tags/v1.1.4-testnet -
Bump image tag (if needed): set
DOCKER_FULL_NODE_IMAGE_VERSIONorIMAGEininstaller.env. -
Stop Old Containers: Stop the existing containers by running the stop script.
./stop_coti-full-node.sh -
Start New Containers: Start the new containers with the updated Docker Compose file.
./start_coti-full-node.sh
If you encounter any bugs or issues, please report them by opening an issue on GitHub. Include as much detail as possible, including steps to reproduce the bug, the environment you encountered it in, and any other relevant information.
Enable with --with-frp (wizard tunnel). The stack runs two frpc containers (regional gateways; defaults in .env.example).
- Outbound-only tunnel to FRPS (
FRPS_SERVER_ADDR_1/_2, port7000by default). - Edge paths on your
FRPC_CUSTOM_DOMAIN:/rpc→ JSON-RPC (8545),/ws→ WebSocket (8546),/operator/→ local operator dashboard. - P2P still uses bootnodes and host port 7400; wizard tunnel mode does not require inbound 80/443/7400 from the internet.
- Host Nginx and FRPC are mutually exclusive on the same install.
Relevant variables: .env.example. FRPC is off by default; use --with-frp to enable it.
After ./start_coti-full-node.sh, a small local web dashboard helps non-technical operators see whether the node is running, has peers, is syncing, and (when configured) whether DNS/HTTPS or the FRPC gateway look healthy. On the machine where Docker runs, open http://127.0.0.1:8090. It is bound to localhost only and auto-refreshes about every 15 seconds.
If you manage the server over SSH, use port forwarding, for example: ssh -L 8090:127.0.0.1:8090 user@your-node then open http://127.0.0.1:8090 in your desktop browser.