Instalasi pgAdmin

Muhammad Fajri
Sunday, 18 June 2023

Bismillahirrahmanirrahim.

Dalam melakukan manajemen basis data, akan mudah dilakukan melalui GUI. Untuk itu, diperlukan sebuah tool agar pengelolaan basis data yang akan lebih nyaman dibandingkan menggunakan perintah-perintah SQL melalui CLI.

Dalam proses kali ini akan dilakukan instalasi pgAdmin sebagai tool administrasi PostgreSQL berbasis web. pgAdmin merupakan platform pengembangan dan administrasi Open Source yang paling populer dan kaya fitur Open Source untuk PostgreSQL, basis data Open Source terdepan di dunia. pgAdmin dapat digunakan di Linux, Unix, macOS dan Windows untuk mengelola PostgreSQL dan EDB Advanced Server 10 ke atas.

Instalasi pgAdmin4

Tambahkan PPA pgAdmin4 untuk sistem Ubuntu.

  1. Import repositori GPG key:
    curl https://www.pgadmin.org/static/packages_pgadmin_org.pub | sudo apt-key add -
    
  2. Tambahkan pgAdmin4 PPA dengan perintah:
    sudo sh -c 'echo "deb https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/focal pgadmin4 main" > /etc/apt/sources.list.d/pgadmin4.list'
    
  3. Update cache APT sistem:
    sudo apt update
    
  4. Install package pgAdmin4:
    sudo apt install pgadmin4
    

Konfigurasi pgAdmin4-Web

Sekarang, pengaturan backend dan frontend sudah siap. Aplikasi pgAdmin dapat dijalankan sekarang.

  1. Buka terminal di mana virtual environment pgAdmin python aktif.
  2. Pindah ke direktori /opt/pgAdmin4/web.
  3. Jalankan perintah python3 pgAdmin4.py:
    (myenv) fajri@fajri-PC:/opt/pgadmin4/web$ python3 pgAdmin4.py
    

Terjadi error:

Traceback (most recent call last):
  File "pgAdmin4.py", line 49, in <module>
    import config
  File "/opt/pgadmin4/web/config.py", line 25, in <module>
    from pgadmin.utils import env, IS_WIN, fs_short_path
  File "/opt/pgadmin4/web/pgadmin/__init__.py", line 24, in <module>
    from flask import Flask, abort, request, current_app, session, url_for
ModuleNotFoundError: No module named 'flask'
(myenv) fajri@fajri-PC:/opt/pgadmin4/web$ python3 pgAdmin4.py 
Traceback (most recent call last):
  File "pgAdmin4.py", line 49, in <module>
    import config
  File "/opt/pgadmin4/web/config.py", line 25, in <module>
    from pgadmin.utils import env, IS_WIN, fs_short_path
  File "/opt/pgadmin4/web/pgadmin/__init__.py", line 24, in <module>
    from flask import Flask, abort, request, current_app, session, url_for
ModuleNotFoundError: No module named 'flask'

Instal flask dengan pip:

python3 -m pip install -U Flask
// atau untuk diinstal pada environment tertentu
source /opt/myenv/bin/activate
python3 -m pip install -U Flask

Output:

Collecting Flask
  Using cached Flask-2.2.5-py3-none-any.whl (101 kB)
