<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jochen Kirstätter (JoKi)</title>
    <description>The latest articles on DEV Community by Jochen Kirstätter (JoKi) (@jkirstaetter).</description>
    <link>https://dev.to/jkirstaetter</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3450829%2F5e0b1a92-5de5-48a1-a877-a7eecc4b5d85.jpg</url>
      <title>DEV Community: Jochen Kirstätter (JoKi)</title>
      <link>https://dev.to/jkirstaetter</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jkirstaetter"/>
    <language>en</language>
    <item>
      <title>Enable authentication in your instance of Jitsi Meet</title>
      <dc:creator>Jochen Kirstätter (JoKi)</dc:creator>
      <pubDate>Thu, 10 Sep 2026 16:57:58 +0000</pubDate>
      <link>https://dev.to/jkirstaetter/enable-authentication-in-your-instance-of-jitsi-meet-2e9p</link>
      <guid>https://dev.to/jkirstaetter/enable-authentication-in-your-instance-of-jitsi-meet-2e9p</guid>
      <description>&lt;p&gt;A basic installation of Jitsi Meet gets you up and running within shortest time, probably in less than 15 minutes. There are hardly any configuration changes necessary. Most important information is a fully qualified domain name (FQDN), and that's it.&lt;/p&gt;

&lt;p&gt;This content been published &lt;a href="https://jochen.kirstaetter.name/authentication-jitsi-meet" rel="noopener noreferrer"&gt;here&lt;/a&gt; originally.&lt;/p&gt;

&lt;p&gt;However such a default installation of Jitsi Meet is open. Meaning, that anyone knowing the URL of your server can create a new meeting room and start to have video conferences using your instance and probably causing additional cost.&lt;/p&gt;

&lt;p&gt;In this second article on Jitsi Meet we are going to enable authentication to avoid any misuse from public users. Please read &lt;a href="https://jochen.kirstaetter.name/install-jitsi-meet-on-gcp.html" rel="noopener noreferrer"&gt;Install Jitsi Meet on Compute Engine (GCP)&lt;/a&gt; in case you have not created your own instance yet.&lt;/p&gt;

&lt;p&gt;Securing your instance of Jitsi Meet requires three configuration changes plus the creation of user accounts with permission to host conference calls.&lt;/p&gt;

&lt;p&gt;Let's have a look at the architecture of Jitsi Meet to get a better understanding.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffh6g2gxp5c5xiq3qq2t3.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffh6g2gxp5c5xiq3qq2t3.webp" alt="Courtesy of https://www.brring.com/2020/04/04/setting-up-a-jitsi-server-in-less-than-15-minutes/" width="799" height="494"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is possible to allow only authenticated users for creating new conference rooms. Whenever a new room is about to be created Jitsi Meet will prompt for user name and password. After the room is created others will still be able to join from an anonymous domain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extend the Prosody configuration
&lt;/h2&gt;

&lt;p&gt;The central component of Jitsi Meet is the Prosody XMPP server which is responsible for user management among other tasks, like authentication.&lt;/p&gt;

&lt;p&gt;Open the configuration file of your domain with your preferred text editor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano /etc/prosody/conf.d/&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;.cfg.lua
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here you change the current value of &lt;em&gt;authentication&lt;/em&gt; from &lt;code&gt;anonymous&lt;/code&gt; to &lt;code&gt;internal_hashed&lt;/code&gt; like so.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="n"&gt;VirtualHost&lt;/span&gt; &lt;span class="s2"&gt;"meet.mscc.mu"&lt;/span&gt;
        &lt;span class="c1"&gt;-- enabled = false -- Remove this line to enable this host&lt;/span&gt;
        &lt;span class="c1"&gt;-- authentication = "anonymous"&lt;/span&gt;
        &lt;span class="n"&gt;authentication&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"internal_hashed"&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Additionally, you add a new virtual host definition at the end of the same file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;VirtualHost&lt;/span&gt; &lt;span class="s2"&gt;"guest.meet.mscc.mu"&lt;/span&gt;
    &lt;span class="n"&gt;authentication&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"anonymous"&lt;/span&gt;
    &lt;span class="n"&gt;c2s_require_encryption&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save the file to confirm the modifications*&lt;em&gt;.&lt;/em&gt;*&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The domain of the guest VirtualHost is internal only. It does not require any DNS record or SSL certificate.&lt;/p&gt;

&lt;p&gt;The outcome is now that the primary VirtualHost of your Jitsi instance would require any kind of authentication to create a conference meeting room whereas the VirtualHost for guests still grants access to anonymous users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add guest domain to Jitsi Meet frontend
&lt;/h2&gt;

&lt;p&gt;After adding the guest domain to the XMPP server component, you need to add this VirtualHost to the configuration object in the web frontend.&lt;/p&gt;

&lt;p&gt;Open the config file with a text editor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano /etc/jitsi/meet/&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="nt"&gt;-config&lt;/span&gt;.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you add the directive &lt;code&gt;anonymousdomain&lt;/code&gt; into your &lt;code&gt;hosts&lt;/code&gt; object.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="nx"&gt;hosts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// XMPP domain.&lt;/span&gt;
        &lt;span class="nl"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;meet.mscc.mu&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

        &lt;span class="c1"&gt;// When using authentication, domain for guest users.&lt;/span&gt;
        &lt;span class="c1"&gt;// anonymousdomain: 'guest.example.com',&lt;/span&gt;
        &lt;span class="nx"&gt;anonymousdomain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;guest.meet.mscc.mu&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save and close the configuration file to confirm your modifications.&lt;/p&gt;

&lt;p&gt;As you might see in the comment in the hosts sections, it already stipulates that your instance is going to use the new domain for guest users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Change Jitsi Conference Focus
&lt;/h2&gt;

