LibreChat adalah aplikasi chat AI open-source yang bisa di-hosting sendiri di VPS. Tampilan dan pengalaman penggunaannya mirip dengan ChatGPT, tetapi dengan satu keunggulan besar: Anda bisa menghubungkannya ke banyak provider AI sekaligus — mulai dari OpenAI, Anthropic (Claude), Google Gemini, hingga endpoint custom lainnya.
Karena berjalan di VPS milik Anda sendiri, seluruh data percakapan dan konfigurasi sepenuhnya berada di bawah kendali Anda. Tidak ada data yang dikirim ke pihak ketiga selain ke API provider AI yang Anda pilih.
Sebelum memulai panduan ini, pastikan Anda sudah menyiapkan hal-hal berikut:
sudo.chat.domainanda.com.LibreChat membutuhkan beberapa layanan yang berjalan bersamaan — database MongoDB, cache, web server NGINX, dan aplikasi LibreChat itu sendiri. Memasang semua layanan ini secara manual langsung di VPS sangat rawan bentrok versi dan dependensi.
Docker mengatasi hal ini dengan mengemas setiap layanan ke dalam kontainer yang terisolasi satu sama lain. Masing-masing punya lingkungan sendiri, tidak saling mengganggu, dan bisa dijalankan atau dihentikan kapan saja.
Login ke VPS melalui SSH, lalu jalankan perintah berikut:
sudo apt update
sudo apt install -y ca-certificates curl gnupg
Perintah di atas memperbarui daftar paket sistem, kemudian memasang tiga paket yang dibutuhkan untuk proses instalasi Docker:
ca-certificates — agar sistem bisa memverifikasi sertifikat SSL saat mengunduh file.curl — untuk mengunduh file dari internet melalui terminal.gnupg — untuk memverifikasi keaslian kunci GPG repositori Docker.Repositori bawaan Debian biasanya menyediakan Docker versi lama. Untuk mendapatkan versi terbaru, kita perlu menambahkan repositori resmi Docker secara manual.
Jalankan perintah berikut satu per satu:
sudo install -m 0755 -d /etc/apt/keyrings
Perintah ini membuat folder /etc/apt/keyrings dengan izin akses yang sesuai. Folder ini digunakan untuk menyimpan kunci GPG.
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
Perintah ini mengunduh kunci GPG resmi Docker untuk Debian. Perhatikan URL-nya menggunakan /linux/debian/, bukan /linux/ubuntu/ — karena VPS kita menggunakan OS Debian.
sudo chmod a+r /etc/apt/keyrings/docker.asc
Perintah ini memastikan semua user di sistem bisa membaca file kunci tersebut.
Selanjutnya, daftarkan repositori Docker ke dalam daftar sumber paket:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Perintah di atas secara otomatis mendeteksi arsitektur sistem (misalnya amd64) dan codename Debian yang digunakan (bookworm untuk Debian 12), lalu menuliskannya sebagai sumber repositori baru.
Terakhir, perbarui kembali daftar paket agar repositori Docker yang baru ditambahkan terbaca oleh sistem:
sudo apt update
Jalankan perintah berikut untuk memasang Docker beserta seluruh komponen yang dibutuhkan:
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Berikut penjelasan masing-masing paket:
docker-ce — Docker Engine, yaitu inti dari Docker itu sendiri.docker-ce-cli — perintah docker yang kita ketik di terminal.containerd.io — runtime yang bertugas menjalankan kontainer di belakang layar.docker-buildx-plugin — plugin untuk membangun image Docker.docker-compose-plugin — plugin agar perintah docker compose bisa digunakan. Plugin ini menggantikan docker-compose (dengan tanda hubung) versi lama.Setelah instalasi selesai, pastikan Docker sudah terpasang dengan benar:
docker --version
▸ Hasil yang diharapkan:
Docker version 28.x.x, build xxxxxxx
Periksa juga Docker Compose:
docker compose version
▸ Hasil yang diharapkan:
Docker Compose version v2.x.x
Jika kedua perintah di atas menampilkan nomor versi tanpa pesan error, maka Docker sudah siap digunakan.
Setelah Docker terpasang, langkah berikutnya adalah mengunduh source code LibreChat dari repository GitHub resminya dan menyiapkan file konfigurasi.
Git dibutuhkan untuk mengunduh (clone) repository LibreChat. Jalankan perintah berikut:
sudo apt install -y git
Pastikan Anda berada di direktori home, lalu clone repository LibreChat:
cd ~
git clone https://github.com/LibreChat-AI/LibreChat.git
▸ Hasil yang diharapkan:
Cloning into 'LibreChat'...
remote: Enumerating objects: xxxxx, done.
remote: Counting objects: 100% (xxxx/xxxx), done.
...
Resolving deltas: 100% (xxxxx/xxxxx), done.
Setelah proses clone selesai, masuk ke direktori project:
cd LibreChat
~/LibreChat/, kecuali dinyatakan lain.
LibreChat sudah menyediakan file template bernama .env.example yang berisi semua variabel konfigurasi beserta nilai default-nya. Kita perlu menyalin file ini menjadi .env agar bisa digunakan:
cp .env.example .env
Jangan langsung membuat file .env kosong dari nol, karena template ini sudah berisi banyak variabel penting yang dibutuhkan LibreChat untuk berjalan dengan benar.
LibreChat membutuhkan folder khusus untuk menyimpan file yang diunggah oleh pengguna (misalnya gambar). Buat folder tersebut dengan perintah:
mkdir -p uploads/images
Flag -p memastikan folder dibuat beserta subfolder induknya jika belum ada.
LibreChat mewajibkan empat variabel keamanan utama untuk mengenkripsi data pengguna dan mengelola sesi login. Berikut fungsi masing-masing variabel:
| Variabel | Fungsi | Panjang |
|---|---|---|
CREDS_KEY | Kunci enkripsi utama untuk menyimpan kredensial pengguna di database | 64 karakter hex |
CREDS_IV | Initialization Vector (pelengkap kunci enkripsi) untuk proses enkripsi kredensial | 32 karakter hex |
JWT_SECRET | Kunci rahasia untuk membuat token login (JWT) saat pengguna login | 64 karakter hex |
JWT_REFRESH_SECRET | Kunci rahasia untuk memperbarui token login yang sudah kedaluwarsa | 64 karakter hex |
Untuk mendapatkan nilai keempat variabel ini, buka halaman generator resmi LibreChat melalui browser:
👉 https://www.librechat.ai/docs/toolkit/credentials-generator
Klik tombol generate untuk mendapatkan keempat kunci tersebut. Salin hasilnya, lalu buka file .env:
nano .env
Cari baris-baris berikut, kemudian ganti nilainya dengan hasil generate tadi:
CREDS_KEY=ganti_dengan_64_karakter_hex_hasil_generate
CREDS_IV=ganti_dengan_32_karakter_hex_hasil_generate
JWT_SECRET=ganti_dengan_64_karakter_hex_hasil_generate
JWT_REFRESH_SECRET=ganti_dengan_64_karakter_hex_hasil_generate
Setelah selesai, simpan file dengan menekan Ctrl + O, tekan Enter, lalu keluar dari editor dengan Ctrl + X.
LibreChat mendukung banyak provider AI. Pada panduan ini, kita akan menggunakan 9Router sebagai gateway API. 9Router menyediakan akses ke berbagai model AI melalui satu endpoint tunggal, sehingga Anda tidak perlu mendaftar ke masing-masing provider secara terpisah.
Selain 9Router, Anda juga bisa menggunakan API key langsung dari OpenAI, Anthropic, atau provider AI lain yang Anda miliki. Prosesnya serupa — cukup sesuaikan nama variabel dan base URL-nya.
Pastikan Anda masih berada di direktori ~/LibreChat/. Buka kembali file .env:
nano .env
Tambahkan baris berikut di bagian paling bawah file:
# API Key 9Router
NINEROUTER_KEY=sk-masukkan-kode-api-key-9router-milik-anda
Ganti sk-masukkan-kode-api-key-9router-milik-anda dengan API key asli yang Anda dapatkan dari dashboard 9Router. Simpan dan keluar dari editor.
LibreChat menyimpan seluruh data percakapan, pengguna, dan pengaturan di database MongoDB. Kita perlu memberi tahu aplikasi bagaimana cara terhubung ke database tersebut.
Masih di file .env, cari baris MONGO_URI. Jika sudah ada, pastikan nilainya adalah:
MONGO_URI=mongodb://mongodb:27017/LibreChat
Jika baris tersebut belum ada, tambahkan di bagian bawah file. Simpan dan keluar dari editor.
mongodb://mongodb:27017/LibreChat berarti:
mongodb:// — protokol koneksi MongoDBmongodb — nama service MongoDB di Docker Compose (sesuai definisi di deploy-compose.yml)27017 — port default MongoDBLibreChat — nama database yang akan dibuat otomatisMasih di file .env, cari dan ubah (atau tambahkan jika belum ada) baris berikut:
DOMAIN_CLIENT=https://chat.domainanda.com
DOMAIN_SERVER=https://chat.domainanda.com
ALLOW_REGISTRATION=true
Ganti chat.domainanda.com dengan subdomain milik Anda. Variabel DOMAIN_CLIENT digunakan oleh browser untuk mengakses LibreChat, sementara DOMAIN_SERVER digunakan oleh server untuk callback. Variabel ALLOW_REGISTRATION diatur ke true agar pengguna baru bisa mendaftar sendiri.
Simpan dan keluar dari editor.
File librechat.yaml bertugas memberitahu LibreChat endpoint mana saja yang tersedia dan model AI apa yang bisa digunakan. File ini dibuat di dalam direktori ~/LibreChat/.
nano librechat.yaml
Isi dengan konfigurasi berikut:
version: 1.3.5
cache: true
endpoints:
custom:
- name: "9Router"
apiKey: "${NINEROUTER_KEY}"
baseURL: "https://app.9router.com/v1"
models:
default: ["claude-3-5-sonnet-20241022"]
fetch: true
titleConvo: true
titleModel: "current_model"
modelDisplayLabel: "9Router Gateway"
Berikut penjelasan setiap baris konfigurasi:
.env. Dengan cara ini, API key tidak ditulis langsung di file konfigurasi sehingga lebih aman.Simpan dan keluar dari editor.
Agar LibreChat bisa diakses melalui alamat yang mudah diingat (misalnya chat.domainanda.com), Anda perlu mengarahkan subdomain tersebut ke IP VPS melalui pengaturan DNS.
Jika Anda belum mengetahui IP VPS, jalankan perintah berikut di terminal VPS:
curl -4 ifconfig.me
▸ Hasil yang diharapkan (contoh):
103.xx.xxx.xx
Catat IP tersebut untuk digunakan pada langkah berikutnya.
Login ke panel manajemen DNS domain Anda. Jika domain dikelola di Rumahweb, buka Clientzone → Kelola Domain → DNS Management. Tambahkan record baru dengan detail sebagai berikut:
| Field | Nilai |
|---|---|
| Type | A |
| Name / Host | chat (atau subdomain lain sesuai keinginan Anda) |
| Value / Target | IP VPS Anda (misalnya 103.xx.xxx.xx) |
| TTL | 14400 (atau biarkan default) |
Setelah record ditambahkan, tunggu beberapa menit hingga DNS terpropagasi. Untuk memastikan subdomain sudah mengarah ke IP yang benar, jalankan perintah berikut dari terminal VPS:
dig chat.domainanda.com +short
▸ Hasil yang diharapkan (IP VPS Anda):
103.xx.xxx.xx
Jika hasilnya masih kosong atau menampilkan IP lain, tunggu 15–30 menit lalu coba lagi. Propagasi DNS membutuhkan waktu tergantung provider.
Agar subdomain bisa diakses melalui HTTPS (ditandai dengan ikon gembok di browser), kita perlu memasang sertifikat SSL. Panduan ini menggunakan sertifikat gratis dari Let's Encrypt yang berlaku selama 90 hari dan bisa diperpanjang secara otomatis.
Certbot adalah tools resmi untuk meminta dan mengelola sertifikat SSL dari Let's Encrypt.
sudo apt install -y certbot
Certbot dengan mode --standalone membutuhkan port 80 yang tidak digunakan oleh proses lain. Pastikan tidak ada web server yang berjalan:
sudo ss -tlnp | grep :80
Jika ada proses yang menggunakan port 80 (misalnya Apache atau NGINX), hentikan terlebih dahulu:
sudo systemctl stop apache2
sudo systemctl disable apache2
Jalankan perintah berikut. Ganti chat.domainanda.com dengan subdomain yang sudah Anda pointing di Bagian IV.
sudo certbot certonly --standalone -d chat.domainanda.com
Certbot akan meminta beberapa informasi:
▸ Hasil yang diharapkan jika berhasil:
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/chat.domainanda.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/chat.domainanda.com/privkey.pem
LibreChat menggunakan NGINX sebagai web server yang berjalan di dalam kontainer Docker. Kita perlu mengubah konfigurasi NGINX bawaan agar mendukung HTTPS dan melakukan redirect otomatis dari HTTP ke HTTPS.
Buka file konfigurasi NGINX:
nano client/nginx.conf
Hapus seluruh isi file, lalu ganti dengan konfigurasi berikut. Pastikan Anda mengganti semua chat.domainanda.com dengan subdomain milik Anda:
server {
listen 80;
server_name chat.domainanda.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name chat.domainanda.com;
ssl_certificate /etc/letsencrypt/live/chat.domainanda.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/chat.domainanda.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://api:3080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_cache_bypass $http_upgrade;
}
}
Penjelasan konfigurasi:
api pada port 3080.Simpan dan keluar dari editor.
Sertifikat SSL tersimpan di VPS (host), sementara NGINX berjalan di dalam kontainer Docker. Agar NGINX bisa membaca sertifikat tersebut, kita perlu memetakan folder sertifikat ke dalam kontainer melalui fitur Docker Volume.
Buka file deploy-compose.yml:
nano deploy-compose.yml
Cari blok layanan bernama client:. Tambahkan bagian ports dan volumes seperti contoh berikut:
client:
# ... baris image dan depends_on biarkan seperti aslinya ...
ports:
- "80:80"
- "443:443"
volumes:
- ./client/nginx.conf:/etc/nginx/conf.d/default.conf
- /etc/letsencrypt:/etc/letsencrypt:ro
Penjelasan:
:ro artinya read-only, sehingga kontainer hanya bisa membaca sertifikat tanpa bisa mengubah atau menghapus file aslinya.Simpan dan keluar dari editor.
Untuk melindungi VPS dari akses yang tidak diinginkan, kita bisa mengaktifkan firewall (UFW) dan hanya membuka port yang diperlukan:
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
Penjelasan:
ufw allow 22/tcp — izinkan koneksi SSHufw allow 80/tcp — izinkan HTTP (untuk redirect dan verifikasi SSL)ufw allow 443/tcp — izinkan HTTPSufw enable — mengaktifkan firewallSaat diminta konfirmasi, ketik y lalu tekan Enter.
Semua konfigurasi sudah selesai. Saatnya menjalankan LibreChat.
Sebelum menjalankan kontainer, kita perlu mengunduh semua image Docker yang dibutuhkan (MongoDB, API, Client). Pastikan Anda berada di direktori ~/LibreChat/:
cd ~/LibreChat
sudo docker compose -f deploy-compose.yml pull
▸ Hasil yang diharapkan:
✔ ghcr.io/danny-avila/librechat:latest
✔ mongo:latest
✔ ghcr.io/danny-avila/librechat-rag-api-dev-lite:latest
Perintah ini mengunduh image terbaru dari registry Docker. Proses ini membutuhkan waktu tergantung kecepatan internet Anda.
sudo docker compose -f deploy-compose.yml up -d
Flag -d menjalankan kontainer dalam mode background (detached), sehingga terminal tidak terkunci dan Anda bisa tetap mengetik perintah lain.
▸ Hasil yang diharapkan:
[+] Running 4/4
✔ Container LibreChat-vectordb-1 Started
✔ Container LibreChat-mongodb-1 Started
✔ Container LibreChat-api-1 Started
✔ Container LibreChat-client-1 Started
sudo docker compose -f deploy-compose.yml ps
▸ Hasil yang diharapkan:
NAME STATUS PORTS
LibreChat-api-1 Up 2 minutes 3080/tcp
LibreChat-client-1 Up 2 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp
LibreChat-mongodb-1 Up 2 minutes 27017/tcp
LibreChat-vectordb-1 Up 2 minutes ...
Pastikan seluruh kontainer berstatus Up. Jika ada kontainer yang berstatus Restarting atau Exited, periksa penyebabnya di bagian Troubleshooting.
Buka browser dan kunjungi subdomain Anda melalui HTTPS:
https://chat.domainanda.com
Jika konfigurasi berjalan dengan benar, halaman login LibreChat akan tampil. Klik Sign up untuk membuat akun baru, lalu login menggunakan akun yang baru dibuat.
Setelah berhasil login, pilih model AI dari dropdown yang tersedia (misalnya claude-3-5-sonnet-20241022 dari 9Router), lalu coba kirimkan pesan. Jika respons AI muncul, LibreChat sudah berjalan dengan sempurna dan siap digunakan.
Ketika tim LibreChat merilis pembaruan, Anda bisa memperbarui instalasi dengan langkah berikut:
cd ~/LibreChat
git pull origin main
sudo docker compose -f deploy-compose.yml pull
sudo docker compose -f deploy-compose.yml up -d --build
Penjelasan setiap perintah:
git pull origin main — mengunduh perubahan kode terbaru dari repository GitHub.docker compose pull — mengunduh image Docker terbaru.up -d --build — membangun ulang image kontainer dengan kode terbaru, lalu menjalankannya kembali.Log sangat berguna untuk mengetahui apa yang terjadi di dalam kontainer, terutama saat ada masalah:
# Melihat log semua kontainer
sudo docker compose -f deploy-compose.yml logs
# Melihat log kontainer tertentu secara real-time (misal: api)
sudo docker compose -f deploy-compose.yml logs -f api
Flag -f berarti follow — log akan terus bergulir mengikuti aktivitas terbaru. Tekan Ctrl + C untuk menghentikannya.
Sertifikat Let's Encrypt berlaku selama 90 hari. Agar tidak perlu memperpanjang secara manual setiap kali masa berlakunya habis, buat cron job untuk perpanjangan otomatis.
Buka editor crontab:
sudo crontab -e
Tambahkan baris berikut di bagian paling bawah:
0 3 * * * certbot renew --pre-hook "docker compose -f /root/LibreChat/deploy-compose.yml stop client" --post-hook "docker compose -f /root/LibreChat/deploy-compose.yml start client" --quiet
Cron job ini berjalan setiap hari pukul 03.00 dini hari. Certbot hanya akan benar-benar memperpanjang sertifikat jika masa berlakunya tersisa kurang dari 30 hari. Flag --pre-hook menghentikan kontainer client terlebih dahulu agar port 80 tersedia untuk proses verifikasi, dan --post-hook menjalankan kontainer kembali setelah proses selesai.
Seluruh data percakapan LibreChat tersimpan di MongoDB. Untuk membuat backup, jalankan dua perintah berikut:
sudo docker compose -f deploy-compose.yml exec mongodb mongodump --out /data/backup/
Perintah di atas membuat dump database di dalam kontainer MongoDB.
sudo docker cp LibreChat-mongodb-1:/data/backup/ ~/librechat-backup-$(date +%Y%m%d)
Perintah kedua menyalin hasil backup dari dalam kontainer ke direktori home VPS. Folder backup akan diberi nama sesuai tanggal saat perintah dijalankan, misalnya librechat-backup-20250928.
Jika salah satu kontainer berstatus Restarting, periksa log untuk mengetahui penyebabnya:
sudo docker compose -f deploy-compose.yml logs api
Penyebab yang paling sering ditemui:
CREDS_KEY, CREDS_IV, JWT_SECRET, dan JWT_REFRESH_SECRET di file .env sudah terisi dengan nilai dari credential generator, bukan masih berisi placeholder.MONGO_URI=mongodb://mongodb:27017/LibreChat ada di file .env.Jika muncul pesan error bind: address already in use, artinya ada aplikasi lain yang sudah menggunakan port tersebut. Cek proses yang menggunakan port 80 dan 443:
sudo ss -tlnp | grep -E ':80|:443'
Jika ditemukan proses seperti apache2 atau nginx yang berjalan di luar Docker, hentikan terlebih dahulu:
sudo systemctl stop apache2
sudo systemctl disable apache2
Perintah disable mencegah Apache berjalan otomatis saat VPS di-restart.
Jika muncul pesan error Cannot connect to the Docker daemon, Docker service kemungkinan belum aktif. Jalankan perintah berikut:
sudo systemctl start docker
sudo systemctl enable docker
Perintah enable memastikan Docker otomatis berjalan setiap kali VPS di-restart.
Jika chat bisa dibuka tetapi model AI tidak memberikan respons, periksa beberapa hal berikut:
.env sudah benar dan tidak ada spasi atau karakter tambahan.sudo docker compose -f deploy-compose.yml logs -f api
Jika browser menampilkan error SSL saat mengakses subdomain, pastikan volume mapping di deploy-compose.yml sudah benar. Verifikasi juga bahwa file sertifikat memang ada di VPS:
sudo ls -la /etc/letsencrypt/live/chat.domainanda.com/
Hasil yang diharapkan harus menampilkan file fullchain.pem dan privkey.pem. Jika folder atau file tersebut tidak ditemukan, ulangi proses request sertifikat SSL di Bagian V Langkah 3.
Jika browser menampilkan error 502, artinya NGINX tidak bisa menghubungi service API. Periksa:
api berstatus Up?api menunjukkan error?sudo docker compose -f deploy-compose.yml ps
sudo docker compose -f deploy-compose.yml logs api
Sampai di sini, LibreChat sudah terpasang dan siap digunakan sebagai antarmuka chat AI pribadi di VPS Anda. Jika di kemudian hari ingin menambahkan provider AI lain atau mengganti model, cukup edit file librechat.yaml dan .env, lalu restart kontainer — tidak perlu install ulang dari awal.