Collecting Werkzeug>=2.2.2 (from Flask)
  Downloading Werkzeug-2.2.3-py3-none-any.whl (233 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 233.6/233.6 kB 217.8 kB/s eta 0:00:00
Collecting Jinja2>=3.0 (from Flask)
  Downloading Jinja2-3.1.2-py3-none-any.whl (133 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 133.1/133.1 kB 148.4 kB/s eta 0:00:00
Collecting itsdangerous>=2.0 (from Flask)
  Downloading itsdangerous-2.1.2-py3-none-any.whl (15 kB)
Collecting click>=8.0 (from Flask)
  Downloading click-8.1.3-py3-none-any.whl (96 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 96.6/96.6 kB 485.8 kB/s eta 0:00:00
Collecting importlib-metadata>=3.6.0 (from Flask)
  Downloading importlib_metadata-6.6.0-py3-none-any.whl (22 kB)
Collecting zipp>=0.5 (from importlib-metadata>=3.6.0->Flask)
  Downloading zipp-3.15.0-py3-none-any.whl (6.8 kB)
Collecting typing-extensions>=3.6.4 (from importlib-metadata>=3.6.0->Flask)
  Using cached typing_extensions-4.6.3-py3-none-any.whl (31 kB)
Collecting MarkupSafe>=2.0 (from Jinja2>=3.0->Flask)
  Downloading MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (25 kB)
Installing collected packages: zipp, typing-extensions, MarkupSafe, itsdangerous, Werkzeug, Jinja2, importlib-metadata, click, Flask
Successfully installed Flask-2.2.5 Jinja2-3.1.2 MarkupSafe-2.1.3 Werkzeug-2.2.3 click-8.1.3 importlib-metadata-6.6.0 itsdangerous-2.1.2 typing-extensions-4.6.3 zipp-3.15.0

Jalankan ulang kembali python3 pgAdmin4.py.

Terdapat error lagi:

Traceback (most recent call last):
  File "pgAdmin4.py", line 49, in <module>
    import config
  File "/opt/pgadmin4/web/config.py", line 25, in <module>
    from pgadmin.utils import env, IS_WIN, fs_short_path
  File "/opt/pgadmin4/web/pgadmin/__init__.py", line 25, in <module>
    from flask_socketio import SocketIO
ModuleNotFoundError: No module named 'flask_socketio'

Instal paket flask-socketio:

python3 -m pip install -U flask-socketio

Output:

Collecting flask-socketio
  Using cached Flask_SocketIO-5.3.4-py3-none-any.whl (17 kB)
Requirement already satisfied: Flask>=0.9 in /opt/myenv/lib/python3.7/site-packages (from flask-socketio) (2.2.5)
Collecting python-socketio>=5.0.2 (from flask-socketio)
  Downloading python_socketio-5.8.0-py3-none-any.whl (56 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 57.0/57.0 kB 116.2 kB/s eta 0:00:00
Requirement already satisfied: Werkzeug>=2.2.2 in /opt/myenv/lib/python3.7/site-packages (from Flask>=0.9->flask-socketio) (2.2.3)
Requirement already satisfied: Jinja2>=3.0 in /opt/myenv/lib/python3.7/site-packages (from Flask>=0.9->flask-socketio) (3.1.2)
Requirement already satisfied: itsdangerous>=2.0 in /opt/myenv/lib/python3.7/site-packages (from Flask>=0.9->flask-socketio) (2.1.2)
Requirement already satisfied: click>=8.0 in /opt/myenv/lib/python3.7/site-packages (from Flask>=0.9->flask-socketio) (8.1.3)
Requirement already satisfied: importlib-metadata>=3.6.0 in /opt/myenv/lib/python3.7/site-packages (from Flask>=0.9->flask-socketio) (6.6.0)
Collecting bidict>=0.21.0 (from python-socketio>=5.0.2->flask-socketio)
  Downloading bidict-0.22.1-py3-none-any.whl (35 kB)
Collecting python-engineio>=4.3.0 (from python-socketio>=5.0.2->flask-socketio)
  Downloading python_engineio-4.4.1-py3-none-any.whl (53 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 53.4/53.4 kB 212.4 kB/s eta 0:00:00
Requirement already satisfied: zipp>=0.5 in /opt/myenv/lib/python3.7/site-packages (from importlib-metadata>=3.6.0->Flask>=0.9->flask-socketio) (3.15.0)
Requirement already satisfied: typing-extensions>=3.6.4 in /opt/myenv/lib/python3.7/site-packages (from importlib-metadata>=3.6.0->Flask>=0.9->flask-socketio) (4.6.3)
Requirement already satisfied: MarkupSafe>=2.0 in /opt/myenv/lib/python3.7/site-packages (from Jinja2>=3.0->Flask>=0.9->flask-socketio) (2.1.3)
Installing collected packages: python-engineio, bidict, python-socketio, flask-socketio
Successfully installed bidict-0.22.1 flask-socketio-5.3.4 python-engineio-4.4.1 python-socketio-5.8.0

Selanjutnya akan error lagi saat menjalankan ulang perintah python3 pgAdmin4.py. Berturut-turut instal package yang tidak ada:

[1] python3 -m pip install -U flask-babel
[2] python3 -m pip install -U flask-login
[3] python3 -m pip install -U flask-mail
[4] python3 -m pip install -U flask-paranoid
[5] python3 -m pip install -U flask-security
[6] python3 -m pip install -U email-validator
[7] python3 -m pip install -U flask-sqlalchemy
[8] python3 -m pip install -U python-dateutil
[9] python3 -m pip install -U flask-migrate
[10] python3 -m pip install -U keyring
[11] python3 -m pip install -U psycopg
[12] python3 -m pip install -U sshtunnel
[13] python3 -m pip install -U ldap3
[14] python3 -m pip install -U authlib
[14] python3 -m pip install -U requests
[14] python3 -m pip install -U pyotp
[14] python3 -m pip install -U qrcode

Error terakhir yaitu karena masalah permission:

ERROR  : Failed to create the directory /var/lib/pgadmin:
           [Errno 13] Permission denied: '/var/lib/pgadmin'
HINT :   Create the directory /var/lib/pgadmin, ensure it is writeable by
         'fajri', and try again, or, create a config_local.py file
         and override the SQLITE_PATH setting per
         https://www.pgadmin.org/docs/pgadmin4/7.3/config_py.html

Buat folder pgadmin pada direktori /var/lib/:

sudo mkdir /var/lib/pgadmin /var/log/pgadmin
sudo chown -R fajri:fajri /var/lib/pgadmin /var/log/pgadmin
  1. Saat semua paket dan direktori yang dibutuhkan sudah terinstal dan dibuat, maka jalankan perintah python3 pgAdmin4.py:
    (myenv) fajri@fajri-PC:/opt/pgadmin4/web$ python3 pgAdmin4.py
    

Output:


temukan baris /* User used to manipulate with storage */. Lalu isi pada bagian controluser (user mariaDB) –pma merupakan user khusus yang melakukan tugas administratif tertentu– dan controlpass (kata sandi user MariaDB). Jangan lupa hapus tanda dua garis miring yang ada pada bagian depan baris. Ini dilakukan agar tidak sembarang user yang dapat mengakses database melalui phpMyAdmin.

/* User used to manipulate with storage */ // $cfg[‘Servers’][$i][‘controlhost’] = ‘’; // $cfg[‘Servers’][$i][‘controlport’] = ‘’; $cfg[‘Servers’][$i][‘controluser’] = ‘root’; $cfg[‘Servers’][$i][‘controlpass’] = ‘password’;


Skrol ke bawah, pada bagian `/* Storage database and tables */` terdapat akses-akses administratif user database `pma`. Hilangkan tanda dua garis miring (komentar) pada tiap bagian sehingga menjadi:
```bash
/* Storage database and tables */
$cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
$cfg['Servers'][$i]['bookmarktable'] = 'pma__bookmark';
$cfg['Servers'][$i]['relation'] = 'pma__relation';
$cfg['Servers'][$i]['table_info'] = 'pma__table_info';
$cfg['Servers'][$i]['table_coords'] = 'pma__table_coords';
$cfg['Servers'][$i]['pdf_pages'] = 'pma__pdf_pages';
$cfg['Servers'][$i]['column_info'] = 'pma__column_info';
$cfg['Servers'][$i]['history'] = 'pma__history';
$cfg['Servers'][$i]['table_uiprefs'] = 'pma__table_uiprefs';
$cfg['Servers'][$i]['tracking'] = 'pma__tracking';
$cfg['Servers'][$i]['userconfig'] = 'pma__userconfig';
$cfg['Servers'][$i]['recent'] = 'pma__recent';
$cfg['Servers'][$i]['favorite'] = 'pma__favorite';
$cfg['Servers'][$i]['users'] = 'pma__users';
$cfg['Servers'][$i]['usergroups'] = 'pma__usergroups';
$cfg['Servers'][$i]['navigationhiding'] = 'pma__navigationhiding';
$cfg['Servers'][$i]['savedsearches'] = 'pma__savedsearches';
$cfg['Servers'][$i]['central_columns'] = 'pma__central_columns';
$cfg['Servers'][$i]['designer_settings'] = 'pma__designer_settings';
$cfg['Servers'][$i]['export_templates'] = 'pma__export_templates';

Tabel-tabel di atas ini belum ada, namun akan segera dibuat.

Terakhir, skrol ke paling bawah dan tambahkan baris berikut. Direktori temporary akan digunakan oleh phpMyAdmin sebagai template cache agar loading halaman lebih cepat.

$cfg['TempDir'] = '/var/lib/phpmyadmin/tmp';

Simpan dan tutup file (CTRL + X, Y, lalu ENTER).

Selanjutnya, perlu untuk membuat storage tabel dan database phpMyAdmin. Pada instalasi phpMyAdmin, terdapat file dengan nama create_tables.sql. File SQL ini memuat perintah-perintah yang dibutuhkan untuk membuat storage tabel dan database phpMyAdmin agar dapat berfungsi dengan baik.

Jalankan perintah:

sudo mariadb < /usr/share/phpmyadmin/sql/create_tables.sql

Selanjutnya, buat user administratif pma. Buka prompt MariaDB:

sudo mariadb

Buat user pma dsn GRANT izin yang sesuai, pastikan input password sesuai dengan yang ada pada dile config.inc.php.

GRANT SELECT, INSERT, UPDATE, DELETE ON phpmyadmin.* TO 'pma'@'localhost' IDENTIFIED BY 'password';

Untuk mengelola database melalui phpMyAdmin, buat user baru yang memiliki privilege terhadap semua tabel yang ada dalam database dan buat kata sandi yang kuat.

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

Keluar dari prompt MariaDB:

exit

phpMyAdmin sudah sepenuhnya terinstal dan dikonfigurasi pada server. Tetapi, server Apache belum bisa men-serve aplikasi. Buat file konfigurasi Apache untuk mengatasinya.

Konfigurasi Apache untuk Men-serve phpMyAdmin

Saat instalasi phpMyAdmin melalui repositori, proses instalasi akan membuat file konfigurasi Apache secara otomatis (phpmyadmin.conf) dan disimpan pada direktori /etc/apache2/conf-enabled/. Karena instalasi dilakukan secara manual maka harus membuat filenya sendiri.

sudo nano /etc/apache2/conf-available/phpmyadmin.conf

Lalu tambahkan isi:

# phpMyAdmin default Apache configuration

Alias /phpmyadmin /usr/share/phpmyadmin

<Directory /usr/share/phpmyadmin>
    Options SymLinksIfOwnerMatch
    DirectoryIndex index.php

    <IfModule mod_php5.c>
        <IfModule mod_mime.c>
            AddType application/x-httpd-php .php
        </IfModule>
        <FilesMatch ".+\.php$">
            SetHandler application/x-httpd-php
        </FilesMatch>

        php_value include_path .
        php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
        php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/php-gettext/:/usr/share/php/php-php-gettext/:/usr/share/javascript/:/usr/share/php/tcpdf/:/usr/share/doc/phpmyadmin/:/usr/share/php/phpseclib/
        php_admin_value mbstring.func_overload 0
    </IfModule>
    <IfModule mod_php.c>
        <IfModule mod_mime.c>
            AddType application/x-httpd-php .php
        </IfModule>
        <FilesMatch ".+\.php$">
            SetHandler application/x-httpd-php
        </FilesMatch>

        php_value include_path .
        php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
        php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/php-gettext/:/usr/share/php/php-php-gettext/:/usr/share/javascript/:/usr/share/php/tcpdf/:/usr/share/doc/phpmyadmin/:/usr/share/php/phpseclib/
        php_admin_value mbstring.func_overload 0
    </IfModule>

</Directory>

# Authorize for setup
<Directory /usr/share/phpmyadmin/setup>
    <IfModule mod_authz_core.c>
        <IfModule mod_authn_file.c>
            AuthType Basic
            AuthName "phpMyAdmin Setup"
            AuthUserFile /etc/phpmyadmin/htpasswd.setup
        </IfModule>
        Require valid-user
    </IfModule>
</Directory>

# Disallow web access to directories that don't need it
<Directory /usr/share/phpmyadmin/templates>
    Require all denied
</Directory>
<Directory /usr/share/phpmyadmin/libraries>
    Require all denied
</Directory>
<Directory /usr/share/phpmyadmin/setup/lib>
    Require all denied
</Directory>

Simpan dan tutup file, lalu aktifkan dengan mengetikkan:

sudo a2enconf phpmyadmin.conf

Output:

Enabling conf phpmyadmin.
To activate the new configuration, you need to run:
  systemctl reload apache2

Lalu reload service apache2 agar konfigurasi diterapkan.

sudo systemctl reload apache2

Setelah selesai, phpMyAdmin sudah dapat diakses melalui web browser.

https://<alamat_domain>/phpmyadmin

phpmyadmin_test_deepin

Berikut tampilan phpMyAdmin setelah login.

phpmyadmin_test_deepin_login

Sekarang sudah dapat terkoneksi dan berinteraksi dengan phpMyAdmin, langkah terakhir yaitu memperkuat keamanan sistem agar terlindungi dari penyerang.

Mengamankan phpMyAdmin Lebih Lanjut

Karena phpMyAdmin banyak digunakan dimana-mana sehingga sangat berpotensi menjadi target bagi penyerang, sehingga perlu untuk menambahkan perlindungan akses terautorisasi. Salah satu cara termudah yaitu menempatkan sebuah gateway di depan semua aplikasi menggunakan fungsionalitas autorisasi dan autentikasi Apache yaitu .htaccess.

Edit file konfigurasi Apache:

sudo nano /etc/apache2/conf-available/phpmyadmin.conf

Tambahkan AllowOverride All di bagian dalam <Directory /usr/share/phpmyadmin>, seperti ini:

<Directory /usr/share/phpmyadmin>
    Options FollowSymLinks
    DirectoryIndex index.php
    AllowOverride All

    <IfModule mod_php5.c>
    ...

Simpan dan tutup file. Restart service Apache:

sudo systemctl restart apache2

Sekarang .htaccess sudah diaktifkan. Lanjutkan, dengan membuat file .htaccess. Agar berhasil, file ini harus dibuat di dalam direktori aplikasi:

sudo nano /usr/share/phpmyadmin/.htaccess

Tambahkan baris:

AuthType Basic
AuthName "Restricted Files"
AuthUserFile /usr/share/phpmyadmin/.htpasswd
Require valid-user

Lokasi yang dipilih untuk file password yaitu /usr/share/phpmyadmin/.htpasswd. Buat file dengan utilitas htpasswd dan sebuah user:

sudo htpasswd -c /usr/share/phpmyadmin/.htpasswd root

Output:

New password: 
Re-type new password: 
Adding password for user root

Untuk membuat user tambahan, jalankan seperti perintah di atas tanpa -c:

sudo htpasswd /etc/phpmyadmin/.htpasswd additionaluser

Restart service Apache agar autentikasi tambahan diterapkan:

sudo systemctl restart apache2

Sekarang, saat mengakses phpMyAdmin melalui web browser, akan dihadapkan tampilan login tambahan (autentikasi Apache) sebelum dihadapkan pada halaman login phpMyAdmin. Pengaturan ini menambahkan layer keamanan tambahan yang diinginkan karena phpMyAdmin rawan terhadap kerentanan.

phpmyadmin_test_deepin_apache_login

Jika tidak dapat melakukan autentikasi dengan data yang benar, saat menekan tombol Cancel akan dihadapkan pada halaman error Unauthorized.

phpmyadmin_test_deepin_apache_login_error

Akhirnya sampai juga di bagian akhir artikel ini. Terima kasih sudah membaca artikel ini sampai bagian akhir.

Demikian langkah-langkah instalasi phpMyAdmin ini. Semoga bermanfaat. Jangan lupa di-share.

Referensi