&lt;p&gt;Next, you have to configure the &lt;a href="https://github.com/jitsi/jicofo" rel="noopener noreferrer"&gt;Jitsi Conference Focus (jicofo)&lt;/a&gt; component to allow requests from an authenticated domain only. For that you need to add the protected URL to the properties files. Open it with a text editor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano /etc/jitsi/jicofo/sip-communicator.properties
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the key-value pair &lt;code&gt;org.jitsi.jicofo.auth.URL=XMPP:&amp;lt;domain&amp;gt;&lt;/code&gt; at the end of the file, and save it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="err"&gt;...&lt;/span&gt;
&lt;span class="py"&gt;org.jitsi.jicofo.auth.URL&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;XMPP:meet.mscc.mu&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Restart all Jitsi services involved
&lt;/h2&gt;

&lt;p&gt;With all changes mentioned above you need to restart the services to apply all modifications. Run the following commands or restart your VM instance completely.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;service prosody restart
service jicofo restart
service jitsi-videobridge2 restart
service nginx restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Check the log files
&lt;/h2&gt;

&lt;p&gt;Should you come across some unexpected issues always have a look at the log files first. Here is a brief overview of where to check.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Prosody&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/prosody/prosody.log

&lt;span class="c"&gt;# Jicofo&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/jitsi/jicofo.log

&lt;span class="c"&gt;# Jitsi video bridge&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/jitsi/jvb.log

&lt;span class="c"&gt;# nginx&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/nginx/error.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Create your moderators
&lt;/h2&gt;

&lt;p&gt;For the last step, now that authentication is active, you need to create at least one user which is going to have permissions to create meeting rooms.&lt;/p&gt;

&lt;p&gt;According to the architecture it is the Prosody component which is responsible for this part. The command &lt;code&gt;prosodyctl&lt;/code&gt; helps you to manage your XMPP server and therefore your user base.&lt;/p&gt;

&lt;p&gt;You can add and enable a user with the following command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;prosodyctl register joki &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; VerySecretPassword
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The syntax is described here.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;prosodyctl register &lt;span class="nt"&gt;--help&lt;/span&gt;
Usage: /usr/bin/prosodyctl register USER HOST &lt;span class="o"&gt;[&lt;/span&gt;PASSWORD]
 Register a user on the server, with the given password
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Unfortunately, this is &lt;strong&gt;&lt;em&gt;not&lt;/em&gt; GDPR-compliant&lt;/strong&gt;, because “enabling users to set their password without the admin knowing it” is a basic and unavoidable security measure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Congratulations!
&lt;/h2&gt;

&lt;p&gt;You completed all necessary steps to enable authentication in your instance of Jitsi Meet. All steps described above are mainly based on the official guide to &lt;a href="https://github.com/jitsi/jicofo#secure-domain" rel="noopener noreferrer"&gt;Secure domain on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let's try it...&lt;/p&gt;

&lt;h2&gt;
  
  
  Authenticate against your instance of Jitsi Meet
&lt;/h2&gt;

&lt;p&gt;Open a browser and navigate to your URL of Jitsi Meet. The site should load as before and there are no obvious changes visible. Authentication is bound to the creation of a meeting room only.&lt;/p&gt;

&lt;p&gt;Either you choose an existing meeting room or you enter a new name and click on &lt;code&gt;GO&lt;/code&gt; to start the video conference session. If you are not authenticated the site will now place you in some kind of virtual lobby until a moderator or host arrives.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5d7ktngbciniannxeoss.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5d7ktngbciniannxeoss.webp" alt="Guests and non-authenticated users cannot create a meeting room" width="800" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In case that you are the host of the meeting click on &lt;code&gt;I am the host&lt;/code&gt; and you will be asked to enter your credentials. You can either enter just the user name without your domain or the fully qualified user name including the domain - both approaches will work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy8jvrqx76mku5qzb7a5b.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy8jvrqx76mku5qzb7a5b.webp" alt="Enter your credentials to continue to your video conference" width="800" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enter your passphrase and click &lt;code&gt;OK&lt;/code&gt;. With successful authentication against Prosody the Jitsi Meet component will grant you access to the meeting room and assign moderator permissions to your account.&lt;/p&gt;

&lt;p&gt;Public access is still possible as soon as a moderator (host) is present in the meeting room.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl99rnrl3m87j65sojw97.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl99rnrl3m87j65sojw97.webp" alt="Guests can still access the meeting room, now that a moderator / host is present" width="800" height="668"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As a moderator you will get additional options under Settings &amp;gt; More which allow you to control what should happen when someone enters the meeting room, e.g. being automatically muted or not being visible to other participants.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F41zbx32uzo3t0yuutyq8.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F41zbx32uzo3t0yuutyq8.webp" alt="Additional settings to control access to the meeting space" width="596" height="260"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enjoy your next, secure video conference.&lt;/p&gt;

&lt;h2&gt;
  
  
  Consider to set password per meeting room
&lt;/h2&gt;

&lt;p&gt;An additional level of protection against "&lt;a href="https://en.wikipedia.org/wiki/Zoombombing" rel="noopener noreferrer"&gt;Zoom-bombing&lt;/a&gt;" or unwanted intrusion into a video conference would be to activate the password of the meeting room.&lt;/p&gt;

&lt;p&gt;Click on the &lt;code&gt;i&lt;/code&gt; circle in the bottom right area and click on &lt;code&gt;Add password&lt;/code&gt; in the popup dialog.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpcdkbg21u6l91ts38okb.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpcdkbg21u6l91ts38okb.webp" alt="Set a room-specific password to avoid Zoom-bombing and unauthorised access" width="662" height="277"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enter your room-specific password and hit &lt;code&gt;Enter&lt;/code&gt; to confirm your choice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The password of a meeting room is not persistent and needs to set each time that you would join / start a conference call. You cannot launch a meeting room with an initial password already set.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;Perhaps you noticed that the visual appearance of the Jitsi Meet instance running for MSCC looks slightly different to the default installation.&lt;/p&gt;

