Category Archives

176 Articles
Konfigurasi CAS 5.1.2
Arsitektur SSO dasar.

Konfigurasi CAS 5.1.2

Apereo CAS (sebelumnya Jasig CAS) banyak dipakai untuk SSO. Cara pemasangannya agak ribet dan sulit. Kebetulan, versi CAS 5.1.2 sekarang sudah menggunakan Spring Boot sebagai dasarnya.

Keuntungan penggunaan Spring Boot adalah Jasig CAS menggunakan banyak keunggulan framework Spring. Misalnya, teknologi Spring Cloud untuk teknologi devops, Spring Web Flow untuk arsitektur layanan mikro (micro service), service discovery, dan konfigurasi melalui YAML. Sehingga, kita bisa memasang infrastruktur SSO melalui CAS tanpa harus mengoding seperti dahulu. Atau, kita bisa mengembangkan layanan yang terpisah dari SSO ala layanan mikro.

Sebelum infrastruktur bertambah rumit, saya ingin memberikan jembatan keledai. Sebab, saya pikir SSO ini agak sulit pada awalnya kalau tidak tahu caranya. Saya harap ketika selesai membaca artikel ini, pembaca ada gambaran bagaimana SSO bisa dikembangkan.

Arsitektur yang dipilih

Arsitektur SSO

Arsitektur SSO dasar.

Ada banyak pilihan, tetapi saya memilih kapabilitas komponen yang bisa diskalakan secara horizontal dan modern. Misalnya, ada banyak pilihan untuk ruang penyimpan tiket (Ticket Storage), tetapi saya memilih Redis karena dia implementasi modern yang banyak dipakai untuk teknologi dewasa ini.

Setiap komponen yang saya pilih ini dapat dikluster. Saya memilih untuk mengembangkan satu layanan per mesin. Nanti kalau sudah mengerti teknologi perawanan, [uhuk colek Utian Ayuba] Anda bisa mengubah setiap ini menjadi konfigurasi devops macam Ansible, Puppet, Chef, Vagrant,  atau apa pun agama Anda.

CAS IdP

CAS IdP adalah mesin utama yang menyediakan profil, otentikasi, dan otorisasi. Semua klien terhubung ke sana.

Cara buat:

CAS IdP Server

CAS Ticket Storage

Secara baku CAS IdP menyimpan tiket sesi pada memori. Namun, untuk arsitektur kluster dan skalabilitas, lebih baik menggunakan Redis. Mengapa Redis? Karena Redis utamanya menggunakan memori.

Untuk peladen Redis tidak perlu dikluster. Lebih baik satu instans Redis yang memakan memori 24 GB dari pada membuat kluster.

Cara buat:

Redis Ticket Storage

CAS Service Storage

Satu situs/sistem/aplikasi yang menggunakan CAS untuk SSO disebut satu layanan (service). Setiap layanan dapat didefinisikan logo, URL, ACL pengguna, dan sebagainya secara granular. Itu semua secara baku disimpan oleh CAS IdP di berkas JSON.

Untuk pengelolaan yang lebih baik, saya memilih PostgreSQL sebagai ruang penyimpan. Pengalaman saya membandingkan PostgreSQL dengan MySQL mengatakan bahwa PostgreSQL rajanya basisdata untuk basisdata perangkat lunak bebas terbuka. Waktu itu saya membandingkan layanan Roundcube Webmail dengan MySQL dan PostgreSQL. Anda sebagai pengguna Webmail UI pasti merasakan bagaimana Webmail UI itu seperti mengakses sistem HTML statik.

Saya, sih, tidak apa kalau ada yang mau menggunakan MongoDB atau yang lainnya. Tetapi saya memilih karena daftar layanan ini tidak perlu kecepatan khusus. Selain itu, daftar layanan butuh untuk tahan banting, saya lebih memilih PostgreSQL. Tentu saja, saya takkan memilih Redis.

Cara buat:

CAS Service Registry

CAS Authentication Provider

Normalnya CAS menggunakan Spring Security dengan login casuser dan sandi Mellon. Tentunya, ini buat yang main-main. Untuk yang lebih serius, gunakan LDAP, basis data, atau bahkan layanan REST.

Penyedia otentikasi CAS dapat lebih dari satu (komposit). Tetapi, untuk kali ini, gunakan saja LDAP.

Cara buat:

CAS Auth LDAP

CAS Service Management Webapp

Aduh, lupa menulis dokumentasi. Silakan simpan URL ini, nanti saya coba tulis. Untuk sementara, langsung saja buat di basisdata. He… he… he….

Studi Kasus: WordPress

Penasaran dengan hasilnya? Langsung saja, buat aplikasi WordPress. Mengapa WordPress? Karena gampang memasangnya. Tinggal pakai plugin WP Cassify, daftarkan URL WP sebagai satu layanan, dan beres!

Cara buat:

WordPress Cassify

TODO:

  • Personalisasi halaman login.
  • Membuat CAS IdP terkluster (lebih dari satu instans)
  • Entahlah….
Akses Dolphin (Manajer Berkas KDE) ke SMBv2 atau SMBv3
About KDE

Akses Dolphin (Manajer Berkas KDE) ke SMBv2 atau SMBv3

Karena WCry 2.0, protokol SMBv1 sudah tidak berlaku lagi. Kebanyakan peladen berkas sudah berjalan di versi 2 ke atas. Masalahnya, banyak penjelajah berkas masih menggunakan SMBv1 secara baku. Untuk itu, perlu diaktifkan klien versi 2 ke atas.

 “Well, hell! PMP exam topics That’s no excuse for insulting me! You PMP exam topics 300-320 questions pdf are 300-320 questions pdf Ma’s PMP exam topics PMP exam topics own blood son, but did PMP exam topics she take on that time PMP exam topics Tony Fontaine shot you in the leg? 70-532 answer analysis No, she 70-532 answer analysis just 300-320 questions pdf sent for old Doc 70-532 answer analysis Fontaine to dress it and asked the doctor what ailed Tony’s aim. Said she guessed licker was spoiling his marksmanship. Remember how mad that made Tony?”Both boys yelled 70-532 answer analysis with laughter.“Ma’s a card!” said Brent with loving approval. “You can always count on her to do the right thing 300-320 questions pdf and 70-532 answer analysis not embarrass you in front of PMP exam topics folks.”  But Gerald remained Gerald. 300-320 questions pdf His habits PMP exam topics of living and his ideas changed, but his manners he would 300-075 certification exam not change, 300-075 certification exam even had he been 70-532 answer analysis able to change them. He admired 300-320 questions pdf the drawling 300-075 certification exam elegance of the 300-075 certification exam wealthy rice and cotton planters, who rode into Savannah from their moss-hung kingdoms, mounted 70-532 answer analysis on 300-320 questions pdf thoroughbred horses and followed by the carriages of their 300-320 questions pdf equally elegant ladies 70-532 answer analysis and the wagons 300-320 questions pdf of their slaves. But Gerald could never attain elegance. 70-532 answer analysis Their lazy, blurred voices fell pleasantly 300-075 certification exam 300-075 certification exam 300-320 questions pdf on PMP exam topics his PMP exam topics ears, but his 300-075 certification exam PMP exam topics own 300-075 certification exam brisk brogue clung to his tongue. He liked the casual 70-532 answer analysis 300-075 certification exam grace with which they PMP exam topics conducted affairs 300-320 questions pdf of importance, 300-320 questions pdf risking 300-320 questions pdf a fortune, a plantation or a slave 70-532 answer analysis 300-075 certification exam on the 300-075 certification exam turn 70-532 answer analysis of a card and writing off their losses with careless good humor and no more ado than when they scattered 300-320 questions pdf pennies to pickaninnies. But Gerald had known poverty, and PMP exam topics he could never PMP exam topics learn to lose money with 70-532 answer analysis good 300-075 certification exam humor or good 300-320 questions pdf 70-532 answer analysis 300-320 questions pdf grace. They were PMP exam topics a pleasant race, these coastal Georgians, with their soft-voiced, 70-532 answer analysis PMP exam topics quick rages and their charming inconsistencies, and Gerald liked them. But 300-075 certification exam there was a 300-075 certification exam brisk and 70-532 answer analysis restless vitality 300-075 certification exam about the young Irishman, fresh from a country where winds blew wet and chill, where misty swamps held no fevers, that 300-075 certification exam set him apart from these indolent gentle-folk of semi-tropical weather and malarial marshes.

Saya pernah membuat sebuah retasan dengan memasang berkas tersebut menggunakan CIFS. Ternyata ada cara yang lebih baik, yakni dengan mengonfigurasi pustaka klien SMB untuk mengaktifkan sampai versi 3.

Caranya:

$ mkdir ~/.smb
$ cat > ~/.smb/smb.conf  << EOF
[global]
    client max protocol = SMB3
EOF

Selesai.

Bacaan Lebih Lanjut

Tutorial Lengkap Patroni PostgreSQL
PostgreSQL database

Tutorial Lengkap Patroni PostgreSQL

Masih ingat tutorial saya tentang Patroni dahulu? Saya akan membuat tulisan lengkap dari nol sampai berjalan. Di akhir tutorial ini Anda bisa membuat kluster Patroni secara manual. Kalau Anda devops dan tertarik menulis resep untuk Ansible, Puppet, dan sejenisnya, saya harap artikel ini bisa menjadi acuan untuk mengerti Patroni.

Mesin-mesin yang Ada

Saya membagi setiap mesin yang digunakan dengan dua IP. Satu subnet IP internal yang digunakan untuk setiap mesin dalam kluster berkomunikasi dan satu subnet IP yang digunakan untuk akses luar. Implementasi fisik dengan menggunakan dua kartu jaringan (atau dua bonding fisik)  yang berbeda. Perbedaan jaringan untuk komunikasi internal dan komunikasi dengan klien ini selain menyediakan keamanan dalam isolasi, juga membuat koneksi internal atau pun eksternal tidak saling mengganggu.

 “Well, hell! PMP exam topics That’s no excuse for insulting me! You PMP exam topics 300-320 questions pdf are 300-320 questions pdf Ma’s PMP exam topics PMP exam topics own blood son, but did PMP exam topics she take on that time PMP exam topics Tony Fontaine shot you in the leg? 70-532 answer analysis No, she 70-532 answer analysis just 300-320 questions pdf sent for old Doc 70-532 answer analysis Fontaine to dress it and asked the doctor what ailed Tony’s aim. Said she guessed licker was spoiling his marksmanship. Remember how mad that made Tony?”Both boys yelled 70-532 answer analysis with laughter.“Ma’s a card!” said Brent with loving approval. “You can always count on her to do the right thing 300-320 questions pdf and 70-532 answer analysis not embarrass you in front of PMP exam topics folks.”  But Gerald remained Gerald. 300-320 questions pdf His habits PMP exam topics of living and his ideas changed, but his manners he would 300-075 certification exam not change, 300-075 certification exam even had he been 70-532 answer analysis able to change them. He admired 300-320 questions pdf the drawling 300-075 certification exam elegance of the 300-075 certification exam wealthy rice and cotton planters, who rode into Savannah from their moss-hung kingdoms, mounted 70-532 answer analysis on 300-320 questions pdf thoroughbred horses and followed by the carriages of their 300-320 questions pdf equally elegant ladies 70-532 answer analysis and the wagons 300-320 questions pdf of their slaves. But Gerald could never attain elegance. 70-532 answer analysis Their lazy, blurred voices fell pleasantly 300-075 certification exam 300-075 certification exam 300-320 questions pdf on PMP exam topics his PMP exam topics ears, but his 300-075 certification exam PMP exam topics own 300-075 certification exam brisk brogue clung to his tongue. He liked the casual 70-532 answer analysis 300-075 certification exam grace with which they PMP exam topics conducted affairs 300-320 questions pdf of importance, 300-320 questions pdf risking 300-320 questions pdf a fortune, a plantation or a slave 70-532 answer analysis 300-075 certification exam on the 300-075 certification exam turn 70-532 answer analysis of a card and writing off their losses with careless good humor and no more ado than when they scattered 300-320 questions pdf pennies to pickaninnies. But Gerald had known poverty, and PMP exam topics he could never PMP exam topics learn to lose money with 70-532 answer analysis good 300-075 certification exam humor or good 300-320 questions pdf 70-532 answer analysis 300-320 questions pdf grace. They were PMP exam topics a pleasant race, these coastal Georgians, with their soft-voiced, 70-532 answer analysis PMP exam topics quick rages and their charming inconsistencies, and Gerald liked them. But 300-075 certification exam there was a 300-075 certification exam brisk and 70-532 answer analysis restless vitality 300-075 certification exam about the young Irishman, fresh from a country where winds blew wet and chill, where misty swamps held no fevers, that 300-075 certification exam set him apart from these indolent gentle-folk of semi-tropical weather and malarial marshes.

