Integrasi PostgreSQL On-Premise dengan Backend API Go Fiber v3 di Google Cloud VPS via WireGuard VPN#

Dokumentasi teknis ini membahas langkah-langkah implementasi tingkat lanjut untuk membangun arsitektur data privat berbasis hybrid cloud. Fokus utama dari panduan ini adalah menonaktifkan ekspos database PostgreSQL lokal ke internet publik dan merutekan seluruh lalu lintas data aplikasi melalui terowongan WireGuard VPN (10.10.10.0/24) yang telah dibangun sebelumnya.

Di akhir panduan ini, aplikasi Backend API yang dibangun menggunakan bahasa pemrograman Go dengan framework Fiber v3 akan berjalan di Google Cloud VPS dan secara aman melakukan kueri (query) database langsung ke server internal on-premise Anda.


1. Instalasi dan Inisialisasi Database PostgreSQL (On-Premise)#

Proses instalasi ini dilakukan sepenuhnya pada mesin server lokal (on-premise) atau laptop Anda. Kita akan memasang paket PostgreSQL server beserta utilitas tambahannya, membuat basis data baru, serta mengonfigurasi skema tabel beserta hak akses pengguna administratif.

Langkah-Langkah Pembuatan Database:#

  1. Pasang paket utama PostgreSQL dan kontribusi modul tambahan melalui manajer paket repositori resmi Ubuntu:
sudo apt update && sudo apt install postgresql postgresql-contrib -y
  1. Akses antarmuka interaktif CLI PostgreSQL (interactive terminal) menggunakan akun sistem operasi postgres:
sudo -u postgres psql
  1. Buat sebuah database baru bernama api yang akan dialokasikan khusus untuk menyimpan data dari aplikasi backend:
CREATE DATABASE api;
  1. Pindah fokus koneksi aktif ke dalam basis data api yang baru saja dibuat:
\c api
  1. Buat struktur tabel bernama users dengan kolom ID bertipe auto-increment, serta nama dan email bertipe tekstual:
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    email TEXT NOT NULL
);
  1. Ubah kata sandi (password) bawaan untuk pengguna administratif postgres menjadi kredensial yang aman guna kebutuhan autentikasi API:
ALTER USER postgres PASSWORD 'wildan123';
  1. Keluar dari lingkungan terminal interaktif psql untuk kembali ke terminal sistem operasi:
\q

2. Mengamankan dan Membuka Akses PostgreSQL via Jalur VPN#

Secara bawaan, PostgreSQL dikonfigurasi oleh sistem untuk hanya mendengarkan koneksi dari antarmuka lokal (loopback/localhost). Agar backend API yang berada di Google Cloud VPS dapat menjangkau database ini, kita perlu memodifikasi konfigurasi jaringan internal PostgreSQL agar bersedia menerima paket data dari IP virtual WireGuard.

Langkah Modifikasi File postgresql.conf:#

  1. Buka file konfigurasi utama jaringan PostgreSQL menggunakan teks editor (ganti <version> dengan nomor versi PostgreSQL yang terpasang pada sistem Anda, contoh: 14, 15, 16, atau 17):
sudo nano /etc/postgresql/<version>/main/postgresql.conf
  1. Cari baris parameter pembatasan IP yang biasanya ditandai dengan tanda pagar (komentar):
#listen_addresses = 'localhost'
  1. Ubah parameter tersebut dengan menghapus tanda pagar dan mengganti nilainya menjadi IP WireGuard privat milik mesin lokal Anda:
listen_addresses = '10.10.10.2'

Penjelasan Konfigurasi: Mengubah listen_addresses menjadi 10.10.10.2 memastikan database PostgreSQL mengisolasi dirinya dari jaringan internet luar. Sockets jaringan PostgreSQL hanya akan terbuka dan mendengarkan permintaan masuk yang mengalir di dalam terowongan enkripsi WireGuard.


Langkah Modifikasi File pg_hba.conf:#

  1. Buka file Host-Based Authentication (HBA) yang berfungsi sebagai pengelola firewall internal PostgreSQL:
sudo nano /etc/postgresql/<version>/main/pg_hba.conf
  1. Gulirkan kursor ke bagian paling bawah file, lalu tambahkan dua baris aturan baru untuk memberikan hak otorisasi masuk kepada IP VPN:
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             10.10.10.1/32           scram-sha-256
host    all             all             10.10.10.2/32           scram-sha-256