&lt;p&gt;Continue reading the next part of this series: &lt;a href="https://jochen.kirstaetter.name/customise-jitsi-meet" rel="noopener noreferrer"&gt;Customise Your Instance of Jitsi Meet&lt;/a&gt;, where we explore core feature configuration, visual branding, Google Calendar synchronisation, resilient Nginx upgrade persistence, and client endpoint setup across desktop and mobile devices.&lt;/p&gt;

</description>
      <category>community</category>
      <category>jitsi</category>
      <category>security</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Install Jitsi Meet on Compute Engine (GCP)</title>
      <dc:creator>Jochen Kirstätter (JoKi)</dc:creator>
      <pubDate>Mon, 07 Sep 2026 06:08:38 +0000</pubDate>
      <link>https://dev.to/jkirstaetter/install-jitsi-meet-on-compute-engine-gcp-3h4k</link>
      <guid>https://dev.to/jkirstaetter/install-jitsi-meet-on-compute-engine-gcp-3h4k</guid>
      <description>&lt;p&gt;Irrespective of the current situation I already had a look at the Jitsi Meet platform some time back last year. Due to a lack of necessity and organising most community meetings offline - both MSCC and GDG Mauritius - there was no motivation to look closer into any video conferencing platform.&lt;/p&gt;

&lt;p&gt;This content been published &lt;a href="https://jochen.kirstaetter.name/install-jitsi-meet-on-gcp" rel="noopener noreferrer"&gt;here&lt;/a&gt; originally.&lt;/p&gt;

&lt;p&gt;Inspired by the announcement that &lt;a href="https://meet.mixp.org" rel="noopener noreferrer"&gt;meet.mixp.org&lt;/a&gt; offers free access to host video conferencing calls locally in Mauritius and the fact that past few meetings of the MSCC had been conducted virtually using &lt;a href="https://meet.google.com/" rel="noopener noreferrer"&gt;Google Hangouts Meet&lt;/a&gt;, I reserved some time to do a little research. The result is a series of tutorials on how to get started with &lt;a href="https://jitsi.org/" rel="noopener noreferrer"&gt;Jitsi Meet&lt;/a&gt;, how to customise it for your own branding, and how to enable more features beyond the basic installation.&lt;/p&gt;

&lt;p&gt;This first article describes the fundamental installation of Jitsi Meet on the &lt;a href="https://cloud.google.com/" rel="noopener noreferrer"&gt;Google Cloud Platform&lt;/a&gt;. Surely, the necessary steps shall be reproducible on other cloud computing platforms like Microsoft Azure or Amazon AWS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites: Domain Name
&lt;/h2&gt;

&lt;p&gt;Before you start following the steps in this article you should consider to have a fully qualified domain name (FQDN) at hand. That domain will be used to access your Jitsi Meet server over the internet.&lt;/p&gt;

&lt;p&gt;I'm going to use the subdomain &lt;code&gt;meet.mscc.mu&lt;/code&gt; because the Jitsi Meet video conferencing system described here will be used for the &lt;a href="https://www.mscc.mu/" rel="noopener noreferrer"&gt;Mauritius Software Craftsmanship Community (MSCC)&lt;/a&gt; and associated user groups in Mauritius.&lt;/p&gt;

&lt;p&gt;Ready?&lt;br&gt;&lt;br&gt;
Let's log into &lt;a href="https://console.cloud.google.com/" rel="noopener noreferrer"&gt;Google Cloud Console&lt;/a&gt; and begin the installation.&lt;/p&gt;
&lt;h2&gt;
  
  
  Define a permanent External IP address
&lt;/h2&gt;

&lt;p&gt;First, you reserve a static IP address. We are going to use this IP address for the DNS record of your FQDN and to attach it to the VM instance running Jitsi Meet server.&lt;/p&gt;

&lt;p&gt;In Cloud Console navigate to &lt;a href="https://console.cloud.google.com/networking/addresses/list" rel="noopener noreferrer"&gt;VPC network &amp;gt; External IP addresses&lt;/a&gt; and reserve a new static address. Although the IP address is not attached to anything yet we are going to use it shortly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo96c8aefy8rfs6wlbqpx.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo96c8aefy8rfs6wlbqpx.webp" alt="Reserve a static external IP address" width="800" height="837"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The result should look similar to this. Of course, your external IP address will be different.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdiy0r3pkvobd1fsalisu.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdiy0r3pkvobd1fsalisu.webp" alt="Overview of reserved external IP addresses" width="798" height="191"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Create a DNS entry
&lt;/h2&gt;

&lt;p&gt;Now, packed with the newly created IP address it is time to create a DNS record for the domain name you would like to use for the Jitsi Meet server. This step depends on your DNS nameserver provider.&lt;/p&gt;

&lt;p&gt;I'm going to describe how it is done using &lt;a href="https://dash.cloudflare.com/" rel="noopener noreferrer"&gt;Cloudflare&lt;/a&gt;. Under DNS management create a new A record with the subdomain &lt;code&gt;meet&lt;/code&gt; and the external IP address provided by Google Cloud Platform.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1vxqk3wosggip4inyf33.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1vxqk3wosggip4inyf33.webp" alt="Create an A record for your domain - here: Cloudflare DNS management" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The resulting DNS configuration should look similar to above. Global DNS propagation can take up to 24 hours and it is important to wait that your DNS record has been deployed successfully.&lt;/p&gt;
&lt;h3&gt;
  
  
  Verify DNS configuration
