Run your own Tusile community on your domain. This page is the canonical install flow. Self-hosting also means your community’s messages live on hardware you control — see where Tusile stands on EU Chat Control.
Requirements
- A machine where Docker and Docker Compose can run.
- A public hostname (for example via Duck DNS, No-IP, or FreeDNS).
- A Tusile server token created in the app/core.
Choose your install path
Quick start
In the Tusile app, create a new server first to obtain the token. Then download the bundle, unpack it, and run the setup. The script will guide you through the rest.
You need a hostname (domain). Free options: No-IP, Duck DNS, FreeDNS — point it at your server's IP.
- Unpack the zip.
- Windows: Double-click
setup.batin thecommunity-serverfolder.
Linux / macOS: In a terminal in that folder:chmod +x setup.shthen./setup.sh.
This script runs the same steps you would do manually in the I know what I'm doing tab, and you are welcome to read the script content. - Follow the prompts.
- When the script lists ports, open them on your router/firewall. The script will start the server.
When the script finishes, connect to your server in the Tusile app.
Advanced setup
The bundle includes Docker, Caddy for HTTPS, and LiveKit for voice and video. Download, set a few variables, edit the Caddyfile with your domain, and start the stack.
You need a domain so Caddy can obtain TLS certificates and the Tusile app can connect without mixed content (browsers block HTTPS pages from calling HTTP backends).
Free options for a hostname: Duck DNS, No-IP, and FreeDNS — you get a subdomain (e.g. yourserver.duckdns.org) and point it at your server's IP; Caddy will then get a certificate for it.
- Unpack the archive (e.g.
unzip community-server.zipandcd community-server). - In the unpacked folder, set these in your environment configuration file:
SERVER_TOKEN— token from the Tusile Core Server to register your community.COMMUNITY_PUBLIC_URL— public URL of your server with no path (e.g.chat.example.com). Must match the domain in the Caddyfile.- LiveKit key pair — generate with the LiveKit Docker image, then set
LIVEKIT_API_KEYandLIVEKIT_API_SECRETin.envand the same pair in your LiveKit configkeys:(e.g.livekit.yamlorlivekit.prod.yaml):
Use the printed API Key and API Secret in bothdocker run --rm livekit/livekit-server generate-keys.envand the LiveKit config file.
- Edit
Caddyfile: replacecommunity.example.comwith your domain. Caddy will obtain TLS certificates automatically. - Enable TURN/TLS (recommended): in
livekit.prod.yamluncomment thetls_port,domain,cert_file, andkey_filelines (setdomainto your hostname). Thelivekit-cert-synccontainer then supplies the cert from Caddy, using the host ofCOMMUNITY_PUBLIC_URLautomatically (setTURN_DOMAINin.envonly to override it). Thesetup.sh/setup.ps1scripts do all of this for you. - Start the stack:
docker compose up -d
NAT / firewall ports
Open these ports on your router or firewall so the server and voice/video work from the internet:
- Caddy (HTTPS + LiveKit WSS):
80/tcp,443/tcp,7880/tcp. Caddy serves the community API on 80/443 and LiveKit WebSocket on 7880. - LiveKit (voice/video):
7881/tcp— ICE/TCP fallback.50000-50060/udp— RTP media. Must be reachable for voice/video.3478/udp— TURN/UDP (and STUN). Helps when clients are behind strict firewalls or symmetric NAT.5349/tcp— TURN/TLS (strongly recommended). The setup script enables it automatically and thelivekit-cert-synccontainer feeds the cert from Caddy — just open this port. Without it, users on networks that block UDP or behind symmetric NAT can get one-way audio (they can't hear some participants).
Port 9090 is also exposed for direct access to the community API if needed; with Caddy, 80/443 are the main entry.
Validation checks
- Run
docker compose psand confirm all containers are healthy/up (the stack includes alivekit-cert-synchelper). On the first run LiveKit may restart a few times until Caddy issues the TLS cert and cert-sync copies it — that is expected and self-heals. - Open
https://your-domainand verify TLS certificate is valid. - Call
https://your-domain/healthand verify status isok. - Join from the Tusile client and verify text + voice in one test channel.
After the containers are up and ports are open, your community server and LiveKit (voice/video) will be running. You should now be able to connect to your server in the Tusile app.