Pernah gak sih kamu ngerasa AI chatbot itu pinter, tapi jawabannya terlalu umum? Kamu tanya soal SOP internal kantor, dia malah jawab definisi Wikipedia. Atau kamu mau AI yang bisa baca dokumen-dokumen kamu sendiri – laporan, catatan meeting, dokumentasi teknis – terus jawab pertanyaan berdasarkan isi dokumen itu. Bukan berdasarkan pengetahuan umum yang kadang gak relevan sama kebutuhan kamu. Solusinya bisa kamu bangun sendiri pakai AnythingLLM dan Qdrant di VPS.
Nah, di sinilah konsep RAG (Retrieval-Augmented Generation) jadi game changer. Dan kabar baiknya, kamu bisa setup sendiri di VPS pakai dua tool open-source: AnythingLLM sebagai antarmuka dan orkestrator RAG, plus Qdrant sebagai vector database-nya. Semua jalan di Docker, semua di bawah kontrol kamu. Gak perlu langganan layanan cloud mahal, gak perlu kirim data sensitif ke pihak ketiga.
Di artikel ini, saya bakal ajak kamu setup AnythingLLM + Qdrant dari nol sampai bisa dipakai buat tanya-jawab berdasarkan dokumen sendiri. Lengkap dengan penjelasan tiap langkah, kenapa kita lakuin itu, dan apa yang harus diwaspadai.
Apa Itu AnythingLLM dan Qdrant
AnythingLLM – Antarmuka RAG yang Gampang Dipakai
AnythingLLM itu ibarat “otak depan” dari sistem RAG kamu. Dia yang ngurus semuanya: dari upload dokumen, pecah dokumen jadi potongan-potongan kecil (chunking), ubah potongan itu jadi angka-angka yang bisa dipahami mesin (embedding), sampai nyambungin ke model LLM buat generate jawaban. Semua lewat tampilan web yang user-friendly, jadi kamu gak perlu nulis kode sama sekali.
Cara kerjanya sederhana: kamu upload dokumen ke workspace, AnythingLLM proses dokumen itu jadi vector embedding, simpan ke vector database, terus kalau ada pertanyaan masuk, dia cari potongan dokumen yang paling relevan dulu baru dikasih ke LLM buat dijadiin jawaban. Ini yang bikin jawabannya akurat dan berdasarkan data kamu sendiri.
Qdrant – Vector Database yang Cepat dan Ringan
Qdrant (dibaca “quadrant”) adalah vector database yang ditulis pakai Rust, jadi performanya kenceng dan pemakaian resource-nya efisien. Tugas Qdrant di sini cuma satu: nyimpen dan nyari vector embedding dengan cepat. Kalau kamu upload 100 dokumen, semua embedding-nya disimpan di Qdrant. Pas ada pertanyaan, Qdrant yang nyari potongan dokumen mana yang paling mirip sama pertanyaan kamu. Detail fitur lengkapnya bisa kamu cek di dokumentasi resmi Qdrant.
Kenapa Qdrant dan bukan yang lain? Karena dia ringan, support API key authentication bawaan, dan yang paling penting – dia jalan lancar di VM yang gak punya instruksi CPU AVX/AVX2. Ini penting banget kalau VPS kamu pakai virtualisasi QEMU, karena beberapa vector database lain (kayak LanceDB yang built-in di AnythingLLM) bisa crash dengan error “Illegal instruction” di environment kayak gitu.
RAG Itu Apa Sih Sebenarnya
Sebelum lanjut ke instalasi, penting buat paham dulu konsep RAG (Retrieval-Augmented Generation). Bayangin gini: LLM biasa itu kayak orang pinter yang tau banyak hal umum, tapi gak pernah baca dokumen internal kamu. RAG itu cara buat “nyontekin” LLM dengan dokumen kamu sebelum dia jawab pertanyaan.
Alurnya begini:
- Kamu upload dokumen ke sistem
- Dokumen dipecah jadi potongan kecil (chunks)
- Setiap chunk diubah jadi vector embedding (representasi numerik)
- Vector disimpan di database (Qdrant)
- Pas ada pertanyaan, sistem cari chunk yang paling relevan
- Chunk relevan + pertanyaan dikirim ke LLM
- LLM jawab berdasarkan konteks dokumen kamu
Hasilnya? AI yang jawab berdasarkan fakta dari dokumen kamu, bukan halusinasi.