&lt;/h3&gt;

&lt;p&gt;You can use any DNS query tool to verify this step. Depending on your OS either use &lt;code&gt;dig&lt;/code&gt; or &lt;code&gt;nslookup&lt;/code&gt; to check whether the DNS record has been distributed to the Cloudflare public DNS server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dig meet.mscc.mu @1.1.1.1
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;&amp;lt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; DiG 9.11.3-1ubuntu1.11-Ubuntu &amp;lt;&amp;lt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; meet.mscc.mu @1.1.1.1
&lt;span class="gp"&gt;;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; global options: +cmd
&lt;span class="gp"&gt;;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; Got answer:
&lt;span class="gp"&gt;;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; -&amp;gt;&amp;gt;HEADER&lt;span class="o"&gt;&amp;lt;&amp;lt;-&lt;/span&gt; &lt;span class="no"&gt;opcode&lt;/span&gt;&lt;span class="sh"&gt;: QUERY, status: NOERROR, id: 43365
&lt;/span&gt;&lt;span class="gp"&gt;;&lt;/span&gt;&lt;span class="sh"&gt;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
&lt;/span&gt;&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; OPT PSEUDOSECTION:
&lt;span class="gp"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;EDNS: version: 0, flags:&lt;span class="p"&gt;;&lt;/span&gt; udp: 1452
&lt;span class="gp"&gt;;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; QUESTION SECTION:
&lt;span class="gp"&gt;;&lt;/span&gt;meet.mscc.mu.                  IN      A
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; ANSWER SECTION:
&lt;span class="go"&gt;meet.mscc.mu.           300     IN      A       35.232.25.165
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;nslookup meet.mscc.mu 1.1.1.1
&lt;span class="go"&gt;Server:  one.one.one.one
Address:  1.1.1.1

Non-authoritative answer:
Name:    meet.mscc.mu
Address:  35.232.25.165
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With proper DNS settings in place you are ready to continue with the installation of Jitsi Meet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a VM instance
&lt;/h2&gt;

&lt;p&gt;Log into Cloud Console and navigate to &lt;a href="https://console.cloud.google.com/compute/instances" rel="noopener noreferrer"&gt;Compute Engine &amp;gt; VM instances&lt;/a&gt;. There click on &lt;code&gt;Create instance&lt;/code&gt; and enter relevant information for your new VM instance.&lt;/p&gt;

&lt;p&gt;The default values provided by GCP shall work just fine. However you might like to adjust region, zone and machine configuration according to your liking.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi5i8i8jp2o68zxxy95i0.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi5i8i8jp2o68zxxy95i0.webp" alt="Set up a VM instance to host Jitsi Meet server on GCP" width="800" height="765"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Specify the hostname
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; The initial configuration allows you to set a custom hostname for your instance and you should specify the prepared DNS name as such. This choice is permanent and cannot be changed later.&lt;/p&gt;

&lt;p&gt;Click on &lt;code&gt;Management, security, disks, networking, sole tenancy&lt;/code&gt; and enter your FQDN under &lt;code&gt;Hostname&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffeyz7mci9aaco4dsmu1v.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffeyz7mci9aaco4dsmu1v.webp" alt="Enter your FQDN as hostname during creation of the VM" width="524" height="186"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Choose the External IP address
&lt;/h3&gt;

&lt;p&gt;While you are at the details of Networking click on the pen symbol of the Network interface and select the external IP address that we created earlier. The entry shall look like so.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0840mbnsvoet3jbsotxv.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0840mbnsvoet3jbsotxv.webp" alt="Attach the external IP address to the VM instance" width="525" height="116"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;code&gt;Done&lt;/code&gt; when your networking options are complete.&lt;/p&gt;

&lt;p&gt;If ever you missed the initial creation of an external IP address you can open the dropdown selection under External IP and choose to &lt;code&gt;Create IP address&lt;/code&gt;. Give the new static IP address a name and click on Reserve.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs9rzn5bq4spd7vaob582.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs9rzn5bq4spd7vaob582.webp" alt="Late reservation of an external IP address is possible" width="771" height="618"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However this still requires proper DNS configuration as described earlier.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configure firewall rules
&lt;/h3&gt;

&lt;p&gt;According to the quick install guide Jitsi Meet requires the following ports and protocols to allow traffic from the internet.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;80 TCP - aka HTTP traffic&lt;/li&gt;
&lt;li&gt;443 TCP - aka HTTPS traffic&lt;/li&gt;
&lt;li&gt;10000 UDP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first two ports can be configured during the creation of the VM instance. Tick the checkboxes in the Firewall section and the necessary rules will be applied during the creation of the virtual machine.&lt;/p&gt;

&lt;p&gt;For the UDP port you are going to enter a Network tag for the moment. That tag is used to connect the VM instance to a (new) firewall rule.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fclkxucd51y7peq5f1cpk.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fclkxucd51y7peq5f1cpk.webp" alt="Allow HTTP/S traffic and enter a tag to link to another firewall rule" width="529" height="198"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, click on &lt;code&gt;Create&lt;/code&gt; to complete your VM instance. This is going to take a few seconds and you will be notified as soon as the VM instance is ready.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhkis9oicouo8q1j2o3rz.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhkis9oicouo8q1j2o3rz.webp" alt="Overview of VM instances with External IP address and SSH access" width="800" height="186"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create and verify firewall rules
&lt;/h2&gt;

&lt;p&gt;In order to create the third, remaining firewall rule you navigate to &lt;a href="https://console.cloud.google.com/networking/firewalls/list" rel="noopener noreferrer"&gt;VPC network &amp;gt; Firewall rules&lt;/a&gt; and there you click on &lt;code&gt;Create Firewall Rule&lt;/code&gt; to configure the missing information.&lt;/p&gt;