Untuk mengurangi kompleksitas tutorial ini, saya hanya menyediakan satu mesin HAProxy dan satu mesin etcd. Fokus tulisan ini adalah untuk ketersediaan PostgreSQL. Untuk membuat ketersediaan HAProxy dan etcd akan dibahas lain kali bila ada waktu [baca: kalau tidak malas].

Agar tidak membingungkan, saya selalu mempraktikkan penamaan kluster ditambah dengan prefiks nama aplikasi. Hal ini penting karena di perawanan yang sudah semakin terotomatisasi, kadang kita suka bingung kalau konfigurasi sudah tidak ada lagi.

konfigurasi

Konfigurasi server yang dipakai

Yak, intinya ada 5 mesin untuk tutorial kali ini. Saya menggunakan GNU/Linux Debian 9 karena itu standar sistem operasi UI. Untuk sistem operasi lain saya rasa tidak ada yang berbeda karena kali ini saya tidak menggunakan paket repositori.

Untuk memudahkan, pastikan kelima mesin ini memiliki berkas /etc/hosts yang berisi kelima host.

$ sudo tee -a  /etc/hosts << EOF
192.168.100.1   haproxy0-nyata
192.168.100.2   etcd0-nyata
192.168.100.3   pg1-nyata
192.168.100.4   pg2-nyata
192.168.100.5   pg3-nyata
EOF

Selanjutnya, akan dibuatkan etcd terlebih dahulu sebagai inti yang mengatur kluster.

ETCD

Aplikasi etcd adalah sebuah basisdata konfigurasi yang digunakan status. Aplikasi etcd tidak ada di repositori Debian 9. Saya mengunduh versi terbaru dari CoreOS dan memasang manual.

wget https://github.com/coreos/etcd/releases/download/v3.3.1/etcd-v3.3.1-linux-amd64.tar.gz
tar xvfz etcd-v3.3.1-linux-amd64.tar.gz
sudo cp etcd-v3.3.1-linux-amd64/etcd /usr/local/bin

Konfigurasi

Aplikasi etcd berisi satu binari. Untuk konfigurasi, buat manual.

$ sudo /etc/etcd.conf.yml << EOF
# This is the configuration file for the etcd server.

# Human-readable name for this member.
name: 'etcd0-nyata'

# Path to the data directory.
data-dir: /var/lib/etcd/data

# Path to the dedicated wal directory.
wal-dir: /var/lib/etcd/wal

# Number of committed transactions to trigger a snapshot to disk.
snapshot-count: 10000

# Time (in milliseconds) of a heartbeat interval.
heartbeat-interval: 100

# Time (in milliseconds) for an election to timeout.
election-timeout: 1000

# Raise alarms when backend size exceeds the given quota. 0 means use the
# default quota.
quota-backend-bytes: 0

# List of comma separated URLs to listen on for peer traffic.
listen-peer-urls: http://192.168.100.2:2380

# List of comma separated URLs to listen on for client traffic.
listen-client-urls: http://localhost:2379,http://192.168.100.2:2379

# Maximum number of snapshot files to retain (0 is unlimited).
max-snapshots: 5

# Maximum number of wal files to retain (0 is unlimited).
max-wals: 5

# Comma-separated white list of origins for CORS (cross-origin resource sharing).
cors: 

# List of this member's peer URLs to advertise to the rest of the cluster.
# The URLs needed to be a comma-separated list.
initial-advertise-peer-urls: http://192.168.100.2:2380

# List of this member's client URLs to advertise to the public.
# The URLs needed to be a comma-separated list.
advertise-client-urls: http://192.168.100.2:2379

# Discovery URL used to bootstrap the cluster.
discovery: 

# Valid values include 'exit', 'proxy'
discovery-fallback: 'proxy'

# HTTP proxy to use for traffic to discovery service.
discovery-proxy: 

# DNS domain used to bootstrap initial cluster.
discovery-srv: 

# Initial cluster configuration for bootstrapping.
initial-cluster: etcd0-scele=http://192.168.100.2:2380,

# Initial cluster token for the etcd cluster during bootstrap.
initial-cluster-token: 'etcd-nyata-cluster'

# Initial cluster state ('new' or 'existing').
initial-cluster-state: 'new'

# Reject reconfiguration requests that would cause quorum loss.
strict-reconfig-check: false

# Valid values include 'on', 'readonly', 'off'
proxy: 'off'

# Time (in milliseconds) an endpoint will be held in a failed state.
proxy-failure-wait: 5000

# Time (in milliseconds) of the endpoints refresh interval.
proxy-refresh-interval: 30000

# Time (in milliseconds) for a dial to timeout.
proxy-dial-timeout: 1000

# Time (in milliseconds) for a write to timeout.
proxy-write-timeout: 5000

# Time (in milliseconds) for a read to timeout.
proxy-read-timeout: 0

# Enable debug-level logging for etcd.
debug: false

# Specify a particular log level for each etcd package (eg: 'etcdmain=CRITICAL,etcdserver=DEBUG'.
log-package-levels: 

# Force to create a new one member cluster.
force-new-cluster: true
EOF

Layanan

Agar dapat dijalankan secara sistem, perlu dibuatkan layanan systemd secara manual.

$ sudo tee -a /etc/systemd/system/etcd.service << EOF
[Unit]
Description=etcd key-value store
Documentation=https://github.com/coreos/etcd
After=network.target

[Service]
User=etcd
Group=etcd
Type=notify
ExecStart=/bin/bash --login -c "/usr/local/bin/etcd --config-file /etc/etcd.conf.yml"
Restart=always
RestartSec=10s
LimitNOFILE=40000

[Install]
WantedBy=multi-user.target
EOF

Pengaktifan Layanan etcd

Perhatikan bahwa untuk contoh kali ini saya menggunakan akun etcd dan grup etcd. Praktik aman selalu jalankan layanan sebagai pengguna biasa, bukan root. Buat pengguna baru ini.

sudo adduser --system --home /var/lib/etcd --group etcd

Bagian terakhir dari etcd adalah mengaktifkan dan menjalankan layanan etcd.

sudo systemctl daemon-reload
sudo systemctl enable etcd
sudo systemctl start etcd

Baris daemon-reload adalah agar systemd membaca konfigurasi yang baru saja dibuat. Baris enable untuk mendaftarkan etcd sebagai layanan yang dijalankan otomatis saat mesin baru mulai. Baris terakhir untuk menjalankan layanan etcd.

PostgreSQL

Berbeda dengan tutorial yang lalu, saya akan membuat konfigurasi per mesin agar lebih menggambarkan apa yang terjadi. Sebelum memulai, saya asumsikan bahwa setiap mesin PostgreSQL pengguna root memiliki kunci SSH sehingga antar mesin bisa masuk tanpa kunci.

Cara paling gampang, di salah satu mesin buat kunci.

ssh-keygen -t ecdsa

Lalu, taruh kunci publik dan privat ke root. Saya asumsikan bahwa kita bekerja di mesin pg1-nyata.

# asumsi kerja di mesin pg1-nyata
sudo mkdir /root/.ssh/
sudo cp ~/.ssh/id_ecdsa /root/.ssh/
cat ~/.ssh/id_ecdsa.pub | sudo tee -a /root/.ssh/authorized_keys

# Transfer
scp ~/.ssh/id_ecdsa ~/.ssh/id_ecdsa.pub pg2-nyata:/tmp
scp ~/.ssh/id_ecdsa ~/.ssh/id_ecdsa.pub pg3-nyata:/tmp

# ke mesin pg2-nyata
ssh pg2-nyata
sudo mkdir /root/.ssh/
sudo cp ~/.ssh/id_ecdsa /root/.ssh/
cat ~/.ssh/id_ecdsa.pub | sudo tee -a /root/.ssh/authorized_keys
rm /tmp/id_ecdsa*
exit

# ke mesin pg3-nyata
ssh pg3-nyata
sudo mkdir /root/.ssh/
sudo cp ~/.ssh/id_ecdsa /root/.ssh/
cat ~/.ssh/id_ecdsa.pub | sudo tee -a /root/.ssh/authorized_keys
rm /tmp/id_ecdsa*
exit

Ini saya pasang secara manual. Biasanya untuk Vagrant, Proxmox, dan sejenisnya sudah menyediakan opsi pemasangan kunci SSH di konfigurasi/plugin mereka. Namun, untuk kelengkapan tutorial ini saya tuliskan saja manual. Saya sendiri sebenarnya hanya memasang satu mesin; memasang PostgreSQL; dan baru diklon menjadi dua mesin lainnya.

Pemasangan PostgreSQL

Saya kali ini menggunakan PostgreSQL yang saya kompilasi sendiri. Mengapa? Karena hasil kompilasi lebih irit dan saya mau ada variasi tulisan. Di blog saya ada kok cara-caranya untuk memasang versi repo.

Pemasangan PostgreSQL setiap mesin sama. Untuk memasang paket ketergantungan di setiap mesin jalankan:

sudo apt -y install build-essential libreadline-dev zlib1g-dev flex bison libxml2-dev libxslt-dev libssl-dev pkg-config libsystemd-dev

Unduh PostgreSQL. Saya memakai versi stabil terbaru, 10.2. Kebetulan juga, saya ada peladen cermin di samping ruangan:

wget http://kambing.ui.ac.id/postgresql/source/v10.2/postgresql-10.2.tar.bz2
tar xvfj postgresql-10.2.tar.bz2
cd postgresql-10.2
sed -i '/DEFAULT_PGSOCKET_DIR/s@/tmp@/run/postgresql@' src/include/pg_config_manual.h
./configure --prefix=/usr --with-icu --with-openssl --with-systemd --enable-thread-safety --docdir=/usr/share/doc/postgresql-10.2 CFLAGS="-O3 -march=native -mtune=native -pipe"
make -j$(nproc)
sudo make install

Saya melakukan optimasi CFLAGS untuk kompilasi. Hal ini karena saya tahu bahwa peladen di tempat saya itu homogen. Tapi, kalau misalnya Anda memasang di penyedia awan, sebaiknya  CFLAGS jangan disertakan.

Selanjutnya pemasangan Patroni.

Patroni

Patroni merupakan skrip Python. Untuk memasang Patroni, pastikan Python PIP dipasang. Saya memilih Python3. Namun, biasanya yang digunakan Python2. Saya memakai Python3 karena saya keren.

sudo apt install python3-pip
sudo pip3 install --upgrade setuptools

Pasang Patroni dan plugin etcd-nya.

sudo pip3 install psycopg2-binary
sudo -E pip3 install patroni[etcd]

Buat pengguna postgres

sudo adduser --system --home /var/lib/postgresql --group postgres

