<?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: febryandana</title>
    <description>The latest articles on DEV Community by febryandana (@febryandana).</description>
    <link>https://dev.to/febryandana</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F539900%2Fcc55b077-9635-47eb-9edd-1dc8ce62bb36.jpeg</url>
      <title>DEV Community: febryandana</title>
      <link>https://dev.to/febryandana</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/febryandana"/>
    <language>en</language>
    <item>
      <title>OpenVPN with FreeRADIUS User Auth</title>
      <dc:creator>febryandana</dc:creator>
      <pubDate>Sat, 06 Aug 2022 05:04:29 +0000</pubDate>
      <link>https://dev.to/febryandana/openvpn-with-freeradius-user-auth-4912</link>
      <guid>https://dev.to/febryandana/openvpn-with-freeradius-user-auth-4912</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;OpenVPN can utilize RADIUS services as a source of authentication for its user accounts. In this article we will try to integrate OpenVPN with FreeRADIUS and utilize DaloRADIUS for the FreeRADIUS GUI dashboard service. That way, administrators can easily manage OpenVPN users in one place.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. FreeRADIUS &amp;amp; DaloRADIUS Configuration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  FreeRADIUS
&lt;/h3&gt;

&lt;p&gt;1) Install Web Server&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;
apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt &lt;span class="nt"&gt;-y&lt;/span&gt; upgrade
apt &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;apache2
apt &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;php libapache2-mod-php php-&lt;span class="o"&gt;{&lt;/span&gt;gd,common,mail,mail-mime,mysql,pear,db,mbstring,xml,curl&lt;span class="o"&gt;}&lt;/span&gt;
php &lt;span class="nt"&gt;-v&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;2) Install DB server&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

apt &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;mariadb-server
mysql_secure_installation


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;3) Create RADIUS database&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt;

MariaDB &lt;span class="o"&gt;[(&lt;/span&gt;none&lt;span class="o"&gt;)]&amp;gt;&lt;/span&gt; CREATE DATABASE radius&lt;span class="p"&gt;;&lt;/span&gt;
MariaDB &lt;span class="o"&gt;[(&lt;/span&gt;none&lt;span class="o"&gt;)]&amp;gt;&lt;/span&gt; GRANT ALL ON radius.&lt;span class="k"&gt;*&lt;/span&gt; TO radius@localhost IDENTIFIED BY &lt;span class="s2"&gt;"StrongPassword"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
MariaDB &lt;span class="o"&gt;[(&lt;/span&gt;none&lt;span class="o"&gt;)]&amp;gt;&lt;/span&gt; FLUSH PRIVILEGES&lt;span class="p"&gt;;&lt;/span&gt;
MariaDB &lt;span class="o"&gt;[(&lt;/span&gt;none&lt;span class="o"&gt;)]&amp;gt;&lt;/span&gt; QUIT


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;4) Install &amp;amp; Configure FreeRADIUS&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

apt &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;freeradius freeradius-mysql freeradius-utils


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Import freeRADIUS sql database&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt; radius &amp;lt; /etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql
mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"use radius; show tables;"&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Create softlink to enable sql mod&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;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /etc/freeradius/3.0/mods-available/sql /etc/freeradius/3.0/mods-enabled/


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Configure sql module&lt;/p&gt;

&lt;p&gt;Comment SSL sections in mysql&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

nano /etc/freeradius/3.0/mods-enabled/sql

&lt;span class="nt"&gt;---&lt;/span&gt;
sql &lt;span class="o"&gt;{&lt;/span&gt;
driver &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"rlm_sql_mysql"&lt;/span&gt;
dialect &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"mysql"&lt;/span&gt;

&lt;span class="c"&gt;# Connection info:&lt;/span&gt;
server &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"localhost"&lt;/span&gt;
port &lt;span class="o"&gt;=&lt;/span&gt; 3306
login &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"radius"&lt;/span&gt;
password &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"StrongPassword"&lt;/span&gt;

&lt;span class="c"&gt;# Database table configuration for everything except Oracle&lt;/span&gt;
radius_db &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"radius"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# Set to ‘yes’ to read radius clients from the database (‘nas’ table)&lt;/span&gt;
&lt;span class="c"&gt;# Clients will ONLY be read on server startup.&lt;/span&gt;
read_clients &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;yes&lt;/span&gt;

&lt;span class="c"&gt;# Table to keep radius client info&lt;/span&gt;
client_table &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"nas"&lt;/span&gt;
&lt;span class="nt"&gt;---&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Change Group&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;chgrp&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt; freerad /etc/freeradius/3.0/mods-available/sql
&lt;span class="nb"&gt;chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; freerad:freerad /etc/freeradius/3.0/mods-enabled/sql


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Restart freeradius service&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;systemctl restart freeradius.service


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  DaloRADIUS
&lt;/h3&gt;

&lt;p&gt;1) Install daloRadius&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

apt &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;wget unzip
wget https://github.com/lirantal/daloradius/archive/master.zip
unzip master.zip
&lt;span class="nb"&gt;mv &lt;/span&gt;daloradius-master daloradius
&lt;span class="nb"&gt;cd &lt;/span&gt;daloradius


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;2) Configure daloRadius&lt;/p&gt;

&lt;p&gt;Import daloRadius tables&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt; radius &amp;lt; contrib/db/fr2-mysql-daloradius-and-freeradius.sql
mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt; radius &amp;lt; contrib/db/mysql-daloradius.sql


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Move daloRadius folder to Web Server&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;cd&lt;/span&gt; ..
&lt;span class="nb"&gt;mv &lt;/span&gt;daloradius /var/www/html/
&lt;span class="nb"&gt;mv&lt;/span&gt; /var/www/html/daloradius/library/daloradius.conf.php.sample /var/www/html/daloradius/library/daloradius.conf.php
&lt;span class="nb"&gt;chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; www-data:www-data /var/www/html/daloradius/
&lt;span class="nb"&gt;chmod &lt;/span&gt;664 /var/www/html/daloradius/library/daloradius.conf.php


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Configure daloRadius connection&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

nano /var/www/html/daloradius/library/daloradius.conf.php

&lt;span class="nt"&gt;---&lt;/span&gt;
&lt;span class="nv"&gt;$configValues&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'CONFIG_DB_HOST'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'localhost'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$configValues&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'CONFIG_DB_PORT'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'3306'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$configValues&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'CONFIG_DB_USER'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'radius'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$configValues&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'CONFIG_DB_PASS'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'StrongPassword'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$configValues&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'CONFIG_DB_NAME'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'radius'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;---&lt;/span&gt;

&lt;span class="nb"&gt;touch&lt;/span&gt; /tmp/daloradius.log


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Restart services&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

systemctl restart freeradius.service apache2.service


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;3) Verify daloRadius&lt;/p&gt;

&lt;p&gt;Access via &lt;a href="http://IP_ADDRESS/daloradius/login.php" rel="noopener noreferrer"&gt;http://IP_ADDRESS/daloradius/login.php&lt;/a&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Default User &amp;amp; Password:
User = administrator
Password = radius


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ffebryandana%2Fmy-hugo-site%2Fmain%2Fcontent%2Fposts%2Fimages%2F2022-07-30-integrasi-openvpn-freeradius%2Fdaloradius-login.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ffebryandana%2Fmy-hugo-site%2Fmain%2Fcontent%2Fposts%2Fimages%2F2022-07-30-integrasi-openvpn-freeradius%2Fdaloradius-login.png" alt="daloradius login page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ffebryandana%2Fmy-hugo-site%2Fmain%2Fcontent%2Fposts%2Fimages%2F2022-07-30-integrasi-openvpn-freeradius%2Fdaloradius-homepage.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ffebryandana%2Fmy-hugo-site%2Fmain%2Fcontent%2Fposts%2Fimages%2F2022-07-30-integrasi-openvpn-freeradius%2Fdaloradius-homepage.png" alt="daloradius homepage"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ffebryandana%2Fmy-hugo-site%2Fmain%2Fcontent%2Fposts%2Fimages%2F2022-07-30-integrasi-openvpn-freeradius%2Fradtest-radius.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ffebryandana%2Fmy-hugo-site%2Fmain%2Fcontent%2Fposts%2Fimages%2F2022-07-30-integrasi-openvpn-freeradius%2Fradtest-radius.png" alt="radtest"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. OpenVPN Installation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  OpenVPN
&lt;/h3&gt;

&lt;p&gt;We will install OpenVPN by easy way using automation shell script&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; openvpn openvpn-auth-radius freeradius-utils
wget https://git.io/vpn &lt;span class="nt"&gt;-O&lt;/span&gt; openvpn-install.sh
bash openvpn-install.sh

&lt;span class="nt"&gt;---&lt;/span&gt;
Public IPv4 address / &lt;span class="nb"&gt;hostname&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;a.b.c.d]: IP_Server_OpenVPN
&lt;span class="nt"&gt;---&lt;/span&gt;

Change the settings whatever you like


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  OpenVPN RADIUS Plugin
&lt;/h3&gt;

&lt;p&gt;To connect OpenVPN with FreeRADIUS, we need to use external plugin named radiusplugin&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

apt update
apt &lt;span class="nb"&gt;install &lt;/span&gt;openvpn-auth-radius


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Binary file will be downloaded to &lt;code&gt;/usr/lib/openvpn/radiusplugin.so&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Integrate OpenVPN with FreeRADIUS
&lt;/h2&gt;

&lt;h3&gt;
  
  
  FreeRadius Side
&lt;/h3&gt;

&lt;p&gt;1) Create NAS (Network Access Server) for OpenVPN server&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Via DaloRadius:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NAS IP/Host = 192.168.1.12/24 //IP ADDRESS OPENVPN SERVER&lt;/li&gt;
&lt;li&gt;NAS Secret = fb-ovpn&lt;/li&gt;
&lt;li&gt;NAS Type   = other&lt;/li&gt;
&lt;li&gt;NA Shortname = fb-ovpn&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Via clients.conf:&lt;/p&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;```bash
&lt;/code&gt;&lt;/pre&gt;



&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nano clients.conf

---
client fb-ovpn {
    ipaddr = 192.168.1.12 //IP ADDRESS OPENVPN SERVER
    netmask = 24
    secret = fb-ovpn
    shortname = fb-ovpn
    nastype = other
}
---
&lt;/code&gt;&lt;/pre&gt;


&lt;/li&gt;

&lt;/ul&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Restart freeradius service everytime you need to create new NAS

```bash


systemctl restart freeradius.service


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  OpenVPN Server Side
&lt;/h3&gt;

&lt;p&gt;1) Create cnf file for connecting OpenVPN to FreeRADIUS&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

nano /etc/openvpn/radiusplugin.cnf

&lt;span class="nt"&gt;---&lt;/span&gt;
NAS-Identifier&lt;span class="o"&gt;=&lt;/span&gt;openvpn
Service-Type&lt;span class="o"&gt;=&lt;/span&gt;5
Framed-Protocol&lt;span class="o"&gt;=&lt;/span&gt;1
NAS-Port-Type&lt;span class="o"&gt;=&lt;/span&gt;5
NAS-IP-Address&lt;span class="o"&gt;=&lt;/span&gt;192.168.1.12
&lt;span class="nv"&gt;OpenVPNConfig&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/etc/openvpn/server/server.conf
&lt;span class="nv"&gt;overwriteccfiles&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true
&lt;/span&gt;server
&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="nv"&gt;acctport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1813
&lt;span class="nv"&gt;authport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1812
&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.1.11
        &lt;span class="nv"&gt;retry&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
        &lt;span class="nb"&gt;wait&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
        &lt;span class="nv"&gt;sharedsecret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;fb-ovpn
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;---&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;2) Test connection to RADIUS via server OpenVPN. You need to create user first from DaloRADIUS&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

radtest &lt;span class="o"&gt;{&lt;/span&gt;username&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;password&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;radius_hostname&lt;span class="o"&gt;}&lt;/span&gt; 10 &lt;span class="o"&gt;{&lt;/span&gt;radius_secret&lt;span class="o"&gt;}&lt;/span&gt;

radtest febry febry 192.168.1.11 10 fb-ovpn


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;3) Configure file server.conf on OpenVPN server so that OpenVPN will use users from FreeRADIUS server&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

nano /etc/openvpn/server/server.conf

&lt;span class="nt"&gt;---&lt;/span&gt;
plugin /usr/lib/openvpn/radiusplugin.so /etc/openvpn/radiusplugin.cnf
verify-client-cert
key-direction 0
duplicate-cn
&lt;span class="nb"&gt;local &lt;/span&gt;192.168.1.12
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh.pem
auth SHA512
tls-crypt tc.key
topology subnet
server 10.8.0.0 255.255.255.0
push &lt;span class="s2"&gt;"redirect-gateway def1 bypass-dhcp"&lt;/span&gt;
ifconfig-pool-persist ipp.txt
push &lt;span class="s2"&gt;"dhcp-option DNS 8.8.8.8"&lt;/span&gt;
keepalive 10 120
cipher AES-256-CBC
user nobody
group nogroup
persist-key
persist-tun
verb 3
crl-verify crl.pem
explicit-exit-notify
&lt;span class="nt"&gt;---&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;4) Create ovpn file for clients&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

nano /root/client.ovpn

&lt;span class="nt"&gt;---&lt;/span&gt;
key-direction 1
auth-user-pass
&lt;span class="p"&gt;;&lt;/span&gt;user nobody
&lt;span class="p"&gt;;&lt;/span&gt;group nogroup

client
dev tun
proto udp
remote 192.168.1.12 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth SHA512
cipher AES-256-CBC
ignore-unknown-option block-outside-dns
block-outside-dns
verb 3
&amp;lt;ca&amp;gt;
...
&lt;span class="nt"&gt;---&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  4. Test connection to OpenVPN with RADIUS user
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Conducted on node fb-ubuntu (192.168.2.11 - lab6)
&lt;/h3&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

openvpn &lt;span class="nt"&gt;--config&lt;/span&gt; client.ovpn


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ffebryandana%2Fmy-hugo-site%2Fmain%2Fcontent%2Fposts%2Fimages%2F2022-07-30-integrasi-openvpn-freeradius%2Fovpn-radius.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ffebryandana%2Fmy-hugo-site%2Fmain%2Fcontent%2Fposts%2Fimages%2F2022-07-30-integrasi-openvpn-freeradius%2Fovpn-radius.png" alt="ovpn-radius test"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conducted on personal computer
&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;sudo &lt;/span&gt;openvpn &lt;span class="nt"&gt;--config&lt;/span&gt; client.ovpn


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ffebryandana%2Fmy-hugo-site%2Fmain%2Fcontent%2Fposts%2Fimages%2F2022-07-30-integrasi-openvpn-freeradius%2Fovpn-pc-cli.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ffebryandana%2Fmy-hugo-site%2Fmain%2Fcontent%2Fposts%2Fimages%2F2022-07-30-integrasi-openvpn-freeradius%2Fovpn-pc-cli.png" alt="ovpn-radius pc cli"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ffebryandana%2Fmy-hugo-site%2Fmain%2Fcontent%2Fposts%2Fimages%2F2022-07-30-integrasi-openvpn-freeradius%2Fovpn-pc-gui-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ffebryandana%2Fmy-hugo-site%2Fmain%2Fcontent%2Fposts%2Fimages%2F2022-07-30-integrasi-openvpn-freeradius%2Fovpn-pc-gui-1.png" alt="ovpn-radius pc gui 1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ffebryandana%2Fmy-hugo-site%2Fmain%2Fcontent%2Fposts%2Fimages%2F2022-07-30-integrasi-openvpn-freeradius%2Fovpn-pc-gui-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ffebryandana%2Fmy-hugo-site%2Fmain%2Fcontent%2Fposts%2Fimages%2F2022-07-30-integrasi-openvpn-freeradius%2Fovpn-pc-gui-2.png" alt="ovpn-radius pc gui 2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Known Issues
&lt;/h2&gt;

&lt;p&gt;1) Unknown column 'acctupdatetime' in 'field list'&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