&lt;p&gt;Under &lt;code&gt;Target tags&lt;/code&gt; you enter the same value you used as &lt;code&gt;Network tags&lt;/code&gt; during the configuration of the VM instance. This closes the link between the instance and this firewall rule.&lt;/p&gt;

&lt;p&gt;The value for the &lt;code&gt;Source IP ranges&lt;/code&gt; is 0.0.0.0/0 which represents any IP address from the internet.&lt;/p&gt;

&lt;p&gt;Under &lt;code&gt;Protocols and ports&lt;/code&gt; you tick UDP protocol and you enter the port number 10000.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fannzfmxfh6u5ci093zli.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fannzfmxfh6u5ci093zli.webp" alt="Firewall rule to allow access to UDP port 10000 on any tagged VM instance" width="800" height="739"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, click on &lt;code&gt;Create&lt;/code&gt; to enable the firewall rule.&lt;/p&gt;

&lt;p&gt;The result should look similar to the list of rules below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx550ory6r0gydwbei8ql.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx550ory6r0gydwbei8ql.webp" alt="Partial list of firewall rules. The relevant rules for Jitsi Meet are shown" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Access the VM instance
&lt;/h2&gt;

&lt;p&gt;Navigate back to &lt;a href="https://console.cloud.google.com/compute/instances" rel="noopener noreferrer"&gt;Compute Engine &amp;gt; VM instances&lt;/a&gt; and click on the SSH button of your instance. This should open a new browser window.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Eventually you have to allow Cloud Console to open popups first.&lt;/p&gt;

&lt;p&gt;After a short initialisation the connection should be established and you are greeted by a bash prompt on Linux.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install Jitsi Meet software
&lt;/h2&gt;

&lt;p&gt;The following steps are based on the official &lt;a href="https://github.com/jitsi/jitsi-meet/blob/master/doc/quick-install.md" rel="noopener noreferrer"&gt;Jitsi Meet quick install&lt;/a&gt; guide on GitHub - with a few additional notes and modifications on my side.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check hostname
&lt;/h3&gt;

&lt;p&gt;First, verify the assignment of the Fully Qualified Domain Name (FQDN) with the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt;
&lt;span class="go"&gt;meet.mscc.mu
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At the same time check that the name resolution has been added to the &lt;code&gt;hosts&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/hosts
127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

10.128.0.2 meet.mscc.mu meet  &lt;span class="c"&gt;# Added by Google&lt;/span&gt;
169.254.169.254 metadata.google.internal  &lt;span class="c"&gt;# Added by Google&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Run commands as user &lt;code&gt;root&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Many of the installation steps require elevated privileges. If you are logged in using a regular user account, you may need to increase your permissions.&lt;/p&gt;

&lt;p&gt;Either use &lt;code&gt;sudo&lt;/code&gt; for individual commands or temporarily change user context and operate as user root.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Although not recommended it's faster to complete the installation as root.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add the Jitsi package repository
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'deb https://download.jitsi.org stable/'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/apt/sources.list.d/jitsi-stable.list 
wget &lt;span class="nt"&gt;-qO&lt;/span&gt; -  https://download.jitsi.org/jitsi-key.gpg.key | &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-key add -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Jitsi repository uses a secured URL which requires that you add the HTTPS transport option to apt, then you update the local repository cache, and finally you install the package of Jitsi Meet and all dependencies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Ensure support is available for apt repositories served via HTTPS&lt;/span&gt;
apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; apt-transport-https

&lt;span class="c"&gt;# Retrieve the latest package versions across all repositories&lt;/span&gt;
apt-get update

&lt;span class="c"&gt;# Perform jitsi-meet installation&lt;/span&gt;
apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; jitsi-meet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;During the process you will be asked to enter the FQDN or hostname of your instance of Jitsi Meet. Enter the hostname that we verified already and hit &lt;code&gt;OK&lt;/code&gt; to continue the installation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2511jbmrgltyyb0owbc2.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2511jbmrgltyyb0owbc2.webp" alt="Enter hostname used in Jitsi Videobridge" width="800" height="484"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, you will be ask to configure SSL certificate of your Jitsi Meet domain. Here keep the default selection to generate a self-signed certificate and hit &lt;code&gt;OK&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffs3yf0pp30qqjpywlu4a.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffs3yf0pp30qqjpywlu4a.webp" alt="Choose the default option to generate an SSL certificate" width="800" height="506"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We are going to generate an SSL certificate provided by &lt;a href="https://letsencrypt.org/" rel="noopener noreferrer"&gt;Let's Encrypt&lt;/a&gt; in the next step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install Let's Encrypt certificate
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Verify that the DNS record has been assigned to your static external IP address and it has been distributed globally before you try to apply the Let's Encrypt SSL certificate. See &lt;code&gt;Verify DNS configuration&lt;/code&gt; above on how to do that.&lt;/p&gt;