Buatkan layanan sistem.

$ sudo tee /etc/systemd/system/patroni.service << EOF
[Unit]
Description=Runners to orchestrate a high-availability PostgreSQL
After=syslog.target network.target
 
[Service]
Type=simple
 
User=postgres
Group=postgres
 
Environment="PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
ExecStart=/usr/local/bin/patroni /etc/patroni.yml
 
KillMode=process
 
TimeoutSec=30
 
Restart=no
 
[Install]
WantedBy=multi-user.target
EOF

Selanjutnya, buat konfigurasi per mesin.

Konfigurasi Per Mesin

Buat konfigurasi per mesin /etc/patroni.yml

scope: postgres
namespace: /pg-nyata/
name: pg1-nyata
 
restapi:
    listen: 192.168.100.3:8008
    connect_address: 192.168.100.3:8008
 
etcd:
    host: 192.168.100.2:2379
 
bootstrap:
    dcs:
        ttl: 30
        loop_wait: 10
        retry_timeout: 10
        maximum_lag_on_failover: 1048576
        postgresql:
            use_pg_rewind: true
 
    initdb:
    - encoding: UTF8
    - data-checksums
 
    pg_hba:
    - host replication replicator 127.0.0.1/32 md5
    - host replication replicator 192.168.100.3/0 md5
    - host replication replicator 192.168.100.4/0 md5
    - host replication replicator 192.168.100.5/0 md5
    - host all all 0.0.0.0/0 md5
 
    users:
        admin:
            password: aiwaQuaeHuojeuyai2fiemai6Reeneix
            options:
                - createrole
                - createdb
 
postgresql:
    listen: 192.168.100.3:5432
    connect_address: 192.168.100.3:5432
    data_dir: /var/lib/postgresql/10.2-patroni
    pgpass: /tmp/pgpass
    authentication:
        replication:
            username: replicator
            password: zee0ohjisai5ohCohsaegho5gaeN8Xei
        superuser:
            username: postgres
            password: saichae9Aich0xeen2Otethaduphiepo
    parameters:
        unix_socket_directories: '.'
 
tags:
    nofailover: false
    noloadbalance: false
    clonefrom: false
    nosync: false

Contoh konfigurasi yang tertulis untuk mesin pg1-nyata. Untuk pg2-nyata dan pg3-nyata ubah baris ke-3 name dengan nama mesin, dan setiap baris listen dan connect_address dengan IP per mesin.

Contoh perbedaan pg1-nyata dan pg2-nyata.

$ diff pg{1,2}-nyata/etc/patroni.yml -u
--- pg1-nyata/etc/patroni.yml   2018-03-08 10:03:26.502995392 +0700
+++ pg2-nyata/etc/patroni.yml   2018-03-08 10:08:35.869743378 +0700
@@ -1,14 +1,14 @@
 scope: postgres
 namespace: /pg-nyata/
-name: pg1-nyata
- 
+name: pg2-nyata
+
 restapi:
-    listen: 192.168.100.3:8008
-    connect_address: 192.168.100.3:8008
- 
+    listen: 192.168.100.4:8008
+    connect_address: 192.168.100.4:8008
+
 etcd:
     host: 192.168.100.2:2379
- 
+
 bootstrap:
     dcs:
         ttl: 30
@@ -17,28 +17,28 @@
         maximum_lag_on_failover: 1048576
         postgresql:
             use_pg_rewind: true
- 
+
     initdb:
     - encoding: UTF8
     - data-checksums
- 
+
     pg_hba:
     - host replication replicator 127.0.0.1/32 md5
     - host replication replicator 192.168.100.3/0 md5
     - host replication replicator 192.168.100.4/0 md5
     - host replication replicator 192.168.100.5/0 md5
     - host all all 0.0.0.0/0 md5
- 
+
     users:
         admin:
             password: aiwaQuaeHuojeuyai2fiemai6Reeneix
             options:
                 - createrole
                 - createdb
- 
+
 postgresql:
-    listen: 192.168.100.3:5432
-    connect_address: 192.168.100.3:5432
+    listen: 192.168.100.4:5432
+    connect_address: 192.168.100.4:5432
     data_dir: /var/lib/postgresql/10.2-patroni
     pgpass: /tmp/pgpass
     authentication:
@@ -50,7 +50,7 @@
             password: saichae9Aich0xeen2Otethaduphiepo
     parameters:
         unix_socket_directories: '.'
- 
+
 tags:
     nofailover: false
     noloadbalance: false

Semoga dengan ini tidak ada salah ganti atau terlewat.

Pengaktifan Layanan Patroni

Setelah konfigurasi dan unit layanan Patroni terpasang, layanan Patroni sudah bisa dijalankan. Untuk setiap mesin, jalankan:

sudo systemctl daemon-reload
sudo systemctl enable patroni
sudo systemctl start patroni

Satu langkah lagi.

HAProxy

Bagian yang paling mudah saya salin saja, ya, perintahnya.

sudo apt install haproxy

Konfigurasi:

$ sudo tee /etc/haproxy/haproxy.cfg << EOF
global
    maxconn 100
 
defaults
    log global
    mode tcp
    retries 2
    timeout client 30m
    timeout connect 4s
    timeout server 30m
    timeout check 5s
 
listen stats
    mode http
    bind *:7000
    stats enable
    stats uri /
 
listen postgres
    bind *:5000
    option httpchk
    http-check expect status 200
    default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
    server postgresql_192.168.100.3_5432 192.168.100.3:5432 maxconn 100 check port 8008
    server postgresql_192.168.100.4_5432 192.168.100.4:5432 maxconn 100 check port 8008
    server postgresql_192.168.100.5_5432 192.168.100.5:5432 maxconn 100 check port 8008
EOF

Lalu,

sudo systemctl restart haproxy

Selesai.

Bacaan Lebih Lanjut

Sesi PHP dengan Redis pada PHP 7.2

Sesi PHP dengan Redis pada PHP 7.2

 “Well, hell! PMP exam topics That’s no excuse for insulting me! You PMP exam topics 300-320 questions pdf are 300-320 questions pdf Ma’s PMP exam topics PMP exam topics own blood son, but did PMP exam topics she take on that time PMP exam topics Tony Fontaine shot you in the leg? 70-532 answer analysis No, she 70-532 answer analysis just 300-320 questions pdf sent for old Doc 70-532 answer analysis Fontaine to dress it and asked the doctor what ailed Tony’s aim. Said she guessed licker was spoiling his marksmanship. Remember how mad that made Tony?”Both boys yelled 70-532 answer analysis with laughter.“Ma’s a card!” said Brent with loving approval. “You can always count on her to do the right thing 300-320 questions pdf and 70-532 answer analysis not embarrass you in front of PMP exam topics folks.”  But Gerald remained Gerald. 300-320 questions pdf His habits PMP exam topics of living and his ideas changed, but his manners he would 300-075 certification exam not change, 300-075 certification exam even had he been 70-532 answer analysis able to change them. He admired 300-320 questions pdf the drawling 300-075 certification exam elegance of the 300-075 certification exam wealthy rice and cotton planters, who rode into Savannah from their moss-hung kingdoms, mounted 70-532 answer analysis on 300-320 questions pdf thoroughbred horses and followed by the carriages of their 300-320 questions pdf equally elegant ladies 70-532 answer analysis and the wagons 300-320 questions pdf of their slaves. But Gerald could never attain elegance. 70-532 answer analysis Their lazy, blurred voices fell pleasantly 300-075 certification exam 300-075 certification exam 300-320 questions pdf on PMP exam topics his PMP exam topics ears, but his 300-075 certification exam PMP exam topics own 300-075 certification exam brisk brogue clung to his tongue. He liked the casual 70-532 answer analysis 300-075 certification exam grace with which they PMP exam topics conducted affairs 300-320 questions pdf of importance, 300-320 questions pdf risking 300-320 questions pdf a fortune, a plantation or a slave 70-532 answer analysis 300-075 certification exam on the 300-075 certification exam turn 70-532 answer analysis of a card and writing off their losses with careless good humor and no more ado than when they scattered 300-320 questions pdf pennies to pickaninnies. But Gerald had known poverty, and PMP exam topics he could never PMP exam topics learn to lose money with 70-532 answer analysis good 300-075 certification exam humor or good 300-320 questions pdf 70-532 answer analysis 300-320 questions pdf grace. They were PMP exam topics a pleasant race, these coastal Georgians, with their soft-voiced, 70-532 answer analysis PMP exam topics quick rages and their charming inconsistencies, and Gerald liked them. But 300-075 certification exam there was a 300-075 certification exam brisk and 70-532 answer analysis restless vitality 300-075 certification exam about the young Irishman, fresh from a country where winds blew wet and chill, where misty swamps held no fevers, that 300-075 certification exam set him apart from these indolent gentle-folk of semi-tropical weather and malarial marshes.

Saya menggunakan pwgen untuk membuat sandi:

sudo apt install pwgen

Pemasangan

Pasang modul PHP Redis dan peladen Redis.

sudo apt install php-redis redis-server

Karena Anda sering bandel dan main salin saja, maka saya tunjukkan pembuatan sandi yang benar:

export REDIS_PASSWORD=`pwgen 32 1`

Saya asumsikan ada sebuah variabel $REDIS_PASSWORD yang berisi sandi yang benar. Untuk contoh saya, saya gunakan perkakas pwgen untuk menghasilkan sandi 32 karakter. Silakan gunakan sandi sendiri.

Selanjutnya, tambahkan sandi pada Redis:

echo requirepass $REDIS_PASSWORD  | sudo tee -a /etc/redis/redis.conf

dan PHP 7.2:

$ sudo tee /etc/php/7.2/fpm/conf.d/99-redis-session.ini << EOF
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379?auth=$REDIS_PASSWORD"
EOF

Untuk penambahan konfigurasi sebaiknya jangan di berkas php.ini. Gunakan berkas terpisah supaya ketika terjadi pembaharuan Debian tidak menimpa konfigurasi yang sudah dimodifikasi.

Muat ulang Redis dan PHP-FPM:

sudo /etc/init.d/redis-server restart
sudo /etc/init.d/php7-fpm stop && sudo /etc/init.d/php7-fpm start

Selesai.

TIPS #1

Untuk menguji apakah Redis berjalan dengan baik, jalankan:

$ redis-cli  -a $REDIS_PASSWORD  keys '*'
1) "PHPREDIS_SESSION:v61gelc0g2vgv6etgst6q3ipm6"
2) "PHPREDIS_SESSION:a286kiqjskupugblas2g6r85lv"
3) "PHPREDIS_SESSION:di8au2o81r8t299br1fpnedmb3"
4) "PHPREDIS_SESSION:bnfsp1587div8pgvdj3qbfq6fu"
5) "PHPREDIS_SESSION:g43f0qiivi182dmriq1g6qa1ak"
6) "PHPREDIS_SESSION:134bts56qhmvm3v5mpvr9ne3nh"
7) "PHPREDIS_SESSION:da38q9a555m2q55m0b5rtocpne"

 

Bacaan Lebih Lanjut

Solusi PostgreSQL dengan Patroni
PostgreSQL database

Solusi PostgreSQL dengan Patroni

Tahun baru dan Universitas Indonesia kedatangan peladen baru. Berhubung tim pengembang DSTI UI membuat pengembangan berbasis pelayan-mikro (microservice) dan ada pengembang yang iseng menantang saya menuju Kubernetes, saya pun tertantang membuat tutorial yang mendukung arsitektur tersebut. Kubernetes menyediakan fasilitas skalabilitas untuk menambah dan mengurangi peladen suatu layanan secara otomatis atau bisa diprogram manual.

