Minimum
- 1 vCPU
- 1 GB RAM
- 10-20 GB SSD
- Linux server recommended
Self-hosting
Run a Hestia server for your own users. The server relays encrypted traffic and call signaling; plaintext messages and files should not be stored on the server.
01
HTTPS and WSS are strongly recommended for reliable production use. A TURN server is recommended when voice or video calls must work across restrictive NAT environments.
02
hestiachat.site03
Replace the repository placeholder with the real Hestia server repository URL when it is published.
git clone https://github.com/RuslanLit/Hestia.git hestia-server
cd hestia-server
npm install
04
Create a .env file in the server directory. Keep it
private and never publish tokens or service account files.
PORT=3000
SERVER_NAME=Hestia Self-Hosted
OFFLINE_TTL_MS=604800000
REGISTRATION_ENABLED=true
INVITE_ONLY=false
INVITE_CODES=
ADMIN_TOKEN=<GENERATE_A_LONG_RANDOM_TOKEN>
TURN_SERVERS=[]
# Optional Android push placeholders
FIREBASE_PROJECT_ID=
FIREBASE_CLIENT_EMAIL=
FIREBASE_PRIVATE_KEY=
ADMIN_TOKEN. If public registration
is not intended, set REGISTRATION_ENABLED=false or use
invite-only mode.
05
npm start
The same Node.js app can serve the landing at /,
backend config at /api/config, and WebSocket traffic
at /ws. It also needs writable persistence storage
for its data files or database.
curl http://127.0.0.1:3000/api/config
06
For production, put the single Hestia Node.js app behind a reverse proxy with TLS. One domain is enough: static pages, release files, HTTP API, and WebSocket traffic all pass through the same handler.
server {
listen 443 ssl http2;
server_name hestiachat.site;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
hestiachat.site and certificate paths with
your real domain and TLS certificate locations. A separate
api subdomain is not required.
07
Direct WebRTC connections work best when peers can reach each
other. Restrictive networks or NAT may require TURN relay fallback.
Configure TURN servers through TURN_SERVERS.
TURN_SERVERS=[
{
"urls": "turn:turn.your-domain.test:3478",
"username": "<TURN_USERNAME>",
"credential": "<TURN_PASSWORD>"
}
]
08
https://hestiachat.site, if the build asks for it.09
/ serves the landing/releases/latest.json is reachable/api/config is reachable over HTTPS/ws10
ADMIN_TOKEN.11
Check the server URL, DNS record, firewall, reverse proxy, and TLS certificate.
Confirm WSS is enabled and your proxy passes Upgrade and Connection headers.
Check Firebase placeholders, service account access, and Android build configuration.
Add a TURN server and verify TURN_SERVERS reaches the client config.
Review server-side file size limits, storage permissions, and available disk space.
Use a full HTTPS origin such as https://hestiachat.site. The client derives wss://hestiachat.site/ws automatically.