[{"data":1,"prerenderedAt":135},["ShallowReactive",2],{"seo-verification":3,"blog-host-jitsi-on-your-own-vps-en":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"id":7,"slug":8,"slugs":9,"title":12,"excerpt":13,"readTime":14,"views":15,"isPinned":16,"publishedAt":17,"category":18,"categories":24,"featuredImage":26,"bgImage":27,"posterImage":28,"relatedSolution":26,"intro":29,"sections":30,"ctaTitle":83,"ctaBody":84,"ctaButton":85,"ctaUrl":86,"relatedPosts":87},78,"host-jitsi-on-your-own-vps",{"fr":10,"en":8,"ar":11},"heberger-jitsi","استضافة-jitsi-على-خادم-vps-الخاص-بك","Host Jitsi on your own VPS","Deploy Jitsi Meet on your VPS with Docker, coturn TURN server and SSL. Full guide: .env config, troubleshooting ICE failed, missing audio and screen sharing.",9,0,false,"2026-04-03T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":23},7,"Self-hosting","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[25],{"id":19,"name":20,"slug":21,"color":22,"icon":23},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fheberger-jitsi-poster.svg","Jitsi Meet is an open source video conferencing solution that works directly in the browser, with no installation on the participant's side. Self-hosting it on a VPS gives you without limits rooms, with no time limit and no data collection. The deployment itself is quick — configuring the TURN server (coturn) is what causes most installations to fail: without it, video works on a local network but stops as soon as a participant is behind a corporate NAT or a carrier-grade NAT provider. This guide covers the full installation, coturn configuration and troubleshooting of the most common errors.",[31,35,45,48,70,73,77,80],{"type":32,"title":33,"body":34},"h2","Jitsi self-hosted vs Zoom: what actually changes","Consumer video conferencing services (Zoom, Google Meet, Teams) impose time limits on free plans, participant quotas, and keep your recordings on their servers. Self-hosted Jitsi Meet removes these constraints: without limits rooms, without limits duration, no account required to join a meeting, and video streams that stay on your infrastructure. This is particularly relevant for an organization concerned about the confidentiality of its meetings, a firm handling sensitive data, or anyone who wants to embed video calling in a third-party application (Jitsi provides a stable **iframe API**). Running costs come down to the VPS bill — no per-seat subscription, no software surcharge.",{"type":36,"title":37,"items":38},"ul","Concrete benefits of self-hosted Jitsi",[39,40,41,42,43,44],"Meetings with no time limit and no cap on the number of rooms — no timer cutting the call.","No account required for participants: a link is enough to join.","iframe API to embed video calling directly in your application or website.","Transport encryption (DTLS-SRTP) and full control over any recordings.","Complete customization: logo, colors, room domain name.","No telemetry sent to a third party — video streams never leave your VPS.",{"type":32,"title":46,"body":47},"Concrete prerequisites before you start","Jitsi is sized by **bandwidth**, not CPU. For meetings up to 10 participants: 2 vCPU, **4 GB RAM minimum**, generous outbound traffic (100 Mbps recommended). Above 20 simultaneous participants, plan for 8 GB RAM and monitor JVB network load. Three ports must be reachable from the internet: **TCP 443** (HTTPS and TURN\u002FTLS), **TCP 80** (Let's Encrypt renewal), **UDP 10000** (JVB media). Add **TCP 3478** if you expose coturn on its native port. You need Docker 24+ and Compose V2, a domain name `meet.yourdomain.com` with an A record pointing to the VPS public IP, and a **dedicated, stable public IP** — a shared IP makes coturn configuration significantly harder.",{"type":49,"title":50,"steps":51},"steps","Step-by-step deployment: Docker, .env, coturn and first test",[52,55,58,61,64,67],{"title":53,"body":54},"Fetch docker-jitsi-meet","Clone the official repository: `git clone https:\u002F\u002Fgithub.com\u002Fjitsi\u002Fdocker-jitsi-meet`. Copy `env.example` to `.env`, then run `.\u002Fgen-passwords.sh` — this script generates all internal secrets (Prosody, Jicofo, JVB). Do not skip this step: default values are not secrets.",{"title":56,"body":57},"Set PUBLIC_URL and DOCKER_HOST_ADDRESS","Two variables in `.env` are critical: `PUBLIC_URL=https:\u002F\u002Fmeet.yourdomain.com` (used by the web client to build room URLs) and `DOCKER_HOST_ADDRESS=\u003CVPS_PUBLIC_IP>` (the address JVB announces to clients to establish the direct media connection). Without `DOCKER_HOST_ADDRESS`, JVB announces an internal Docker address and no external client can reach it.",{"title":59,"body":60},"Enable Let's Encrypt in .env","Add to `.env`: `ENABLE_LETSENCRYPT=1`, `LETSENCRYPT_DOMAIN=meet.yourdomain.com`, `LETSENCRYPT_EMAIL=admin@yourdomain.com`. Verify that port 80 is open before starting — Let's Encrypt uses an HTTP-01 challenge that requires a response on that port.",{"title":62,"body":63},"Configure coturn (TURN server)","This is the step most guides skim over and that causes installations to fail. In `.env`, enable: `ENABLE_TURN=1`, `TURN_HOST=meet.yourdomain.com`, `TURN_PORT=443`, `TURN_TRANSPORT=tls`. Port 443 over TLS crosses the most restrictive firewalls, which block non-standard ports but let through anything resembling HTTPS. Then add: `TURN_CREDENTIALS=a_strong_secret`, `TURN_TLS_CERT=\u002Fetc\u002Fletsencrypt\u002Flive\u002Fmeet.yourdomain.com\u002Ffullchain.pem`, `TURN_TLS_KEY=\u002Fetc\u002Fletsencrypt\u002Flive\u002Fmeet.yourdomain.com\u002Fprivkey.pem`. If coturn runs in a separate container, mount these files as volumes. One often-missed detail: coturn blocks RFC1918 ranges (192.168.x.x, 10.x.x.x, 172.16.x.x) by default. If your VPS has an internal network interface in those ranges, add `no-multicast-peers` and verify that `denied-peer-ip` does not include the JVB address.",{"title":65,"body":66},"Start the stack and check the JVB","Run `docker compose up -d`. Wait 30 seconds, then: `docker compose logs jvb 2>&1 | grep -E 'register|connected|error'`. You should see a line showing that JVB registered with Jicofo. If you see `Failed to register` or `Connection refused`, Prosody is not ready yet — retry after a minute. Then verify coturn responds: `nc -zv meet.yourdomain.com 443` (TCP) and `nc -zvu meet.yourdomain.com 10000` (UDP).",{"title":68,"body":69},"First video test from two different networks","Open `https:\u002F\u002Fmeet.yourdomain.com` from your usual machine and a second device on a different network (a phone on mobile data, for example). If both participants see and hear each other, TURN is working. A test between two machines on the same local network **does not validate coturn** — it succeeds peer-to-peer without ever using the relay.",{"type":32,"title":71,"body":72},"Advanced configuration: recording, authentication and limits","**Meeting recording.** Jitsi includes Jibri for local recording or RTMP streaming. Jibri requires a second VPS or at minimum 4 additional vCPU, as it captures the browser render in real time. Enable `ENABLE_RECORDING=1` in `.env` and deploy a separate Jibri container pointing to your Jicofo. **Organizer authentication.** By default, anyone can create a room. Enable `AUTH_TYPE=internal` to require an account on the organizer's side while letting guests join freely. Create host accounts with `docker exec \u003Cprosody-container> prosodyctl --config \u002Fconfig\u002Fprosody.cfg.lua register admin meet.yourdomain.com password`. **Limiting anonymous participants.** Add `ENABLE_LOBBY=1` so a moderator approves each entry before accessing the room. Combined with `AUTH_TYPE=internal`, this gives full control over who accesses what.",{"type":74,"title":75,"body":76},"tip","Hardening: fail2ban on the TURN service","coturn exposes a service reachable from the internet. Install fail2ban and create a filter on failed TURN authentication attempts: coturn logs write `ERROR: 401, realm` on each failure. A fail2ban jail with `maxretry=10` and `bantime=600` is enough to deter automated scans without affecting your legitimate users. Verify that fail2ban watches `\u002Fvar\u002Flog\u002Fcoturn.log` (default path if coturn runs natively) or mount that file from the container.",{"type":32,"title":78,"body":79},"Troubleshooting: the four most common errors","**Missing audio or video stuck on 'connecting' — coturn + UDP 10000.** This is the most frequent failure. Check in this order: (1) `ufw status` — are TCP 443 and UDP 10000 open? (2) `docker compose logs coturn | grep -i error` — does coturn start without certificate errors? (3) From an external machine: `curl -v telnet:\u002F\u002Fmeet.yourdomain.com:3478` — does coturn respond? (4) In browser logs (F12 → Console): do you see `ICE failed` or `failed to gather candidates`? If so, coturn is not reachable from outside. Compare `TURN_HOST` in `.env` with the actual VPS IP. **Connection refused on TCP 443.** If Let's Encrypt could not issue a certificate (port 80 was closed on first start), the web container attempts to serve HTTPS with a self-signed certificate that the browser rejects. Fix: open port 80, delete the volume `~\u002F.jitsi-meet-cfg\u002Fweb` and re-run `docker compose up -d`. **Screen sharing refused by the browser.** Screen sharing requires a secure context (valid HTTPS). If you see `getUserMedia is not supported`, the certificate is invalid or the domain is not on HTTPS. Check `PUBLIC_URL` — it must start with `https:\u002F\u002F` with a domain whose certificate is valid, not a raw IP. **Persistent 'ICE failed' error despite a working coturn.** Check the `DOCKER_HOST_ADDRESS` variable: it must contain the VPS public IP, not the internal Docker container IP (172.17.x.x). If your VPS sits behind cloud NAT (rare but possible), you need the external NAT IP, not the network interface IP.",{"type":32,"title":81,"body":82},"Your Jitsi is running — manage bandwidth","Jitsi runs in SFU mode: the video bridge (JVB) relays each stream to each participant, so outbound bandwidth scales with the number of participants multiplied by the number of streams. For 10 participants at 720p, expect 20 to 40 Mbps outbound continuously. Enable `lastN=5` (last N active videos) to cap client-side streams in large meetings, and watch `docker stats jvb` to anticipate saturation. Above about twenty regular simultaneous participants, deploy several JVB instances on separate VPSes behind a single Jicofo: that is Jitsi's native horizontal scaling architecture.","Launch your Jitsi server on a ServOrbit Cloud VPS","A Cloud VPS with a dedicated public IP, generous bandwidth and root access lets you deploy Jitsi Meet, coturn and Jibri with no meeting limit. Your video calls stay on your infrastructure.","Launch my Cloud VPS","\u002Fvps-cloud",[88,104,119],{"id":89,"slug":90,"slugs":91,"title":94,"excerpt":95,"readTime":96,"views":15,"isPinned":16,"publishedAt":97,"category":98,"categories":99,"featuredImage":26,"bgImage":27,"posterImage":101,"relatedSolution":102},71,"hosting-nextcloud-on-your-own-vps",{"fr":92,"en":90,"ar":93},"heberger-nextcloud","استضافة-nextcloud-على-خادمك-الـvps-الخاص","Self-Host Nextcloud on VPS: Complete Guide, NC 34 and Security","Deploy Nextcloud 34.0.2 on your VPS with Docker and Redis. Complete guide: missing NC 34.0.0 apps, PostgreSQL oc_filecache_extended constraint, and 2FA CVEs.",12,"2026-04-10T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":23},[100],{"id":19,"name":20,"slug":21,"color":22,"icon":23},"\u002Fblog\u002Fcovers\u002Fheberger-nextcloud-poster.svg",{"categorySlug":21,"appSlug":103},"nextcloud",{"id":105,"slug":106,"slugs":107,"title":110,"excerpt":111,"readTime":14,"views":15,"isPinned":16,"publishedAt":112,"category":113,"categories":114,"featuredImage":26,"bgImage":27,"posterImage":116,"relatedSolution":117},72,"hosting-ghost-on-your-own-vps",{"fr":108,"en":106,"ar":109},"heberger-ghost","استضافة-ghost-على-خادمك-الـvps-الخاص","Hosting Ghost on your own VPS: complete 2026 guide","Deploy Ghost v6 on your VPS with Caddy, MySQL, Ghost CLI and Stripe Tax: installation, TLS reverse proxy, updates and troubleshooting common startup errors.","2026-04-09T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":23},[115],{"id":19,"name":20,"slug":21,"color":22,"icon":23},"\u002Fblog\u002Fcovers\u002Fheberger-ghost-poster.svg",{"categorySlug":21,"appSlug":118},"ghost",{"id":120,"slug":121,"slugs":122,"title":125,"excerpt":126,"readTime":127,"views":15,"isPinned":16,"publishedAt":128,"category":129,"categories":130,"featuredImage":26,"bgImage":27,"posterImage":132,"relatedSolution":133},73,"host-wordpress-on-your-own-vps",{"fr":123,"en":121,"ar":124},"heberger-wordpress","استضافة-wordpress-على-خادم-vps-الخاص-بك","Host WordPress on your own VPS","Host WordPress on your VPS for maximum performance and control: Docker, MariaDB, caching, reverse proxy and SSL.",3,"2026-04-08T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":23},[131],{"id":19,"name":20,"slug":21,"color":22,"icon":23},"\u002Fblog\u002Fcovers\u002Fheberger-wordpress-poster.svg",{"categorySlug":21,"appSlug":134},"wordpress",1787580999500]