DaloRadius, RADIUS log :
ERROR: &lt;span class="o"&gt;(&lt;/span&gt;21&lt;span class="o"&gt;)&lt;/span&gt; sql: ERROR: rlm_sql_mysql: ERROR 1054 &lt;span class="o"&gt;(&lt;/span&gt;Unknown column &lt;span class="s1"&gt;'acctupdatetime'&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s1"&gt;'field list'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;: 42S22 


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Solve: Rebuild table radacct&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt; radius

DROP TABLE radacct&lt;span class="p"&gt;;&lt;/span&gt;

CREATE TABLE radacct &lt;span class="o"&gt;(&lt;/span&gt;
radacctid bigint&lt;span class="o"&gt;(&lt;/span&gt;21&lt;span class="o"&gt;)&lt;/span&gt; NOT NULL auto_increment,
acctsessionid varchar&lt;span class="o"&gt;(&lt;/span&gt;64&lt;span class="o"&gt;)&lt;/span&gt; NOT NULL default &lt;span class="s1"&gt;''&lt;/span&gt;,
acctuniqueid varchar&lt;span class="o"&gt;(&lt;/span&gt;32&lt;span class="o"&gt;)&lt;/span&gt; NOT NULL default &lt;span class="s1"&gt;''&lt;/span&gt;,
username varchar&lt;span class="o"&gt;(&lt;/span&gt;64&lt;span class="o"&gt;)&lt;/span&gt; NOT NULL default &lt;span class="s1"&gt;''&lt;/span&gt;,
groupname varchar&lt;span class="o"&gt;(&lt;/span&gt;64&lt;span class="o"&gt;)&lt;/span&gt; NOT NULL default &lt;span class="s1"&gt;''&lt;/span&gt;,
realm varchar&lt;span class="o"&gt;(&lt;/span&gt;64&lt;span class="o"&gt;)&lt;/span&gt; default &lt;span class="s1"&gt;''&lt;/span&gt;,
nasipaddress varchar&lt;span class="o"&gt;(&lt;/span&gt;15&lt;span class="o"&gt;)&lt;/span&gt; NOT NULL default &lt;span class="s1"&gt;''&lt;/span&gt;,
nasportid varchar&lt;span class="o"&gt;(&lt;/span&gt;15&lt;span class="o"&gt;)&lt;/span&gt; default NULL,
nasporttype varchar&lt;span class="o"&gt;(&lt;/span&gt;32&lt;span class="o"&gt;)&lt;/span&gt; default NULL,
acctstarttime datetime NULL default NULL,
acctupdatetime datetime NULL default NULL,
acctstoptime datetime NULL default NULL,
acctinterval int&lt;span class="o"&gt;(&lt;/span&gt;12&lt;span class="o"&gt;)&lt;/span&gt; default NULL,
acctsessiontime int&lt;span class="o"&gt;(&lt;/span&gt;12&lt;span class="o"&gt;)&lt;/span&gt; unsigned default NULL,
acctauthentic varchar&lt;span class="o"&gt;(&lt;/span&gt;32&lt;span class="o"&gt;)&lt;/span&gt; default NULL,
connectinfo_start varchar&lt;span class="o"&gt;(&lt;/span&gt;50&lt;span class="o"&gt;)&lt;/span&gt; default NULL,
connectinfo_stop varchar&lt;span class="o"&gt;(&lt;/span&gt;50&lt;span class="o"&gt;)&lt;/span&gt; default NULL,
acctinputoctets bigint&lt;span class="o"&gt;(&lt;/span&gt;20&lt;span class="o"&gt;)&lt;/span&gt; default NULL,
acctoutputoctets bigint&lt;span class="o"&gt;(&lt;/span&gt;20&lt;span class="o"&gt;)&lt;/span&gt; default NULL,
calledstationid varchar&lt;span class="o"&gt;(&lt;/span&gt;50&lt;span class="o"&gt;)&lt;/span&gt; NOT NULL default &lt;span class="s1"&gt;''&lt;/span&gt;,
callingstationid varchar&lt;span class="o"&gt;(&lt;/span&gt;50&lt;span class="o"&gt;)&lt;/span&gt; NOT NULL default &lt;span class="s1"&gt;''&lt;/span&gt;,
acctterminatecause varchar&lt;span class="o"&gt;(&lt;/span&gt;32&lt;span class="o"&gt;)&lt;/span&gt; NOT NULL default &lt;span class="s1"&gt;''&lt;/span&gt;,
servicetype varchar&lt;span class="o"&gt;(&lt;/span&gt;32&lt;span class="o"&gt;)&lt;/span&gt; default NULL,
framedprotocol varchar&lt;span class="o"&gt;(&lt;/span&gt;32&lt;span class="o"&gt;)&lt;/span&gt; default NULL,
framedipv6address varchar&lt;span class="o"&gt;(&lt;/span&gt;32&lt;span class="o"&gt;)&lt;/span&gt; default NULL,
framedipv6prefix varchar&lt;span class="o"&gt;(&lt;/span&gt;32&lt;span class="o"&gt;)&lt;/span&gt; default NULL,
framedinterfaceid varchar&lt;span class="o"&gt;(&lt;/span&gt;32&lt;span class="o"&gt;)&lt;/span&gt; default NULL,
delegatedipv6prefix varchar&lt;span class="o"&gt;(&lt;/span&gt;32&lt;span class="o"&gt;)&lt;/span&gt; default NULL,
framedipaddress varchar&lt;span class="o"&gt;(&lt;/span&gt;15&lt;span class="o"&gt;)&lt;/span&gt; NOT NULL default &lt;span class="s1"&gt;''&lt;/span&gt;,
PRIMARY KEY &lt;span class="o"&gt;(&lt;/span&gt;radacctid&lt;span class="o"&gt;)&lt;/span&gt;,
UNIQUE KEY acctuniqueid &lt;span class="o"&gt;(&lt;/span&gt;acctuniqueid&lt;span class="o"&gt;)&lt;/span&gt;,
KEY username &lt;span class="o"&gt;(&lt;/span&gt;username&lt;span class="o"&gt;)&lt;/span&gt;,
KEY framedipaddress &lt;span class="o"&gt;(&lt;/span&gt;framedipaddress&lt;span class="o"&gt;)&lt;/span&gt;,
KEY acctsessionid &lt;span class="o"&gt;(&lt;/span&gt;acctsessionid&lt;span class="o"&gt;)&lt;/span&gt;,
KEY acctsessiontime &lt;span class="o"&gt;(&lt;/span&gt;acctsessiontime&lt;span class="o"&gt;)&lt;/span&gt;,
KEY acctstarttime &lt;span class="o"&gt;(&lt;/span&gt;acctstarttime&lt;span class="o"&gt;)&lt;/span&gt;,
KEY acctinterval &lt;span class="o"&gt;(&lt;/span&gt;acctinterval&lt;span class="o"&gt;)&lt;/span&gt;,
KEY acctstoptime &lt;span class="o"&gt;(&lt;/span&gt;acctstoptime&lt;span class="o"&gt;)&lt;/span&gt;,
KEY nasipaddress &lt;span class="o"&gt;(&lt;/span&gt;nasipaddress&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt; ENGINE &lt;span class="o"&gt;=&lt;/span&gt; INNODB&lt;span class="p"&gt;;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;2) Error reading log file: /tmp/daloradius.log&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

error reading log file: /tmp/daloradius.log
looked &lt;span class="k"&gt;for &lt;/span&gt;log file &lt;span class="k"&gt;in&lt;/span&gt; /tmp/daloradius.log but couldn&lt;span class="s1"&gt;'t find it.
if you know where your daloradius log file is located, set it'&lt;/span&gt;s location &lt;span class="k"&gt;in &lt;/span&gt;your library/daloradius.conf file


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Solve: Create new log file&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;touch&lt;/span&gt; /tmp/daloradius.log
&lt;span class="nb"&gt;chown &lt;/span&gt;www-data:www-data daloradius.log
&lt;span class="nb"&gt;chmod &lt;/span&gt;644 /tmp/daloradius.log


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;3) Error reading log file: /var/log/syslog&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

error reading log file: /var/log/syslog
possible cause is file permissions or file does not exist.


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Solve: Change file permission&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;chmod &lt;/span&gt;644 /var/log/syslog


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;4) RADIUS user authentication's type that is compatible with OpenVPN&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[x] cleartext-password&lt;/li&gt;
&lt;li&gt;[ ] User-password (AUTH_FAILED)&lt;/li&gt;
&lt;li&gt;[x] Crypt-password&lt;/li&gt;
&lt;li&gt;[x] MD5-password&lt;/li&gt;
&lt;li&gt;[ ] SHA1-password (AUTH_FAILED)&lt;/li&gt;
&lt;li&gt;[ ] CHAP-password (AUTH_FAILED)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;5) Some OS's dont have &lt;code&gt;nogroup&lt;/code&gt; user &amp;amp; group but they use &lt;code&gt;nobody&lt;/code&gt;, and vice versa. To solve issue with these groups, we can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create user &lt;code&gt;nobody&lt;/code&gt; and group &lt;code&gt;nogroup&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Cretae user &lt;code&gt;nobody&lt;/code&gt; and group &lt;code&gt;nobody&lt;/code&gt;. Then edit &lt;code&gt;group nogroup&lt;/code&gt; to &lt;code&gt;group nobody&lt;/code&gt; in client.ovpn file.&lt;/li&gt;
&lt;li&gt;Comment out &lt;code&gt;user nobody&lt;/code&gt; and &lt;code&gt;group nogroup&lt;/code&gt; in client.ovpn file.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://book.btech.id/books/riset-freeradius" rel="noopener noreferrer"&gt;https://book.btech.id/books/riset-freeradius&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bytexd.com/freeradius-ubuntu/" rel="noopener noreferrer"&gt;https://bytexd.com/freeradius-ubuntu/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://computingforgeeks.com/how-to-install-freeradius-and-daloradius-on-ubuntu/" rel="noopener noreferrer"&gt;https://computingforgeeks.com/how-to-install-freeradius-and-daloradius-on-ubuntu/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Nyr/openvpn-install" rel="noopener noreferrer"&gt;https://github.com/Nyr/openvpn-install&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://go.btech.id/ops/skk/-/wikis/Riset/OpenVPN-Dnsmasq-FreeRADIUS" rel="noopener noreferrer"&gt;https://go.btech.id/ops/skk/-/wikis/Riset/OpenVPN-Dnsmasq-FreeRADIUS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linux.die.net/man/5/clients.conf" rel="noopener noreferrer"&gt;https://linux.die.net/man/5/clients.conf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://serverfault.com/questions/1095415/daloradius-error-3-sql-error-rlm-sql-mysql-error-1054-unknown-column-acc" rel="noopener noreferrer"&gt;https://serverfault.com/questions/1095415/daloradius-error-3-sql-error-rlm-sql-mysql-error-1054-unknown-column-acc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sourceforge.net/p/daloradius/support-requests/27/" rel="noopener noreferrer"&gt;https://sourceforge.net/p/daloradius/support-requests/27/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.osradar.com/openvpn-authentication-with-freeradius/" rel="noopener noreferrer"&gt;https://www.osradar.com/openvpn-authentication-with-freeradius/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>vpn</category>
      <category>authentication</category>
      <category>freeradius</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Dekatanah</title>
      <dc:creator>febryandana</dc:creator>
      <pubDate>Sun, 17 Apr 2022 05:29:31 +0000</pubDate>
      <link>https://dev.to/febryandana/dekatanah-3327</link>
      <guid>https://dev.to/febryandana/dekatanah-3327</guid>
      <description>&lt;p&gt;A microcontroller-based soil fertility detection system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Abstract
&lt;/h2&gt;

&lt;p&gt;Soil is the most used plant growth medium. However, due to various soil conditions, not all plants are also suitable for the particular soil to be used, so a tool or sensor is needed that can read and measure soil fertility. Simple soil fertility measurement can be measured from 2 elements of soil fertility attributes, namely the soil pH element and the soil moisture element. Most of the available soil fertility detection instruments or systems only use one of the soil fertility elements and the data on the detection results can't be stored for a long period, making the readings less effective. From these problems, we conducted research to build a soil fertility detection system that uses a soil pH sensor and a soil moisture sensor that is connected to the Arduino Nano microcontroller and can be run with an application on a smartphone. The results of this study are in the form of a soil fertility detection tool and system that can read soil pH and soil moisture content and an Android smartphone application that is connected to the device via the USB-OTG feature. With this application, a test location is obtained where the soil is tested and then stored in the TinyDB database in the application so that data will not be lost even if the tool is turned off.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keywords&lt;/strong&gt;: &lt;em&gt;soil, fertility, pH sensor, moisture sensor, microcontroller, Android application&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Hardware Specifications
&lt;/h2&gt;

&lt;p&gt;1. Arduino Nano microcontroller&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Isbbcme4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/arduino-nano.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Isbbcme4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/arduino-nano.png" alt="Arduino Nano microcontroller" width="597" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2. Soil pH meter sensor&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AQOIzpJh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/ph-sensor.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AQOIzpJh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/ph-sensor.png" alt="Soil pH meter sensor" width="880" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3. Capacitive soil moisture sensor&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--u7-t4mty--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/capacitive-soil-moisture-sensor.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--u7-t4mty--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/capacitive-soil-moisture-sensor.png" alt="Capacitive soil moisture sensor" width="500" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4. LED lamp indicator&lt;/p&gt;

&lt;p&gt;5. Active Buzzer&lt;/p&gt;

&lt;p&gt;6. Voltage Regulator&lt;/p&gt;

&lt;p&gt;7. Switch/Push button&lt;/p&gt;

&lt;p&gt;8. Diode&lt;/p&gt;

&lt;p&gt;9. Jumper cable&lt;/p&gt;

&lt;p&gt;10. USB-OTG Adapter&lt;/p&gt;

&lt;p&gt;11. Micro USB / Type C USB cable (depends on smartphone USB port)&lt;/p&gt;

&lt;p&gt;12. Printed Circuit Board&lt;/p&gt;

&lt;p&gt;13. Case&lt;/p&gt;

&lt;p&gt;14. Smartphone with support for USB On-The-Go, GPS, and Location Sensor&lt;/p&gt;




&lt;h2&gt;
  
  
  System Design
&lt;/h2&gt;

&lt;h3&gt;
  
  
  System Block Diagram
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7-23Xqgs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/en_block-diagram.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7-23Xqgs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/en_block-diagram.png" alt="System block diagram" width="880" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Hardware Schematic
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RDJ6kFu4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/hardware-schematic.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RDJ6kFu4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/hardware-schematic.png" alt="Hardware schematic" width="727" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Hardware System Flowchart
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MI1xldiq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/flowchart-microcontroller.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MI1xldiq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/flowchart-microcontroller.png" alt="Hardware system flowchart" width="160" height="686"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Android App Main Program Flowchart
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--u4R1l8Ga--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/android-flowchart/main-program.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--u4R1l8Ga--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/android-flowchart/main-program.png" alt="Android main flowchart" width="575" height="844"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Android App Sub Program Flowchart
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Serial communication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6YSnh0IK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/android-flowchart/sub-serial-comm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6YSnh0IK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/android-flowchart/sub-serial-comm.png" alt="Serial communication" width="192" height="728"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clock&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--elylJdgw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/android-flowchart/sub-clock.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--elylJdgw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/android-flowchart/sub-clock.png" alt="Clock" width="274" height="821"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Location sensor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--om32P6r3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/android-flowchart/sub-location-sensor.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--om32P6r3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/android-flowchart/sub-location-sensor.png" alt="Location sensor" width="477" height="781"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Show map marker&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UY5Qdue5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/android-flowchart/sub-show-map.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UY5Qdue5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/android-flowchart/sub-show-map.png" alt="Show map marker" width="198" height="966"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Save data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qu_-NNFW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/android-flowchart/sub-save-data.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qu_-NNFW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/android-flowchart/sub-save-data.png" alt="Save data" width="536" height="728"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delete data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PTpTvFTv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/android-flowchart/sub-delete-data.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PTpTvFTv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/android-flowchart/sub-delete-data.png" alt="Delete data" width="271" height="718"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Save data list&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FWI1E2TB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/android-flowchart/sub-save-list-data.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FWI1E2TB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/android-flowchart/sub-save-list-data.png" alt="Save data list" width="179" height="616"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Prototype Implementation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Hardware prototype
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;PCB design&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UOi6kZZ4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/pcb-design.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UOi6kZZ4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/pcb-design.png" alt="PCB design" width="622" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Final prototype&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--X1_t17m8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/prototype.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--X1_t17m8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/prototype.png" alt="Final prototype" width="820" height="686"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prototype on use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xAxC5sQT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/hardware-usage.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xAxC5sQT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/hardware-usage.png" alt="Prototype on use" width="433" height="623"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Arduino Program
&lt;/h3&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  Android Application Program
&lt;/h3&gt;

&lt;p&gt;This Android application uses Kodular Blocks, read more: &lt;a href="https://docs.kodular.io"&gt;https://docs.kodular.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The full image of these blocks can be seen on: &lt;a href="https://raw.githubusercontent.com/febryandana/dekatanah/main/kodular-blocks/kodular_blocks.png"&gt;&lt;code&gt;kodular-blocks/kodular-blocks.png&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Main program initialization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--i534lykr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/kodular-blocks/main-program-initialization.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i534lykr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/kodular-blocks/main-program-initialization.png" alt="Main program initialization" width="700" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;0pen serial connection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kdZSVq0k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/kodular-blocks/open-serial-conn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kdZSVq0k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/kodular-blocks/open-serial-conn.png" alt="0pen serial connection" width="536" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read serial data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--u1fAywX7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/kodular-blocks/read-serial-data.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--u1fAywX7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/kodular-blocks/read-serial-data.png" alt="Read serial data" width="697" height="196"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Get location&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KGcKGhuS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/kodular-blocks/get-location.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KGcKGhuS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/kodular-blocks/get-location.png" alt="Get location" width="571" height="169"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Address input&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--93vQEb2z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/kodular-blocks/address-input.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--93vQEb2z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/kodular-blocks/address-input.png" alt="Address input" width="864" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Show location map&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--D-Y7ju0---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/kodular-blocks/show-map.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--D-Y7ju0---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/kodular-blocks/show-map.png" alt="Show location map" width="623" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Save data and list&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ca7Dlw8B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/kodular-blocks/save-data.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ca7Dlw8B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/kodular-blocks/save-data.png" alt="Save data and list" width="531" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delete data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mV4GsExP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/kodular-blocks/delete-data.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mV4GsExP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/kodular-blocks/delete-data.png" alt="Delete data" width="601" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Android Application User Interface
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7H8MJxtJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/app-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7H8MJxtJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/app-1.png" alt="App 1" width="479" height="1041"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bAH-pwgm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/app-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bAH-pwgm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/app-2.png" alt="App 2" width="435" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Qq8TVnzB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/app-3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Qq8TVnzB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/dekatanah/main/app-3.png" alt="App 3" width="479" height="1041"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;End Notes&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This is a simple college project for Praktik Kerja Lapangan which is supervised by a lecturer. There is still much room for improvement.&lt;/p&gt;

</description>
      <category>indonesia</category>
      <category>iot</category>
      <category>android</category>
      <category>arduino</category>
    </item>
    <item>
      <title>Auto Scale Jitsi Meet Server Dengan AWS Autoscaling</title>
      <dc:creator>febryandana</dc:creator>
      <pubDate>Sun, 31 Oct 2021 04:06:44 +0000</pubDate>
      <link>https://dev.to/febryandana/auto-scale-jitsi-meet-server-dengan-aws-autoscaling-3n77</link>
      <guid>https://dev.to/febryandana/auto-scale-jitsi-meet-server-dengan-aws-autoscaling-3n77</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UG5YkQWR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qrzvbvjf8ondhvbg07ym.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UG5YkQWR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qrzvbvjf8ondhvbg07ym.png" alt="Jitsi_Diagram" width="762" height="712"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pada artikel ini, kita akan belajar membuat autoscaling untuk Jitsi Videobridge, komponen XMPP server Jitsi yang bertanggung jawab untuk pembuatan multiuser video communication. Kita bisa menganggapnya sebagai backend dari Jitsi Meet Server yang bertugas untuk mengurus masalah video &amp;amp; audio di conference room.&lt;/p&gt;

&lt;p&gt;Langkah terbaik untuk membuat Jitsi Meet Server adalah dengan memisahkan antara Jitsi Meet, Jibri, dan Jitsi Videobridge ke dalam instance masing". Lebih baik lagi jika kita membuat autoscaling untuk videobridge (dan juga Jibri, tapi kita akan fokus pada videobridge saja sekarang), dengan begitu, resource yang perlu digunakan dapat menyesuaikan dengan kebutuhan, tidak ada yang menganggur atau kelebihan beban. Langkah-langkah pembuatan autoscaling untuk Jitsi Videobridge menggunakan Amazon Web Service adalah sebagai berikut.&lt;/p&gt;

&lt;h2&gt;
  
  
  Persiapan Instance
&lt;/h2&gt;

&lt;p&gt;Pertama kita perlu membuat instance baru yang akan menjadi template dari Jitsi Videobridge. Cara pembuatan instance bisa dilihat di artikel &lt;a href="https://dev.to/febryandana/membuat-ec2-instance-pada-aws-2ol7"&gt;Membuat EC2 di AWS&lt;/a&gt;. Port yang perlu dibuka di Security Group adalah port 22/TCP, 10000/UDP, 5347/TCP, dan 4443/TCP.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalasi Jitsi Videobridge
&lt;/h2&gt;

&lt;p&gt;Setelah instance terbuat dan kita bisa masuk ke dalam instance, selanjutnya kita perlu menambahkan repository dari Jitsi dan memasang paket instalasi jitsi-videobridge2.&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;# Install dependencies&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &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;# Adding jitsi 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="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="se"&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;# Update system&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update

&lt;span class="c"&gt;# Install jitsi-videobridge2&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; jitsi-videobridge2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Konfigurasi Jitsi Videobridge
&lt;/h2&gt;

&lt;p&gt;Tahap selanjutnya adalah melakukan sedikit tweaking pada Jitsi Meet Server dan beberapa file konfigurasi jitsi-videobridge agar dapat digunakan untuk autoscaling.&lt;/p&gt;