Cara yang paling mudah untuk menyiapkan infrastruktur adalah dengan mengambil resep dari Ansible Playbook, menggunakan Juju, menggunakan helm, atau pemaket awan menurut keyakinan dan kepercayaan masing-masing. Namun, sebelum itu, saya tertarik untuk membahas bagaimana seandainya bila semua itu dibuat secara manual. Hal ini agar setiap kita dapat memahami bagaimana cara kerja masing-masing komponen yang nantinya diterbitkan dengan satu baris kode.

Tulisan ini sebenarnya mengikuti tutorial dari Linode. Hanya saja, saya menyesuaikan dengan lingkungan UI, Debian Stretch. Sehingga, ada yang saya modifikasi untuk keperluan dan keyakinan saya.

Arsitektur

PostgreSQL HA

PostgreSQL HA dengan 3 node dibalik haproxy

Untuk lingkungan ujicoba, saya membuat 5 mesin VM di VirtualBox dengan menggunakan 2 kartu jaringan (NIC). Satu NIC tipe NAT untuk keluar (standar VirtualBox) dengan DHCP. Satu lagi NIC tipe Jaringan Internal yang digunakan untuk setiap VM berkomunikasi satu sama lain.

pg1:

  • hostname: pg1
  • NIC: 192.0.2.11
  • Memori: 1GB

pg2:

  • hostname: pg2
  • NIC: 192.0.2.12
  • Memori: 1GB

pg3:

  • hostname: pg3
  • NIC: 192.0.2.13
  • Memori: 1GB

haproxy0:

  • hostname: haproxy0
  • NIC: 192.0.2.22
  • Memori: 512MB

etcd0:

  • hostname: etcd0
  • NIC: 192.0.2.21
  • Memori: 1GB

Berhubung komputer saya memiliki memori 32GB, saya agak royal mengalokasikan memori. Untuk keperluan pembelajaran, bisa, kok, dikurangi menjadi 512MB. Tapi, saya belum mencoba.

Sekedar tips untuk pengerjaan pg1 s.d. pg3. Sebaiknya kerjakan saja dulu pg1 lalu setelah rampung, klon dan ubah konfigurasi IP dan hostname sesuai dengan masing-masing mesin.

Konfigurasi Jaringan

Ada dua hal yang perlu dikerjakan:

  1. Konfigurasi IP pada NIC yang digunakan untuk berkomunikasi
  2. Tambahkan daftar hostname.

Konfigurasi IP

Pertama-tama kita perlu tahu NIC yang perlu dikonfigurasi. Debian Stretch sudah tidak lagi menyediakan ifconfig. Cara yang sahih sekarang untuk mengetahui ada antarmuka NIC apa saja yang tersedia:

$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:86:ca:c3 brd ff:ff:ff:ff:ff:ff
3: enp0s8: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 08:00:27:20:b1:2b brd ff:ff:ff:ff:ff:ff

Pada konfigurasi VM saya, yang NIC yang perlu dikonfigurasi adalah enp0s8 — punya Anda bisa beda. Untuk menambahkan konfigurasi IP statik umpanya untuk mesin pg1:

$ sudo tee /etc/network/interfaces.d/enp0s8 << EOF
auto enp0s8
allow-hotplug enp0s8
iface enp0s8 inet static
  address 192.0.2.11
  netmask 255.255.255.0
EOF

Gunakan penyunting teks favorit Anda, tapi saya menggunakan cara heker. 😛

Lakukan ini untuk pg2, pg3, haproxy0, dan etcd0 dengan IP mereka masing-masing.

Untuk langsung mengaktifkan konfigurasi jaringan:

$ sudo ifup enp0s8

Lakukan ini di semua mesin.

Konfigurasi Hostname

Untuk VM, sebaiknya untuk setiap VM yang berhubungan dimasukkan namanya ke daftar /etc/hosts. Lakukan ini di semua mesin:

$ sudo tee -a  /etc/hosts << EOF
192.0.2.21      etcd0
192.0.2.22      haproxy0
192.0.2.11      pg1
192.0.2.12      pg2
192.0.2.13      pg3
EOF

Ganti nama hostname, umpanya untuk mesin pg1:

sudo hostnamectl set-hostname pg1

Keluar dari SSH lalu masuk kembali. Kalau tidak, nama sudah berganti tetapi shell Anda masih bernama yang lama.

Pemasangan etcd

TIPS: Pengerjaan yang saya lakukan adalah saya mematikan pg1. Lalu, saya klon dan saya ubah IP dan hostname.

Aplikasi etcd adalah sebuah repositori konfigurasi yang bisa diakses dari jaringan. Dia bisa dibuat kluster, tetapi untuk contoh kali ini dibuatkan satu saja. Saya asumsikan jaringan dan nama sudah terbuat.

Cara terbaik saat ini untuk lingkungan awan adalah menggunakan pemaket snapcraft untuk mendapatkan perangkat lunak terbaru yang stabil. Debian Stretch tidak memasang pemaket ini secara baku. Pasang dulu:

sudo apt update
sudo apt install snapd

Lalu, pasang etcd menggunakan snapcraft:

sudo snap install etcd

Konfigurasi aplikasi berbasis snapcraft ada di /var/snap. Berhubung konfigurasinya panjang, saya sudah sediakan unduhan. Saya jelaskan properti yang penting saja nanti. Cara pasang:

wget -q -O- https://raw.githubusercontent.com/jpmrblood/postgresql-ha-configuration/master/etcd.conf.yml | sudo tee /var/snap/etcd/common/etcd.conf.yml

Beberapa properti yang penting:

  • name: ‘etcd0’ — memberi nama mesin ini. Kalau ada lebih dari satu mesin etcd, pastikan masing-masing unik.
  • data-dir: /var/lib/etcd/data — tempat data etcd. Saya sesuaikan dengan FHS.
  • wal-dir: /var/lib/etcd/wal — tempat penampungan untuk jurnal etcd.
  • listen-peer-urls: http://192.0.2.21:2380 — Alamat TCP/IP untuk mendengarkan permintaan bergabung.
  • listen-client-urls: http://localhost:2379,http://192.0.2.21:2379 — Alamat TCP/IP untuk aplikasi ini beroperasi.
  • initial-advertise-peer-urls: http://192.0.2.21:2380 — Alamat TCP/IP untuk mengiklankan diri sendiri ke etcd yang lain. Saat ini tidak terpakai karena hanya ada satu saja.
  • advertise-client-urls: http://192.0.2.21:2379 — Alamat TCP/IP yang diberitahukan kepada yang lainnya.
  • initial-cluster: etcd0=http://192.0.2.21:2380, — Sejumlah alamat TCP/IP peladen etcd yang tergabung dalam kluster. Kali ini hanya satu.
  • initial-cluster-token: ‘etcd-cluster’ — Nama kluster etcd kita. Maaf kalau kurang kreatif.
  • initial-cluster-state: ‘new’ — Kondisi awal saat pertama kali etcd nanti dijalankan.

Kalau tutorial Linode memuat semua ini dalam variabel lingkungan. Sayangnya, Debian Stretch tidak ada etcd sehingga kita terpaksa memasangnya dari snapcraft.

Sebelum menjalankan etcd, jangan lupa membuat direktori yang dibutuhkan.

sudo mkdir -p /var/lib/etcd/data /var/lib/etcd/wal
sudo snap start etcd

TIPS #1: Kalau mau mencoba dulu, sebelum menggunakan snap start, gunakan snap run untuk menjalankan etcd langsung. Apabila sudah selesai diagnosis, tekan CTRL+C untuk selesai.

Bila sudah benar, maka akan terlihat:

$ snap services
Snap  Service  Startup  Current
etcd  etcd     enabled  active

Bila statusnya sudah aktif, sekarang saatnya memasang PostgreSQL beserta Patroni.

Pemasangan PostgreSQL (pg1, pg2, dan pg3)

Kecuali hostname dan IP, semua pemasangan PostgreSQL identik. Selain itu, saya menggunakan pwgen untuk membuat sandi. Mohon sandi Anda berbeda dengan tutorial ini!

Pasang PostgreSQL

Pasang seperti biasa.

echo "deb http://kambing.ui.ac.id/postgresql/repos/apt/ `lsb_release -cs`-pgdg main" | sudo tee /etc/apt/sources.list.d/postgresql.list
wget --quiet -O - http://kambing.ui.ac.id/postgresql/repos/apt/ACCC4CF8.asc | sudo apt-key add -
sudo apt update && sudo apt install postgresql-10

Saya sengaja memilih versi 10. Lebih baru dan keren.

Matikan layanan PostgreSQL karena kita mau menjalankannya dari Patroni:

sudo systemctl disable postgresql

Pasang Patroni

Patroni tersedia di Python PIP. Pasang PIP:

sudo apt install python3-pip
sudo pip3 install --upgrade setuptools

Baru pasang Patroni dan Python-etcd:

sudo pip3 install patroni[etcd]

Selanjutnya, buat konfigurasi Patroni:

$ sudo tee /etc/patroni.yml << EOF
scope: postgres
namespace: /db/
name: pg1

restapi:
    listen: 192.0.2.11:8008
    connect_address: 192.0.2.11:8008

etcd:
    host: 192.0.2.21:2379

bootstrap:
    dcs:
        ttl: 30
        loop_wait: 10
        retry_timeout: 10
        maximum_lag_on_failover: 1048576
        postgresql:
            use_pg_rewind: true

    initdb:
    - encoding: UTF8
    - data-checksums

    pg_hba:
    - host replication replicator 127.0.0.1/32 md5
    - host replication replicator 192.0.2.11/0 md5
    - host replication replicator 192.0.2.12/0 md5
    - host replication replicator 192.0.2.13/0 md5
    - host all all 0.0.0.0/0 md5

    users:
        admin:
            password: ioqu8ohqueh6kai5va0Hoigirae7Xaem
            options:
                - createrole
                - createdb

postgresql:
    listen: 192.0.2.11:5432
    connect_address: 192.0.2.11:5432
    data_dir: /var/lib/postgresql/10/patroni
    pgpass: /tmp/pgpass
    authentication:
        replication:
            username: replicator
            password: shohkaitahsee0er6eXoh0Ohghie2toh
        superuser:
            username: postgres
            password: exuush9shohlail6Cool9eeng3kae5iy
    parameters:
        unix_socket_directories: '.'

tags:
    nofailover: false
    noloadbalance: false
    clonefrom: false
    nosync: false
EOF

Jangan lupa mengganti IP pada setiap baris listen dan connect_address pada mesin pg2 dan pg3 dengan IP masing-masing. Jangan lupa mengganti sandi (password) agar tidak sama dengan tutorial ini!

Siapkan direktori data untuk PostgreSQL versi Patroni:

sudo -u postgres mkdir -p /var/lib/postgresql/10/patroni

Terakhir, pasang unit pelayan systemd Patroni:

$ sudo tee /etc/systemd/system/patroni.service << EOF
[Unit]
Description=Runners to orchestrate a high-availability PostgreSQL
After=syslog.target network.target

[Service]
Type=simple

User=postgres
Group=postgres

Environment="PATH=/usr/lib/postgresql/10/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
ExecStart=/usr/local/bin/patroni /etc/patroni.yml

KillMode=process

TimeoutSec=30

Restart=no

[Install]
WantedBy=multi-user.target
EOF

Daftarkan dan jalankan Patroni:

sudo systemctl daemon-reload
sudo systemctl enable patroni
sudo systemctl start patroni

Kalau sudah benar, maka Patroni akan menjalankan PostgreSQL versinya.

