Cara Install AnythingLLM + Qdrant di VPS: Setup RAG Lokal dengan Vector Database

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:

  1. Kamu upload dokumen ke sistem
  2. Dokumen dipecah jadi potongan kecil (chunks)
  3. Setiap chunk diubah jadi vector embedding (representasi numerik)
  4. Vector disimpan di database (Qdrant)
  5. Pas ada pertanyaan, sistem cari chunk yang paling relevan
  6. Chunk relevan + pertanyaan dikirim ke LLM
  7. LLM jawab berdasarkan konteks dokumen kamu

Hasilnya? AI yang jawab berdasarkan fakta dari dokumen kamu, bukan halusinasi.

Arsitektur AnythingLLM dan Qdrant di VPS

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

Alur instalasi AnythingLLM dan Qdrant

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 AnythingLLM
  • qdrant_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 tulis 6333:6333 tanpa 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 pakai openssl rand -hex 32 juga, 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.

  1. Buka AnythingLLM di browser: http://IP-VPS-kamu:3003
  2. Login sebagai administrator
  3. Masuk ke Admin Settings (ikon gear di sidebar)
  4. Pilih menu Vector Database
  5. Pilih provider QDrant
  6. Isi Qdrant URL: http://qdrant:6333
  7. Masukkan API Key yang udah kamu generate di Step 2
  8. 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:

  1. Buat workspace baru di AnythingLLM, misalnya “test-rag”
  2. Upload satu dokumen kecil yang isinya kamu tau (jangan dokumen sensitif dulu ya buat testing)
  3. Tunggu proses parsing dan embedding selesai – biasanya ada indikator progress
  4. Cek dashboard Qdrant di http://127.0.0.1:6333/dashboard – pastiin collection baru muncul
  5. Verifikasi jumlah points > 0 dan dimensi vector cocok sama embedding model yang kamu pakai
  6. 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_SECRET udah 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_storage masih terpasang di /app/server/storage
  • Hindari docker volume prune sebelum 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_storage dan qdrant_storage secara 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.

Jundi Husni Mubaraq

Jundi Husni Mubaraq

Saya seorang software engineer yang sejak awal 2026 megang penuh (sendirian) tanggung jawab infrastruktur server di tempat saya kerja: deploy dan maintain server Linux Ubuntu on-premises, bangun keamanan berlapis pakai CrowdSec dan Cloudflare, kelola job scheduling dan monitoring pakai Cronicle, deploy aplikasi containerized pakai Docker, sampai ngurusin mail server korporat dari nol. Sebelumnya saya 3+ tahun jadi Software Engineer/Fullstack Developer di beberapa perusahaan, termasuk proyek skala internasional (EUDR compliance system buat Lindt & Sprungli) dan sistem rumah sakit (SIMRS, rekam medis elektronik, integrasi BPJS Kesehatan) di RS PKU Muhammadiyah Surakarta. jundi.hm ini tempat saya dokumentasiin apa yang beneran saya kerjain dan pelajarin di lapangan, bukan sekadar riset teori, S.Kom dari Universitas Duta Bangsa Surakarta jadi bekal awal, tapi yang nulis di sini adalah pengalaman langsung ngelola server production sehari-hari. Selengkapnya: https://iam.jundi.hm

Lihat Juga Nih

Kasih Komentar

Email kamu gak bakal ditampilin ke publik. Kalau ada tanda ini artinya wajib diisi ya *

Rekomendasi.

Lagi Viral.