&lt;p&gt;Yang pertama adalah menambahkan user baru khusus untuk videobridge melalui komponen prosodyctl pada instance Jitsi Meet Server. User ini akan digunakan sebagai autentikasi saat ada videobridge baru yang tersambung.&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;prosodyctl register jvb auth.meet.yourdomain.com yourjvbpassword
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selanjutnya adalah file &lt;code&gt;sip-communicator.properties&lt;/code&gt; yang ada di instance jitsi-videobridge. File ini digunakan untuk memberitahu videbridge tentang informasi-informasi dirinya sendiri dan Jitsi Meet Server yang akan dihubungi.&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;nano /etc/jitsi/videobridge/sip-communicator.properties
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Konten file &lt;code&gt;sip-communicator.properties&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;org.jitsi.videobridge.xmpp.user.shard.DISABLE_CERTIFICATE_VERIFICATION&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true
&lt;/span&gt;org.ice4j.ice.harvest.DISABLE_AWS_HARVESTER&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true
&lt;/span&gt;org.jitsi.videobridge.ENABLE_STATISTICS&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true
&lt;/span&gt;org.jitsi.videobridge.STATISTICS_TRANSPORT&lt;span class="o"&gt;=&lt;/span&gt;muc
org.jitsi.videobridge.xmpp.user.shard.HOSTNAME&lt;span class="o"&gt;=&lt;/span&gt;meet.yourdomain.com
org.jitsi.videobridge.xmpp.user.shard.DOMAIN&lt;span class="o"&gt;=&lt;/span&gt;auth.meet.yourdomain.com
org.jitsi.videobridge.xmpp.user.shard.USERNAME&lt;span class="o"&gt;=&lt;/span&gt;jvb
org.jitsi.videobridge.xmpp.user.shard.PASSWORD&lt;span class="o"&gt;=&lt;/span&gt;yourjvbpassword
org.jitsi.videobridge.xmpp.user.shard.MUC_JIDS&lt;span class="o"&gt;=&lt;/span&gt;jvbbrewery@internal.auth.meet.yourdomain.com
org.jitsi.videobridge.xmpp.user.shard.MUC_NICKNAME&lt;span class="o"&gt;=&lt;/span&gt;1cc60513-7064-4c47-afee-a838eb29a58c
org.jitsi.videobridge.DISABLE_TCP_HARVESTER&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false
&lt;/span&gt;org.jitsi.videobridge.TCP_HARVESTER_PORT&lt;span class="o"&gt;=&lt;/span&gt;4443
org.jitsi.videobridge.TCP_HARVESTER_MAPPED_PORT&lt;span class="o"&gt;=&lt;/span&gt;443
org.jitsi.videobridge.TCP_HARVESTER_SSLTCP&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true
&lt;/span&gt;org.ice4j.ice.harvest.NAT_HARVESTER_LOCAL_ADDRESS&lt;span class="o"&gt;=&lt;/span&gt;172.0.0.1
org.ice4j.ice.harvest.NAT_HARVESTER_PUBLIC_ADDRESS&lt;span class="o"&gt;=&lt;/span&gt;11.22.33.44
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Berikutnya adalah file &lt;code&gt;jvb.conf&lt;/code&gt; dan file &lt;code&gt;config&lt;/code&gt; yang berisi konfigurasi dasar dari jitsi-videobridge.&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;nano /etc/jitsi/videobridge/jvb.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Konten file &lt;code&gt;jvb.conf&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;videobridge &lt;span class="o"&gt;{&lt;/span&gt;
 http-servers &lt;span class="o"&gt;{&lt;/span&gt;
  public &lt;span class="o"&gt;{&lt;/span&gt;
   port &lt;span class="o"&gt;=&lt;/span&gt; 9090
  &lt;span class="o"&gt;}&lt;/span&gt;
 &lt;span class="o"&gt;}&lt;/span&gt;
 websockets &lt;span class="o"&gt;{&lt;/span&gt;
  enabled &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true
  &lt;/span&gt;domain &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"meet.yourdomain.com:443"&lt;/span&gt;
  tls &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
 &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;nano /etc/jitsi/videobridge/config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Konten file &lt;code&gt;config&lt;/code&gt; :&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;# Jitsi Videobridge settings&lt;/span&gt;

&lt;span class="c"&gt;# sets the XMPP domain (default: none)&lt;/span&gt;
&lt;span class="nv"&gt;JVB_HOSTNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;localhost

&lt;span class="c"&gt;# sets the hostname of the XMPP server (default: domain if set, localhost otherwise)&lt;/span&gt;
&lt;span class="nv"&gt;JVB_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;

&lt;span class="c"&gt;# sets the port of the XMPP server (default: 5275)&lt;/span&gt;
&lt;span class="nv"&gt;JVB_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5347

&lt;span class="c"&gt;# sets the shared secret used to authenticate to the XMPP server&lt;/span&gt;
&lt;span class="nv"&gt;JVB_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;jvbpassword

&lt;span class="c"&gt;# extra options to pass to the JVB daemon&lt;/span&gt;
&lt;span class="nv"&gt;JVB_OPTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"--apis=,"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yang terakhir adalah konfigurasi file &lt;code&gt;jvb.sh&lt;/code&gt; yang akan dijalankan saat jitsi-videobridge pertama kali aktif (pertama kali booting). Buka file &lt;code&gt;jvb.sh&lt;/code&gt; dan tambahkan baris berikut di bagian atas 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="nb"&gt;sudo &lt;/span&gt;nano /usr/share/jitsi-videobridge/jvb.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Konten file &lt;code&gt;jvb.sh&lt;/code&gt; :&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;RAND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;openssl rand &lt;span class="nt"&gt;-hex&lt;/span&gt; 5&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;span class="nv"&gt;USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;jvb
&lt;span class="nv"&gt;BRIDGE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;bridge&lt;span class="nv"&gt;$RAND&lt;/span&gt;
&lt;span class="nv"&gt;JVB_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yourjvbpassword
&lt;span class="nv"&gt;NICKNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;uuidgen&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;span class="nv"&gt;LOCAL_ADDRESS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt; &lt;span class="nt"&gt;-I&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $1}'&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;span class="nv"&gt;PUBLIC_ADDRESS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;curl ifconfig.me&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"s/&lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="s2"&gt;JVB_SECRET=&lt;/span&gt;&lt;span class="se"&gt;\)&lt;/span&gt;&lt;span class="s2"&gt;.*&lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\1&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;JVB_SECRET&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/"&lt;/span&gt; /etc/jitsi/videobridge/config
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"s/&lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="s2"&gt;org.jitsi.videobridge.xmpp.user.shard.USERNAME=&lt;/span&gt;&lt;span class="se"&gt;\)&lt;/span&gt;&lt;span class="s2"&gt;.*&lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\1&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USERNAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/"&lt;/span&gt; /etc/jitsi/videobridge/sip-communicator.properties
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"s/&lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="s2"&gt;org.jitsi.videobridge.xmpp.user.shard.PASSWORD=&lt;/span&gt;&lt;span class="se"&gt;\)&lt;/span&gt;&lt;span class="s2"&gt;.*&lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\1&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;JVB_SECRET&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/"&lt;/span&gt; /etc/jitsi/videobridge/sip-communicator.properties
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"s/&lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="s2"&gt;org.jitsi.videobridge.xmpp.user.shard.MUC_NICKNAME=&lt;/span&gt;&lt;span class="se"&gt;\)&lt;/span&gt;&lt;span class="s2"&gt;.*&lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\1&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NICKNAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/"&lt;/span&gt; /etc/jitsi/videobridge/sip-communicator.properties
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"s/&lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="s2"&gt;org.ice4j.ice.harvest.NAT_HARVESTER_LOCAL_ADDRESS=&lt;/span&gt;&lt;span class="se"&gt;\)&lt;/span&gt;&lt;span class="s2"&gt;.*&lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\1&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LOCAL_ADDRESS&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/"&lt;/span&gt; /etc/jitsi/videobridge/sip-communicator.properties
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"s/&lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="s2"&gt;org.ice4j.ice.harvest.NAT_HARVESTER_PUBLIC_ADDRESS=&lt;/span&gt;&lt;span class="se"&gt;\)&lt;/span&gt;&lt;span class="s2"&gt;.*&lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\1&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PUBLIC_ADDRESS&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/"&lt;/span&gt; /etc/jitsi/videobridge/sip-communicator.properties
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"s/&lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="s2"&gt;org.jitsi.videobridge.octo.BIND_ADDRESS=&lt;/span&gt;&lt;span class="se"&gt;\)&lt;/span&gt;&lt;span class="s2"&gt;.*&lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\1&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LOCAL_ADDRESS&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/"&lt;/span&gt; /etc/jitsi/videobridge/sip-communicator.properties
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"s/&lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="s2"&gt;org.jitsi.videobridge.octo.PUBLIC_ADDRESS=&lt;/span&gt;&lt;span class="se"&gt;\)&lt;/span&gt;&lt;span class="s2"&gt;.*&lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\1&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PUBLIC_ADDRESS&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/"&lt;/span&gt; /etc/jitsi/videobridge/sip-communicator.properties
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"s/&lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="s2"&gt;org.jitsi.videobridge.REGION=&lt;/span&gt;&lt;span class="se"&gt;\)&lt;/span&gt;&lt;span class="s2"&gt;.*&lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\1&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BRIDGE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/"&lt;/span&gt; /etc/jitsi/videobridge/sip-communicator.properties
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setelah selesai, kita bisa melakukan test dengan restart service jitsi-videobridge2 dan sekaligus mengaktifkan autostart agar service tersebut selalu dijalankan setiap sistem aktif.&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;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;jitsi-videobridge2
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart jitsi-videobridge2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sampai sini, tahap pembuatan instance untuk jitsi-videobridge2 telah selesai. Selanjutnya kita bisa memanfaatkan instance tersebut untuk membuat template baru untuk autoscaling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pembuatan Template
&lt;/h2&gt;

&lt;p&gt;Untuk membuat instance template, pertama kita perlu mematikan instance dengan klik &lt;code&gt;Instance state -&amp;gt; Stop instance&lt;/code&gt;. Selanjutnya kita buat template dengan klik &lt;code&gt;Action -&amp;gt; Image and templates -&amp;gt; Create template from instance&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Beri nama dan deskripsi untuk template yang akan dibuat. Lalu centang checkbox &lt;strong&gt;&lt;em&gt;Provide guidance to help me set up a template that I can use with EC2 Auto Scaling&lt;/em&gt;&lt;/strong&gt; untuk mendapat bantuan konfigurasi template yang sesuai untuk autoscaling.&lt;/p&gt;

&lt;p&gt;Pada bagian Network Interfaces, untuk pengaturan subnet, pilih &lt;strong&gt;&lt;em&gt;Specify custom value...&lt;/em&gt;&lt;/strong&gt; dan klik &lt;strong&gt;&lt;em&gt;Save&lt;/em&gt;&lt;/strong&gt; tanpa memberikan value.&lt;/p&gt;

&lt;p&gt;Kemudian klik &lt;em&gt;Advanced Details&lt;/em&gt; untuk membuka pengaturan lanjutan. Pada bagian &lt;strong&gt;&lt;em&gt;Shutdown behavior&lt;/em&gt;&lt;/strong&gt; dan &lt;strong&gt;&lt;em&gt;Stop - Hibernate behavior&lt;/em&gt;&lt;/strong&gt;, pilih opsi &lt;strong&gt;&lt;em&gt;Don't include in launch template&lt;/em&gt;&lt;/strong&gt;. Setelah pengaturan sudah cukup dan tidak ada tanda merah, klik &lt;strong&gt;&lt;em&gt;Create launch template&lt;/em&gt;&lt;/strong&gt; untuk mengonfirmasi pembuatan template.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pembuatan Auto Scaling Group
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bBeoa8N2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xckl2jnxs6o4y8q1seid.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bBeoa8N2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xckl2jnxs6o4y8q1seid.png" alt="AWS_Auto_Scaling_Group" width="880" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tahap terakhir adalah pembuatan auto scaling group. Menu auto scaling group bisa dibuka dari &lt;strong&gt;EC2 Services&lt;/strong&gt;. Buka EC2 dari menu &lt;strong&gt;All Services&lt;/strong&gt; atau melalui &lt;strong&gt;Search Bar&lt;/strong&gt;, lalu pilih opsi &lt;strong&gt;Auto Scaling Group&lt;/strong&gt; dari kolom sebelah kiri, kemudian klik &lt;strong&gt;Create Auto Scaling Group&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Berikut adalah tampilan wizard dari Create Auto Scaling Group. AWS telah memudahkan pembuatan auto scaling group dengan menyediakan urutan langkah-langkah pembuatan. Kita cukup mengikutinya dan mengisikan data-data yang perlu diatur.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--a3C_fgEu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ql2pwnth20asidnqd7gz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--a3C_fgEu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ql2pwnth20asidnqd7gz.png" alt="Auto_Scaling_Step_1" width="880" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pertama kita perlu memberi nama group dan memilih launch template yang telah kita buat sebelumnya. Pemilihan nama harus unik dalam satu akun di Region tersebut, dan tidak boleh lebih dari 255 karakter. Setelah selesai memberi nama dan launch template, klik &lt;strong&gt;Next&lt;/strong&gt; untuk melanjutkan.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nTaxnfKy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zeew5s7ibi1fcm8nvv3c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nTaxnfKy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zeew5s7ibi1fcm8nvv3c.png" alt="Auto_Scaling_Step_2" width="880" height="698"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pada langkah kedua, Pada bagian &lt;strong&gt;Instance purchase options&lt;/strong&gt;, kita dapat mengatur berapa persen yang akan dibayar secara on-demand dan secara spot instances. Selanjutnya pada bagian &lt;strong&gt;Network&lt;/strong&gt;, kita dapat mengatur VPC yang akan digunakan beserta Availability Zone dan Subnet yang akan digunakan oleh instances dalam auto scaling group. Kemudian pada bagian &lt;strong&gt;Instance type requirements&lt;/strong&gt; kita bisa memilih untuk menggunakan instance type sesuai dengan template yang sudah dibuat atau mengubahnya ke instance type yang lain. Setelah selesai, klik &lt;strong&gt;Next&lt;/strong&gt; untuk melanjutkan.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VfukBmeN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lncixdpw0ogpowc3df8t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VfukBmeN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lncixdpw0ogpowc3df8t.png" alt="Auto_Scaling_Step_3" width="880" height="684"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Untuk langkah ke-3 hingga step ke-6 sifatnya adalah optional. Langkah ketiga berisi opsi untuk memasangkan auto scaling group ke &lt;strong&gt;load balancer&lt;/strong&gt;, &lt;strong&gt;health check&lt;/strong&gt;, dan &lt;strong&gt;monitoring&lt;/strong&gt; melalui CloudWatch.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tC4xNZ-5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gkza11qgup77hrmysvbz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tC4xNZ-5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gkza11qgup77hrmysvbz.png" alt="Auto_Scaling_Step_4" width="880" height="717"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Langkah ke-4 berisi opsi &lt;strong&gt;Group size&lt;/strong&gt; untuk mengatur ukuran group (kapasitas instance yang diinginkan, kapasitas minimal, dan kapasitas maksimal). &lt;strong&gt;Scaling policies&lt;/strong&gt; untuk mengatur bagaimana grup akan melakukan scaling, berupa Target tracking dari Average CPU Utilization, Average Network In/Out, dan jumlah request dari Application Load Balancer. Opsi &lt;strong&gt;Instance scale-in protection&lt;/strong&gt; digunakan untuk memproteksi instance yang terbuat dari aksi scale-in (mengurangi/menghapus instance yang tak terpakai).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8PP4AIe9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/avnf4pu958w6di8rqcxw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8PP4AIe9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/avnf4pu958w6di8rqcxw.png" alt="Auto_Scaling_Step_5" width="880" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Langkah ke-5 berisi opsi untuk memberikan notifikasi jika ada event yang terjadi pada auto scaling group. Kita bisa mengirimkan topik SNS ke administrator jika ada event berupa : launch instance, terminate instance, Instance fail to launch, dan instance fail to terminate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iKuXuHcR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8pg4trt9p1ya1dgxdx5j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iKuXuHcR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8pg4trt9p1ya1dgxdx5j.png" alt="Auto_Scaling_Step_6" width="880" height="481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Langkah ke-6 berisi opsi penambahan tag berupa key-value untuk auto scaling group.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ilyhXvJm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3xvbyk6wrqamqbqye507.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ilyhXvJm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3xvbyk6wrqamqbqye507.png" alt="Auto_Scaling_Step_7" width="880" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Langkah terakhir berupa review dari kumpulan konfigurasi yang telah kita buat di langkah-langkah sebelumnya. Disini kita bisa mengecek apabila ada pengaturan yang salah atau terlewatkan. Jika dirasa sudah cukup, kita bisa mengonfirmasi pembuatan auto scaling group dengan klik tombol &lt;strong&gt;&lt;em&gt;Create Auto Scaling Group&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pJPspi6b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jdmwboj5cs8ha3zpzbt6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pJPspi6b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jdmwboj5cs8ha3zpzbt6.png" alt="Auto_Scaling_Dashboard" width="880" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gambar di atas adalah tampilan Auto Scaling Group yang telah kita buat. Kita bisa melihat informasi detail tentang auto scaling group tersebut dengan klik tanda centang dan memperhatikan daftar kolom di bawahnya, atau langsung klik nama group tersebut. Sampai sini pembuatan auto scaling group Jitsi Videobridge telah selesai dan seharusnya instance baru khusus untuk videobridge telah terbuat dan terhubung dengan Jitsi Meet Server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Referensi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Amazon EC2 Auto Scaling User Guide. Retrieved September 26, 2021, from &lt;a href="https://docs.aws.amazon.com/autoscaling/ec2/userguide/what-is-amazon-ec2-auto-scaling.html"&gt;https://docs.aws.amazon.com/autoscaling/ec2/userguide/what-is-amazon-ec2-auto-scaling.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Garcia, A. (2020). Script for Autoscaling JVB. Community.Jitsi.Org. Retrieved September 26, 2021, from &lt;a href="https://community.jitsi.org/t/script-for-autoscaling-jvb/59157/11"&gt;https://community.jitsi.org/t/script-for-autoscaling-jvb/59157/11&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cloud</category>
      <category>server</category>
      <category>jitsi</category>
      <category>indonesia</category>
    </item>
    <item>
      <title>Auto Uploader File Record Jibri ke Google Drive</title>
      <dc:creator>febryandana</dc:creator>
      <pubDate>Sat, 30 Oct 2021 03:25:09 +0000</pubDate>
      <link>https://dev.to/febryandana/auto-uploader-file-record-jibri-ke-google-drive-371f</link>
      <guid>https://dev.to/febryandana/auto-uploader-file-record-jibri-ke-google-drive-371f</guid>
      <description>&lt;p&gt;Setelah Jibri berhasil dipasang, tentunya kita ingin untuk bisa mengakses file-file hasil rekaman tersebut. Secara default, Jibri menyimpan hasil rekamannya di direktori &lt;code&gt;/srv/recordings&lt;/code&gt; tanpa ada fitur untuk mengunggahnya ke layanan cloud storage.&lt;br&gt;
Ada banyak cara untuk bisa mengunggah file rekaman ke cloud storage mulai dari sync folder, FTP/File server, memanfaatkan layanan AWS S3 jika server Jibri berada di AWS, atau menggunakan rclone untuk menyambungkan server kita dengan layanan cloud storage lain. Pada artikel ini, kita akan memanfaatkan rclone untuk mengunggah file rekaman Jibri ke layanan Google Drive.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Membuat file konfigurasi rclone di host machine
&lt;/h2&gt;

&lt;p&gt;Pada artikel ini, penulis menggunakan PC pribadi sebagai host machine dengan sistem operasi Fedora 34. Kalian bisa menyesuaikan cara instalasi rclone sesuai dengan sistem operasi kalian sendiri.&lt;br&gt;
Paket rclone sudah tersedia di repository Fedora 34 sehingga kita hanya perlu memberi perintah:&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;dnf upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; rclone
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setelah proses instalasi selesai, kita lanjutkan dengan proses membuat file konfigurasi, prosesnya adalah sebagai berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rclone config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cara konfigurasi rclone untuk Google Drive bisa kalian baca langsung &lt;a href="https://rclone.org/drive/"&gt;disini&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Mengirimkan file konfigurasi tersebut ke server Jibri
&lt;/h2&gt;

&lt;p&gt;Di server Jibri, kita juga perlu memasang paket rclone. Karena sebelumnya kita menggunakan Ubuntu Server 18.04 sebagai server Jibri, paket rclone sudah tersedia di repositori:&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;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;rclone
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk mengirimkan file rclone.conf yang sudah dibuat sebelumnya, kita bisa menggunakan layanan scp atau sftp. Misalnya menggunakan scp maka perintahnya adalah:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;scp ~/.config/rclone/rclone.conf jibri@IP_PUBLIC_JIBRI_SERVER:/home/jibri/.config/rclone/rclone.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dapat diperhatikan bahwa tujuan pengiriman kita adalah ke home direktori dari user jibri. Ini karena nanti rclone akan dijalankan oleh user jibri melalui file &lt;code&gt;finalize.sh&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Selanjutnya untuk memeriksa apakah config file kita sudah siap, kita bisa menggunakan perintah berikut dari dalam server Jibri:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;// Masuk ke user jibri yang akan menjalankan rclone:
su - jibri

// Ubah ownership dari file rclone.conf
&lt;span class="nb"&gt;sudo chown &lt;/span&gt;jibri:jibri /home/jibri/.config/rclone.rclone.conf

// Cek ketersediaan config file:
rclone config file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika tidak ada error sampai sini berarti rclone sudah siap digunakan. Kita bisa mengujinya dengan memeriksa daftar file yang ada di Google Drive:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Parameter &lt;code&gt;googledrive:&lt;/code&gt; yang digunakan adalah nama config yang kita buat di rclone sebelumnya. Jika Anda membuat config dengan nama yang berbeda, ganti &lt;code&gt;googledrive:&lt;/code&gt; sesuai dengan nama config yang Anda miliki.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rclone &lt;span class="nb"&gt;ls &lt;/span&gt;googledrive:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk mengirim file dari server ke Google Drive, menggunakan perintah:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rclone copy /FILE/PATH googledrive:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk mengirim file ke folder tertentu di Google Drive, bisa menggunakan perintah:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rclone copy /FILE/PATH googledrive:FOLDER/PATH/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Membuat file finalize.sh untuk menjalankan rclone secara otomatis
&lt;/h2&gt;

&lt;p&gt;Setelah rclone selesai dikonfigurasi, selanjutnya kita perlu menyiapkan file finalize.sh untuk dijalankan Jibri setiap selesai rekaman. Path dari file ini sesuai dengan apa yang sudah kita tentukan di file &lt;code&gt;/etc/jitsi/jibri/jibri.conf&lt;/code&gt;. Contohnya pada server Jibri sebelumnya, path file finalize.sh berada di &lt;code&gt;/srv/finalize.sh&lt;/code&gt;.&lt;br&gt;
Kita perlu membuat sekaligus membuka file &lt;code&gt;/srv/finalize.sh&lt;/code&gt;. Kita bisa menggunakan nano, vim, atau text editor lainnya. Contoh:&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;nano /srv/finalize.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selanjutnya masukkan baris program di bawah ini ke dalam file finalize.sh:&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;#!/bin/bash&lt;/span&gt;

&lt;span class="nv"&gt;RECORDINGS_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;

&lt;span class="nv"&gt;VIDEO_FILE_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;find &lt;span class="nv"&gt;$RECORDINGS_DIR&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;.mp4&lt;span class="si"&gt;)&lt;/span&gt;