&lt;p&gt;At the time of writing there was a small issue running the script as described on GitHub: &lt;a href="https://github.com/jitsi/jitsi-meet/issues/5929" rel="noopener noreferrer"&gt;Lets Encrypt setup error about missing file #5929&lt;/a&gt;. The workaround is to create the expected deployment hook manually yourself &lt;strong&gt;before&lt;/strong&gt; running the certificate installation script.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Workaround for missing deployment script&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /etc/letsencrypt/renewal-hooks/deploy/ 
&lt;span class="nb"&gt;touch&lt;/span&gt; /etc/letsencrypt/renewal-hooks/deploy/0000-coturn-certbot-deploy.sh
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x /etc/letsencrypt/renewal-hooks/deploy/0000-coturn-certbot-deploy.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, run the following shell script as mentioned in the quick install guide.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/usr/share/jitsi-meet/scripts/install-letsencrypt-cert.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The script is going to ask you for an email address to send notifications from Let's Encrypt to. Then your terminal is going to provide you with tons of information and the outcome should look similar to below. Look for &lt;code&gt;Congratulations!&lt;/code&gt; to be sure that the SSL certificate has been successfully requested from &lt;a href="https://letsencrypt.org/" rel="noopener noreferrer"&gt;Let's Encrypt&lt;/a&gt; and applied to your system.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxsuts6utd8hqv4swu6zb.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxsuts6utd8hqv4swu6zb.webp" alt="Successful generation and distribution of SSL certificate by Let's Encrypt" width="796" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Basically your installation is complete now.&lt;br&gt;&lt;br&gt;
You shall be able to load your FQDN in your browser. In case you run into any trouble kindly repeat the steps above or refer to the official &lt;a href="https://github.com/jitsi/jitsi-meet/blob/master/doc/quick-install.md" rel="noopener noreferrer"&gt;Jitsi Meet quick install&lt;/a&gt; or the &lt;a href="https://community.jitsi.org/" rel="noopener noreferrer"&gt;Jitsi Community Forum&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;However there are probably some additional considerations prior to operating your instance of Jitsi Meet server on the internet.&lt;/p&gt;
&lt;h2&gt;
  
  
  Adjust nginx configuration file
&lt;/h2&gt;

&lt;p&gt;The default configuration of &lt;a href="https://www.nginx.com/" rel="noopener noreferrer"&gt;nginx&lt;/a&gt; created by the Jitsi Meet package is not optimal and you should make a few changes to it. Open the file with your preferred text editor&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano /etc/nginx/sites-enabled/meet.mscc.mu.conf 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Change the default protocol to HTTP/2
&lt;/h3&gt;

&lt;p&gt;Look for the &lt;code&gt;listen&lt;/code&gt; directives and add the value &lt;code&gt;http2&lt;/code&gt; at the end of both. It shall look like so.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt; &lt;span class="s"&gt;http2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="s"&gt;[::]:443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt; &lt;span class="s"&gt;http2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Change SSL protocol versions and ciphers
&lt;/h3&gt;

&lt;p&gt;By default nginx is enabled to support TLS 1.0, TLS 1.1 and TLS 1.2. However the two former protocols are legacy protocol that shouldn't be used. TLS v1.0 and TLS v1.1 have been deprecated in January 2020 by modern browsers. Hence you should change the ssl_protocols directive like so.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;    &lt;span class="c1"&gt;# ssl_protocols TLSv1 TLSv1.1 TLSv1.2;&lt;/span&gt;
    &lt;span class="k"&gt;ssl_protocols&lt;/span&gt; &lt;span class="s"&gt;TLSv1.2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depending on the &lt;a href="https://www.nginx.com/" rel="noopener noreferrer"&gt;nginx&lt;/a&gt; version TLS 1.3 might be an additional option. You might consider to replace the existing directive of SSL ciphers with the following value.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;    &lt;span class="k"&gt;ssl_ciphers&lt;/span&gt; &lt;span class="s"&gt;'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;a href="https://ssl-config.mozilla.org/" rel="noopener noreferrer"&gt;Mozilla SSL Configuration Generator&lt;/a&gt; is definitely worth a look. The Intermediate configuration would be the recommended choice. Perhaps you might like to read &lt;a href="https://github.com/ssllabs/research/wiki/SSL-and-TLS-Deployment-Best-Practices" rel="noopener noreferrer"&gt;SSL and TLS Deployment Best Practices&lt;/a&gt; for more background information.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add more HTTP headers
&lt;/h3&gt;

&lt;p&gt;Next, you should define a few more HTTP header directives to improve your default configuration. Open the nginx config file again and add the following lines right after the existing &lt;code&gt;add_header&lt;/code&gt; directive related to &lt;a href="https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security" rel="noopener noreferrer"&gt;HSTS&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;    &lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Content-Type-Options&lt;/span&gt; &lt;span class="s"&gt;nosniff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;# Don't use with iFrames, e.g. Jitsi Meet Desktop (Electron) app&lt;/span&gt;
    &lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Frame-Options&lt;/span&gt; &lt;span class="s"&gt;SAMEORIGIN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-XSS-Protection&lt;/span&gt; &lt;span class="s"&gt;"1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;mode=block"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Referrer-Policy&lt;/span&gt; &lt;span class="s"&gt;no-referrer-when-downgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The Jitsi Meet Electron application for desktop systems cannot load your instance if the HTTP header &lt;code&gt;X-Frame-Options&lt;/code&gt; has been set. Either comment or remove that directive if you are planning to use the application.&lt;/p&gt;

&lt;p&gt;Save the configuration after each change and run a &lt;code&gt;configtest&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;service nginx configtest
[ ok ] Testing nginx configuration:.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the result is OK restart nginx as usual. Otherwise, inspect the log file located at &lt;code&gt;/var/log/nginx/error.log&lt;/code&gt; for any error entries.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;service nginx restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In case that you are interested to see the impact of your changes open the &lt;a href="https://www.ssllabs.com/ssltest/index.html" rel="noopener noreferrer"&gt;Qualys SSL Server Test&lt;/a&gt; and validate your domain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Increase number of processes and open files
&lt;/h2&gt;

&lt;p&gt;The quick install guide mentions that the default configuration of a system is good for less than 100 participants. To avoid running into any unexpected situations I suggest that you increase that value already now.&lt;/p&gt;