AnythingLLM vs Alternatif Lain
Ada beberapa tool RAG self-hosted lain yang mungkin kamu pertimbangin. Ini perbandingan singkatnya:
AnythingLLM vs PrivateGPT: PrivateGPT lebih fokus ke privasi dan bisa jalan full offline. Tapi setup-nya lebih ribet dan UI-nya gak se-polished AnythingLLM. Kalau kamu butuh yang cepet jalan dan gampang dikelola, AnythingLLM lebih cocok.
AnythingLLM vs Open WebUI: Open WebUI bagus buat chat interface ke Ollama, tapi fitur RAG-nya masih basic dibanding AnythingLLM yang emang didesain khusus buat itu. AnythingLLM punya workspace management, multi-user support, dan pilihan vector database yang lebih fleksibel.
Qdrant vs ChromaDB: ChromaDB lebih simpel buat development, tapi Qdrant lebih mature buat production. Qdrant punya built-in authentication, dashboard monitoring, dan performa yang lebih stabil di environment Docker.
Qdrant vs Weaviate: Weaviate fiturnya lebih banyak (termasuk hybrid search), tapi resource-nya juga lebih berat. Buat VPS dengan RAM terbatas, Qdrant jelas lebih ringan.
Yang Harus Disiapkan Sebelum Mulai
Sebelum mulai instalasi, pastiin semua prasyarat ini udah terpenuhi:
- VPS dengan Ubuntu Server – Minimal Ubuntu 20.04 ke atas. Pastiin kamu punya akses sudo atau root.
- Docker Engine dan Docker Compose – Ini wajib karena kedua service jalan di container. Kalau belum install, ikutin panduan install Docker di sini.
- Ruang disk minimal 10GB kosong – Buat image Docker, volume storage, dan dokumen yang bakal di-embed.
- RAM minimal 2GB – Lebih banyak lebih bagus, terutama kalau kamu jalanin model embedding lokal.
- Portainer (opsional tapi recommended) – Buat manage Docker stack lewat GUI. Cara install Portainer ada di sini.
Cara verifikasi Docker udah siap:
docker --version
docker compose version
Kalau kedua command itu keluar versi tanpa error, kamu siap lanjut.
Langkah Instalasi Step-by-Step