/usr/bin/rclone copy &lt;span class="nv"&gt;$VIDEO_FILE_PATH&lt;/span&gt; googledrive:meet.yourdomain.com/ &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nt"&gt;--log-file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/var/log/jitsi/jibri/googledrive_upload.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cara kerja program tersebut adalah dengan mengambil path direktori hasil rekaman yang baru saja dilakukan Jibri, kemudian mencari file dengan ekstensi mp4, lalu menyalin file tersebut ke dalam folder meet.yourdomain.com di Google Drive dengan bantuan aplikasi rclone. Opsi -v akan membuat rclone menampilkan output yang lebih banyak &amp;amp; lengkap. Selain itu, dengan opsi --log-file, rclone juga akan menyimpan informasi penggunaan dengan membuat log file  di &lt;code&gt;/var/log/jitsi/jibri/googledrive_upload.log&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Setelah selesai, simpan dan keluar dari file finalize.sh. Selanjutnya kita perlu mengatur permission dan ownership dari file tersebut agar dapat dieksekusi oleh Jibri:&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 chown &lt;/span&gt;jibri:jibri /srv/finalize.sh
&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; +x /srv/finalize.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sampai sini fitur auto uploader file rekaman Jibri ke Google Drive telah selesai. Kita bisa mengujinya dengan melakukan rekaman di Jitsi Meet. Setelah selesai, file rekamannya seharusnya diunggah ke folder meet.yourdomain.com di akun Google Drive yang sudah dipilih sebelumnya.&lt;br&gt;
Pemanfaatan rclone tidak berhenti hanya sampai disini saja. Kita juga bisa menggunakan layanan cloud storage atau layanan penyimpanan file lain selain Google Drive untuk mengirim file rekaman Jibri.&lt;/p&gt;

&lt;h3&gt;
  
  
  Referensi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://rclone.org/drive/"&gt;Rclone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.jitsi.org/t/how-to-to-get-a-working-setup-of-google-drive-one-drive-or-other-cloud-services-in-jibri-my-comprehensive-tutorial-for-the-beginner/42228"&gt;How-to to get a WORKING setup of Google Drive, One Drive or other cloud services in Jibri, my comprehensive tutorial for the beginner&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cloud</category>
      <category>backup</category>
      <category>jitsi</category>
      <category>indonesia</category>
    </item>
    <item>
      <title>Menambahkan Jibri Recorder untuk Jitsi Meet Server</title>
      <dc:creator>febryandana</dc:creator>
      <pubDate>Fri, 29 Oct 2021 07:14:10 +0000</pubDate>
      <link>https://dev.to/febryandana/menambahkan-jibri-recorder-untuk-jitsi-meet-server-3c66</link>
      <guid>https://dev.to/febryandana/menambahkan-jibri-recorder-untuk-jitsi-meet-server-3c66</guid>
      <description>&lt;p&gt;Setelah menyelesaikan panduan instalasi Jitsi Meet, kita dapat menggunakannya untuk rapat atau pertemuan secara online. Tetapi ada fitur yang tidak ikut terinstall, yaitu fitur rekaman. Fitur ini sangat berguna apabila kita perlu menyimpan hasil konferensi online kita untuk diarsipkan atau di-upload ke Youtube. Untungnya, Jitsi juga menyediakan layanan rekaman dengan nama Jibri. Pada artikel ini, kita akan mencoba melakukan instalasi Jibri untuk Jitsi Meet Sever sebelumnya.&lt;/p&gt;

&lt;p&gt;Hal yang perlu diperhatikan sebelum melakukan instalasi Jibri antara lain :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jibri bekerja dengan membuat sebuah instance browser Chrome untuk masuk ke dalam room Jitsi lalu menangkap dan melakukan proses encoding video dan audion dengan FFMPEG. Oleh karena itu Jibri sebaiknya dipasang pada standalone system yang dibuat khusus untuk Jibri.&lt;/li&gt;
&lt;li&gt;Karena melakukan proses encoding video dan audio, Jibri membutuhkan resource yang cukup besar. Spesifikasi yang direkomendasikan adalah 4 core CPU dan 8 GB memory. Jibri juga perlu ruang storage yang cukup besar untuk menyimpan hasil rekamannya.&lt;/li&gt;
&lt;li&gt;Saat ini, satu Jibri instance hanya bisa melakukan 1 proses record. Jika ada banyak room dan semuanya perlu untuk merekam maka kita juga harus menyediakan instance Jibri sesuai jumlah room tersebut.&lt;/li&gt;
&lt;li&gt;Jibri membutuhkan modul ALSA loopback yang ada di generic kernel. Jika kita menggunakan AWS maka perlu untuk mengubah kernel-nya menjadi kernel generic.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Mengubah kernel AWS menjadi generic-kernel pada Ubuntu Server 18.04 AWS
&lt;/h2&gt;

&lt;p&gt;Pertama-tama kita perlu install image generic-kernel dengan perintah:&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;apt-get update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;linux-image-extra-virtual
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cek kernel yang saat ini digunakan dengan perintah:&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;uname&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika masih ada "aws" berarti Ubuntu Server masih menggunakan kernel AWS.&lt;/p&gt;

&lt;p&gt;Cek daftar kernel yang tersedia dengan perintah:&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;grep&lt;/span&gt; &lt;span class="nt"&gt;-A100&lt;/span&gt; submenu /boot/grub/grub.cfg |grep menuentry
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh hasil keluarannya adalah seperti di bawah ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;submenu &lt;span class="s1"&gt;'Advanced options for Ubuntu'&lt;/span&gt; &lt;span class="nv"&gt;$menuentry_id_option&lt;/span&gt; &lt;span class="s1"&gt;'gnulinux-advanced-db937f23-4ed7-4c4b-8058-b23a860fae08'&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        menuentry &lt;span class="s1"&gt;'Ubuntu, with Linux 5.4.0-1054-aws'&lt;/span&gt; &lt;span class="nt"&gt;--class&lt;/span&gt; ubuntu &lt;span class="nt"&gt;--class&lt;/span&gt; gnu-linux &lt;span class="nt"&gt;--class&lt;/span&gt; gnu &lt;span class="nt"&gt;--class&lt;/span&gt; os &lt;span class="nv"&gt;$menuentry_id_option&lt;/span&gt; &lt;span class="s1"&gt;'gnulinux-5.4.0-1054-aws-advanced-db937f23-4ed7-4c4b-8058-b23a860fae08'&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;             menuentry &lt;span class="s1"&gt;'Ubuntu, with Linux 5.4.0-1054-aws (recovery mode)'&lt;/span&gt; &lt;span class="nt"&gt;--class&lt;/span&gt; ubuntu &lt;span class="nt"&gt;--class&lt;/span&gt; gnu-linux &lt;span class="nt"&gt;--class&lt;/span&gt; gnu &lt;span class="nt"&gt;--class&lt;/span&gt; os &lt;span class="nv"&gt;$menuentry_id_option&lt;/span&gt; &lt;span class="s1"&gt;'gnulinux-5.4.0-1054-aws-recovery-db937f23-4ed7-4c4b-8058-b23a860fae08'&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        menuentry &lt;span class="s1"&gt;'Ubuntu, with Linux 5.4.0-1045-aws'&lt;/span&gt; &lt;span class="nt"&gt;--class&lt;/span&gt; ubuntu &lt;span class="nt"&gt;--class&lt;/span&gt; gnu-linux &lt;span class="nt"&gt;--class&lt;/span&gt; gnu &lt;span class="nt"&gt;--class&lt;/span&gt; os &lt;span class="nv"&gt;$menuentry_id_option&lt;/span&gt; &lt;span class="s1"&gt;'gnulinux-5.4.0-1045-aws-advanced-db937f23-4ed7-4c4b-8058-b23a860fae08'&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;             menuentry &lt;span class="s1"&gt;'Ubuntu, with Linux 5.4.0-1045-aws (recovery mode)'&lt;/span&gt; &lt;span class="nt"&gt;--class&lt;/span&gt; ubuntu &lt;span class="nt"&gt;--class&lt;/span&gt; gnu-linux &lt;span class="nt"&gt;--class&lt;/span&gt; gnu &lt;span class="nt"&gt;--class&lt;/span&gt; os &lt;span class="nv"&gt;$menuentry_id_option&lt;/span&gt; &lt;span class="s1"&gt;'gnulinux-5.4.0-1045-aws-recovery-db937f23-4ed7-4c4b-8058-b23a860fae08'&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        menuentry &lt;span class="s1"&gt;'Ubuntu, with Linux 4.15.0-153-generic'&lt;/span&gt; &lt;span class="nt"&gt;--class&lt;/span&gt; ubuntu &lt;span class="nt"&gt;--class&lt;/span&gt; gnu-linux &lt;span class="nt"&gt;--class&lt;/span&gt; gnu &lt;span class="nt"&gt;--class&lt;/span&gt; os &lt;span class="nv"&gt;$menuentry_id_option&lt;/span&gt; &lt;span class="s1"&gt;'gnulinux-4.15.0-153-generic-advanced-db937f23-4ed7-4c4b-8058-b23a860fae08'&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        menuentry &lt;span class="s1"&gt;'Ubuntu, with Linux 4.15.0-153-generic (recovery mode)'&lt;/span&gt; &lt;span class="nt"&gt;--class&lt;/span&gt; ubuntu &lt;span class="nt"&gt;--class&lt;/span&gt; gnu-linux &lt;span class="nt"&gt;--class&lt;/span&gt; gnu &lt;span class="nt"&gt;--class&lt;/span&gt; os &lt;span class="nv"&gt;$menuentry_id_option&lt;/span&gt; &lt;span class="s1"&gt;'gnulinux-4.15.0-153-generic-recovery-db937f23-4ed7-4c4b-8058-b23a860fae08'&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Salin id option dari baris pertama (Advanced options for Ubuntu). Contohnya seperti di bawah ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gnulinux-advanced-db937f23-4ed7-4c4b-8058-b23a860fae08
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selanjutnya salin id option dari bagian generic (Ubuntu, with Linux 4.15.0-153-generic). Contohnya seperti di bawah ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gnulinux-4.15.0-153-generic-advanced-db937f23-4ed7-4c4b-8058-b23a860fae08
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kombinasikan keduanya menggunakan tanda &amp;gt; menjadi seperti di bawah ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gnulinux-advanced-db937f23-4ed7-4c4b-8058-b23a860fae08&amp;gt;gnulinux-4.15.0-153-generic-advanced-db937f23-4ed7-4c4b-8058-b23a860fae08
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kemudian edit file grub.cfg dengan perintah:&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;nano /etc/default/grub.cfg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ubah value dari GRUB_DEFAULT=0 dengan value di atas, menjadi&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;GRUB_DEFAULT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'gnulinux-advanced-db937f23-4ed7-4c4b-8058-b23a860fae08&amp;gt;gnulinux-4.15.0-153-generic-advanced-db937f23-4ed7-4c4b-8058-b23a860fae08'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simpan dan keluar, lalu restart grub dan sistem:&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;update-grub &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;update-grub2
&lt;span class="nb"&gt;sudo &lt;/span&gt;restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kemudian cek apakah kernel telah berubah dengan perintah &lt;code&gt;uname -r&lt;/code&gt;. Seharusnya hasilnya menjadi:&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;uname&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt;
4.15.0-153-generic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Persiapan di Jitsi Meet Server Instance
&lt;/h2&gt;

&lt;p&gt;Semua domain yang digunakan pada panduan ini adalah &lt;strong&gt;meet.yourdomain.com&lt;/strong&gt;. Kalian perlu mengubahnya ke domain Jitsi kalian sendiri. Pertama-tama kita perlu menyiapkan environment Jibri pada Jitsi Meet Server, antara lain:&lt;/p&gt;

&lt;h3&gt;
  
  
  Prosody
&lt;/h3&gt;

&lt;p&gt;Kita perlu membuat entry untuk internal muc agar Jibri client dapat berkomunikasi dengan Jicofo. Edit file &lt;code&gt;/etc/prosody/conf.avail/meet.yourdomain.com.cfg.lua&lt;/code&gt;, cari dan sesuaikan dengan baris berikut:&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="nt"&gt;--&lt;/span&gt; internal muc component, meant to &lt;span class="nb"&gt;enable &lt;/span&gt;pools of jibri and jigasi clients
Component &lt;span class="s2"&gt;"internal.auth.meet.yourdomain.com"&lt;/span&gt; &lt;span class="s2"&gt;"muc"&lt;/span&gt;
    modules_enabled &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"ping"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="nt"&gt;--&lt;/span&gt; storage should be &lt;span class="s2"&gt;"none"&lt;/span&gt; &lt;span class="k"&gt;for &lt;/span&gt;prosody 0.10 and &lt;span class="s2"&gt;"memory"&lt;/span&gt; &lt;span class="k"&gt;for &lt;/span&gt;prosody 0.11
    storage &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"memory"&lt;/span&gt;
    admins &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"focus@auth.meet.yourdomain.com"&lt;/span&gt;, &lt;span class="s2"&gt;"jvb@auth.meet.yourdomain.com"&lt;/span&gt;, &lt;span class="s2"&gt;"jibri@auth.meet.yourdomain.com"&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
    muc_room_locking &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false
    &lt;/span&gt;muc_room_default_public_jids &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true
    &lt;/span&gt;muc_room_cache_size &lt;span class="o"&gt;=&lt;/span&gt; 1000
    c2s_require_encryption &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selanjutnya kita perlu membuat virtual host entry untuk recorder untuk sebagai user akun untuk sesi Jibri. Hal ini diperlukan agar Jibri dapat menjadi hidden participant pada konferensi yang direkam. Edit dan tambahkan baris berikut ke file &lt;code&gt;/etc/prosody/conf.avail/meet.yourdomain.com.cfg.lua&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;VirtualHost &lt;span class="s2"&gt;"recorder.meet.yourdomain.com"&lt;/span&gt;
  modules_enabled &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"ping"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
  authentication &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"internal_plain"&lt;/span&gt;
  c2s_require_encryption &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false
  &lt;/span&gt;allow_empty_token &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kemudian kita perlu membuat akun untuk Jibri dengan perintah:&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;prosodyctl register jibri auth.meet.yourdomain.com jibriauthpass
&lt;span class="nb"&gt;sudo &lt;/span&gt;prosodyctl register recorder recorder.meet.yourdomain.com jibrirecorderpass
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simpan username dan password dari prosodyctl di atas karena nantinya akan diperlukan lagi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Jicofo
&lt;/h3&gt;