&lt;p&gt;Open the file &lt;code&gt;/etc/systemd/system.conf&lt;/code&gt; and add the following lines at the end.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;DefaultLimitNOFILE&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;65000&lt;/span&gt;
&lt;span class="py"&gt;DefaultLimitNPROC&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;65000&lt;/span&gt;
&lt;span class="py"&gt;DefaultTasksMax&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;65000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reload the systemd changes on a running system and restart your Jitsi instance with those two commands.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl daemon-reload
service jitsi-videobridge2 restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To verify that the settings have been applied run the following command and check the value of &lt;code&gt;Tasks: XX (limit: 65000)&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;service jitsi-videobridge2 status
● jitsi-videobridge2.service - Jitsi Videobridge
&lt;/span&gt;&lt;span class="gp"&gt;   Loaded: loaded (/lib/systemd/system/jitsi-videobridge2.service;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;enabled&lt;span class="p"&gt;;&lt;/span&gt; vendor preset: enabled&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;   Active: active (running) since Thu 2020-04-16 11:23:08 UTC;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;14s ago
&lt;span class="gp"&gt;  Process: 7896 ExecStartPost=/bin/bash -c echo $&lt;/span&gt;MAINPID &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /var/run/jitsi-videobridge/jitsi-videobridge.pid &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;e
&lt;span class="go"&gt;xited, status=0/SUCCESS)
 Main PID: 7895 (java)
    Tasks: 38 (limit: 65000)
&lt;/span&gt;&lt;span class="c"&gt;...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Confirm your installation is working
&lt;/h2&gt;

&lt;p&gt;Open a new browser tab or better an incognito window and navigate to the FQDN you specified during the installation. You shall be greeted by the Jitsi Meet default page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbfqwy93vlr440yenlq7f.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbfqwy93vlr440yenlq7f.webp" alt="Welcome to your own Jitsi Meet video conferencing system" width="800" height="788"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Congratulations!
&lt;/h2&gt;

&lt;p&gt;When you click on the gear symbol in the top right corner your browser should ask for permissions to access microphone and camera.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fll1q7ivtrjf4kadd10n7.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fll1q7ivtrjf4kadd10n7.webp" alt="Grant permissions to access your microphone and camera" width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;code&gt;Allow&lt;/code&gt; in both cases and continue to configure your devices you would like to use in Jitsi Meet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8un2uy7zmx54i31vwmdb.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8un2uy7zmx54i31vwmdb.webp" alt="It's working - customise your attendee profile" width="619" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Change to the tab &lt;code&gt;Profile&lt;/code&gt; to provide more information like your displayed name in the meeting rooms. On the tab &lt;code&gt;More&lt;/code&gt; you are able to configure your preferred language.&lt;/p&gt;

&lt;p&gt;Finally, enter any value to start a new meeting and click on GO.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F67oh1bmwhs8nw1sa733v.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F67oh1bmwhs8nw1sa733v.webp" alt="Enter any meeting room in CamelCase writing" width="757" height="130"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The use of camel-case writing forms the URL to access the meeting and is automatically converted into blanks after you entered the meeting room.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkdolep1ynyugx4dcjool.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkdolep1ynyugx4dcjool.webp" alt="CamelCase is converted to blanks in the room name" width="720" height="144"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enjoy your very own Jitsi Meet video conferencing system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automate it with gcloud
&lt;/h2&gt;

&lt;p&gt;All steps above can be executed by using &lt;code&gt;gcloud&lt;/code&gt; commands. Best might be to use your instance of Cloud Shell to create a VM instance and to install Jitsi Meet.&lt;/p&gt;

&lt;p&gt;Make sure that you have a domain name prepared.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create the infrastructure
&lt;/h3&gt;

&lt;p&gt;You would probably adjust the environmental variables at the top to change region, zone, instance name and your DNS hostname.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Define your preferences and values - to CHANGE!&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;REGION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;us-central1
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ZONE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;us-central1-a
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;VM_INSTANCE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mscc-jitsi-dummy
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FQDN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;meet.mscc.mu

&lt;span class="c"&gt;# Enable Compute Engine&lt;/span&gt;
gcloud services &lt;span class="nb"&gt;enable &lt;/span&gt;compute.googleapis.com

&lt;span class="c"&gt;# Reserve and retrieve static IP address&lt;/span&gt;
gcloud compute addresses create &lt;span class="nv"&gt;$VM_INSTANCE&lt;/span&gt;&lt;span class="nt"&gt;-ip&lt;/span&gt; &lt;span class="nt"&gt;--project&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$DEVSHELL_PROJECT_ID&lt;/span&gt; &lt;span class="nt"&gt;--description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Static external IP address for Jitsi Meet VM instance"&lt;/span&gt; &lt;span class="nt"&gt;--region&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$REGION&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;IP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;gcloud compute addresses describe &lt;span class="nv"&gt;$VM_INSTANCE&lt;/span&gt;&lt;span class="nt"&gt;-ip&lt;/span&gt; &lt;span class="nt"&gt;--region&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$REGION&lt;/span&gt; &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'get(address)'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Create VM instance with hostname and attach IP address&lt;/span&gt;
gcloud beta compute &lt;span class="nt"&gt;--project&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$DEVSHELL_PROJECT_ID&lt;/span&gt; instances create &lt;span class="nv"&gt;$VM_INSTANCE&lt;/span&gt; &lt;span class="nt"&gt;--hostname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$FQDN&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$ZONE&lt;/span&gt; &lt;span class="nt"&gt;--machine-type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;n1-standard-1 &lt;span class="nt"&gt;--subnet&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;default &lt;span class="nt"&gt;--address&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$IP&lt;/span&gt; &lt;span class="nt"&gt;--network-tier&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;PREMIUM &lt;span class="nt"&gt;--tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;jitsi,http-server,https-server &lt;span class="nt"&gt;--image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;debian-9-stretch-v20200309 &lt;span class="nt"&gt;--image-project&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;debian-cloud &lt;span class="nt"&gt;--boot-disk-size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10GB &lt;span class="nt"&gt;--boot-disk-type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;pd-standard &lt;span class="nt"&gt;--boot-disk-device-name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$VM_INSTANCE&lt;/span&gt; &lt;span class="nt"&gt;--reservation-affinity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;any