Analisis Aturan Akses (HBA Rules):#

  • host: Menandakan bahwa koneksi dilakukan menggunakan protokol jaringan TCP/IP.
  • all (Kolom database & user): Memberikan izin kepada koneksi tersebut untuk mengakses seluruh database dan menggunakan nama user apa pun yang terdaftar di sistem.
  • 10.10.10.1/32: Mengizinkan entitas dengan IP tepat 10.10.10.1 (yaitu VPS Google Cloud) untuk melakukan jabat tangan koneksi database.
  • 10.10.10.2/32: Mengizinkan mesin lokal itu sendiri untuk mengakses database via segmen IP VPN.
  • scram-sha-256: Merupakan metode autentikasi berbasis tantangan kriptografi (cryptographic challenge-response) standar industri modern yang jauh lebih aman dibanding metode lama (md5). Anda juga bisa menggunakan md5 jika versi PostgreSQL lama Anda membutuhkannya.

Langkah Penerapan dan Pengujian:#

  1. Muat ulang (restart) layanan database PostgreSQL agar seluruh konfigurasi baru di atas diterapkan oleh sistem:
sudo systemctl restart postgresql
  1. Beralihlah ke terminal Google Cloud VPS Anda, kemudian lakukan pengujian koneksi jarak jauh mengarah ke IP WireGuard lokal untuk memastikan routing telah berjalan lancar:
psql -h 10.10.10.2 -U postgres -d api

Catatan Validasi: Jika terminal VPS meminta Anda memasukkan kata sandi (Password for user postgres:), hal ini menandakan bahwa sistem keamanan jaringan dan enkripsi VPN WireGuard telah berhasil menghubungkan sisi Cloud ke database internal lokal Anda secara sempurna.


3. Pengembangan Aplikasi Backend API Menggunakan Go Fiber v3#

Tahap ini berfokus pada pembangunan aplikasi REST API berbasis bahasa pemrograman Go. Aplikasi ini memanfaatkan framework Fiber v3 yang memiliki performa tinggi untuk mengelola rute permintaan (routing request) HTTP, serta driver lib/pq untuk berkomunikasi langsung ke database PostgreSQL melalui jalur privat.

Langkah Inisiasi Proyek Go:#

  1. Pasang paket compiler bahasa pemrograman Go pada sistem operasi Anda:
sudo apt install golang -y
  1. Buat direktori kerja baru untuk menampung seluruh berkas kode sumber aplikasi proyek, lalu masuk ke direktori tersebut:
mkdir backend && cd backend
  1. Inisialisasi modul Go baru untuk mengelola dependensi proyek:
go mod init backend
  1. Unduh paket pustaka (library) resmi untuk framework Fiber v3:
go get github.com/gofiber/fiber/v3
  1. Unduh paket driver resmi database PostgreSQL untuk bahasa pemrograman Go:
go get github.com/lib/pq

Pembuatan dan Struktur Kode Sumber (main.go):#

  1. Buat file kode sumber baru menggunakan editor teks:
nano main.go
  1. Tuliskan keseluruhan struktur arsitektur kode program di bawah ini ke dalam file main.go:
package main

import (
	"database/sql"
	"log"

	"github.com/gofiber/fiber/v3"
	_ "github.com/lib/pq"
)

// User merepresentasikan struktur data tabel users di database
type User struct {
	ID    int    `json:"id"`
	Name  string `json:"name"`
	Email string `json:"email"`
}

// db bertindak sebagai pool koneksi database global
var db *sql.DB

func main() {
	// Kredensial string koneksi mengarah ke IP WireGuard lokal (On-Premise)
	connStr := "host=10.10.10.2 port=5432 user=postgres password=wildan123 dbname=api sslmode=disable"

	var err error

	// Membuka pool koneksi ke database PostgreSQL
	db, err = sql.Open("postgres", connStr)
	if err != nil {
		log.Fatal("Gagal membuka koneksi database:", err)
	}

	// Memastikan status keaktifan database dengan metode Ping
	err = db.Ping()
	if err != nil {
		log.Fatal("Database tidak merespon (Ping Gagal):", err)
	}

	// Inisialisasi instance aplikasi Fiber v3
	app := fiber.New()

	// Registrasi Endpoints API
	app.Get("/users", getUsers)
	app.Post("/users", createUser)

	// Menjalankan HTTP Server pada port internal 8080
	log.Fatal(app.Listen(":8080"))
}

