Setup Private Railway Sendiri: Dokploy + Tailscale + Valid SSL di Proxmox LXC
Setiap engineer menyukai kesederhanaan Railway: push kode, buka web dashboard, buat database baru, dan aplikasi langsung online dengan domain otomatis serta SSL valid. Namun, membayar biaya commercial cloud PaaS untuk setiap branch staging, dashboard internal, atau side project bisa membengkak dengan cepat.
Dengan perkakas open-source modern saat ini, kamu bisa membangun Platform as a Service (PaaS) privat sendiri di atas hardware milikmu. Bahkan lebih menariknya lagi: kamu bisa mengaksesnya secara aman dari mana saja di seluruh dunia, lengkap dengan sertifikat HTTPS terpercaya, tanpa perlu membuka satu pun port di router.
Berikut adalah panduan lengkap cara setup Dokploy di dalam unprivileged Proxmox LXC, menghubungkannya secara aman via Tailscale, dan mendapatkan sertifikat SSL Let’s Encrypt valid menggunakan Cloudflare DNS-01 challenge.
Contoh Kasus Nyata untuk Setup Ini
Arsitektur ini sangat fleksibel dan menjawab dua kebutuhan utama dalam rekayasa perangkat lunak:
-
Environment Staging Zero-Trust untuk Tim Engineering
Tim developer skala kecil sering kali menghabiskan ratusan dolar setiap bulan hanya untuk environment staging di cloud publik. Melalui setup ini, kamu hanya membutuhkan satu komputer, mini PC cadangan, atau beberapa mesin yang di-cluster bersama di kantor. Anggota tim cukup bergabung ke Tailnet kantor, mendeploy pull request atau staging branch ke Dokploy, dan mengujinya di kondisi yang realistis. Karena seluruh traffic tetap berada di dalam Tailscale, aplikasi staging, API internal, dan fitur pra-rilis tidak pernah terekspos ke internet publik. Tanpa pengunjung tak dikenal, tanpa terindeks oleh mesin pencari (search engine), dan nol risiko kebocoran data yang tidak disengaja. -
Homelab, Self-Hosting, dan Private AI Assistant
Untuk penggunaan pribadi, setup ini mengubah homelab atau home server milikmu menjadi cloud privat. Kamu bisa menjalankan layanan harian (seperti Nextcloud, Vaultwarden, Home Assistant, atau aplikasi web pribadi) dengan antarmuka web yang rapi, backup otomatis, dan update tanpa repot di hardware sendiri. Setup ini juga merupakan environment ideal untuk menjalankan private AI assistant 24/7 menggunakan tools seperti OpenClaw atau Hermes. Alih-alih membayar tagihan komputasi cloud yang mahal untuk background worker nonstop, headless Chromium browser, dan memori vektor, kamu menyimpan API key, dokumen privat, dan riwayat percakapan 100% di hardware kamu sendiri. Melalui kombinasi Tailscale dan Traefik, kamu mendapatkan domain HTTPS yang rapi (sepertihttps://assistant.domainkamu.com) yang bisa kamu ajak chat atau panggil melalui webhook langsung dari laptop atau smartphone dari mana saja, tanpa pernah mengekspos apa pun ke internet publik.
Arsitektur: Mengapa Memilih Komponen Ini?
Sebelum masuk ke perintah terminal, mari kita pahami fungsi dan alasan di balik pemilihan setiap komponen:
- Proxmox VE & LXC Container: Memasang Proxmox VE memberikan fleksibilitas yang jauh lebih besar dibandingkan menginstall distro Linux standar langsung di hardware server. Dengan Proxmox, kamu bisa dengan mudah membuat, mengkloning, membuat snapshot, dan menghapus berbagai virtual machine (VM) terisolasi maupun Linux Container (LXC) yang ringan, sembari menentukan batasan resource (core CPU, limit RAM, dan kuota disk) secara presisi untuk masing-masing container. Hal ini membuat eksperimen menjadi aman dan nyaman: kamu bisa menguji stack baru tanpa membahayakan stabilitas sistem host. Untuk Dokploy, kita mendeploy-nya di dalam unprivileged LXC container karena ia berbagi kernel Linux dengan host, menghasilkan performa mendekati bare-metal, proses boot instan, dan overhead RAM serta CPU yang sangat minimal.
- Dokploy: Alternatif PaaS open-source dan self-hosted untuk Railway, Heroku, atau Coolify. Dokploy menyediakan UI web yang intuitif untuk mengelola container Docker, database (Postgres, MySQL, Redis, Mongo), deployment Git otomatis, dan routing domain.
- Tailscale: Mesh VPN zero-config berbasis WireGuard. Alih-alih membuka port router (seperti 80 atau 443) atau berurusan dengan dynamic DNS dan mengekspos IP publik rumah atau kantor ke scanner internet, Tailscale membuat jaringan privat terenkripsi (Tailnet). Hanya perangkat yang terotentikasi yang dapat mengakses service kamu.
- Traefik (Reverse Proxy Bawaan Dokploy): Traefik bertindak di garda terdepan dari semua aplikasi Dokploy. Traefik mendengarkan request web yang masuk, merutekan traffic ke container yang tepat, dan menangani provisi sertifikat SSL secara otomatis.
- Cloudflare DNS + DNS-01 Challenge:
- Masalahnya: Secara default, Let’s Encrypt menggunakan HTTP-01 challenge, di mana server Let’s Encrypt mencoba menghubungi domain kamu melalui port 80 untuk memverifikasi kepemilikan domain. Karena container kita berada di IP privat Tailscale (
100.x.y.z), internet publik tidak dapat menjangkau port 80 tersebut, sehingga verifikasi standar pasti gagal. - Solusinya: DNS-01 challenge membuktikan kepemilikan domain dengan membuat TXT record sementara di Cloudflare DNS melalui Cloudflare API. Let’s Encrypt akan mengecek DNS server publik alih-alih menghubungi jaringan privat kamu. Kamu mendapatkan sertifikat SSL yang dipercaya secara publik tanpa perlu membuka port apa pun di router.
- Masalahnya: Secara default, Let’s Encrypt menggunakan HTTP-01 challenge, di mana server Let’s Encrypt mencoba menghubungi domain kamu melalui port 80 untuk memverifikasi kepemilikan domain. Karena container kita berada di IP privat Tailscale (
1. Aktifkan Perangkat TUN di Host Proxmox
Secara default, unprivileged LXC container di Proxmox terisolasi dari perangkat jaringan /dev/net/tun milik host. Tailscale memerlukan interface TUN ini untuk membuat interface jaringan WireGuard terenkripsinya.
- Hentikan (stop) LXC container yang dituju.
- Buka shell di host Proxmox kamu:
nano /etc/pve/lxc/<CT_ID>.conf
- Tambahkan baris-baris berikut di baris paling bawah konfigurasi untuk melakukan passthrough character device TUN:
lxc.cgroup2.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file
- Nyalakan kembali container-nya:
pct start <CT_ID>
2. Install Dokploy & Tailscale di Dalam LXC
Masuk ke shell LXC kamu (melalui SSH atau web console Proxmox):
Install Dokploy:
curl -sSL https://dokploy.com/install.sh | sh
Dokploy akan secara otomatis menginstall Docker, Traefik, dan semua dependensi latar belakang yang dibutuhkan.
Install & Autentikasi Tailscale:
curl -fsSL https://tailscale.com/install.sh | sh
tailscale up
Buka tautan autentikasi yang muncul di terminal untuk login dan menghubungkan container ke Tailnet kamu.
Ambil alamat IPv4 Tailscale container kamu:
tailscale ip -4
(Catat dan simpan IP ini, misalnya: 100.x.y.z. Ini adalah alamat IP privat container kamu di dalam Tailnet.)
3. Konfigurasi Cloudflare DNS & API Token
Karena Traefik dan Tailscale berada di host yang sama di dalam LXC, kamu tidak memerlukan routing subnet Tailscale yang rumit. Kamu bisa langsung mengarahkan domain ke alamat IP Tailscale container tersebut.
A. Tambahkan DNS Record
- Buka dashboard Cloudflare kamu > DNS > Records.
- Buat sebuah A Record:
- Name: Subdomain aplikasi kamu (misalnya
appatau wildcard seperti*.domainkamu.com) - IPv4 Address: IP Tailscale container kamu (
100.x.y.z) - Proxy Status: DNS Only (Awan Abu-abu / Gray Cloud)
- Name: Subdomain aplikasi kamu (misalnya
Penting: Fitur Cloudflare Proxy (Awan Oranye / Orange Cloud) wajib dinonaktifkan. Edge proxy Cloudflare tidak dapat merutekan traffic ke rentang IP CGNAT privat (
100.64.0.0/10) yang digunakan oleh Tailscale.
B. Buat Cloudflare API Token
Traefik membutuhkan izin terbatas (scoped permissions) untuk membuat dan menghapus TXT record selama proses verifikasi ACME DNS-01 challenge berlangsung.
- Di Cloudflare, buka My Profile > API Tokens > Create Token.
- Pilih template Edit zone DNS.
- Di bagian Zone Resources, pilih Include > Specific zone > pilih domain kamu.
- Buat token dan salin token yang dihasilkan.
4. Konfigurasi Traefik DNS-01 Challenge via Dokploy UI
Sekarang instruksikan Traefik untuk menggunakan Cloudflare API dalam verifikasi sertifikat alih-alih HTTP:
-
Buka Dokploy di browser kamu pada alamat
http://<TAILSCALE_IP>:3000dari perangkat mana pun yang terhubung ke Tailnet kamu. -
Buka menu Web Server di bilah navigasi kiri (sidebar).
-
Pada bagian Traefik:
-
Environment Variables: Tambahkan token Cloudflare kamu:
CF_DNS_API_TOKEN=token_cloudflare_api_kamu_di_sini -
Traefik Configuration: Pastikan blok
certificatesResolversmendefinisikan Cloudflare sebagai provider DNS challenge:certificatesResolvers: letsencrypt: acme: email: email-kamu@domain.com storage: /etc/dokploy/traefik/dynamic/acme.json dnsChallenge: provider: cloudflare resolvers: - "1.1.1.1:53" - "8.8.8.8:53"
-
-
Klik Save dan Reload Traefik.
Pengecekan (Sanity Check): Pastikan Traefik berhasil membaca environment variable tersebut dengan menjalankan perintah berikut di dalam LXC:
docker exec -it dokploy-traefik env | grep CF_DNS
Perintah ini akan menampilkan variabel CF_DNS_API_TOKEN kamu.
5. Hubungkan Domain ke Aplikasi Dokploy Kamu
Sekarang, setiap kali kamu membuat project atau container baru di Dokploy, Traefik akan menangani SSL handshake secara otomatis di balik layar:
- Buka project/aplikasi kamu di Dokploy > tab Domains.
- Klik Add Domain:
- Host:
app.domainkamu.com - Path:
/ - Port: Port internal container (misalnya
3000atau8080) - HTTPS: Aktifkan (toggle ON)
- Host:
- Klik Save / Deploy.
Traefik akan secara otomatis berkomunikasi dengan Cloudflare melalui API, menyelesaikan verifikasi DNS-01, dan memperoleh sertifikat Let’s Encrypt yang valid.
Buka https://app.domainkamu.com dari perangkat apa pun yang terhubung ke Tailnet kamu. Kamu akan melihat ikon gembok yang aman, enkripsi HTTPS penuh tanpa peringatan self-signed di browser, dan routing terenkripsi end-to-end melalui Tailscale.