&lt;span class="c"&gt;# Attach firewall rules (might be already present, no big deal)&lt;/span&gt;
gcloud compute &lt;span class="nt"&gt;--project&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$DEVSHELL_PROJECT_ID&lt;/span&gt; firewall-rules create default-allow-http &lt;span class="nt"&gt;--direction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;INGRESS &lt;span class="nt"&gt;--priority&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1000 &lt;span class="nt"&gt;--network&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;default &lt;span class="nt"&gt;--action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ALLOW &lt;span class="nt"&gt;--rules&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tcp:80 &lt;span class="nt"&gt;--source-ranges&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.0.0.0/0 &lt;span class="nt"&gt;--target-tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http-server
gcloud compute &lt;span class="nt"&gt;--project&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$DEVSHELL_PROJECT_ID&lt;/span&gt; firewall-rules create default-allow-https &lt;span class="nt"&gt;--direction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;INGRESS &lt;span class="nt"&gt;--priority&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1000 &lt;span class="nt"&gt;--network&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;default &lt;span class="nt"&gt;--action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ALLOW &lt;span class="nt"&gt;--rules&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tcp:443 &lt;span class="nt"&gt;--source-ranges&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.0.0.0/0 &lt;span class="nt"&gt;--target-tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https-server
gcloud compute &lt;span class="nt"&gt;--project&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$DEVSHELL_PROJECT_ID&lt;/span&gt; firewall-rules create default-allow-10k &lt;span class="nt"&gt;--description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Allow UDP packets for VM instance running Jitsi Meet server"&lt;/span&gt; &lt;span class="nt"&gt;--direction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;INGRESS &lt;span class="nt"&gt;--priority&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1000 &lt;span class="nt"&gt;--network&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;default &lt;span class="nt"&gt;--action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ALLOW &lt;span class="nt"&gt;--rules&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;udp:10000 &lt;span class="nt"&gt;--source-ranges&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.0.0.0/0 &lt;span class="nt"&gt;--target-tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;jitsi

&lt;span class="c"&gt;# Display external IP address and connect to instance using SSH&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$IP&lt;/span&gt;
gcloud compute ssh &lt;span class="nv"&gt;$VM_INSTANCE&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$ZONE&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After execution you are going to see the external IP address in the Shell, and you should be connected to the new VM instance.&lt;/p&gt;

&lt;p&gt;In case that the remote VM instance does not respond to the SSH connection or times out, wait a short while and repeat the last command to SSH into the instance.&lt;/p&gt;

&lt;p&gt;Now is the right time to verify that your DNS record is up-to-date and matches the external IP address of your VM instance &lt;strong&gt;before&lt;/strong&gt; you continue to install Jitsi Meet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install Jitsi Meet server
&lt;/h3&gt;

&lt;p&gt;This paragraph summarizes the commands used above to install Jitsi Meet server. They should be run as user root. Change into an interactive session of user &lt;code&gt;root&lt;/code&gt; first.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run the following to complete the basic installation of Jitsi Meet server on the VM instance.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Increase number of processes and open files&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/systemd/system.conf &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
DefaultLimitNOFILE=65000
DefaultLimitNPROC=65000
DefaultTasksMax=65000
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;systemctl daemon-reload

&lt;span class="c"&gt;# Add the package repository&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'deb https://download.jitsi.org stable/'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/apt/sources.list.d/jitsi-stable.list 
wget &lt;span class="nt"&gt;-qO&lt;/span&gt; -  https://download.jitsi.org/jitsi-key.gpg.key | &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-key add -

&lt;span class="c"&gt;# Ensure support is available for apt repositories served via HTTPS&lt;/span&gt;
apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; apt-transport-https  
&lt;span class="c"&gt;# Retrieve the latest package versions across all repositories&lt;/span&gt;
apt-get update  
&lt;span class="c"&gt;# Perform jitsi-meet installation&lt;/span&gt;
apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; jitsi-meet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Last, prepare the system for an SSL certificate provided by Let's Encrypt by running the following commands.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Without properly configured DNS this is going to fail.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Workaround for missing deployment script&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /etc/letsencrypt/renewal-hooks/deploy/ 
&lt;span class="nb"&gt;touch&lt;/span&gt; /etc/letsencrypt/renewal-hooks/deploy/0000-coturn-certbot-deploy.sh
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x /etc/letsencrypt/renewal-hooks/deploy/0000-coturn-certbot-deploy.sh

&lt;span class="c"&gt;# Get SSL certificate from Let's Encrypt&lt;/span&gt;
/usr/share/jitsi-meet/scripts/install-letsencrypt-cert.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You have to specify an email address to receive notifications regarding your certificates from Let's Encrypt.&lt;/p&gt;

&lt;p&gt;Congrats, your Jitsi Meet server is now operational. Maybe you like to review the nginx changes described above to improve your setup a little bit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Securing your Jitsi Meet server
&lt;/h2&gt;

&lt;p&gt;The default installation in this article is kind of basic and provides you a jumpstart to run your own video conferencing system. In the next article of this series I'm going to describe how you &lt;a&gt;enable authentication and secure your Jitsi Meet instance&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>community</category>
      <category>jitsi</category>
      <category>googlecloud</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