&lt;p&gt;Edit file &lt;code&gt;/etc/jitsi/jicofo/sip-communicator.properties&lt;/code&gt; dan tambahkan baris berikut ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;org.jitsi.jicofo.jibri.BREWERY&lt;span class="o"&gt;=&lt;/span&gt;JibriBrewery@internal.auth.meet.yourdomain.com
org.jitsi.jicofo.jibri.PENDING_TIMEOUT&lt;span class="o"&gt;=&lt;/span&gt;90
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Baris tersebut diperlukan untuk membuat MUC yang sesuai untuk Jibri Controllers agar dapat berkomunikasi dengan Jicofo. PENDING_TIMEOUT juga sebaiknya di-set ke 90 detik untuk memberikan jeda waktu Jibri sebelum dicap failed dan dimatikan.&lt;/p&gt;

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

&lt;p&gt;Edit file /etc/jitsi/meet/meet.yourdomain.com-config.js lalu cari dan tambahkan set konfigurasi berikut ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fileRecordingsEnabled: &lt;span class="nb"&gt;true&lt;/span&gt;, // Untuk mengaktifkan fitur file recording
liveStreamingEnabled: &lt;span class="nb"&gt;true&lt;/span&gt;, // Untuk mengaktifkan fitur live streaming
hiddenDomain: &lt;span class="s1"&gt;'recorder.meet.yourdomain.com'&lt;/span&gt;, // Untuk menyembunyikan user jibri dari room
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Proses Instalasi Jibri di Jibri Instance
&lt;/h2&gt;

&lt;p&gt;Panduan selanjutnya dilakukan di instance Jibri. Pertama-tama pastikan modul ALSA loopback telah tersedia dengan mengikuti panduan mengubah kernel AWS menjadi kernel generic di awal.&lt;/p&gt;

&lt;h3&gt;
  
  
  ALSA dan Loopback Device
&lt;/h3&gt;

&lt;p&gt;Jalankan beberapa perintah di bawah ini untuk mengaktifkan modul ALSA loopback&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set modul agar di-load saat boot : &lt;code&gt;sudo echo "snd-aloop" &amp;gt;&amp;gt; /etc/modules&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Load modul ke kernel saat ini : &lt;code&gt;sudo modprobe snd-aloop&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Cek jika modul telah di-load : &lt;code&gt;sudo lsmod | grep snd_aloop&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Jika output-nya menampilkan modul snd-aloop, berati ALSA loopback telah selesai dikonfigurasi.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Google Chrome dan Chromedriver
&lt;/h3&gt;

&lt;p&gt;Selanjutnya kita perlu memasang Google Chrome stabil dan Chromedriver yang akan digunakan Jibri untuk mengakses room Jitsi dan melakukan rekaman. Instruksi instalasi manual Google Chrome stabil adalah sebagai berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="nt"&gt;-O&lt;/span&gt; - https://dl.google.com/linux/linux_signing_key.pub | &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-key add -
&lt;span class="nb"&gt;sudo &lt;/span&gt;sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" &amp;gt;&amp;gt; /etc/apt/sources.list.d/google.list'&lt;/span&gt;
apt-get &lt;span class="nt"&gt;-y&lt;/span&gt; update
apt-get &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;google-chrome-stable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tambahkan file chrome managed policies dan set &lt;code&gt;CommandLineFlagSecurityWarningEnabled&lt;/code&gt; ke &lt;code&gt;false&lt;/code&gt; untuk menyembunyikan warning dari Chrome:&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 mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /etc/opt/chrome/policies/managed
&lt;span class="nb"&gt;sudo &lt;/span&gt;sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'echo '&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"CommandLineFlagSecurityWarningsEnabled"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;' &amp;gt;&amp;gt; /etc/opt/chrome/policies/managed/managed_policies.json'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selanjutnya install Chromedriver dengan perintah dibawah ini:&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;CHROME_DRIVER_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; chromedriver.storage.googleapis.com/LATEST_RELEASE&lt;span class="sb"&gt;`&lt;/span&gt;
wget &lt;span class="nt"&gt;-N&lt;/span&gt; http://chromedriver.storage.googleapis.com/&lt;span class="nv"&gt;$CHROME_DRIVER_VERSION&lt;/span&gt;/chromedriver_linux64.zip &lt;span class="nt"&gt;-P&lt;/span&gt; ~/
unzip ~/chromedriver_linux64.zip &lt;span class="nt"&gt;-d&lt;/span&gt; ~/
&lt;span class="nb"&gt;rm&lt;/span&gt; ~/chromedriver_linux64.zip
&lt;span class="nb"&gt;sudo mv&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; ~/chromedriver /usr/local/bin/chromedriver
&lt;span class="nb"&gt;sudo chown &lt;/span&gt;root:root /usr/local/bin/chromedriver
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;0755 /usr/local/bin/chromedriver
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Repository Jitsi dan Instalasi Jibri
&lt;/h3&gt;

&lt;p&gt;Paket Jibri terdapat di repository Jitsi, jadi kita perlu menambahkan Jitsi ke dalam repository Ubuntu Server dengan perintah:&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;echo&lt;/span&gt; &lt;span class="s1"&gt;'deb https://download.jitsi.org stable/'&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="se"&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; &lt;span class="se"&gt;\ &lt;/span&gt;apt-key add -
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selanjutnya kita mulai instalasi Jibri terbaru dengan perintah:&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;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;jibri
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agar dapat bekerja dengan baik, sebaiknya kita juga memasukan user jibri ke dalam beberapa grup berikut:&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;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; adm,audio,video,plugdev jibri
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  File Konfigurasi Jibri
&lt;/h3&gt;

&lt;p&gt;File konfigurasi Jibri terdapat di &lt;code&gt;/etc/jitsi/jibri/jibri.conf&lt;/code&gt;. Contoh konfigurasinya dapat dilihat di &lt;a href="https://github.com/jitsi/jibri/blob/master/src/main/resources/reference.conf"&gt;reference.conf&lt;/a&gt; untuk default values dan contoh bagaimana membuat jibri.conf. Di bawah ini adalah contoh file konfigurasi jibri.conf yang digunakan penulis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jibri &lt;span class="o"&gt;{&lt;/span&gt;
  // A unique identifier &lt;span class="k"&gt;for &lt;/span&gt;this Jibri
  // TODO: eventually this will be required with no default
  &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
  // Whether or not Jibri should &lt;span class="k"&gt;return &lt;/span&gt;to idle state after handling
  // &lt;span class="o"&gt;(&lt;/span&gt;successfully or unsuccessfully&lt;span class="o"&gt;)&lt;/span&gt; a request.  A value of &lt;span class="s1"&gt;'true'&lt;/span&gt;
  // here means that a Jibri will NOT &lt;span class="k"&gt;return &lt;/span&gt;back to the IDLE state
  // and will need to be restarted &lt;span class="k"&gt;in &lt;/span&gt;order to be used again.
  single-use-mode &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false
  &lt;/span&gt;api &lt;span class="o"&gt;{&lt;/span&gt;
    http &lt;span class="o"&gt;{&lt;/span&gt;
      external-api-port &lt;span class="o"&gt;=&lt;/span&gt; 2222
      internal-api-port &lt;span class="o"&gt;=&lt;/span&gt; 3333
    &lt;span class="o"&gt;}&lt;/span&gt;
    xmpp &lt;span class="o"&gt;{&lt;/span&gt;
      // See example_xmpp_envs.conf &lt;span class="k"&gt;for &lt;/span&gt;an example of what is expected here
      environments &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
              &lt;span class="o"&gt;{&lt;/span&gt;
                name &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"prod environment"&lt;/span&gt;
                xmpp-server-hosts &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"meet.yourdomain.com"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
                xmpp-domain &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"meet.yourdomain.com"&lt;/span&gt;

                control-muc &lt;span class="o"&gt;{&lt;/span&gt;
                    domain &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"internal.auth.meet.yourdomain.com"&lt;/span&gt;
                    room-name &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"JibriBrewery"&lt;/span&gt;
                    nickname &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"jibri"&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;

                control-login &lt;span class="o"&gt;{&lt;/span&gt;
                    domain &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"auth.meet.yourdomain.com"&lt;/span&gt;
                    username &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"jibri"&lt;/span&gt;
                    password &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"jibriauthpass"&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;

                call-login &lt;span class="o"&gt;{&lt;/span&gt;
                    domain &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"recorder.meet.yourdomain.com"&lt;/span&gt;
                    username &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"recorder"&lt;/span&gt;
                    password &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"jibrirecorderpass"&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;

                strip-from-room-domain &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"conference."&lt;/span&gt;
                usage-timeout &lt;span class="o"&gt;=&lt;/span&gt; 0
                trust-all-xmpp-certs &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
            &lt;span class="o"&gt;}]&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
  recording &lt;span class="o"&gt;{&lt;/span&gt;
    recordings-directory &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"/srv/recordings"&lt;/span&gt;
    &lt;span class="c"&gt;# TODO: make this an optional param and remove the default&lt;/span&gt;
    finalize-script &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"/srv/finalize.sh"&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
  streaming &lt;span class="o"&gt;{&lt;/span&gt;
    // A list of regex patterns &lt;span class="k"&gt;for &lt;/span&gt;allowed RTMP URLs.  The RTMP URL used
    // when starting a stream must match at least one of the patterns &lt;span class="k"&gt;in&lt;/span&gt;
    // this list.
    rtmp-allow-list &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
      // By default, all services are allowed
      &lt;span class="s2"&gt;".*"&lt;/span&gt;
    &lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
  chrome &lt;span class="o"&gt;{&lt;/span&gt;
    // The flags which will be passed to chromium when launching
    flags &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
      &lt;span class="s2"&gt;"--use-fake-ui-for-media-stream"&lt;/span&gt;,
      &lt;span class="s2"&gt;"--start-maximized"&lt;/span&gt;,
      &lt;span class="s2"&gt;"--kiosk"&lt;/span&gt;,
      &lt;span class="s2"&gt;"--enabled"&lt;/span&gt;,
      &lt;span class="s2"&gt;"--disable-infobars"&lt;/span&gt;,
      &lt;span class="s2"&gt;"--autoplay-policy=no-user-gesture-required"&lt;/span&gt;
    &lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
  stats &lt;span class="o"&gt;{&lt;/span&gt;
    enable-stats-d &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
  webhook &lt;span class="o"&gt;{&lt;/span&gt;
    // A list of subscribers interested &lt;span class="k"&gt;in &lt;/span&gt;receiving webhook events
    subscribers &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
  jwt-info &lt;span class="o"&gt;{&lt;/span&gt;
    // The path to a .pem file which will be used to sign JWT tokens used &lt;span class="k"&gt;in &lt;/span&gt;webhook
    // requests.  If not &lt;span class="nb"&gt;set&lt;/span&gt;, no JWT will be added to webhook requests.
    &lt;span class="c"&gt;# signing-key-path = "/path/to/key.pem"&lt;/span&gt;

    // The kid to use as part of the JWT
    &lt;span class="c"&gt;# kid = "key-id"&lt;/span&gt;

    // The issuer of the JWT
    &lt;span class="c"&gt;# issuer = "issuer"&lt;/span&gt;

    // The audience of the JWT
    &lt;span class="c"&gt;# audience = "audience"&lt;/span&gt;

    // The TTL of each generated JWT.  Can&lt;span class="s1"&gt;'t be less than 10 minutes.
    # ttl = 1 hour
  }
  call-status-checks {
    // If all clients have their audio and video muted and if Jibri does not
    // detect any data stream (audio or video) comming in, it will stop
    // recording after NO_MEDIA_TIMEOUT expires.
    no-media-timeout = 90 seconds

    // If all clients have their audio and video muted, Jibri consideres this
    // as an empty call and stops the recording after ALL_MUTED_TIMEOUT expires.
    all-muted-timeout = 10 minutes

    // When detecting if a call is empty, Jibri takes into consideration for how
    // long the call has been empty already. If it has been empty for more than
    // DEFAULT_CALL_EMPTY_TIMEOUT, it will consider it empty and stop the recording.
    default-call-empty-timeout = 30 seconds
  }
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selanjutnya, aktifkan jibri agar berjalan otomatis ketika sistem dinyalakan dengan perintah:&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;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;jibri
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart jibri
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setelah selesai melakukan rekaman, file rekaman Jibri akan tersimpan di direktori &lt;code&gt;/srv/recordings/&lt;/code&gt;. Kita juga bisa menambahkan file &lt;code&gt;finalize.sh&lt;/code&gt; di direktori &lt;code&gt;/srv/finalize.sh&lt;/code&gt; yang akan dijalankan setiap jibri selesai merekam. File &lt;code&gt;finalize.sh&lt;/code&gt; dapat diisi dengan script untuk mengunggah hasil rekaman ke cloud storage atau yang lain sesuai keinginan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Referensi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Github Jitsi/Jibri. &lt;a href="https://github.com/jitsi/jibri"&gt;https://github.com/jitsi/jibri&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Coders, N. (2021, July 28). How to change default kernel in Ubuntu (AWS) (Jibri). NIMBLE CODERS. &lt;a href="https://nimblecoders.in/how-to-change-default-kernel-in-ubuntu-aws/"&gt;https://nimblecoders.in/how-to-change-default-kernel-in-ubuntu-aws/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Saiflakhani, S. (2021, February 24). [Setup / Guide] Jitsi Meet Native + Multiple (6) Jibri Docker instances working on the same AWS server. Community.Jitsi.Org. &lt;a href="https://community.jitsi.org/t/setup-guide-jitsi-meet-native-multiple-6-jibri-docker-instances-working-on-the-same-aws-server/"&gt;https://community.jitsi.org/t/setup-guide-jitsi-meet-native-multiple-6-jibri-docker-instances-working-on-the-same-aws-server/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cloud</category>
      <category>server</category>
      <category>jitsi</category>
      <category>indonesia</category>
    </item>
    <item>
      <title>Menambahkan Autentikasi pada Jitsi Meet Server</title>
      <dc:creator>febryandana</dc:creator>
      <pubDate>Thu, 28 Oct 2021 03:29:38 +0000</pubDate>
      <link>https://dev.to/febryandana/menambahkan-autentikasi-pada-jitsi-meet-server-2j5i</link>
      <guid>https://dev.to/febryandana/menambahkan-autentikasi-pada-jitsi-meet-server-2j5i</guid>
      <description>&lt;p&gt;Jitsi mendukung beberapa metode autentikasi seperti SIP, LDAP, dan plain account. Pada artikel ini, kita akan mencoba membuat autentikasi menggunakan plain account yang dibuat langsung menggunakan Prosody.&lt;/p&gt;

&lt;h2&gt;
  
  
  Konfigurasi Prosody
&lt;/h2&gt;

&lt;p&gt;Buka file konfigurasi domain di prosody dengan menggunakan &lt;code&gt;nano&lt;/code&gt; atau text editor lainnya.&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/meet.yourdomain.com.cfg.lua
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cari VirtualHost yang berisi domain Jitsi Meet kita, lalu ubah value &lt;code&gt;authentication&lt;/code&gt; menjadi &lt;code&gt;internal_hashed&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;VirtualHost &lt;span class="s2"&gt;"meet.yourdomain.com"&lt;/span&gt;
        &lt;span class="nt"&gt;--&lt;/span&gt; enabled &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; Remove this line to &lt;span class="nb"&gt;enable &lt;/span&gt;this host
        &lt;span class="nt"&gt;--&lt;/span&gt; authentication &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"anonymous"&lt;/span&gt;
        authentication &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"internal_hashed"&lt;/span&gt;
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kemudian, tambahkan VirtualHost baru dalam file yang sama untuk menampung guest. Domain guest ini bersifat internal only sehingga tidak memerlukan DNS record atau sertifikat SSL baru.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;...
VirtualHost &lt;span class="s2"&gt;"guest.meet.yourdomain.com"&lt;/span&gt;
    authentication &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"anonymous"&lt;/span&gt;
    c2s_require_encryption &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simpan file untuk mengonfirmasi perubahan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Menambahkan guest domain ke Jitsi Meet
&lt;/h2&gt;

&lt;p&gt;Setelah mengatur Prosody XMPP Server untuk mengaktifkan fitur autentikasi, selanjutnya kita perlu memberi tahu Jitsi Meet tentang VirtualHost guest yang baru kita buat. Caranya adalah dengan membuka file berikut menggunakan 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/meet.yourdomain.com-config.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cari variabel &lt;code&gt;anonymousdomain&lt;/code&gt; pada blok &lt;code&gt;hosts&lt;/code&gt;, lalu tambahkan domain guest.yourdomain.com sebagai value-nya.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;    hosts: &lt;span class="o"&gt;{&lt;/span&gt;
        // XMPP domain.
        domain: &lt;span class="s1"&gt;'meet.yourdomain.com'&lt;/span&gt;,

        // When using authentication, domain &lt;span class="k"&gt;for &lt;/span&gt;guest users.
        // anonymousdomain: &lt;span class="s1"&gt;'guest.example.com'&lt;/span&gt;,
        anonymousdomain: &lt;span class="s1"&gt;'guest.meet.yourdomain.com'&lt;/span&gt;,
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simpan dan tutup file tersebut untuk mengonfirmasi perubahan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Konfigurasi Jicofo
&lt;/h2&gt;

&lt;p&gt;Selanjutnya kita perlu mengatur komponen Jitsi Conference Focus (Jicofo) untuk mengizinkan request hanya dari authenticated domain saja. Buka file berikut dengan 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;Tambahkan key-value baru berikut ke dalam file dan simpan.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;...
org.jitsi.jicofo.auth.URL&lt;span class="o"&gt;=&lt;/span&gt;XMPP:meet.yourdomain.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Membuat akun moderator
&lt;/h2&gt;

&lt;p&gt;Tahap terakhir adalah membuat akun moderator yang memiliki izin untuk membuat conference room di Jitsi Meet Server. Kita bisa menggunakan layanan prosodyctl untuk membuat akun ini.&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;prosodyctl register USERNAME meet.yourdomain.com PASSWORD
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pastikan untuk membuat &lt;em&gt;username&lt;/em&gt; dan &lt;em&gt;password&lt;/em&gt; yang unik agar tidak mudah diretas. Pastikan juga untuk menyimpan kredensial &lt;em&gt;username&lt;/em&gt; dan &lt;em&gt;password&lt;/em&gt; tersebut di tempat yang aman dan tidak mudah lupa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Restart semua Jitsi service
&lt;/h2&gt;

&lt;p&gt;Setelah selesai melalukan konfigurasi di atas, restart layanan Jitsi dengan perintah berikut.&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;systemctl restart prosody
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart jicofo
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart nginx

&lt;span class="c"&gt;# Jika Jitsi Meet diatur untuk menggunakan videobridge dalam satu server yang sama:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart jitsi-videobridge2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Cek file log
&lt;/h2&gt;

&lt;p&gt;Untuk melihat log aktifitas dari layanan Jitsi, kita bisa menggunakan perintah berikut.&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;# Log 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;# Log 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;# Log 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;span class="c"&gt;# Log 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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Selesai
&lt;/h2&gt;

&lt;p&gt;Kita bisa mengetesnya langsung dengan membuka domain Jitsi Meet dan mencoba membuat conference room. Seharusnya Jitsi akan memunculkan notifikasi "Waiting for the host". Pilih "I am the host" lalu masukkan kredensial akun yang telah dibuat sebelumnya. Baru lah setelah moderator masuk, peserta conference lainnya dapat saling berinteraksi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Referensi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Kirstätter, J. (2020, May 3). Enable authentication in your instance of jitsi meet. Get Blogged by JoKi. Retrieved August 28, 2021, from &lt;a href="https://jochen.kirstaetter.name/authentication-jitsi-meet/"&gt;https://jochen.kirstaetter.name/authentication-jitsi-meet/&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cloud</category>
      <category>jitsi</category>
      <category>indonesia</category>
    </item>
    <item>
      <title>Instalasi Jitsi Meet Sebagai Alternatif Open Source Video Conference</title>
      <dc:creator>febryandana</dc:creator>
      <pubDate>Wed, 27 Oct 2021 12:05:46 +0000</pubDate>
      <link>https://dev.to/febryandana/instalasi-jitsi-meet-sebagai-alternatif-open-source-video-conference-457b</link>
      <guid>https://dev.to/febryandana/instalasi-jitsi-meet-sebagai-alternatif-open-source-video-conference-457b</guid>
      <description>&lt;p&gt;Di masa modern sekarang, terutama saat pandemi COVID-19 seperti ini, banyak instansi swasta, pemerintah, maupun pendidikan yang terpaksa untuk meniadakan interaksi tatap muka dan mengharuskan semuanya dilakukan dari rumah (Work from Home, School from Home). Salah satu tool/aplikasi yang paling populer digunakan adalah online video conference untuk menggantikan rapat atau pertemuan tatap muka secara online. Ada banyak sekali layanan yang menyediakan fitur online video conference seperti Google Meet, Zoom, Skype, Microsoft Teams, Discord, dan lain-lain.&lt;/p&gt;

&lt;p&gt;Sayangnya sebagian besar layanan tersebut sifatnya komersial dan closed source sehingga fitur-fiturnya terbatas atau mengharuskan untuk membayar biaya langganan. Oleh karena itu mulai banyak yang melirik alternatif lain yang lebih luwes dengan fitur melimpah tanpa harus membayar biaya langganan. Salah satunya alternatif tersebut adalah &lt;a href="https://jitsi.org/jitsi-meet/"&gt;Jitsi Meet&lt;/a&gt;, sebuah layanan Video Conference yang 100% gratis dan open source dari Jitsi. Jitsi Meet memiliki banyak sekali fitur yang menarik seperti autentikasi berbasis SIP dan LDAP, fitur livestreaming ke Youtube atau video streaming lainnya, end-to-end encryption, akses tanpa batas waktu, dan lain-lain. Karena merupakan produk open source, Jitsi Meet juga menyediakan paket instalasi yang dapat dipasang di server milik sendiri dengan custom domain. Salah satu contohnya adalah &lt;a href="https://meet.jit.si/"&gt;meet.jit.si&lt;/a&gt; yang sudah disediakan oleh Jitsi sendiri.&lt;/p&gt;

&lt;p&gt;Kali ini kita akan mencoba melakukan instalasi Jitsi Meet pada server milik sendiri dengan custom domain. Beberapa hal yang perlu diperhatikan antara lain :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Spesifikasi mesin&lt;/strong&gt;. Karena berfungsi sebagai video conference, Jitsi Meet membutuhkan spesifikasi server yang cukup kuat untuk dapat menampung beban audio dan video dari user. Semakin banyak user maka bebannya juga akan semakin berat sehingga butuh spesifikasi sistem yang semakin tinggi.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Custom domain&lt;/strong&gt;. Jitsi Meet dapat digunakan tanpa custom domain, tetapi ini menyebabkan kita tidak bisa memanfaatkan fitur SSL untuk HTTPS dan keamanan end-to-end encryption. Penulis sangat merekomendasikan untuk menyiapkan custom domain atau subdomain khusus untuk Jitsi Meet. Kita juga perlu mengalokasikan IP public static dengan Elastic IP agar tautan IP Address ke domain tidak berubah-ubah.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Firewall&lt;/strong&gt;. Berikut adalah port yang perlu dibuka atau diberi izin akses agar Jitsi Meet dapat bekerja dengan baik :&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--s24bLvw0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/04iyws0ek6aitwlsijzi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--s24bLvw0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/04iyws0ek6aitwlsijzi.png" alt="Jitsi Firewall" width="880" height="663"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pada artikel ini kita akan mencoba melakukan instalasi Jitsi Meet pada sistem operasi Ubuntu Server 18.04 dari AWS EC2 Instance. Panduan instalasi ini juga dapat digunakan untuk Ubuntu Server 20.04. Jika belum tahu bagaimana cara membuat EC2 Instance, kalian bisa membaca &lt;a href="https://febryandana.xyz/membuat-ec2-instance-pada-aws/"&gt;Membuat EC2 Instance pada AWS&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalasi Jitsi Meet pada Ubuntu Server 18.04 AWS
&lt;/h2&gt;

&lt;p&gt;Untuk memudahkan proses, semua domain yang ada di bawah menggunakan meet.yourdomain.com. Kalian harus mengubahnya ke domain kalian sendiri.&lt;/p&gt;

&lt;p&gt;Pertama-tama kita perlu memperbarui sistem Ubuntu kita dengan,&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;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selanjutnya ubah hostname dari Ubuntu Server dengan perintah&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;hostnamectl set-hostname meet.yourdomain.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Edit file /etc/hosts dengan menambahkan IP public server dan subdomain meet.yourdomain.com&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;nano /etc/hosts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika belum ada, tambahkan baris berikut di bagian awal file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Baris 1 : &lt;span class="sb"&gt;`&lt;/span&gt;127.0.0.1 localhost&lt;span class="sb"&gt;`&lt;/span&gt;
Baris 2 : &lt;span class="sb"&gt;`&lt;/span&gt;IP_PUBLIC_SERVER meet.yourdomain.com&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simpan dengan &lt;code&gt;Ctrl+S&lt;/code&gt; dan keluar dengan &lt;code&gt;Ctrl+X&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Install beberapa dependencies yang perlu dipersiapkan untuk menggunakan Jitsi Meet. Seharusnya dependencies ini sudah terinstall tetapi sebaiknya kita cek ulang :&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;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; apt-transport-https
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selanjutnya tambahkan Jitsi ke repository Ubuntu Server dengan perintah :&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;echo&lt;/span&gt; &lt;span class="s1"&gt;'deb https://download.jitsi.org stable/'&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="se"&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="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setelah semuanya selesai selanjutnya kita akan mulai melakukan instalasi Jitsi Meet dengan memberikan perintah instalasi :&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;apt &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;Proses instalasi akan berlangsung. Jitsi Meet akan diinstall beserta dengan dependencies yang diperlukan.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Jika muncul dialog masukan untuk hostname, masukkan meet.yourdomain.com (ganti dengan domain kalian). Pastikan untuk mengetik hostname dengan benar tanpa kesalahan.&lt;br&gt;&lt;br&gt;
Ketika muncul dialog tentang certification, pilih self-signed certification karena selanjutnya kita akan memanfaatkan Let's Encrypt untuk mendapatkan SSL certification.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Setelah proses instalasi selesai, selanjutnya kita akan membuat self-signed SSL certificate dengan memanfaatkan Let's Encrypt. Masukkan perintah berikut untuk memulai proses pembuatan sertifikat :&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; /usr/share/jitsi-meet/scripts/install-letsencrypt-cert.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saat diminta, masukkan hostname domain Jitsi Meet dan email kalian lalu tunggu proses sertifikasi berjalan hingga selesai.&lt;/p&gt;