$ systemctl status patroni
● patroni.service - Runners to orchestrate a high-availability PostgreSQL
   Loaded: loaded (/etc/systemd/system/patroni.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2018-01-26 11:18:14 WIB; 2min 27s ago
 Main PID: 9391 (patroni)
    Tasks: 12 (limit: 4915)
   CGroup: /system.slice/patroni.service
           ├─9391 /usr/bin/python3 /usr/local/bin/patroni /etc/patroni.yml
           ├─9417 postgres -D /var/lib/postgresql/10/patroni --config-file=/var/lib/postgresql/10/patroni/postgresql.conf --max_prepared_transactions=0 --port=5432 --cluster_name=postgres --max_locks_per_transaction
           ├─9420 postgres: postgres: checkpointer process   
           ├─9421 postgres: postgres: writer process   
           ├─9422 postgres: postgres: wal writer process   
           ├─9423 postgres: postgres: autovacuum launcher process   
           ├─9424 postgres: postgres: stats collector process   
           ├─9425 postgres: postgres: bgworker: logical replication launcher   
           └─9430 postgres: postgres: postgres postgres 192.0.2.11(44308) idle

Lakukan ini di pg2 dan pg3. Jangan lupa mengganti IP pada berkas /etc/patroni.yml.

Oh, iya, kalau menggunakan klon, jangan lupa /etc/network/interfaces.d/enp0s8 diubah sesuai dengan IP mesin. Jangan lupa juga ganti hostname.

Terus, kalau misalnya pg2 dan pg3 diklon dari pg1 saat Patroni sudah terkonfigurasi, jangan lupa kosongkan terlebih dahulu direktori data Patroni.

sudo systemctl stop patroni
sudo -u postgres rm -rf /var/lib/postgresql/10/patroni/
sudo -u postgres mkdir /var/lib/postgresql/10/patroni/
sudo systemctl start patroni

Kalau tidak, bisa aneh nanti.

Pemasangan HAProxy

Komponen terakhir yang hendak kita pasang adalah HAProxy. Untungnya, sudah ada paket Debian untuk HAProxy. Pasang seperti biasa:

sudo apt install haproxy

Konfigurasi HAProxy untuk menjadi proksi ketiga mesin  PostgreSQL kita.

$ sudo tee /etc/haproxy/haproxy.cfg << EOF
global
    maxconn 100

defaults
    log global
    mode tcp
    retries 2
    timeout client 30m
    timeout connect 4s
    timeout server 30m
    timeout check 5s

listen stats
    mode http
    bind *:7000
    stats enable
    stats uri /

listen postgres
    bind *:5000
    option httpchk
    http-check expect status 200
    default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
    server postgresql_192.0.2.11_5432 192.0.2.11:5432 maxconn 100 check port 8008
    server postgresql_192.0.2.12_5432 192.0.2.12:5432 maxconn 100 check port 8008
    server postgresql_192.0.2.13_5432 192.0.2.13:5432 maxconn 100 check port 8008
EOF

Setelah itu, muat ulang HAProxy untuk memuat konfigurasi baru.

sudo systemctl restart haproxy

Saya mengikuti Tutorial Linode untuk membuat port PostgreSQL pada port 5000. Anda bisa saja membuat port 5432. Kebetulan PC saya ada layanan PostgreSQL lain yang jalan pada port itu.

Untuk memonitor, silakan buka peramban Anda pada port 7000.

HAProxy interfacing Patriani's PostgreSQL nodes

HAProxy interfacing Patriani’s PostgreSQL nodes

Hanya ada satu yang hijau/aktif. Kalau tiga-tiganya, kemungkinan Anda mengklon tanpa mengubah konfigurasi dan mengosongkan direktori data PostgreSQL terlebih dahulu.

Selesai.

(Kulshekhar Kabra, 2017)

Daftar Pustaka

Kulshekhar Kabra (2017, September 19). Create a Highly Available PostgreSQL Cluster Using Patroni and HAProxy. Retrieved January 26, 2018 from https://linode.com/docs/databases/postgresql/create-a-highly-available-postgresql-cluster-using-patroni-and-haproxy/.^
Memasang Python 3.6.4 pada Debian dan Turunannya
ID Python

Memasang Python 3.6.4 pada Debian dan Turunannya

Cara sebelumnya menggunakan pyenv, sebuah perkakas yang membantu untuk memasang Python 3. Python 3.6 menyatakan bahwa paket pyenv sudah kedaluwarsa, alias sudah tidak akan dipakai lagi. Ya, sudah, dari pada ada masalah, mari memasang dengan mengompilasi dari kode sumber. Sekalian saja, mengoptimasi pemasangan.

Seperti yang lain, pasang paket yang dibutuhkan:

sudo apt install -y build-essential libbz2-dev libssl-dev libreadline-dev libsqlite3-dev tk-dev libpng-dev libfreetype6-dev

Unduh kode sumber, ekstraksi, dan masuk ke direktori:

wget https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tar.xz
tar xvfJ Python-3.6.4.tar.xz
cd Python-3.6.4/

Konfigurasi dengan optimasi menyeluruh:

CXX="/usr/bin/g++" CFLAGS="-march=native -mtune=native -pipe" CXXFLAGS=$CFLAGS ./configure --enable-optimizations --with-lto --enable-shared  --with-system-expat --with-system-ffi --with-system-libmpdec --with-ensurepip=yes

Kompilasi:

make -j$(nproc)

Ada sekitar 406 tes yang harus dilewati. Untuk itu, sebaiknya saat kompilasi Anda menyapa keluarga Anda, gebetan Anda, atau pun rekan di sebelah Anda. Ingat! Anda tidak sendirian di dunia ini.

Pasang dengan nama alternatif agar tidak bentrok dengan Python yang telah terpasang di sistem:

sudo make altinstall

Konfigurasi Sebuah Lingkungan Python versi 3.6.4

Cara untuk membuat sebuah lingkungan terisolasi yang didukung oleh Python adalah dengan menggunakan perkakas venv. Perkakas pyenv sudah kedaluwarsa dan tidak disarankan pengembang Python.

Pasang sebuah lingkungan baru:

python3.6m -m venv ~/.local/python-3.6.4

Masukan direktori lingkungan lokal tersebut ke PATH dan simpan di ~/.bashrc agar tersimpan PATH baru tersebut.

echo "PATH=~/.local/python-3.6.4/bin:$PATH" >> ~/.bashrc
source ~/.bashrc

Jalankan Python versi 3.6.4

Untuk menjalankan Python yang sudah terpasang:

source activate

Untuk mematikan — mengembalikan ke Python versi sistem:

source deactivate

Selesai.

Memasang Python 3 Terbaru di Debian dan Turunannya
ID Python

Memasang Python 3 Terbaru di Debian dan Turunannya

Debian menyertakan Python 3 versi 3.5 yang sebenarnya cukup untuk digunakan. Namun, untuk menambah khasanah dan tulisan di blog ini, saya berusaha menulis cara memasang Python versi terbaru. Siapa tahu ada yang berminat. Apalagi, Python menjadi seksi semenjak banyak pustaka seperti Numpy dan Pandas untuk pengolahan data besar.

Paket yang Diperlukan

Pasang pengembangan paket yang diperlukan:

sudo apt install -y build-essential libbz2-dev libssl-dev libreadline-dev \
                         libsqlite3-dev tk-dev libpng-dev libfreetype6-dev  -y

Pasang paket GIT karena perkakas untuk memasang memerlukan akses GIT:

sudo apt install git

Perkakas pyenv

Perkakas pyenv adalah sebuah perkakas yang bisa memasang berbagai versi Python dan mengaktifkannya sesuai selera.

 wget -O- https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer  | bash

Perkakas pyenv akan memasang skrip yang dibutuhkan untuk memasang Python. Setelah memasang pyenv, tambahkan tiga baris berikut ke ~/.bashrc dengan penyunting teks favorit Anda.

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

Untuk bisa langsung mengaktifkan, langsung jalankan:

source ~/.bashrc

Pemasangan Python

Setelah perkakas pemasang selesai dipasang, langsung saja pasang Python 3 terbaru:

pyenv install 3.6.4

Setelah selesai pemasangan, kasih nama lingkungan Python versi 3.6.4 itu agar nanti kalau butuh versi ini gampang diaktifkan.

pyenv virtualenv 3.6.4 versi_3.6.4

Versi Global

Sampai baris ini, bila kita mengetik:

$ python --version
Python 2.7.13

akan terlihat versi baku untuk pengguna yang aktif adalah Python 2.7.13 (Debian Stretch). Agar versi yang telah dikompilasi menjadi versi yang baku, jalankan:

pyenv global versi_3.6.4

Selesai.

Bacaan Lebih Lanjut

Memainkan Shadowverse di GNU/Linux
Shadowverse

Memainkan Shadowverse di GNU/Linux

Sebenarnya tulisan ini bisa terbagi menjadi dua artikel; artikel tentang memasang Steam dan artikel tentang memasang Shadowverse. Mengingat Shadowverse tidak butuh apa-apa, tulisan ini malah hanya terfokus untuk memasang Steam dengan menggunakan WINE versi terbaru. Saya menggunakan KDE Neon, sebuah sistem operasi berbasis Ubuntu 16.04.

Pengaktifan Repositori WINE Terbaru

Untuk WINE versi terbaru, tambahkan PPA WINE dari Ubuntu.

sudo add-apt-repository ppa:wine/wine-builds

Jangan jalankan pembaharuan repositori dulu. Nanti saja di saat penambahan arsitektur 32-bit.

Pengaktifan Arsitektur 32-bit

Hasil terbaik untuk menjalankan aplikasi Steam dengan WINE didapatkan dengan menjalankannya di arsitektur 32-bit.

Konfigurasi WINE Mode 32-bit

Tetapkan WINE untuk menggunakan arsitektur 32-bit:

export WINEARCH=win32

Supaya Hayati tidak lelah, taruh baris tersebut pada berkas konfigurasi mula:

echo "export WINEARCH=win32" >> ~/.bashrc

Berkas ini akan selalu dijalankan setiap kali BASH/login memulai sesi baru.

Penambahan Arsitektur 32-bit

Tambahkan arsitektur 32-bit sistem operasi Anda bila Anda menggunakan arsitektur 64-bit.

sudo dpkg --add-architecture i386
sudo apt-get update

Langkah penambahan arsitektur dilakukan kalau Anda masih memasang arsitektur 64-bit murni. Tidak ada salahnya dijalankan. Jangan lupa juga menjalankan pembaharuan daftar repositori.

Pemasangan S3 Texture Compression

Puji Tuhan negara kita tercinta tidak memiliki hukum paten perangkat lunak seperti beberapa (Uhuk AS uhuk) negara pencilan. Untuk berjaga-jaga siapa tahu sudah terpasang, buang pustaka kompresi tekstur yang lama:

sudo apt-get remove --purge libtxc-dxtn-s2tc0 libtxc-dxtn-s2tc0

Ini hanya berjaga-jaga saja. Takutnya sudah pernah terpasang untuk aplikasi lain.

Selanjutnya, pasang pustaka tekstur yang tanpa embel-embel.

wget https://launchpad.net/~xorg-edgers/+archive/ubuntu/ppa/+files/libtxc-dxtn0_1.0.1-0.3ubuntu0sarvatt+raring_amd64.deb
wget https://launchpad.net/~xorg-edgers/+archive/ubuntu/ppa/+files/libtxc-dxtn0_1.0.1-0.3ubuntu0sarvatt+raring_i386.deb
sudo dpkg -i libtxc-dxtn0_1.0.1-0.3ubuntu0sarvatt+raring_amd64.deb 
sudo dpkg libtxc-dxtn0_1.0.1-0.3ubuntu0sarvatt+raring_i386.deb

Sebenarnya Shadowverse tidak S3TC yang aneh-aneh. Satu bagian ini bisa dilewati. Namun, saya pikir mungkin nanti ini dibutuh untuk aplikasi Steam yang lainnya.

Pemasangan WINE

Pasang WINE.

sudo apt-get install --install-recommends wine-staging

Aplikasi WINE secara aneh terpasang di direktori /opt/wine-staging. Terpaksa harus ditambahkan ke PATH agar bisa dieksekusi.

export PATH=/opt/wine-staging/bin:$PATH

Jangan lupa menyimpan baris ini agar nanti selalu dijalankan.

echo "export PATH=/opt/wine-staging/bin:\$PATH" >> ~/.bashrc

Selanjutnya winetricks.

Pemasangan winetricks

Untuk pemasangan Steam yang baik, digunakan perkakas winetricks. Perkakas ini sebenarnya tersedia di repositori Ubuntu. Sayangnya, untuk memasang Steam diperlukan versi terbaru perkakas ini. Mari pasang versi terbaru winetricks:

wget -q0 -  https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks | sudo tee /usr/local/bin/winetricks
sudo chmod +x /usr/local/bin/winetricks

Saya sengaja menjalankan wget tanpa sudo. Siapa tahu di antara pembaca ada yang menggunakan proksi dengan menggunakan variabel lingkungan.

Pemasangan Steam

Sebelum memasang Steam, pastikan bahwa aplikasi Steam dijalankan oleh WINE dengan mode WinXP. Pada WINE versi terbaru, WINE dijalankan dengan mode Windows 7. Hal ini wajar, sih, mengingat banyak permainan yang membutuhkan minimal sistem operasinya Windows 7.

Mari tandai Steam.

wine reg.exe ADD "HKEY_CURRENT_USER\Software\Wine\AppDefaults\Steam.exe" /v "Version" /t "REG_SZ" /d "winxp" /f
wine reg.exe ADD "HKEY_CURRENT_USER\Software\Wine\AppDefaults\steamwebhelper.exe" /v "Version" /t "REG_SZ" /d "winxp" /f

Pasang Steam, namun jangan dijalankan dulu. Pastikan tanda centang untuk menjalankan Steam pada langkah pemasangan terakhir dihilangkan. Steam belum dapat dijalankan karena ada galat pada implementasi WINE. WINE masih belum bisa menjalankan CEF, pustaka Chrome yang menjalankan langsung web di sistem dasar.

winetricks steam

Untuk memperbaiki hal tersebut, harus ditambahkan “-no-cef-sandbox” pada saat menjalankan Steam. WINE memasang dua berkas peluncur untuk menjalankan WINE. Satu untuk ditaruh di menu dan satu ditaruh di destop.

sed -i '/^Exec/ s/$/ "-no-cef-sandbox"/'  ~/.local/share/applications/wine/Programs/Steam/Steam.desktop
sed -i '/^Exec/ s/$/ "-no-cef-sandbox"/'  ~/Desktop/Steam.desktop

Nah, selesai sudah. Jalankan Steam dengan klik ikon Steam di destop/menu. Atau jalankan langsung di terminal:

env WINEPREFIX="/home/jp/.wine" /opt/wine-staging/bin/wine C:\\\\windows\\\\command\\\\start.exe /Unix /home/jp/.wine/dosdevices/c:/users/Public/Desktop/Steam.lnk "-no-cef-sandbox"

Selanjutnya tinggal memasang Shadowverse seperti biasa.

Pemasangan Shadowverse

Bisa saja membuka Steam lalu menjelajah Steam Store dan memasang Shadowverse. Atau, jalankan Steam untuk memasang Shadowverse.

env WINEPREFIX="/home/jp/.wine" /opt/wine-staging/bin/wine C:\\\\windows\\\\command\\\\start.exe /Unix /home/jp/.wine/dosdevices/c:/users/Public/Desktop/Steam.lnk "-no-cef-sandbox" "steam://install/453480"

Selesai.

Bacaan Lebih Lanjut

Membuat VLOG dengan Perangkat Lunak Bebas dan Terbuka

Saat ini di Indonesia sedang keranjingan membuat VLOG. VLOG adalah jurnal berbentuk video yang diunggah ke Youtube. Bahkan, Pakde Jokowi, Presiden RI, juga memiliki kanal Youtube resmi.

Mengapa saya spesifik menyebutkan hanya Youtube? Mengapa saya tidak menyebut media sosial lainnya? Karena vidio.com jarang yang menonton dan Vimeo masih saja ada yang memblokir. Selain itu, proses komersialisasi video atau lazim yang disebut sebagai monetisasi, hanya disediakan dengan mantap oleh Youtube.

Ahem! Saya sebenarnya mau menyinyir yang lainnya, bukan itu. Saya sedih bahwa banyak artis-artis media sosial yang menyarankan menggunakan perangkat berbayar semisalnya Adobe Premiere Pro. Banyak yang memberikan tutorial menggunakan perkakas ini. Sepertinya mereka banyak yang sanggup membayar Rp269.800,00 per bulan atau Rp3.237.600,00 per tahun.

Hmm…

Menurut saya, ada banyak peralatan yang lebih murah untuk membuat itu.

Perkakas yang Digunakan

Saya menggunakan kamera telepon pintar saya, Xiaomi Mi 6. Berikut spesifikasi saya:

  • Sistem operasi saya Lineage OS 14.1 bentukan 1024 oleh Xiaobai yang didapatkan dari XDA Developer.
  • Aplikasi Legend untuk membuat logo yang menarik. Saya dapatkan dari Playstore.
  • Aplikasi Audio Recorder untuk merekam suara. Saya dapatkan dari F-Droid.
  • Aplikasi kamera Snapdragon PRO M 4.4.0. Saya dapatkan zip pemasangan dari XDA.

Semua aplikasi yang saya sebutkan bisa diganti dengan yang lain. Intinya, semua kebutuhan (OS, kamera, dan aplikasi) sudah bisa dipenuhi dan banyak alternatif yang gratis dan bebas.

Saya memiliki PC dengan memori 32GB dan AMD FX-8350 seperti yang sudah pernah saya bahas sebelum ini. PC ini masih mumpuni. Berikut spesifikasi saya:

  • Sistem operasi saya GNU/Linux KDE Neon 5.11, sebuah distribusi KDE berdasarkan Ubuntu 16.04.
  • Aplikasi Kdenlive untuk menyunting video.
  • Aplikasi Audacity untuk menyunting suara. Aplikasi ini sangat penting untuk memperbaiki bising yang timbul.

Sekarang saatnya membuat video.

Bahan-bahan

Saya menggunakan bahan-bahan sebagai berikut:

  • Berkas intro tanpa suara yang dibuat dari Legend.
  • Berkas ketukan untuk suara intro yang saya rekam sendiri menggunakan Audio Recorder. Saya buat dengan mengetukkan meja.
  • Berkas “Take_You _Home_Tonight.mp3” yang disediakan oleh Youtube untuk bebas diunduh. Kalau penasaran, sumbernya “Take You Home Tonight – Vibe Tracks”.
  • Berkas saya berbicara singkat.
  • Berkas suara saya berbicara singkat.

Membuat Intro (dan Outro Karena Saya Terlalu Malas)

Create logo

Dari Legend, ketik kata yang mau dijadikan logo. Lalu, tekan tanda centang.

Edit Logo

Edit Logo

Sunting animasi logo dan tekan tanda panah ke bawah (ekspor/unduh) untuk memilih mengunduh sebagai video.

Video yang dibuat masih tidak ada suara. Anda dapat membuat suara apa pun, namun perhatikan lisensi lagu/suara yang hendak dijadikan suara latar. Untuk menghindari kerumitan, kali ini saya menggunakan suara yang saya buat sendiri. Selain unik, suara ini pun bebas lisensi dari orang lain. Benar-benar 100% karya sendiri.

Pada Kdenlive, klik Project → Add Clip untuk menambah video animasi dan suara ketukan animasi. Nanti pada Project Bin, video animasi dan suara akan muncul sebagai aset proyek (sebutan untuk mereka klip suara dan klip video). Untuk menggunakan keduanya, drag saja masing-masing ke linimasa (timeline) Video 1 dan Suara 1.

Inilah demarkasi yang membedakan orang jago dan bodoh. Proses membuat suara dan video menjadi sesuai/sinkronisasi. Anda harus pintar untuk menyesuaikan suara dan video (timing). Saya, sih, membuat klip video animasi pada menit 0 dan klip suara mulai dari menit ke-15. Saya juga menambahkan efek Phaser ke klip suara.

Setiap kita punya selera berbeda. Namun, saya sudah memberikan prinsip bagi Anda.

Video Isi

Pada video isi, saya seperti biasa menambahkan aset klip video pembicaraan saya.

Lalu, pada Project Bin, saya klik kanan → Extract Audio → Wav 48000Hz untuk menghasilkan klip suara pembicaraan saya. Pada video asli, suara saya berdesis (noise).

Modifikasi Desis

Buka Audacity dan buka berkas mentahan klip suara. Pada Audacity, drag pada bagian kosong yang biasanya cuma berisi desis.

Drag to get noise sample

Drag to get noise sample

Lalu, pilih Efek → Noise Reduction → Get Noise Profile.

Setelah itu, pilih semua bagian klip suara yang mau dibuang kebisingannya. Saya pilih CTRL + A untuk memilih semua.

Setelah terpilih, klik Efek → Noise Reduction → Get Noise Profile → OK. Ya, silakan ubah-ubah parameter sebelum OK. Saya sendiri hanya mengubah Noise reduction menjadi 15dB.

Buat Diam

Oh, iya, terkadang kita tidak bisa menghindari suara-suara aneh, misalnya di awal ada suara kamera. Drag saja area klip suara yang mau dibuang. Lalu, pilih Buat → Diam… → OK.

Simpan perubahan dengan Berkas → Export Audio.

Sinkronisasi Pembicaraan

Nah, ini yang paling ribet sedunia. Bahkan dunia rekaman profesional pun suka salah. Masukkan klip suara yang sudah dibuat di Audacity sebagai aset proyek.

Saya biasanya membagi klip video menjadi kanal video dan kanal suara. Caranya, dengan klik kanan pada klip di linimasa dan pilih Split Audio.

Buat kanal Audio baru dengan cara klik kanan pada panel label linimasa dan pilih Insert Track.

Drag klip suara ke trek yang baru dibuat. Sesuaikan gambarnya dengan trek audio asli.

Sound edit

Sound edit. Sorry BGM got in the way because recreate for the tutorial.

Seperti pada gambar, saya berusaha menyesuakan suara hasil sunting dengan suara asli. Saya perhatikan gunung-gunung suara. Mohon maaf bila pada gambar tersempil kanal BGM. Cuplikan saya buat setelah produksi untuk keperluan blog ini. Biasanya di atas BGM.

Setelah dirasa sesuai, klik kanan pada kanal Suara Asli dan hapus kanal tersebut. Hal ini agar suara yang digunakan adalah suara yang sudah dibersihkan sebelumnya.

Suara Latar (BGM/Background Music)

Beda jenis isi, beda pula penggunaan BGM. Ada yang sama sekali tak perlu misalnya, bila itu isinya adalah lagu, khotbah, atau diskusi bersama. Namun, suara jangkrik akan terdengar bila saya sendirian berbicara tanpa ada suara apa pun. Biasanya, untuk format santai, gunakan suara latar untuk menambah isi.

Prinsipnya sama seperti waktu kita makan di restoran atau belanja di Mall. Lagu yang dipasang menambah suasana kondusif. Ingat, ya, penambah, bukan untuk mengacaukan. Jadi, pilihlah suara yang sesuai dengan tema isi blog.

Youtube menyediakan aset suara yang bisa diunduh dan digunakan secara bebas. Perhatikan lisensi suara yang hendak digunakan. Biasanya ada lisensi yang memerlukan atribusi (penyantuman nama lagu yang digunakan) dan sebagainya. Saya menggunakan suara yang berlisensi Domain Publik/bebas.

Seperti biasa, masukkan berkas suara tersebut menjadi klip suara di Project → Add Clip. Drag seperti biasa untuk sejajar dengan konten. Atau, bisa agak geser sedikit kalau mau agak nyeni dan sedikit pro.

Ada dua cara untuk menyesuaikan durasi klip suara latar dengan klip konten. Yang pertama, ke ujung klip lalu kecilkan bingkai klip lagu sehingga pas dengan durasi yang dibutuhkan. Cara kedua, klik dua kali pada  klip suara dan klip bisa disesuaikan parameter durasi, mulai muncul pada menit ke berapa, dan berakhir pada menit ke berapa. Saya menggunakan cara pertama, lalu menggunakan cara kedua untuk lebih presisi lagi.

Ingat! Kita mau mendengar suara saya yang lembut dan bersahaja, bukan suara musik. Untuk itu, suara BGM harus dipelankan. Caranya: pilih klip suara, lalu pilih Add Effect → Audio correction → Volume (keyframable). Pada bagian Effects for Take_You_Home_Tonight.mp3, di bagian Volume, saya menurunkan Gain menjadi -17dB. Cara menurunkannya adalah dengan drag di batang Gain.

Setiap klip baik suara mau pun video dapat dibuat efek-efek yang ditumpuk menjadi satu. Namun, untuk saat ini, cukup gunakan efek dasar saja.

Terakhir

Saya pun menambahkan klip video Intro di bagian akhir. Saya memperpanjang durasi klip suara BGM sampai ke bagian akhir klip ini.

Semua proses ini saya kerjakan sekitar sejam lebih. Hal ini karena saya harus mencari-cari aplikasi yang diperlukan dan iseng-iseng mencoba. Menurut saya, kalau memang niat, kumpulkan saja klip-klip yang diperlukan. Dan, apabila sudah terbiasa, paling proses ini hanya 15 menit saja. Apalagi, saya belum menggunakan preset (konfigurasi yang sudah tersimpan dan siap digunakan).

Saya justru menghabiskan waktu untuk mengetik entri blog ini. Ah, saya sudah ditunggu untuk minum kopi bersama. Masih banyak perkakas lain yang bisa dipakai untuk membuat video. Namun, untuk saat ini saya rasa cukuplah untuk membuat video Youtube yang sederhana dan mumpuni. Yang bikin canggih itu  kreativitas, bukan perkakas yang mahal.

May the source be with you.

Create A Database and Its Owner on PostgreSQL
PostgreSQL database

Create A Database and Its Owner on PostgreSQL

In MySQL, these are the chants:

sudo mysql --defaults-file=/etc/mysql/debian.cnf
create database mydb;
grant all privileges on mydb.* to myuser identified by 'p@s$W0rd';

On PostgreSQL, the chants are:

sudo -u postgres createuser -DAP myuser
sudo -u postgres createdb -O myuser mydb

Very simple actually and Debian by default listen at localhost. Users can connect to its database via port 5432.

Of course, these chants are useful for developing apps. In Production, you should supply a user that can only Read/Write/Update a database. In fact, several frameworks like Laravel could setup another user just to Read the database.

Memasang Golang Terbaru

Memasang Golang Terbaru

Debian Jessie memiliki Go versi lawas di repositorinya. Hal ini membuat beberapa aplikasi Go seperti Hydra SSO tidak bisa berjalan. Untuk itu, harus dipasang Go versi manual.

Pertama-tama, pergi ke laman unduh di situs resmi Go. Saat penulisan versi Go yang terbaru adalah 1.8.3. Lalu, salin tautan unduhan untuk dipakai.

Unduh dan taruh Go ke direktori tertentu. Kalau saya, lebih suka di /opt

wget -O- https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz | sudo tar xvfz - -C /opt

Go memerlukan direktori Go untuk pengguna dan direktori Go sendiri untuk bisa dieksekusi. Maka, buatlah berkas /etc/profiles.d/golang.sh yang berisi:

export GOROOT=/opt/go
export GOPATH=$HOME/.go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

Selesai.

Oh, iya, supaya tidak usah keluar, langsung saja eksekusi:

source /etc/profile.d/golang.sh

 

Mount Windows Share on KDE Neon
Wily Broke The Window

Mount Windows Share on KDE Neon

 The twins looked at each other jubilantly but with some surprise. Although 70-534 answer analysis they 70-534 answer analysis considered themselves Scarlett’s favored suitors, they had never before gained tokens ADM-201 exam dumps of this favor so easily. Usually she made them beg and plead, while she put them off, CISSP exam topics refusing to give a 70-534 answer analysis Yes or No answer, laughing if they sulked, growing cool if they became angry. And here she had practically promised them 70-534 answer analysis the ADM-201 exam dumps whole of tomorrow—seats by her at 70-534 answer analysis the barbecue, all the waltzes (and they’d see to it that the dances were CISSP exam topics all waltzes!) and the supper intermission. This was worth getting expelled from the university.Filled ADM-201 exam dumps with new enthusiasm by their success, they CISSP exam topics lingered on, talking about the barbecue 70-534 answer analysis and the ball and Ashley Wilkes 300-208 study material CISSP exam topics and Melanie Hamilton, CISSP exam topics interrupting each other, making jokes and laughing at them, hinting broadly for invitations 300-208 study material to supper. ADM-201 exam dumps Some time had passed before they realized that Scarlett was having very little to say. The atmosphere had somehow changed. Just how, the twins did not know, but the fine glow had gone out of the afternoon. Scarlett seemed to ADM-201 exam dumps be paying little attention to 70-534 answer analysis what they 300-208 study material 70-534 answer analysis ADM-201 exam dumps said, although she made the correct answers. Sensing something they 300-208 study material could not understand, baffled and annoyed by it, the twins struggled along for a while, and then rose reluctantly, ADM-201 exam dumps looking at their 300-208 study material watches.The sun was low CISSP exam topics across the new-plowed fields and the tall woods across the river ADM-201 exam dumps were looming ADM-201 exam dumps blackly in silhouette. Chimney swallows were darting swiftly across the yard, and chickens, ducks and turkeys were waddling 70-534 answer analysis and strutting and straggling in from the fields.Stuart bellowed: “Jeems!” And after an interval a 70-534 answer analysis tall black boy of their own age ran breathlessly around CISSP exam topics the house and out toward the ADM-201 exam dumps tethered horses. Jeems was their 300-208 study material body servant and, like CISSP exam topics the dogs, accompanied them everywhere. He had been CISSP exam topics their childhood playmate and had been given to the twins for their own ADM-201 exam dumps on their tenth birthday. At the sight of him, CISSP exam topics CISSP exam topics the Tarleton hounds rose up out of the red dust and stood waiting expectantly for their masters. The 300-208 study material boys bowed, shook hands and 300-208 study material told CISSP exam topics Scarlett they’d be over 300-208 study material at the 300-208 study material Wilkeses’ early in the morning, waiting for her. Then CISSP exam topics they were ADM-201 exam dumps off down the 70-534 answer analysis walk CISSP exam topics at a rush, mounted their horses and, followed by ADM-201 exam dumps ADM-201 exam dumps Jeems, went down the avenue of cedars at a gallop, waving their hats and yelling back to her.When they had rounded the curve of the dusty road that hid them from Tara, Brent drew his horse to a ADM-201 exam dumps stop under a clump of dogwood. Stuart halted, 70-534 answer analysis too, and the darky boy pulled up a few paces behind 300-208 study material them. The horses, feeling slack reins, 300-208 study material stretched down their necks to crop the tender spring grass, and the patient hounds lay down again in the 300-208 study material CISSP exam topics soft red dust and looked up longingly at the chimney swallows circling in the gathering dusk. 300-208 study material Brent’s wide ingenuous face was puzzled and mildly indignant.“Look,” he said. “Don’t it look to you like she 70-534 answer analysis would of asked us to stay for supper?”  Nor did 70-534 answer analysis James and Andrew, who took him into their store in Savannah, regret his lack of education. His clear hand, his 300-208 study material accurate CISSP exam topics figures and his shrewd ADM-201 exam dumps ability in bargaining won their respect, where a knowledge 70-534 answer analysis of literature and a fine appreciation of music, had young 300-208 study material Gerald possessed them, would have moved them to snorts of contempt. America, in the early years of the century, had been kind to the Irish. James and Andrew, who had begun by hauling goods in covered wagons 70-534 answer analysis from Savannah to Georgia’s inland towns, had prospered into a store of their own, and Gerald prospered with them.

Because of WCry 2.0, people turned off SMBv1 protocol. So, to mount that Windows Share folder, we need to adjust by defining the protocol version. Thus, mounting:

sudo mount -t cifs //[WINDOWS_IP]/[WINDOWS_FOLDER] /mnt -o username=guest,uid=1000,vers=2.1

e.g.

sudo mount -t cifs //192.168.1.2/jav /mnt -o username=guest,uid=1000,vers=2.1

Change uid with your own UID. We could use protocol 3. But, in this example, I used SMB version 2.1.

Wily Broke The Window

Read more about ..

Kalau KMail mengambek dengan pesan:

org.kde.pim.kmail: "The protocol version of the Akonadi server is incompatible. Make sure you have a compatible version installed. (Protocol version mismatch. Server version is newer (56) than ours (57). If you updated your system recently please restart the Akonadi server.)"
*** KMail got signal 11 (Exiting)
Segmentation fault

Itu berarti Akonadi perlu dinyalakan ulang.

akonadictl restart

 

Memasang React Native
Super Android, recharge!

Memasang React Native

WordPress semenjak versi 4.7 telah menambahkan fitur WP REST API v2. Dengan adanya fasilitas tersebut, WordPress bisa dibuat sebagai peladen API yang berisi artikel. Namun, yang paling penting dari semuanya itu, WordPress dapat menjadi peladen untuk aplikasi-aplikasi web modern macam React/Redux dan lain sebagainya.

Cara Pasang

Pastikan bahwa Android SDK sudah terpasang. Paling gampang, kita bisa langsung memasang Android Studio yang juga akan memasang Android SDK. Silakan ikuti tautan. Saya takkan menulis apa pun karena tutorial dari Google sudah ada yang menggunakan Bahasa Indonesia.

Jalankan ketiga baris ini dan tambahkan ketiga baris tersebut ke dalam ~/.bashrc agar selalu otomatis terjalankan setiap kali Anda menjalankan sesi terminal baru.

export ANDROID_HOME=~/Android/Sdk
export PATH=${PATH}:${ANDROID_HOME}/tools
export PATH=${PATH}:${ANDROID_HOME}/platform-tools

Lalu, jalankan Android SDK Manager:

android

Dalam Android SDK Manager, pilih dua paket berikut:

  • Android SDK Build-tools versi 23.0.1
  • Android 6.0 (API 23) SDK Platform (Rev 3).

Silakan lihat gambar untuk lebih jelasnya.

SDK Android Platform Manager

Android SDK Manager, showing what to install to run React Native

Setelah ini, pasang React Native:

sudo npm install -g react-native

Ambil kopi atau sapa sanak saudara dari pada bengong lama menunggu proses pemasangan React Native.

Buat AVD Dulu

Buat terlebih dahulu sebuah emulasi mesin Android:

android avd
AVD Manager

AVD Manager, click Create to create new emulated Android device.

Pilih tombol Create.

Saya mengubah beberapa parameter berikut:

  • AVD Name: ReactNativeOS [Saya memang kurang kreatif :P]
  • Device: Nexus 5 [Terserah, sih]
  • Target: Android 5.1.1 – API Level 22
  • CPU/ABI: Intel Atom (x86_64)
  • Skin: Skin with dynamic hardware control
  • Front Camera, Back Camera: Emulated
  • SD Card: 200 MB
  • Emulation Options: Use Host GPU
Create Android Emulator

Create new Android Emulator based on Nexus 5 and API Level 21

Sisanya saya biarkan pilihan baku. Setelah itu, klik OK.

Jalankan Android yang baru dibuatkan:

emulator -avd ReactNativeOS &

Cara Pakai

Jalankan terlebih dahulu emulator AVD

Untuk membuat proyek baru:

react-native init UnivIndonesia && cd UnivIndonesia

Setelah pemasangan berhasil, masuk ke direktori dan jalankan peladen NodeJS:

npm start

Setelah itu, buka terminal baru lagi dan masuk ke direktori tersebut. Kalau mau di terminal yang sama, tambahkan tanda ampersand (“&”) setelah “start” agar Nodejs dijalankan di latar belakang.

Untuk melihat aplikasi Android yang sudah dibuat, jalankan:

react-native run-android

Selamat mencoba. Sebenarnya, React Native bisa dijalankan di iOS, tapi saya tak mampu membeli SDK Apple. 😛

Pasang ZFS Terbaru pada Ubuntu Xenial 16.04

Pasang ZFS Terbaru pada Ubuntu Xenial 16.04

Ubuntu Xenial secara baku memasang ZFS. Sayangnya, saya sering pindah-pindah sistem operasi sehingga versi ZFS yang dimiliki oleh Ubuntu Xenial tidak memadai. Ada fitur yang tidak kompatibel dengan versi ZFS Ubuntu.

Untungnya, perkakas ZFS yang sudah ada di Xenial sudah mumpuni. Yang perlu diperbaiki hanya versi kernelnya. Jadi, itulah yang hendak kita lakukan: memasang kernel ZFS terbaru pada Ubuntu Xenial sehingga fitur-fitur terbaru didukung.

Saya belum tahu efeknya, tetapi mohon berhati-hati bila menggunakan perkakas berbeda dengan kernel. Kalau saya, saya punya cadangan. Lagipula, saya biasa melakukan ini dari CD Pemasangan KDE Neon, distro GNU/Linux berdasarkan Ubuntu Xenial.

Mohon berhati-hati.  Saya tidak bertanggung jawab atas risiko yang Anda lakukan.

Teknis Setelah Mukadimah

Untuk kernel dari Ubuntu, hapus kernel ZFS yang sudah ada:

rm -rf /lib/modules/4.4.0-24-generic/kernel/zfs/

Pasang ketergantungan:

apt -y install build-essential autoconf libtool gawk alien fakeroot linux-headers-$(uname -r)
apt -y install zlib1g-dev uuid-dev libattr1-dev libblkid-dev libselinux-dev libudev-dev
apt -y install parted lsscsi ksh
apt -y install autoconf git libdevmapper-dev

Unduh SPL:

git clone https://github.com/zfsonlinux/spl && cd spl

Buat:

./autogen
./configure --prefix=/usr --with-config=kernel
make -j$(nproc)
sudo make install

Unduh ZFS:

cd ..
git clone https://github.com/zfsonlinux/zfs && cd zfs

Buat:

./autogen.sh
./configure --prefix=/usr --with-config=kernel
make -j$(nproc)
sudo make install

Selesai.

Pasang ZFS GIT di Ubuntu 16.04 Xenial

Pasang ZFS GIT di Ubuntu 16.04 Xenial

Set:

export KERNEL_TARGET_VERSION=`uname -r`

Cuma memastikan versi yang lama tidak ada:

rm -rf /lib/modules/4.4.0-24-generic/kernel/zfs/

Pasang ketergantungan:

apt -y install build-essential autoconf libtool gawk alien fakeroot linux-headers-$KERNEL_TARGET_VERSION
apt -y install zlib1g-dev uuid-dev libattr1-dev libblkid-dev libselinux-dev libudev-dev
apt -y install parted lsscsi ksh
apt -y install autoconf git libdevmapper-dev

INI IMPLEMENTASI YANG RUSAK UNTUK XENIAL. SAYA TIDAK MENGHAPUS KARENA UNTUK KEPERLUAN RISET DI VERSI OS YANG LAIN. MOHON IKUTI CARA DI TULISAN INI.

 

Bacaan Lebih Lanjut

Resep: Jemalloc

Resep: Jemalloc

Pastikan bahwa:

sudo apt-get install build-essential autoconf

terpasang. Perkakas autoconf diperlukan untuk membuat makro-makro yang dibutuhkan. Hal ini karena versi VCS biasanya perlu menjalankan autogen.sh untuk membuat skrip configure.

Ambil dari GIT:

git clone https://github.com/jemalloc/jemalloc.git && cd jemalloc

Lakukan tiga langkah sulap seperti biasa:

./autogen.sh
./configure --prefix=/usr --enable-lazy-lock EXTRA_CFLAGS='-march=native -mtune=native'
make -j$(nproc)
sudo make install_bin install_include install_lib

Eh, empat, deh. Lupa. Kalau memasang dari repositori langsung, bukan versi terbit, harus dibuatkan makronya terlebih dahulu. Baris configure saya tambahkan parameter GCC untuk menggunakan kode-kode ke prosesor saya berhubung jemalloc untuk laptop. Baris make dijalankan sebanyak jumlah prosesor. Baris instalasi secara spesifik dijabarkan untuk hanya memasang pustaka dan binari jemalloc. Ada galat kompilasi dokumentasi di jemalloc yang menyebabkan pemasangan menyeluruh (sudo make install) menjadi gagal.

Memasang RVM

Memasang RVM

RVM adalah sebuah pengatur lingkungan Ruby. Dengan menggunakan RVM, kita bisa memiliki beberapa versi Ruby yang tidak saling bertabrakan. Cocok untuk pengembangan aplikasi Ruby yang versinya sering kali tidak bisa stabil mengikuti distro.

Impor kunci GPG:

curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -

Pasang RVM seperti biasa:

\curl -sSL https://get.rvm.io | bash -s stable --ruby

Selesai.

Catatan Pribadi: Pemasangan ZFS Pada Ubuntu 16.04 Xenial

Catatan Pribadi: Pemasangan ZFS Pada Ubuntu 16.04 Xenial

Versi kernel disesuaikan dengan kebutuhan, namun untuk kesederhanaan anggap saja versi yang sama dengan kernel yang sedang berjalan.

export KERNEL_TARGET_VERSION=`uname -r`

Pasang hal-hal yang dibutuhkan sesuai panduan pada ZFSOnLinux. Saya menambahkan GIT dan GNU Autoconf karena hendak memasang versi GIT.

sudo apt-get install build-essential gawk alien fakeroot linux-headers-$KERNEL_TARGET_VERSION
sudo apt-get install zlib1g-dev uuid-dev libattr1-dev libblkid-dev libselinux-dev libudev-dev
sudo apt-get install parted lsscsi ksh
sudo apt-get install git autoconf

Setelah ini, mari bangun komponen-komponen ZFS, yakni: SPL dan ZFS itu sendiri.

Memasang SPL

Unduh:

git clone https://github.com/zfsonlinux/spl && cd spl

Sebenarnya tidak perlu dengan –with-linux. Sebagai pengingat saja kalau misalnya mau memasang untuk kernel versi lainnya. Misalnya, ada versi kernel terbaru dan sebelum masuk dengan kernel tersebut, kita pasang terlebih dahulu modul kernel. Jalankan skrip konfigurasi untuk mendapatkan skrip configure yang lazim dipakai untuk mengompilasi. Biasanya kalau unduh dari SCM (CVS, SVN, Mercurial, GIT, dan sebagainya), skrip tersebut belum ada. Lalu, lakukan stanza yang seperti biasanya.

./autogen.sh
./configure --prefix=/usr --disable-static --with-gnu-ld --with-linux=/usr/src/linux-headers-$KERNEL_TARGET_VERSION --with-linux-obj=/usr/src/linux-headers-$KERNEL_TARGET_VERSION --libexecdir=/usr/lib/zfs-linux --bindir=/bin --sbindir=/sbin --localstatedir=/var --runstatedir=/run --sysconfdir=/etc
make -j$(nproc)
sudo make install

Tentu saja, biasakan untuk mengompilasi dengan pengguna biasa. Baru setelah mau dipasang, dieskalasi jadi administrator.

Memasang ZFS

Unduh:

cd .. && git clone https://github.com/zfsonlinux/zfs && cd zfs

Lakukan empat stanza standar.

./autogen.sh
./configure --prefix=/usr --disable-static --with-gnu-ld --with-linux=/usr/src/linux-headers-$KERNEL_TARGET_VERSION --with-linux-obj=/usr/src/linux-headers-$KERNEL_TARGET_VERSION --with-systemdunitdir=/lib/systemd/system --with-systemdpresetdir=/lib/systemd/system-preset --with-systemdmodulesloaddir=/etc/modules-load.d --libexecdir=/usr/lib/zfs-linux --bindir=/bin --sbindir=/sbin --localstatedir=/var --runstatedir=/run --sysconfdir=/etc
make -j$(nproc)
sudo make install

Selesai. Bagaimana menjalankan ZFS sudah ada di tulisan yang lain.

King of Fighters XIII Steam Edition pada GNU/Linux Wine
WINE Is Not Emulator

King of Fighters XIII Steam Edition pada GNU/Linux Wine

Valve telah berhasil membuat Steam, sebuah platform yang berhasil menciptakan ekonomi mayanya sendiri. Di saat yang lain sedang berjuang menciptakan ekosistem, Yang Dipermuliakan Gaben mengundang seorang ekonom, Yanis Varoufakis, untuk membuat sebuah ekonomi maya di Steam. Yanis Varoufakis inilah yang saban hari menolong Yunani melewati masa-masa kelamnya ketika negara tersebut tengah terancam bangkrut.

[Jadi, jangan bilang saya tidak riset. Saya membuka Steam dalam rangka mempelajari ekonomi maya itu. uhuk ;-P]

Salah satu riset saya waktu itu adalah membeli beberapa permainan. Salah satu permainan itu adalah King of Fighters XIII edisi Steam. Ada sedikit pergumulan untuk memasang permainan ini di GNU/Linux karena dia harus menggunakan Wine.

Oh, iya, saya menggunakan KDE Neon, turunan Ubuntu 16.04 Xenial. Saya juga normalnya menggunakan Wine 1.9 yang memiliki Gallium Nine (DirectX 9 dengan Gallium Mesa 3D). Saya juga memilih untuk menjalankan Wine 32-bit.

export WINEARCH=wine32

Supaya kita satu visi, pastikan bahwa winetricks sudah terpasang. Saya lebih suka versi GIT. Tetapi, kalau tidak mau pusing, Anda bisa menggunakan yang versi paket Ubuntu.

wget https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks
chmod +x winetricks
sudo mv winetricks /usr/local/sbin

Pasang Wine 1.6. Wine versi ini sangat diperlukan untuk memasang pustaka WMP9. Wine versi terbaru tidak bisa dipakai untuk memasang pustaka-pustaka.

sudo apt-get install wine1.6

Selanjutnya, pasang beberapa pustaka yang perlu.

WINEARCH=win32 winetricks wmp9
WINEARCH=win32 winetricks devenum
WINEARCH=win32 winetricks vcrun6

Sudah. Selanjutnya, kembali pasang Wine versi terbaru yang keren.

sudo apt-get install wine1.9

Selanjutnya, pada detik ini silakan langsung memasang Steam seperti biasa; unduh dari situsnya, pasang Steam, login, dan pasang KoF XIII. Kalau tidak ada apa-apa, KoF XIII bisa berjalan seperti biasa.

KoF XIII for Steam

King of Fighters XIII Steam edition, Mai Shiranui winning pose.

 

Bacaan Lebih Lanjut