// createUser menangani pembuatan data user baru via HTTP POST
func createUser(c fiber.Ctx) error {
	user := new(User)

	// Melakukan parsing data JSON dari HTTP request body ke struct User
	if err := c.Bind().Body(user); err != nil {
		return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Format JSON tidak valid"})
	}

	// Kueri SQL untuk memasukkan data dan mengembalikan ID yang digenerasikan
	query := `
	INSERT INTO users (name, email)
	VALUES ($1, $2)
	RETURNING id
	`

	err := db.QueryRow(query, user.Name, user.Email).Scan(&user.ID)
	if err != nil {
		return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
	}

	return c.Status(fiber.StatusCreated).JSON(user)
}

// getUsers menangani pengambilan seluruh data user via HTTP GET
func getUsers(c fiber.Ctx) error {
	// Kueri SQL untuk mengambil seluruh data dari tabel users
	rows, err := db.Query("SELECT id, name, email FROM users")
	if err != nil {
		return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
	}
	defer rows.Close()

	var users []User

	// Melakukan iterasi untuk setiap baris data hasil kueri database
	for rows.Next() {
		var user User
		if err := rows.Scan(&user.ID, &user.Name, &user.Email); err != nil {
			return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
		}
		users = append(users, user)
	}

	return c.JSON(users)
}

Langkah Pengujian Kode Sumber secara Lokal:#

  1. Jalankan aplikasi secara langsung pada mesin lokal untuk memastikan tidak ada kesalahan sintaksis atau kegagalan koneksi awal:
go run main.go
  1. Buka jendela terminal baru, kemudian lakukan pengujian pengiriman data menggunakan perintah curl (HTTP POST):
curl -X POST http://localhost:8080/users \
  -H "Content-Type: application/json" \
  -d '{"name":"Wildan","email":"wildan@gmail.com"}'
  1. Lakukan pengujian penarikan data untuk memastikan data telah tersimpan di database lokal (HTTP GET):
curl http://localhost:8080/users

4. Kompilasi dan Proses Deployment ke Google Cloud VPS#

Bahasa pemrograman Go memiliki keunggulan berupa kompilasi ke dalam bentuk satu berkas biner mandiri (single binary executable). Berkas biner ini dapat langsung dijalankan di Google Cloud VPS tanpa perlu memasang modul compiler Go di sisi server cloud.

Langkah Kompilasi dan Migrasi File:#

  1. Kompilasi kode sumber Go menjadi file biner siap pakai bernama backend:
go build -o backend
  1. Transfer file biner tersebut dari mesin lokal menuju direktori home pengguna di Google Cloud VPS menggunakan protokol aman SCP (Secure Copy Protocol). Ganti USER dengan nama pengguna SSH Anda dan IP_VPS dengan alamat IP publik asli VPS Anda:
scp backend USER@IP_VPS:/home/USER/

Langkah Eksekusi Aplikasi di Google Cloud VPS:#

  1. Masuk ke dalam sistem operasi Google Cloud VPS Anda melalui koneksi SSH:
ssh USER@IP_VPS
  1. Berikan hak akses eksekusi penuh pada berkas biner backend yang baru saja diunggah:
chmod +x /home/USER/backend
  1. Jalankan aplikasi backend di latar belakang (background process) menggunakan utilitas nohup. Langkah ini memastikan aplikasi tetap terus berjalan melayani permintaan API meskipun Anda keluar atau memutus koneksi sesi SSH dari VPS:
nohup /home/USER/backend > backend.log 2>&1 &

Penjelasan Teknis Operasional: Perintah nohup dikombinasikan dengan simbol ampersand (&) akan memisahkan proses aplikasi dari kontrol terminal saat ini. Seluruh keluaran log error dan log akses sistem akan otomatis dialihkan ke dalam berkas teks bernama backend.log.


Langkah Validasi Akhir Layanan API di Cloud:#

  1. Lakukan pengujian internal dari dalam VPS untuk memastikan server API berjalan dengan lancar merutekan data privat melewati VPN WireGuard:
curl http://localhost:8080/users

5. Kesimpulan Arsitektur Akhir#

Selamat, Anda telah berhasil mengimplementasikan infrastruktur jaringan hybrid modern untuk level produksi (production-ready hybrid architecture).

Secara topologi, Google Cloud VPS bertindak sebagai gerbang depan publik yang menghosting REST API berkinerja tinggi menggunakan Go Fiber v3. Sementara itu, seluruh data transaksional sensitif disimpan di Server On-Premise (Lokal) Anda yang tersembunyi dengan aman di balik firewall lokal. Jembatan komunikasi data rahasia di antara keduanya sepenuhnya dilindungi oleh enkripsi asimetris tingkat tinggi dari WireGuard VPN Tunnel.