&lt;p&gt;Selanjutnya kita dapat meningkatkan system limit dengan mengedit file /etc/systemd/system.conf :&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;nano /etc/systemd/system.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pergi ke bagian bawah file lalu tambahkan baris berikut :&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;DefaultLimitNOFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;65000
&lt;span class="nv"&gt;DefaultLimitNPROC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;65000
&lt;span class="nv"&gt;DefaultTasksMax&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;65000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart service dengan perintah :&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;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart &lt;span class="o"&gt;{&lt;/span&gt;prosody,jicofo,jitsi-videobridge2,nginx&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sampai tahap ini Jitsi Meet telah selesai di-install. Untuk mengujinya, buka browser dan pergi ke &lt;a href="https://meet.yourdomain.com"&gt;https://meet.yourdomain.com&lt;/a&gt;. Sekarang Jitsi Meet kita sudah siap digunakan, tetapi masih terdapat beberapa fitur yang belum tersedia seperti fitur record, livestreaming, dan autentikasi user. Panduan penambahan fitur record, autentikasi, dan kustomisasi home page akan dipecah ke dalam artikel selanjutnya.&lt;/p&gt;

&lt;h3&gt;
  
  
  Referensi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jitsi/jitsi-meet"&gt;Github Jitsi Meet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jitsi.org/jitsi-meet/"&gt;Jitsi Meet Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Jitsi"&gt;Jitsi Wikipedia entry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Saiflakhani, S. (2021, February 24). [Setup / Guide] Jitsi Meet Native + Multiple (6) Jibri Docker instances working on the same AWS server. Community.Jitsi.Org. &lt;a href="https://community.jitsi.org/t/setup-guide-jitsi-meet-native-multiple-6-jibri-docker-instances-working-on-the-same-aws-server/"&gt;https://community.jitsi.org/t/setup-guide-jitsi-meet-native-multiple-6-jibri-docker-instances-working-on-the-same-aws-server/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cloud</category>
      <category>jitsi</category>
      <category>indonesia</category>
    </item>
    <item>
      <title>Kelola Server Lewat Website Dengan Cockpit</title>
      <dc:creator>febryandana</dc:creator>
      <pubDate>Sat, 21 Aug 2021 03:53:47 +0000</pubDate>
      <link>https://dev.to/febryandana/kelola-server-lewat-website-dengan-cockpit-448o</link>
      <guid>https://dev.to/febryandana/kelola-server-lewat-website-dengan-cockpit-448o</guid>
      <description>&lt;p&gt;Kebanyakan system administrator mengelola server mereka melalui koneksi SSH dengan antarmuka CLI, bukan GUI. Meskipun umum digunakan, tetap ada sebagian kecil orang yang merasa bahwa &lt;em&gt;command line interface&lt;/em&gt; itu susah digunakan, dan merasa mengintimidasi. Karena salah satu karakter saja bisa menyebabkan server crash.&lt;/p&gt;

&lt;p&gt;Tapi bukan berarti tidak ada jalan lain. Karena sekarang sudah banyak alat-alat manajemen server yang berbasis grafis dan mudah digunakan. Contohnya seperti &lt;a href="https://webmin.com/"&gt;Webmin&lt;/a&gt; dan &lt;a href="https://cockpit-project.org/"&gt;Cockpit&lt;/a&gt;. Tools ini bertujuan untuk memudahkan &lt;em&gt;sysadmin&lt;/em&gt; mengelola sistem linux mereka tanpa ribet dengan urusan SSH key, salah ketik perintah, atau untuk mengurus banyak server sekaligus tanpa perlu berpindah-pindah terminal SSH.&lt;/p&gt;

&lt;p&gt;Pada artikel ini, kita akan mencoba untuk melakukan instalasi Cockpit di Ubuntu Server yang ada di AWS. JIka kalian belum tahu bagaimana cara membuat virtual machine Ubuntu Server di AWS, kalian dapat melihat artikel &lt;a href="https://febryandana.xyz/membuat-ec2-instance-pada-aws/"&gt;Membuat EC2 Instance pada AWS&lt;/a&gt; terlebih dahulu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalasi Paket Cockpit
&lt;/h2&gt;

&lt;p&gt;Instalasi Cockpit sangat sederhana. Hanya ada satu package yang perlu dipasang dan untungnya, paket instalasi Cockpit sudah tersedia di hampir semua package manager. Yang perlu diperhatikan adalah bahwa Cockpit secara default memakai port TCP/9090 untuk akses ke website-nya sehingga kita perlu membuka firewall untuk port tersebut.&lt;/p&gt;

&lt;p&gt;Jika menggunakan AWS EC2 Instance, kita bisa memodifikasi Security Group yang terhubung dengan Instance tempat Cockpit berada. Jika menggunakan aplikasi firewall seperti UFW, kita harus menambahkan aturan baru untuk mengizinkan akses masuk ke port TCP/9090 dengan perintah :&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;ufw allow 9090
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paket instalasi Cockpit sudah tersedia dalam repositori Ubuntu sehingga untuk memasangnya kita cukup memberikan perintah :&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;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; cockpit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika kalian menggunakan sistem lain, Cockpit juga sudah menyediakan panduan instalasi untuk banyak sistem operasi yang bisa dilihat di &lt;a href="https://cockpit-project.org/running.html"&gt;cockpit-project.org/running&lt;/a&gt;. Cockpit sudah mendukung sebagian besar distro Linux seperti Debian, Red Hat Linux Enterprise, Fedora, Arch, dll.&lt;/p&gt;

&lt;p&gt;Setelah sistem menyelesaikan instalasi, cockpit dapat langsung diakses di &lt;a href="http://SERVER_PUBLIC_IP:9090"&gt;http://SERVER_PUBLIC_IP:9090&lt;/a&gt; atau di &lt;a href="http://YOUR_DOMAIN.COM:9090"&gt;http://YOUR_DOMAIN.COM:9090&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;SERVER_PUBLIC_IP dan YOUR_DOMAIN.COM hanya contoh, gunakan IP Address atau domain yang ada di server Cockpit kalian sendiri.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Tampilan Cockpit
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9PmY0aqY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/ab2df571a79d42ec83cf274558ecad8e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9PmY0aqY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/ab2df571a79d42ec83cf274558ecad8e.png" alt="Cockpit login page.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gambar di atas adalah tampilan login page Cockpit ketika pertama kali diakses. Untuk masuk ke dalam Cockpit kita perlu memberikan user name dan password sistem.&lt;br&gt;
Dalam beberapa kasus seperti Instance di AWS, secara default kita tidak memiliki password untuk user sistem. Untuk itu kita bisa memberikan sendiri password-nya dengan perintah:&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;passwd &lt;span class="nv"&gt;$USER&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perintah ini berguna untuk mengganti password dari user. Setelah password selesai dibuat, kita bisa masuk Cockpit menggunakan username dari &lt;code&gt;$USER&lt;/code&gt; dan password yang baru kita buat.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wXmUHXMx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/50acd4ee0d8d42168cc253331ca996e1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wXmUHXMx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/50acd4ee0d8d42168cc253331ca996e1.png" alt="Cockpit Overview menu.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ketika kita sudah masuk, kita akan disambut menu &lt;strong&gt;Host&lt;/strong&gt; yang berisi layanan-layanan dari Cockpit seperti Overview, Logs, Storage, dan sebagainya yang akan dibahas lebih lanjut. Di bawah menu Host terdapat menu Dashboard yang berisi grafik penggunaan secara real time dari komponen CPU, Memory, Network, dan Disk I/O. Desain antarmuka pengguna dari Cockpit cukup sederhana dan intuitif sehingga mudah digunakan bahkan oleh pemula sekalipun.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0suYbYtt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/1d26cba15ed044d98746b89af6c069c1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0suYbYtt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/1d26cba15ed044d98746b89af6c069c1.png" alt="Cockpit Dashboard.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Salah satu kelebihan Cockpit adalah kita bisa menambahkan server lain ke dalam Cockpit sehingga satu halaman Cockpit saja bisa digunaka untuk mengelola semua server yang kita miliki. Kita akan mencoba fitur ini di bagian akhir artikel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Daftar Layanan Cockpit
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Overview
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wXmUHXMx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/50acd4ee0d8d42168cc253331ca996e1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wXmUHXMx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/50acd4ee0d8d42168cc253331ca996e1.png" alt="Cockpit Overview menu.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pada bagian Overview kita bisa melihat ringkasan dari sistem seperti kesehatan sistem, penggunaan CPU dan Memory, informasi sistem, dan konfigurasi sistem&lt;/p&gt;

&lt;h3&gt;
  
  
  Logs
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iWUkAgaE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/39daa581332444b4b7eb01f82801a304.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iWUkAgaE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/39daa581332444b4b7eb01f82801a304.png" alt="Cockpit Logs menu.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pada bagian Logs ditampilkan daftar error, peringatan, dan informasi log penting lainnya dari sistem. Kita dapat melihat logs dari range waktu tertentu&lt;/p&gt;

&lt;h3&gt;
  
  
  Storage
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LZg3Z-Jz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/9c749319449c4ce2af9e8dc560092891.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LZg3Z-Jz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/9c749319449c4ce2af9e8dc560092891.png" alt="Cockpit Storage menu.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pada bagian Storage ditampilkan daftar perangkat dan drive storage yang terhubung, detail filesystem dan sisa penggunaan storage, informasi logs dari storage, serta grafik real time usage dari aksi Baca/Tulis perangkat storage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Networking
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CzPeakDI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/11aa2311b1924b7ab3206e88221e30c6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CzPeakDI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/11aa2311b1924b7ab3206e88221e30c6.png" alt="Cockpit Networking menu.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Di bagian ini, kita bisa melihat daftar perangkat kartu jaringan dan grafik dari trafik penggunaan jaringan (send/receive). Kita juga bisa melihat informasi logs tentang status jaringan dari sistem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Accounts
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FDY__AFq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/4abbc7f9df364e52ada4b42e373c0d41.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FDY__AFq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/4abbc7f9df364e52ada4b42e373c0d41.png" alt="Cockpit Accounts menu.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Di bagian Account, terdapat daftar akun yang ada di dalam sistem. Di dalamnya kita bisa memodifikasi beberapa pengaturan akun seperti Role administrator, mengunci akses akun, mengganti password, dan lain-lain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Services
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tel1vE5p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/a84a101024db4a588ad0b610565ad759.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tel1vE5p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/a84a101024db4a588ad0b610565ad759.png" alt="Cockpit Services menu.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bagian Services menampilkan daftar services yang aktif maupun non-aktif yang ada di dalam sistem. Disini kita bisa mengatur status services, mengatur automatic startup, menambahkan/menghapus path, dan lain-lain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Applications
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dWWNsjKB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/1036151cd284426eba04dd2fe5bdfd25.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dWWNsjKB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/1036151cd284426eba04dd2fe5bdfd25.png" alt="Cockpit Applications menu.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bagian Applications menampilkan daftar plugin aplikasi yang dapat digunakan oleh Cockpit. Kita bisa menambahkan atau mematikan aplikasi Cockpit melalui menu ini. Daftar aplikasi Cockpit yang tersedia dapat dilihat di &lt;a href="https://cockpit-project.org/applications.html"&gt;cockpit-project.org/applications&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Software Updates
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--K0jX4qMw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/ee5db2bf08194c97ac1d4ed7637f8cad.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--K0jX4qMw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/ee5db2bf08194c97ac1d4ed7637f8cad.png" alt="Cockpit Software Updates menu.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kita bisa melakukan update sistem secara keseluruhan maupun per software melalui menu Software Updates.&lt;/p&gt;

&lt;h3&gt;
  
  
  Terminal
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0Que1h6F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/e8dc117870a84831bc89c81dec677a65.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0Que1h6F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/e8dc117870a84831bc89c81dec677a65.png" alt="Cockpit Terminal menu.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Selain kontrol menggunakan GUI, Cockpit juga memiliki built-in terminal untuk mengelola sistem melalui command line. Dengan adanya built-in terminal, kita tidak perlu menggunakan SSH atau tool komunikasi lain untuk mengakses server, semuanya cukup menggunakan satu halaman Cockpit. Dengan terminal ini kita bisa melakukan apa saja ke dalam sistem seperti memasang aplikasi baru, mengganti file konfigurasi, manipulasi teks atau file, dan lain-lain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mengelola Server Lain Melalui Cockpit
&lt;/h2&gt;

&lt;p&gt;Selanjutnya kita akan mencoba menambahkan server baru untuk dikelola dalam satu Cockpit. Untuk mengakses server lain, Cockpit memanfaatkan layanan SSH dengan menggunakan proses &lt;code&gt;cockpit-bridge&lt;/code&gt;. Cockpit mengakses server lain melalui &lt;em&gt;password based authentication&lt;/em&gt; sehingga kita harus mengaktifkan opsi tersebut terlebih dahulu. Untuk mengaktifkan password based authentication, kita cukup memodifikasi satu baris di &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt; :&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;nano /etc/sshd/sshd_config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cari baris "&lt;code&gt;PasswordAuthentication no&lt;/code&gt;" dan ubah menjadi "&lt;code&gt;PasswordAuthentication yes&lt;/code&gt;" (tanpa tanda kutip). Simpan file dengan &lt;code&gt;Ctrl+S&lt;/code&gt; dan keluar dengan &lt;code&gt;Ctrl+X&lt;/code&gt; . Kemudian restart service SSHD dengan perintah :&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;systemctl restart sshd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tahap selanjutnya akan dilakukan melalui website Cockpit di server utama kita. Pertama kita masuk ke dalam Dashboard Cockpit, lalu klik tombol "+" biru di sebelah kanan atas dari tabel Servers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0suYbYtt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/1d26cba15ed044d98746b89af6c069c1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0suYbYtt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/1d26cba15ed044d98746b89af6c069c1.png" alt="Cockpit Dashboard.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Akan muncul dialog &lt;em&gt;Add Machine to Dashboard&lt;/em&gt;. Masukkan IP Address atau hostname dari mesin yang akan kita kelola,pilih warna identitasnya, lalu klik &lt;em&gt;Add&lt;/em&gt;. Jika semua server yang akan dikelola berada dalam satu jaringan yang sama, lebih baik gunakan hostname atau IP Address lokal untuk mengurangi latency dan beban jaringan ke luar (internet).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SwXtWUM6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/d9fbf8fd379743a187c32012abd590dc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SwXtWUM6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/d9fbf8fd379743a187c32012abd590dc.png" alt="Add machine to dashboard.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Selanjutnya akan muncul dialog &lt;em&gt;Log in to server&lt;/em&gt;. Masukkan username server lain, ubah autentikasinya menggunakan password, lalu masukkan password user server lain tersebut dan klik &lt;em&gt;Log in&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5Ols7um5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/596cbb941e004cfbac6e0e6c8e0bcf59.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5Ols7um5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/596cbb941e004cfbac6e0e6c8e0bcf59.png" alt="Log in to server.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jika proses &lt;em&gt;Log in&lt;/em&gt; berhasil, seharusnya akan muncul item berupa hostname dari server baru tersebut di tabel Servers. Grafik penggunaannya juga akan muncul di bagian grafik dengan warna yang sudah ditentukan sebelumnya.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sI1LpnBK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/67d2fa89a9a4453c9060f03f3a291cf6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sI1LpnBK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/67d2fa89a9a4453c9060f03f3a291cf6.png" alt="Servers table.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kita bisa memulai mengelola server lain dengan menekan hostname di menu Host lalu memilih hostname server lain.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZwV3Xuuh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/65f3d1fc0610456fafaef1453c9f1a16.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZwV3Xuuh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/febryandana/febryandana.github.io/master/images/2021-08-20-kelola-server-lewat-website-dengan-cockpit/65f3d1fc0610456fafaef1453c9f1a16.png" alt="Cockpit host list.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kita bisa menambahkan sistem server lain sebanyak yang kita mau selama semua server tersebut berhasil dipasang paket Cockpit tanpa ada masalah perbedaan sistem operasi. Cockpit cukup dapat diandalkan baik oleh pemula maupun sysadmin yang sudah berpengelaman untuk mengelola sistem server. Dengan Cockpit, kita bisa mengelola banyak remote server secara sekaligus dalam satu tempat tanpa perlu berganti-ganti perangkat atau SSH. Kita bisa mengelola banyak hal dengan memanfaatkan Cockpit seperti memasang aplikasi baru, mengecek load penggunaan CPU dan Memory, mengubah status services, reboot dan shutdown server, dan lain sebagainya.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referensi
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cockpit-project.org"&gt;Halaman Web Cockpit Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cockpit-project/cockpit"&gt;Repositori Github Cockpit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>management</category>
      <category>cloud</category>
      <category>ubuntu</category>
      <category>indonesia</category>
    </item>
    <item>
      <title>Membuat EC2 Instance pada AWS</title>
      <dc:creator>febryandana</dc:creator>
      <pubDate>Wed, 18 Aug 2021 15:12:47 +0000</pubDate>
      <link>https://dev.to/febryandana/membuat-ec2-instance-pada-aws-2ol7</link>
      <guid>https://dev.to/febryandana/membuat-ec2-instance-pada-aws-2ol7</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;em&gt;AWS Elastic Compute Cloud&lt;/em&gt;&lt;/strong&gt; (&lt;strong&gt;EC2&lt;/strong&gt;) adalah salah satu service dari &lt;a href="https://aws.amazon.com"&gt;Amazon Web Service&lt;/a&gt; yang paling populer digunakan. &lt;strong&gt;EC2&lt;/strong&gt; adalah service yang menawarkan komponen &lt;em&gt;cloud computing&lt;/em&gt; seperti &lt;em&gt;virtual machine&lt;/em&gt; yang Amazon sebut sebagai &lt;strong&gt;&lt;em&gt;Instance&lt;/em&gt;&lt;/strong&gt; yang memiliki banyak pilihan spesifikasi, &lt;strong&gt;&lt;em&gt;Amazon Machine Image&lt;/em&gt;&lt;/strong&gt; (&lt;strong&gt;AMI&lt;/strong&gt;) yang merupakan kumpulan OS image yang dapat dipasang untuk &lt;em&gt;Instance&lt;/em&gt;, &lt;strong&gt;&lt;em&gt;Elastic IP&lt;/em&gt;&lt;/strong&gt; yang merupakan IPv4 Public statis cocok digunakan untuk DNS record, &lt;strong&gt;&lt;em&gt;Amazon Elastic Block Store&lt;/em&gt;&lt;/strong&gt; (&lt;strong&gt;Amazon EBS&lt;/strong&gt;) sebagai &lt;em&gt;persistent storage&lt;/em&gt;, dan lain-lain yang bisa dilihat sendiri &lt;a href="https://docs.aws.amazon.com/ec2/index.html"&gt;disini&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Membuat EC2 Instance di AWS cukup sederhana, hanya ada beberapa tahap yang perlu dilakukan.&lt;/p&gt;

&lt;h3&gt;
  
  
  0. Persiapan - Masuk ke layanan EC2 pada AWS Console
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uZnE7c0J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/km5yel0qmb888clet73i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uZnE7c0J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/km5yel0qmb888clet73i.png" alt="image_2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sebelum membuat EC2 Instance, pertama-tama siapkan dulu kebutuhan sistem yang akan digunakan. Perkirakan seberapa berat beban komputasi yang akan ditanggung dan seberapa besar spesifikasi mesin yang cukup untuk menanggungnya. Setelah itu baru kita masuk ke tahap awal dari membuat EC2 instance, yaitu masuk ke dalam AWS Console. Pastikan akun yang kita gunakan memiliki akses untuk EC2, kemudian pilih layanan EC2 di bagian All Services. Gambar di atas adalah tampilan dashboard utama dari layanan EC2, untuk membuat Instance baru, kita bia memilih tombol "Launch instance".&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Memilih AMI (Amazon Machine Image) dari OS yang akan digunakan
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g_I7liKt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5gx1lv3ej709olwuvi89.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g_I7liKt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5gx1lv3ej709olwuvi89.png" alt="image_3"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Selanjutnya kita akan disambut oleh menu pilihan AMI. Kita bisa memilih AMI yang direkomendasikan AWS di bagian Quick Start, menggunakan AMI milik kita sendiri jika ada, atau memilih untuk menggunakan AMI yang ada di AWS Marketplace atau AMI milik komunitas.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Memilih spesifikasi Instance
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xtS8O1KG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7w073g11yvzmx2k0apoo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xtS8O1KG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7w073g11yvzmx2k0apoo.png" alt="image_4"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tahap selanjutnya adalah memilih jenis dan spesifikasi Instance yang akan digunakan. AWS menyediakan banyak sekali spesifikasi Instance yang dapat dipilih, pilihan spesifikasi Instances dibedakan sebagai "family", mulai dari keluarga T, C, M, R dan sebagainya. Penjelasan lebih lanjut tentang pilihan Instance bisa dilihat &lt;a href="https://aws.amazon.com/ec2/instance-types/"&gt;disini&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Mengatur detail Instance
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oFku-mfx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mrbkctwy14tj887peblj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oFku-mfx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mrbkctwy14tj887peblj.png" alt="image_5"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Spesifikasi Instance yang kita pilih dapat diatur lebih lanjut di tahap ini. Disini kita bisa mengatur jumlah Instance yang akan dibuat, pilihan pembayaran, jaringan dan subnet yang digunakan, IAM Role, monitoring, dan lain sebagainya. Setelah dirasa cukup, kita bisa melanjutkan ke tahap berikutnya.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Memberi storage untuk Instance
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yRKGgRPk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8c0faappxz6xiyvpil4i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yRKGgRPk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8c0faappxz6xiyvpil4i.png" alt="image_6"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tahap selanjutnya adalah mengatur ukuran dan tipe media penyimpanan yang akan digunakan. Minimal satu volume harus ada sebagai Root Volume. Kita bisa memilih kapasitas storage dengan bebas tetapi sebaiknya disesuaikan dengan kebutuhan karena setiap GB dari storage ini akan tetap dihitung biayanya (kecuali jika masih dalam batasan Free Tier). Kita juga bisa memilih tipe volume dan enkripsi yang akan digunakan untuk volume tersebut. Penjelasan lengkap untuk EC2 Storage ini dapat dibaca &lt;a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Storage.html?icmpid=docs_ec2_console"&gt;disini&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Memberi tag pada instance
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---CMvkdTR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tiv25bp9pqibu314z87m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---CMvkdTR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tiv25bp9pqibu314z87m.png" alt="image_7"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Langkah kelima ini sebenarnya opsional. Tanpa tag pun kita masih bisa membuat Instance. Tetapi best practice-nya memang sebaiknya kita memberikan tag untuk setiap komponen AWS yang dibuat agar lebih mudah dalam manajemen. Paling tidak berikan Name tag untuk membedakan nama setiap Instance yang akan dibuat.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Mengatur Security Group untuk keamanan Instance
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SO_ne74U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sj0wt7rt7nl7f4k1e2cd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SO_ne74U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sj0wt7rt7nl7f4k1e2cd.png" alt="image_8"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tentunya kita pasti tidak ingin Instance kita dapat dibobol dengan mudah oleh orang lain bukan? Oleh karena itu tahap keenam ini menjadi bagian yang cukup krusial karena berhubungan dengan keamanan Instance. Pastikan untuk hanya membuka protokol dan port yang memang benar-benar dibutuhkan saja. Untuk keamanan lebih, kita juga bisa membatasi hanya IP Address dari sumber tertentu saja yang dapat mengakses Instance. Penjelasan lebih lanjut tentang EC2 Security Group dapat dibaca &lt;a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-security-groups.html?icmpid=docs_ec2_console"&gt;disini&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Pengecekan terakhir dan meluncurkan Instance
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eNPrkzxX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/007mafpk28wluzmkacha.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eNPrkzxX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/007mafpk28wluzmkacha.png" alt="image_9"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tahap terakhir dari pembuatan EC2 Instance adalah review. Di tahap ini kita disuguhkan detail dari konfigurasi Instance yang sudah kita buat sebelumnya. Pastikan bahwa pengaturan yang dibuat sudah sesuai dengan apa yang kita butuhkan agar tidak repot mengatur ulang nantinya. Jika dirasa sudah yakin, kita lanjutkan dengan menekan tombol "Launch" untuk meluncurkan Instance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gKi7M5zK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c2tp4jib18dvudfhg2c0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gKi7M5zK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c2tp4jib18dvudfhg2c0.png" alt="image_10"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sebelum meluncurkan Instance, kita akan diberikan jendela terakhir dimana kita harus memilih SSH key pair untuk mengakses Instance nantinya. Kita bisa memilih untuk membuat key baru, memilih dari yang sudah ada, atau melanjutkan tanpa key. Simpan SSH key yang dibuat dengan baik karena kita tidak bisa mengunduhnya ulang setelah Instance dibuat. Setelah itu lanjutkan dengan menekan tombol "Launch Instances" untuk menyelesaian pembuatan AWS EC2 Instance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OsTUOs6M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sbr5mizj89hjkbhoie3v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OsTUOs6M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sbr5mizj89hjkbhoie3v.png" alt="image_11"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Detail Instance yang telah dibuat dapat dilihat di menu "Instances" dari daftar menu sebelah kiri. Disini kita bisa melihat detail Instance, Security, Networking, dan lain-lain. Selain itu kita juga bisa menghentikan dan menghapus Instance. Ada juga pilihan Actions seperti untuk menghubungi Instance, mengganti tipe Instance, mengubah Security Group, dan lain-lain. AWS EC2 memberikan kemudahan dan kontrol yang sangat luas terhadap cloud computer yang kita buat.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mematikan EC2 Instance
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---ZggnpdS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ox2e1cswekdlmkw56p8w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---ZggnpdS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ox2e1cswekdlmkw56p8w.png" alt="image_12"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Untuk menghemat biaya, sebaiknya kita mematikan EC2 Instance yang sudah tidak digunakan. Cara mematikan dan menghapus EC2 Instance sangat sederhana. Pertama-tama masuk ke dalam EC2 Dashboard dan pilih menu Instances. Kemudian centang Instance yang ingin dimatikan atau ingin dihapus. Selanjutnya klik pada menu Instance State di sebelah kanan atas. Akan muncul pilihan menu status instance :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stop Instance : Untuk mematikan Instance tanpa menghapusnya. Biaya Instance masih akan tetap berjalan meskipun Instance berhenti&lt;/li&gt;
&lt;li&gt;Start Instance : Untuk menjalankan kembali Instance yang sudah di-stop&lt;/li&gt;
&lt;li&gt;Reboot Instance : Untuk memuat ulang Instance&lt;/li&gt;
&lt;li&gt;Hibernate Instance : Untuk menghibernasi Instance&lt;/li&gt;
&lt;li&gt;Terminate Instance : Untuk menghapus Instance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Item yang terhapus termasuk Instance, Network Interface, dan Volume storage beserta data-data yang ada di dalamnya. Instance yang telah terhapus tidak dapat dikembalikan, karena itu sebelum menghapus Instance pastikan bahwa sudah tidak ada data penting di dalamnya dan Instance benar-benar sudah tidak dibutuhkan lagi.&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>aws</category>
      <category>indonesia</category>
    </item>
    <item>
      <title>Mengakses Ubuntu di Cloud Menggunakan xrdp</title>
      <dc:creator>febryandana</dc:creator>
      <pubDate>Wed, 04 Aug 2021 05:26:50 +0000</pubDate>
      <link>https://dev.to/febryandana/mengakses-ubuntu-di-cloud-menggunakan-xrdp-a0p</link>
      <guid>https://dev.to/febryandana/mengakses-ubuntu-di-cloud-menggunakan-xrdp-a0p</guid>
      <description>&lt;p&gt;Kita bisa mengakses Ubuntu server yang ada di cloud seperti AWS, GCP, DigitalOcean, dll dengan menggunakan GUI daripada melalui SSH seperti yang biasa digunakan. Manfaatnya? Tidak begitu banyak. Justru cenderung lebih banyak kekurangan yang perlu diperhatikan seperti tambahan beban kerja yang tidak diperlukan, tambahan aplikasi-aplikasi yang mungkin akan jarang dipakai, dan beban jaringan yang lebih berat karena harus mengirim lebih banyak data.&lt;/p&gt;

&lt;p&gt;Tapi bukan berarti GUI untuk Ubuntu server tidak berguna. Kalian bisa memanfaatkan Ubuntu GUI di cloud tersebut sebagai pengganti desktop, untuk menyimpan data jauh lebih banyak, atau memanfaatkannya untuk mengunduh file-file besar menggunakan jaringan internet dari cloud provider yang lebih cepat dan stabil. Bisa juga digunakan untuk melakukan administrasi server dengan aplikasi versi GUI yang lebih user friendly.&lt;/p&gt;

&lt;p&gt;Pada artikel ini, penulis menggunakan OS Ubuntu Server 20.04 LTS yang dipasang di AWS EC2. Tidak ada perhatian khusus selain layanan Security Group pada EC2 sehingga perintah-perintah ini dapat direplikasi untuk sistem lain yang berbasis Ubuntu. Desktop Environment yang digunakan adalah &lt;a href="https://lxde.org/"&gt;LXDE&lt;/a&gt; dengan pertimbangan ukurannya yang kecil dan ringan tetapi memiliki layanan yang lengkap. Kalian juga bisa memasang Desktop Environment lainnya atau memilih jalur menggunakan Window Manager.&lt;/p&gt;

&lt;p&gt;Untuk menghubungkan komputer dengan Ubuntu LXDE di cloud, penulis menggunakan &lt;a href="https://github.com/neutrinolabs/xrdp"&gt;xrdp&lt;/a&gt;. Aplikasi xrdp adalah implementasi open source dari layanan RDP (Remote Desktop Protocol) milik Microsoft. Fitur dari xrdp antara lain :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Terhubung dengan desktop Linux dari manapun&lt;/li&gt;
&lt;li&gt;Reconnect ke sesi yang sudah ada&lt;/li&gt;
&lt;li&gt;Mengubah ukuran session&lt;/li&gt;
&lt;li&gt;Dapat berperan sebagai RDP/VNC proxy&lt;/li&gt;
&lt;li&gt;Two-way clipboard (text, bitmap, file)&lt;/li&gt;
&lt;li&gt;Audio &amp;amp; microphone redirection&lt;/li&gt;
&lt;li&gt;Drive redirection&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Persiapan
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Pastikan untuk membuka akses pada port TCP/3389. Hal ini dapat dilakukan pada Security Group di EC2 (kalian bisa menyesuaikan dengan cloud provider kalian sendiri). Pastikan juga untuk membuka akses port tersebut jika menggunakan firewall di dalam Ubuntu (ufw, iptables, dsb).&lt;/li&gt;
&lt;li&gt;Pastikan sisa storage yang tersedia cukup untuk melakukan instalasi LXDE dan aplikasi bawaannya. Setidaknya siapkan ruang sebesar 2 GB.&lt;/li&gt;
&lt;li&gt;Siapkan waktu dan teh karena proses download dan instalasinya dapat memakan waktu.&lt;/li&gt;
&lt;li&gt;Untuk terhubung dengan Ubuntu Desktop di cloud, kita perlu memasang RDP/VNC client seperti Remmina di komputer client.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Langkah-Langkah
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Masuk ke Ubuntu Server melalui koneksi SSH&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pastikan user kalian memiliki password. Jika belum ada, berikan password dengan perintah :  &lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ sudo passwd [namauser]&lt;/code&gt;&lt;br&gt;&lt;br&gt;
contoh :&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ sudo passwd ubuntu&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Melakukan update untuk memperbarui software dan menambal keamanan Ubuntu  &lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ sudo apt-get update &amp;amp;&amp;amp; sudo apt-get upgrade -y&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Melakukan instalasi LXDE  &lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ sudo apt-get install lxde -y&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Minum teh dan lakukan pemanasan singkat sembari menunggu instalasi berlangsung&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Setelah instalasi LXDE selesai, lakukan instalasi xrdp.  &lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ sudo apt-get install xrdp -y&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;That's it. Setelah langkah-langkah di atas selesai dan sukses dijalankan, kita bisa langsung mengakses versi GUI-nya melalui RDP/VNC client.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Mengakses Ubuntu Desktop di Cloud
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Buka aplikasi Remmina atau RDP/VNC client lainnya.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Gunakan public IP Address atau public DNS milik Ubuntu Server untuk terhubung ke Remmina&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cuMgCjrf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lqkxle399faavbiynvdg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cuMgCjrf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lqkxle399faavbiynvdg.png" alt="Tampilan awal Remmina"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Masukkan user dan password user yang digunakan oleh Ubuntu Server&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IPuINN_K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/052fl7o2me7r8f92v2w8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IPuINN_K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/052fl7o2me7r8f92v2w8.png" alt="Input user password"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Selesai. Kalian telah masuk ke Ubuntu Server dengan mode GUI.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oyAsqzoh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2hppidfqxi02x97yfddf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oyAsqzoh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2hppidfqxi02x97yfddf.png" alt="file manager"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qfLvOpDv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nenpkkkmpvce4umh7do8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qfLvOpDv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nenpkkkmpvce4umh7do8.png" alt="Terminal"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;Memasang antarmuka grafis untuk Ubuntu Server di Cloud cukup sederhana dan mudah. Kita bisa memanfaatkan mode GUI di Ubuntu Server sebagai cloud PC. Jika ingin melakukan administrasi server dengan antarmuka grafis, penulis lebih menyarankan penggunaan layanan administrasi berbasis web seperti Webmin dan Cockpit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referensi
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;linuxize.com. How to Install Xrdp Server (Remote Desktop) on Ubuntu 20.04. Diakses 30 Juli 2021, dari &lt;a href="https://linuxize.com/post/how-to-install-xrdp-on-ubuntu-20-04/"&gt;https://linuxize.com/post/how-to-install-xrdp-on-ubuntu-20-04/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Stas, C. (2021). How to Install GUI on Ubuntu Server [Beginner's Guide]. Diakses 30 Juli 2021, dari &lt;a href="https://itsfoss.com/install-gui-ubuntu-server/"&gt;https://itsfoss.com/install-gui-ubuntu-server/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.australtect.net"&gt;www.australtect.net&lt;/a&gt;. How To Enable GUI On AWS EC2 Ubuntu server. Diakses 30 Juli 2021, dari &lt;a href="https://www.australtech.net/how-to-enable-gui-on-aws-ec2-ubuntu-server/"&gt;https://www.australtech.net/how-to-enable-gui-on-aws-ec2-ubuntu-server/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cloudnative</category>
      <category>ubuntu</category>
      <category>remote</category>
      <category>indonesia</category>
    </item>
    <item>
      <title>Mengenal Cloud Computing</title>
      <dc:creator>febryandana</dc:creator>
      <pubDate>Wed, 04 Aug 2021 05:21:44 +0000</pubDate>
      <link>https://dev.to/febryandana/mengenal-cloud-computing-53f6</link>
      <guid>https://dev.to/febryandana/mengenal-cloud-computing-53f6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;THERE IS NO CLOUD, It's Just Someone Else's Computer  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;or is it?&lt;/em&gt;&lt;br&gt;&lt;br&gt;
Untuk mengetahuinya, kita harus memahami dulu tentang cloud computing. Apa itu cloud computing? Kenapa namanya cloud? Apakah komputernya memang ada di awan?&lt;/p&gt;




&lt;h2&gt;
  
  
  Apa Itu Cloud Computing?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IUe18oAk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ti7ir9gir4pdk14gg7y2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IUe18oAk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ti7ir9gir4pdk14gg7y2.jpg" alt="Ilustrasi Datacenter"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Menurut &lt;a href="https://www.newyorker.com/books/page-turner/how-the-metaphor-of-the-cloud-changed-our-attitude-toward-the-internet"&gt;newyorker.com&lt;/a&gt;, istilah cloud (awan) adalah simbol, sebagai metafora bahwa data kita ada di suatu tempat di luar sana, melayang, mengambang, berpindah-pindah, dan selalu ada kapan saja dan dimana saja saat kita membutuhkannya. Istilah awan juga menarik dan menggugah benak orang karena sangat berseberangan kenyataan dimana internet terdiri dari material yang nyata seperti colokan, kabel, hard disk drive, prosesor, dan lain sebagainya.&lt;/p&gt;

&lt;p&gt;Lalu apa itu cloud computing? Menurut &lt;a href="https://ieeexplore.ieee.org/document/9044834"&gt;Ahmadreza&lt;/a&gt;, cloud computing adalah kemampuan untuk menyediakan sumber daya sistem komputer sesuai permintaan, terutama data storage dan computing power, tanpa campur tangan langsung dari pengguna. Secara sederhana, cloud computing adalah sebuah layanan dimana pengguna dapat memiliki sumber daya IT seperti komputer, storage, IP Address, dan lain-lain secara mudah, sangat scalable, dan dengan dengan skema harga yang dapat dipilih sesuai keinginan.&lt;/p&gt;

&lt;p&gt;Biasanya, jika kita ingin membuat suatu data center atau server untuk suatu layanan, kita harus membangunnya sendiri mulai dari rancangan spesifikasi komputer, prediksi penggunaan di masa depan, alokasi anggaran, penyediaan tempat, kelistrikan, pendinginan dan lain-lain. Model seperti ini biasanya disebut On-Premise, dimana perangkat keras data center berada di tempat yang sama dengan pengguna dan memiliki kontrol fisik terhadap server. Karena mengurus server model On-Premise sangat merepotkan dan membutuhkan banyak uang, munculnya inovasi cloud computing menjadi angin segar yang sangat menarik. Dengan cloud, masalah-masalah tersebut akan dibebankan kepada cloud service provider. Kita cukup mengalokasikan anggaran dana dan rancangan penggunaan yang kita inginkan. Cloud computing juga sangat scalable, penggunaan sumber daya yang kita gunakan dapat dengan mudah diatur menyesuaikan kebutuhan. Penyesuaian skala seperti ini membuat biaya pengeluaran dapat ditekan serendah mungkin tanpa perlu khawatir kekurangan sumber daya untuk server.&lt;/p&gt;




&lt;h2&gt;
  
  
  Jenis-Jenis Cloud Computing
&lt;/h2&gt;

&lt;p&gt;Model penerapan (deployment) cloud computing secara umum terbagi menjadi 3 jenis: Public Cloud, Private Cloud, dan Hybrid Cloud.&lt;/p&gt;

&lt;h3&gt;
  
  
  Public Cloud
&lt;/h3&gt;

&lt;p&gt;Pada model penerapan Public Cloud, sumber daya IT (server, database, jaringan, dll) sepenuhnya berbasis di cloud dan dikelola oleh cloud service provider. Sumber daya IT (biasanya hardware) dari model ini akan digunakan bersama-sama dengan user lain sehingga tidak ada yang menganggur, sehingga perbandingan biaya dan penggunaan cloud dapat ditekan serendah mungkin membuat harganya lebih murah. Tetapi dengan catatan memungkinkan munculnya masalah keamanan (hacking, bencana, privasi, dll).&lt;/p&gt;

&lt;h3&gt;
  
  
  Private Cloud (On-Premise)
&lt;/h3&gt;

&lt;p&gt;Model Private Cloud lebih mirip seperti On-Premise. Ketika menggunakan model Private Cloud, sumber daya IT yang disediakan cloud service provider akan digunakan sepenuhnya untuk 1 client saja tanpa dibagi-bagi sehingga keamanannya lebih kuat dibanding model Public Cloud. Kekurangannya ada pada harganya yang lebih mahal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hybrid Cloud
&lt;/h3&gt;

&lt;p&gt;Hybrid Cloud adalah gabungan dari Public Cloud dan Private Cloud. Pendekatan seperti ini dapat digunakan untuk banyak situasi seperti aturan yang mengharuskan adanya data yang disimpan di data center lokal, penggunaan fungsi backup, atau untuk meningkatkan keamanan dengan menyimpan data penting dan rahasia di data center on-premise sementara aplikasinya diletakkan di public cloud untuk menjangkau pengguna secara cepat.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nng7DXxI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o3v8e35qosgrvi7cl2ha.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nng7DXxI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o3v8e35qosgrvi7cl2ha.png" alt="Cloud deployment types"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Selain dari model penerapannya, cloud computing juga dapat dibagi dari model arsitektur atau layanannya, yaitu Iaas, Paas, dan SaaS.&lt;/p&gt;

&lt;h3&gt;
  
  
  Infrastructure-as-a-Service (IaaS)
&lt;/h3&gt;

&lt;p&gt;IaaS adalah layanan cloud computing dimana kita mendapat akses penuh terhadap VM yang kita pesan, sementara cloud service provider akan mengelola sumber daya dasar seperti CPU, memory, storage, jaringan, dan server fisik. Pengguna akan mendapat akses ke VM melalui SSH, dashboard GUI, atau metode lain untuk mengelola server virtual tersebut. IaaS memberikan kontrol yang luas kepada pengguna terhadap infrastuktur yang akan dibangun. Pengguna bebas melakukan hampir apa saja terhadap infrastruktur tersebut. Kelemahannya, karena diserahkan sepenuhnya kepada pengguna, cloud service provider tidak memberikan layanan keamanan yang mumpuni karena harus pengguna sendiri yang mengaturnya. Selain itu arsitektur seperti ini juga dapat menguras waktu karena pengguna harus menyiapkan environment untuk aplikasi terlebih dahulu sebelum dapat digunakan. Contoh layanan IaaS antara lain Elastic Compute Cloud dari Amazon Web Service (AWS EC2), Google Compute Engine, DigitalOcean, Microsoft Azure dan banyak penyedia VPS (Virtual Private Server) lainnya.&lt;/p&gt;

&lt;h3&gt;
  
  
  Platform-as-a-Service (PaaS)
&lt;/h3&gt;

&lt;p&gt;PaaS berada satu tingkat di atas IaaS dimana cloud service provider selain mengelola sumber daya IT pada IaaS, mereka juga membantu mengelola software dasar seperti sistem operasi dan service-service yang dibutuhkan untuk meluncurkan aplikasi pengguna. Ini membuat kita tidak perlu membuang waktu untuk menyiapkan environment aplikasi dan bisa fokus untuk membuat dan meluncurkan aplikasi saja. Kelemahannya, keamanan yang disiapkan cenderung berfokus untuk mengamankan platform saja, bukan aplikasi. Selain itu juga dapat muncul masalah inkompatibilitas jika ternyata platform yang disediakan tidak cocok dengan aplikasi kita. Contoh layanan PaaS adalah Heroku, AWS Beanstalk, AWS RDS, dan Google App Engine.&lt;/p&gt;

&lt;h3&gt;
  
  
  Software-as-a-Service (SaaS)
&lt;/h3&gt;

&lt;p&gt;Pada SaaS, kita benar-benar dimanjakan oleh cloud. Semua urusan cloud akan dikelola oleh cloud service provider sementara kita cukup menikmati layanan aplikasi yang sudah disediakan. Kita tidak perlu repot-repot mengurusi masalah pembuatan dan pengelolaan aplikasi atau server. Kelemahan dari SaaS biasanya fitur yang tersedia terbatas, tergantung pada penyedia layanan dan kita tidak bisa melakukan kustomisasi secara bebas. Contoh layanan SaaS adalah Google Workspace, Office 365, Dropbox, Adobe Creative Cloud, dan sebagainya.&lt;/p&gt;

&lt;p&gt;Selain 3 di atas ada pula model arsitektur lain seperti &lt;strong&gt;Database as a Service&lt;/strong&gt; (&lt;strong&gt;DBaaS&lt;/strong&gt;), &lt;strong&gt;Bare Metal as a Service&lt;/strong&gt; (&lt;strong&gt;BMaaS&lt;/strong&gt;), dan &lt;strong&gt;Function as a Service&lt;/strong&gt; (&lt;strong&gt;FaaS&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;Di bawah ini adalah visualisasi perbandingan antara On-Premise, IaaS, PaaS, dan SaaS dari segi manajemennya:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FPHrrqim--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3cqrrqead8r642bi05nc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FPHrrqim--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3cqrrqead8r642bi05nc.png" alt="Cloud Comparison"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Plus-Minus dari Cloud Computing
&lt;/h2&gt;

&lt;p&gt;Ada banyak sekali manfaat dan kelebihan dari pemanfaatan cloud computing, beberapa di antaranya adalah :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Waktu deployment yang sangat cepat&lt;br&gt;&lt;br&gt;
Sumber daya IT pada Cloud Computing dapat digunakan dengan cepat, bahkan kurang dari satu jam. Kita tidak perlu menunggu perangkat datang, merakit server, dan melakukan instalasi macam-macam. Cukup beberapa kali klik dan cloud service provider akan langsung menyiapkan semua resource yang diperlukan.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Harga yang murah&lt;br&gt;&lt;br&gt;
Jika kita memilih model On-Premise maka kita akan dihadapkan oleh beban biaya yang sangat banyak, mulai dari biaya pembelian perangkat, kelistrikan, pendinginan, pembangunan ruang khusus, biaya instalasi, dll. Berbeda dengan cloud computing dimana kita cukup membayar biaya penggunaan saja karena beban-beban tersebut sudah ditanggung oleh cloud service provider.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mampu mendunia secara instant&lt;br&gt;&lt;br&gt;
Karena ditempatkan di cloud alias internet, kebanyakan cloud service provider juga menyediakan IP Address public yang dapat diakses langsung melalui internet. Beberapa cloud service provider juga memiliki layanan DNS dan IP public statis, hal ini membuat kita tidak perlu memusingkan urusan langganan IP Address dan domain name. Dengan begitu, aplikasi kita dapat langsung berada di internet dan diakses oleh siapa saja, di mana saja dan kapan saja.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Skalabilitas yang luar biasa&lt;br&gt;&lt;br&gt;
Karena kebanyakan layanan cloud berbasiskan virtualisasi, resource pada cloud computing dapat di-scale up/scale down dengan leluasa mengikuti kebutuhan sehingga bisa menghemat biaya pengeluaran dan mengurangi adanya sumber daya yang tidak terpakai/mubazir.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dapat diandalkan&lt;br&gt;&lt;br&gt;
Layanan cloud menerapkan pengelompokan berdasarkan region dan sistem redundansi pada infrastruktur data center-nya sehingga meningkatkan nilai ketersediaan (High Availabity) dan keandalan (Reliability) dari aplikasi kita. Adanya fitur backup and restore juga membuat kita tidak perlu khawatir merugi karena kehilangan data.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Namun dengan segala kelebihannya tersebut, cloud computing tetap memiliki beberapa kelemahan, seperti :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Harus selalu terhubung dengan internet&lt;br&gt;&lt;br&gt;
Karena berada di internet, mau tidak mau perangkat cloud dan client kita harus selalu terhubung ke internet untuk mengelola semua layanan cloud yang digunakan. Jika terjadi internet outage di data center cloud service provider, semua aplikasi kita akan berada dalam masalah besar. Masalah bandwidth juga menjadi concern utama dalam penggunaan cloud. Karena server kita diletakkan di satu tempat bersama dengan milik orang lain, dapat terjadi isu rebutan bandwidth karena jalur internet yang jauh lebih sedikit dibanding jumlah server dan masalah latency yang tinggi karena tempat data center-nya terlalu jauh dari pengguna.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Isu keamanan&lt;br&gt;&lt;br&gt;
Masalah keamanan dapat datang dari berbagai sisi, mulai dari kelalaian dalam mengatur firewall, bug/vulnerability pada aplikasi, kelalaian dalam mengatur izin user, dll. Tetapi dengan penggunaan cloud dapat muncul satu sisi masalah kemanan lagi, yaitu kemungkinan hardware tempat virtual server kita berada diretas, atau bahkan worst case scenario-nya adalah kemungkinan layanan cloud provider diretas dan hacker mendapat akses penuh ke semua layanan. Karena diletakkan di satu tempat, masalah pencurian, pembobolan data center dan bencana juga menjadi concern utama.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Isu privasi&lt;br&gt;&lt;br&gt;
Terutama ketika memilih penerapan Public Cloud, masalah privasi dapat muncul karena server virtual kita berada di tangan cloud service provider dan kita tidak tahu apa yang mungkin mereka lakukan terhadap perangkat kita. Mungkin saja ada sniffer, spyware, dan semacamnya untuk mengambil data tanpa sepengetahuan kita.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Inkompatibilitas&lt;br&gt;&lt;br&gt;
Terkadang ada server virtual yang mengharuskan firmware atau software-nya menggunakan versi khusus yang disediakan oleh cloud service provider. Perbedaan ini dapat menyebabkan bentrok atau ketidakcocokan dengan aplikasi kita. Ada pula layanan-layanan yang mengharuskan pengguna meng-install modul khusus yang terkadang tidak disediakan cloud service provider.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Locked vendor&lt;br&gt;&lt;br&gt;
Meskipun cloud service provider memiliki layanan migrasi atau integrasi dengan cloud service provider lain, kebanyakan cukup merepotkan dan cenderung disulitkan karena cloud provider pun tidak ingin kehilangan pengguna potensialnya. Selain itu perbedaan cloud service provider dapat menyebabkan munculnya masalah inkompatibilitas, perbedaan hardware/software, masalah support, dan lain-lain.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dengan semua kekurangan dan kelebihannya tersebut, tidak dapat dipungkiri bahwa cloud computing masih menjadi topik yang hangat dibicarakan dan tetap menjadi primadona untuk meluncurkan aplikasi-aplikasi ke dunia.&lt;/p&gt;

&lt;p&gt;Jadi apakah cloud computing hanya komputer milik orang lain? Jawaban dari pertanyaan ini bisa "ya" dan bisa "tidak". "Ya" jika kita menggunakan model Public Cloud, dimana kita hanya meminjam tempat di server fisik untuk menjalankan server virtual. "Tidak" jika kita menggunakan model Private Cloud karena perangkat cloud-nya benar-benar hanya digunakan oleh kita saja.&lt;/p&gt;

</description>
      <category>cloudnative</category>
      <category>indonesia</category>
    </item>
  </channel>
</rss>