Step 1: Buat Jaringan Docker
Pertama, kita perlu bikin jaringan Docker supaya container AnythingLLM dan Qdrant bisa saling komunikasi. Kenapa gak pakai jaringan default aja? Karena dengan jaringan custom, kita bisa kontrol siapa yang bisa ngobrol sama siapa, dan container bisa saling panggil pakai nama (bukan IP yang bisa berubah).
docker network create anythingllm_default
docker network create qdrant_default
anythingllm_default– jaringan utama buat AnythingLLMqdrant_default– jaringan utama buat Qdrant
Kedua container nantinya bakal terhubung ke kedua jaringan ini, jadi mereka bisa komunikasi lewat nama host internal.
Catatan penting: Jalankan command di atas cuma kalau jaringannya belum ada. Kalau udah ada, Docker bakal kasih error “network already exists” – itu normal, tinggal skip aja.
Step 2: Generate API Key Qdrant
Sebelum deploy Qdrant, kita butuh API key buat proteksi akses. Tanpa API key, siapa aja yang bisa akses port Qdrant bisa baca, tulis, atau hapus semua data vector kamu. Bahaya banget.
openssl rand -hex 32
openssl rand– generate random bytes-hex 32– output dalam format hexadecimal, 32 bytes = 64 karakter
Simpan hasilnya di password manager atau secret store. Jangan taruh di dokumentasi, Git, screenshot, atau chat. Ini kunci akses ke seluruh data vector kamu.
Step 3: Deploy Qdrant dengan Docker Compose
Sekarang kita deploy Qdrant. Bikin folder dan file docker-compose.yml:
mkdir qdrant && cd qdrant
nano docker-compose.yml
Isi dengan konfigurasi berikut:
services:
qdrant:
image: qdrant/qdrant:latest
container_name: qdrant
restart: unless-stopped
environment:
QDRANT__SERVICE__API_KEY: ${QDRANT_API_KEY}
volumes:
- qdrant_storage:/qdrant/storage
ports:
- "127.0.0.1:6333:6333"
networks:
- qdrant_default
- anythingllm_default
volumes:
qdrant_storage:
name: qdrant_storage
networks:
qdrant_default:
name: qdrant_default
anythingllm_default:
external: true
Penjelasan parameter penting:
QDRANT__SERVICE__API_KEY: ${QDRANT_API_KEY}– API key diambil dari environment variable, bukan hardcode di file. Ini lebih aman.127.0.0.1:6333:6333– Port Qdrant cuma bisa diakses dari localhost (127.0.0.1). Ini penting banget buat keamanan. Kalau kamu tulis6333:6333tanpa 127.0.0.1, port-nya kebuka ke semua interface dan bisa diakses dari internet.qdrant_storage– Named volume buat nyimpen data. Selama volume ini ada, data kamu aman meskipun container di-recreate.anythingllm_default: external: true– Qdrant ikut gabung ke jaringan AnythingLLM supaya bisa diakses dari container AnythingLLM.
Tips keamanan: Variabel QDRANT_API_KEY bisa kamu set lewat environment Portainer atau file .env yang permission-nya ketat (chmod 600). Jangan bikin file .env yang bisa dibaca semua user di server.
Step 4: Jalankan dan Verifikasi Qdrant
Deploy Qdrant:
QDRANT_API_KEY=api_key_kamu_di_sini docker compose up -d
Verifikasi container jalan:
# Cek container dan port
docker ps --filter name=qdrant
ss -lntp | grep 6333
# Test endpoint (harusnya kena 401 karena API key aktif)
curl -s http://127.0.0.1:6333/collections
Kalau kamu dapat response 401 Unauthorized saat curl tanpa API key, itu justru bagus. Artinya proteksi API key-nya aktif dan bekerja. Qdrant menolak request yang gak bawa credential.
Step 5: Deploy AnythingLLM
Sekarang giliran AnythingLLM. Bikin folder terpisah:
mkdir anythingllm && cd anythingllm
nano docker-compose.yml
Isi dengan konfigurasi ini:
services:
anythingllm:
image: mintplexlabs/anythingllm:latest
container_name: anythingllm
restart: unless-stopped
ports:
- "3003:3001"
cap_add:
- SYS_ADMIN
environment:
STORAGE_DIR: /app/server/storage
SERVER_PORT: 3001
JWT_SECRET: ${JWT_SECRET}
extra_hosts:
- "host.docker.internal:host-gateway"
volumes:
- anythingllm_storage:/app/server/storage
networks:
- anythingllm_default
- qdrant_default
volumes:
anythingllm_storage:
networks:
anythingllm_default:
external: true
qdrant_default:
external: true
Penjelasan parameter penting:
3003:3001– AnythingLLM jalan di port 3001 di dalam container, tapi kita akses lewat port 3003 di host. Kenapa gak langsung 3001? Biar gak bentrok sama service lain yang mungkin udah pakai port itu.cap_add: SYS_ADMIN– Dibutuhkan AnythingLLM buat beberapa operasi internal. Tanpa ini, beberapa fitur bisa error.JWT_SECRET– Secret key buat enkripsi token autentikasi. Generate pakaiopenssl rand -hex 32juga, simpan aman.host.docker.internal:host-gateway– Biar container bisa akses service yang jalan di host (misalnya Ollama yang jalan langsung di host, bukan di Docker).anythingllm_storage– Volume ini nyimpen semua data AnythingLLM: setting, workspace, dokumen yang udah diproses. Jangan pernah hapus volume ini kecuali kamu emang mau reset total.
Step 6: Jalankan AnythingLLM
JWT_SECRET=jwt_secret_kamu_di_sini docker compose up -d
Verifikasi setelah deployment:
# Cek mount volume
docker inspect anythingllm
--format '{{range .Mounts}}{{println .Source "->" .Destination}}{{end}}'
# Cek environment (JWT_SECRET disembunyikan)
docker inspect anythingllm
--format '{{range .Config.Env}}{{println .}}{{end}}'
| grep -E 'STORAGE_DIR|SERVER_PORT|JWT_SECRET'
| sed 's/JWT_SECRET=.*/JWT_SECRET=[REDACTED]/'
Pastiin output menunjukkan volume terpasang di /app/server/storage dan semua environment variable udah ke-set.
Konfigurasi: Hubungkan AnythingLLM dan Qdrant
Ini bagian krusialnya. Kita perlu kasih tau AnythingLLM bahwa vector database yang dipakai adalah Qdrant, bukan LanceDB bawaan.
- Buka AnythingLLM di browser:
http://IP-VPS-kamu:3003 - Login sebagai administrator
- Masuk ke Admin Settings (ikon gear di sidebar)
- Pilih menu Vector Database
- Pilih provider QDrant
- Isi Qdrant URL:
http://qdrant:6333 - Masukkan API Key yang udah kamu generate di Step 2
- Klik Save
Perhatian penting soal URL: Jangan pakai http://127.0.0.1:6333 atau http://localhost:6333. Kenapa? Karena dari dalam container AnythingLLM, localhost itu mengacu ke container AnythingLLM sendiri, bukan ke host atau ke container Qdrant. Kita pakai http://qdrant:6333 karena itu nama host internal Docker yang resolve ke container Qdrant lewat jaringan Docker yang udah kita setup.
Testing AnythingLLM dan Qdrant
Test Konektivitas Antar Container
Pertama, pastiin AnythingLLM bisa “ngomong” ke Qdrant:
# Test health Qdrant dari dalam container AnythingLLM
docker exec anythingllm curl -sS http://qdrant:6333/healthz
Kalau hasilnya menunjukkan status OK atau healthy, koneksi antar container udah bener.
# Cek log AnythingLLM buat error terkait Qdrant
docker logs --tail 100 anythingllm | grep -iE 'qdrant|vector|embedding|error'
Test RAG End-to-End
Sekarang test yang sesungguhnya – apakah RAG beneran jalan:
- Buat workspace baru di AnythingLLM, misalnya “test-rag”
- Upload satu dokumen kecil yang isinya kamu tau (jangan dokumen sensitif dulu ya buat testing)
- Tunggu proses parsing dan embedding selesai – biasanya ada indikator progress
- Cek dashboard Qdrant di
http://127.0.0.1:6333/dashboard– pastiin collection baru muncul - Verifikasi jumlah points > 0 dan dimensi vector cocok sama embedding model yang kamu pakai
- Ajukan pertanyaan spesifik berdasarkan isi dokumen yang kamu upload
Sebagai referensi, di environment yang saya test: collection workspace memiliki 23 points dengan vector berdimensi 384 dan distance metric Cosine. Angka dimensi ini tergantung embedding model yang kamu pilih – model berbeda menghasilkan dimensi berbeda.
Troubleshooting: Masalah Umum
Qdrant Menampilkan 401 Unauthorized
Ini normal kalau kamu akses tanpa API key. Yang perlu dicek:
- Pastiin API key yang dimasukkan di setting AnythingLLM sama persis dengan yang di-set di environment Qdrant
- Jangan ada spasi atau karakter tersembunyi saat copy-paste key
- Jangan pernah tampilkan key di terminal atau chat untuk debugging
Collection Tidak Muncul di Qdrant
Collection di Qdrant baru dibuat saat dokumen pertama berhasil diproses, bukan saat workspace dibuat. Jadi:
- Upload dokumen uji dulu ke workspace
- Tunggu proses embedding selesai
- Baru refresh dashboard Qdrant
- Jangan bikin collection manual sebelum memastikan konfigurasi bener
AnythingLLM Minta JWT_SECRET Terus
- Periksa apakah
JWT_SECRETudah ke-set di environment container - Pastiin container pakai volume storage yang bener – kalau volume-nya beda, AnythingLLM nganggep ini instalasi baru
- Setelah nambahin atau ganti secret, redeploy/recreate container-nya
Illegal Instruction / SIGILL Crash
Ini masalah klasik di VPS yang pakai virtualisasi QEMU. Penyebabnya: CPU virtual gak mengekspos instruksi AVX/AVX2 yang dibutuhkan beberapa library native (termasuk LanceDB yang jadi vector database default AnythingLLM).
Solusinya? Justru ini alasan kenapa kita pakai Qdrant sebagai vector database eksternal. Qdrant jalan lancar di VM tanpa AVX. Kalau kamu tetap pakai LanceDB bawaan, kemungkinan besar bakal crash.
# Cek log kernel buat konfirmasi SIGILL
dmesg | tail -n 40
# Cek log AnythingLLM
docker logs --tail 150 anythingllm
Pengaturan Hilang Setelah Redeploy
- Periksa apakah volume
anythingllm_storagemasih terpasang di/app/server/storage - Hindari
docker volume prunesebelum verifikasi volume mana yang masih dipakai - Jangan ganti nama volume di docker-compose.yml tanpa migrasi data dulu
Tips Keamanan dan Operasional
Beberapa hal penting yang sering kelewat tapi krusial buat production:
- Port Qdrant – Jangan pernah expose ke semua interface tanpa tinjauan keamanan. Selalu bind ke 127.0.0.1.
- API Key – Gunakan key yang kuat (minimal 32 karakter random), simpan sebagai secret di Portainer atau vault.
- Akses publik – Kalau mau AnythingLLM bisa diakses dari luar, pakai HTTPS lewat reverse proxy (Nginx, Caddy, atau Cloudflare Tunnel). Jangan expose port 3003 langsung ke internet tanpa enkripsi.
- Backup rutin – Backup volume
anythingllm_storagedanqdrant_storagesecara terjadwal. Ini data kamu, kehilangan volume = kehilangan semua dokumen dan embedding. - Monitoring – Pantau disk, RAM, CPU, dan restart count container. Qdrant yang kehabisan disk bisa corrupt data.
- Dokumen sensitif – Jangan upload dokumen rahasia tanpa memastikan akses ke AnythingLLM udah dibatasi dan terenkripsi.
Kesimpulan
Sekarang kamu udah punya sistem RAG sendiri yang jalan di VPS. AnythingLLM sebagai antarmuka dan orkestrator, Qdrant sebagai vector database yang ringan dan aman. Dokumen kamu diproses lokal, embedding disimpan lokal, dan jawaban AI dihasilkan berdasarkan data kamu sendiri – bukan pengetahuan umum yang kadang gak relevan.
Beberapa hal yang perlu diingat buat maintenance jangka panjang:
- Update image secara berkala – Baik AnythingLLM maupun Qdrant aktif dikembangkan. Cek release notes sebelum update.
- Monitor penggunaan disk – Semakin banyak dokumen yang di-embed, semakin besar volume Qdrant.
- Backup sebelum update – Selalu backup volume sebelum pull image baru.
- Cek kompatibilitas – Kadang update AnythingLLM mengubah cara dia berkomunikasi dengan vector database.
Kalau setup ini terasa terlalu berat buat kebutuhan kamu, atau VPS kamu resource-nya terbatas, alternatifnya bisa coba Ollama dulu buat LLM-nya tanpa RAG, atau pakai layanan cloud RAG yang tinggal pakai. Tapi kalau kamu mau kontrol penuh atas data dan privasi, setup AnythingLLM dan Qdrant ini salah satu pilihan terbaik yang bisa kamu jalankan sendiri.

























