Skip to content

Teknis — API Tarantula

Service backend utama RAGA yang dibangun di atas NestJS. Bertanggung jawab sebagai core API layer — mengelola workspace, knowledge (dokumen, audio, database, API), chat, system prompt, user access, serta mengorkestrasikan panggilan ke engine eksternal (chatbot, OCR, summarize, speech).

Repository

KeyValue
Git Remotehttps://git.tlab.co.id/tarantula/tarantula-v2/service/api-tarantula.git
Branch Aktifdev
Branch Lainmain, staging, refactor/code-integrations
bash
git clone https://git.tlab.co.id/tarantula/tarantula-v2/service/api-tarantula.git
cd api-tarantula
git checkout dev

Tech Stack

LayerTeknologi
FrameworkNestJS 10 (TypeScript)
DatabasePostgreSQL 16 via TypeORM 0.3
Cache / QueueRedis 7 (ioredis + Bull)
Object StorageMinIO
Search / IndexElasticsearch 8.17
Secret ManagementInfisical SDK v4
Loggingnest-winston (Winston 3.17)
TestingJest 29 + Supertest
RuntimeNode.js (Docker)

Environment Variables

File .env (Bootstrap Infisical)

File .env hanya memuat variabel bootstrap untuk autentikasi ke Infisical. Semua secret aplikasi diambil dari Infisical saat startup.

bash
INFISICAL_ENV=dev
INFISICAL_PATH=/
INFISICAL_SITE_URL=http://infisical-backend:8080
INFISICAL_CLIENT_ID=<client-id>
INFISICAL_CLIENT_SECRET=<client-secret>
INFISICAL_PROJECT_ID=<project-id>
VariableKeterangan
INFISICAL_ENVEnvironment target di Infisical (dev / staging / prod)
INFISICAL_PATHPath secret di Infisical (default /)
INFISICAL_SITE_URLURL Infisical server (self-hosted atau https://app.infisical.com)
INFISICAL_CLIENT_IDClient ID untuk Universal Auth
INFISICAL_CLIENT_SECRETClient Secret untuk Universal Auth
INFISICAL_PROJECT_IDID project Infisical yang menyimpan secrets service ini

Secrets via Infisical

Semua variabel berikut dikelola di Infisical dan di-inject ke process.env saat runtime oleh InfisicalService.

Database (PostgreSQL)

VariableKeterangan
DB_HOSTHost PostgreSQL
DB_PORTPort PostgreSQL (default 5432)
DB_USERUsername PostgreSQL
DB_PASSWORDPassword PostgreSQL
DB_NAMENama database

Redis

VariableDefaultKeterangan
REDIS_HOSTlocalhostHost Redis
REDIS_PORT6379Port Redis
REDIS_PASSWORDPassword Redis (opsional)

MinIO (Object Storage)

VariableDefaultKeterangan
MINIO_ENDPOINTlocalhostEndpoint MinIO
MINIO_PORTPort MinIO (opsional)
MINIO_SSLfalseGunakan SSL (true/false)
MINIO_ACCESS_KEYAccess key MinIO
MINIO_SECRET_KEYSecret key MinIO
MINIO_BUCKETtarantulaNama bucket default
MINIO_DOMAINhttps://s3.ziwardingai.xyzDomain publik dipakai untuk menyusun URL file yang diupload (dokumen, gambar chat, dsb.)

Elasticsearch

VariableDefaultKeterangan
ELASTICSEARCH_HOSThttp://localhost:9200URL Elasticsearch node
ELASTICSEARCH_USERNAMEUsername Elasticsearch
ELASTICSEARCH_PASSWORDPassword Elasticsearch
MAXIMUM_CHAT_PER_ROOM2Batas maksimum pesan per room yang di-index
INDEX_USER_ACTIVITY_LOGuser-activity-logNama index Elasticsearch tempat activity-log menulis aktivitas user

Chatbot Engine (opa-data / VLLM)

VariableDefaultKeterangan
CHATBOT_URLhttp://192.168.0.25:8034Base URL engine chatbot
MAX_CHAR_GENERATE_REPORT100000Batas karakter untuk generate report

RDBMS Engine (database-connect)

VariableDefaultKeterangan
DATABASE_CONNECT_URLhttp://192.168.0.25:8105Base URL layanan database-connect untuk koneksi RDBMS eksternal & Text-to-SQL
DATABASE_CONNECT_TIMEOUT86400000Timeout (ms) untuk request ke database-connect

OCR / PDF Engine

VariableDefaultKeterangan
PDF_URLhttp://192.168.0.25:8090/api/v1URL service PDF/OCR Tarantula
ENGINE_SOURCE_LOCALtrueGunakan source file lokal untuk OCR

Summarize Engine

VariableDefaultKeterangan
SUMMARIZE_URLhttp://10.1.102.14:8014URL service summarize
SUMMARIZE_TIMEOUT86400000Timeout (ms) untuk proses summarize
SUMMARIZE_ENABLE_NERtrueAktifkan Named Entity Recognition
SUMMARIZE_CHUNK_SIZE1000Ukuran chunk teks untuk summarize
SUMMARIZE_TARGET_CONTEXT128000Target context window LLM

Speaches (Speech-to-Text)

VariableDefaultKeterangan
SPEACHES_URLhttps://speaches.ziwardingai.xyz/v1URL service transcription
SPEACHES_MODELturboModel Whisper yang digunakan
SPEACHES_DIARIZEtrueAktifkan speaker diarization
SPEACHES_SUPPRESS_NUMERALSfalseSuppress angka pada output

WhatsApp Integration

VariableDefaultKeterangan
WHATSAPP_URLhttp://192.168.0.27:18004URL WhatsApp Go service
WHATSAPP_TIMEOUT86400000Timeout (ms) koneksi WhatsApp

License Validation

VariableDefaultKeterangan
LICENSE_API_URLhttp://10.1.102.15:8003URL layanan validasi lisensi
LICENSE_API_EMAILadmin@mail.comEmail untuk Basic Auth ke layanan lisensi
LICENSE_API_PASSWORD123456Password untuk Basic Auth ke layanan lisensi

Struktur Folder

api-tarantula/
├── src/
│   ├── app.module.ts               # Root module, bootstrap semua module
│   ├── main.ts                     # Entry point NestJS
│   │
│   ├── common/                     # Shared utilities, config, integrations
│   │   ├── config/                 # Config class tiap service eksternal
│   │   │   ├── chatbot.config.ts
│   │   │   ├── elasticsearch.config.ts
│   │   │   ├── minio.config.ts
│   │   │   ├── pdf-tarantula.config.ts
│   │   │   ├── rdbms.config.ts
│   │   │   ├── redis.config.ts
│   │   │   ├── speaches.config.ts
│   │   │   ├── summarize.config.ts
│   │   │   ├── typeorm.config.ts
│   │   │   └── whatsapp-go.config.ts
│   │   ├── decorator/               # Custom decorators
│   │   ├── dto/                     # Shared DTO (PaginationDto, ParamDto)
│   │   ├── exception/                # Custom exceptions
│   │   ├── filter/                   # Global exception filter
│   │   ├── helper/                   # PDF helper, safe JSON parse
│   │   ├── integrations/             # HTTP client tiap service eksternal
│   │   │   ├── chatbot/
│   │   │   ├── elasticsearch/
│   │   │   ├── minio/
│   │   │   ├── pdf-tarantula/
│   │   │   ├── rdbms/
│   │   │   ├── redis/
│   │   │   ├── speaches/
│   │   │   ├── summarize/
│   │   │   └── whatsapp-go/
│   │   ├── interceptor/              # Response interceptor (format standar)
│   │   ├── logger/                   # Telegram transport untuk Winston
│   │   ├── middleware/                # API key middleware, dynamic CSP
│   │   └── services/
│   │       └── document/              # Chunk document service
│   │
│   ├── db/
│   │   ├── migrations/               # TypeORM migrations (70+ file)
│   │   └── seeds/                     # Data seeder
│   │
│   ├── infisical/                    # Infisical secret loader & service
│   │
│   ├── activity-log/                 # Log aktivitas user
│   ├── apis/                         # Manajemen API eksternal di workspace
│   ├── api-users/                    # ACL: user akses ke API
│   ├── audio-document-chunks/        # Chunk audio transkripsi
│   ├── audio-document-summaries/     # Ringkasan audio document
│   ├── audio-document-users/         # ACL: user akses ke audio document
│   ├── audio-documents/              # Dokumen hasil transkripsi audio
│   ├── audio-users/                  # ACL: user akses ke audio
│   ├── audios/                       # Manajemen file audio
│   ├── canvas/                       # Fitur uji coba kombinasi knowledge & LLM
│   ├── chat-histories/               # Riwayat chat per room
│   ├── dashboard/                    # Data ringkasan dashboard
│   ├── database-users/               # ACL: user akses ke database
│   ├── databases/                    # Koneksi database eksternal (RDBMS)
│   ├── document-folder/              # Folder manajemen dokumen
│   ├── document-folder-users/        # ACL: user akses ke folder
│   ├── document-ocr/                 # Hasil OCR per dokumen
│   ├── document-summaries/           # Ringkasan dokumen
│   ├── document-users/               # ACL: user akses ke dokumen
│   ├── documents/                    # Manajemen dokumen (upload, metadata)
│   ├── endpoints/                    # Endpoint dari API eksternal
│   ├── health/                       # Health check endpoint
│   ├── log/                          # HTTP request logging middleware
│   ├── mail/                         # Email service (Bull queue + template)
│   ├── model-management/             # Manajemen model LLM per workspace
│   ├── open-api/                     # Permukaan API publik (app_key)
│   ├── openai-compat/                # OpenAI-compatible chat completion endpoint
│   ├── room-chats/                   # Room chat management
│   ├── settings/                     # Global setting aplikasi
│   ├── shared/                       # Shared service (JWT, auth helper)
│   ├── system-prompt/                # Manajemen system prompt workspace
│   ├── system-prompt-users/          # ACL: user akses ke system prompt
│   ├── topic-document-users/         # ACL: user akses ke topic document
│   ├── topic-documents/              # Relasi topic ↔ document
│   ├── topic-users/                  # ACL: user akses ke topic
│   ├── topics/                       # Manajemen topik knowledge
│   ├── utils/                        # Utility endpoint (misc)
│   ├── whatsapp/                     # Integrasi WhatsApp
│   ├── workspace-iframes/            # Konfigurasi iframe embed workspace
│   ├── workspace-integrations/       # Integrasi eksternal per workspace
│   ├── workspace-roles/              # Role management dalam workspace
│   ├── workspace-users/              # User membership workspace
│   └── workspaces/                   # Manajemen workspace (core entity)

├── test/                             # E2E tests
├── scripts/                          # Infisical CLI helper script
├── docker-compose.dev.yml            # Docker untuk development lokal
├── docker-compose.yml                # Docker untuk production/staging
├── Dockerfile.dev                    # Image development
├── Dockerfile                        # Image production
├── Dockerfile.stag                   # Image staging
├── nest-cli.json
├── tsconfig.json
└── package.json

Arsitektur Modul

Domain utama dikelompokkan ke dalam modul NestJS yang mengikuti pola controller → service → entity:

  • Workspace Coreworkspaces, workspace-users, workspace-roles, workspace-integrations, workspace-iframes
  • Knowledge: Dokumendocuments, document-ocr, document-folder, document-summaries, topics, topic-documents
  • Knowledge: Audioaudios, audio-documents, audio-document-chunks, audio-document-summaries
  • Knowledge: Database & APIdatabases, apis, endpoints
  • Chat & Intelligenceroom-chats, chat-histories, system-prompt, model-management, canvas, openai-compat
  • Auth & Accessshared (JWT), open-api, activity-log
  • Supportmail, health, settings, dashboard, whatsapp, infisical

Setiap knowledge source juga punya modul *-users pasangannya (document-users, audio-users, topic-users, database-users, api-users, dst.) untuk mengatur akses per-resource — lihat Ringkasan Arsitektur.

Modul Penting

ModulTanggung Jawab
workspacesEntity inti RAGA; mengatur LLM, chain mode, stream, personalisasi, dan relasi ke semua knowledge
documentsUpload, metadata, status OCR, progress tracking dokumen PDF/file
document-ocrMenyimpan hasil OCR per chunk; relasi ke service PDF Tarantula
audiosUpload file audio; memicu transkripsi ke service Speaches
audio-documentsHasil transkripsi per segmen; status is_publish_transcribe
topicsPengelompokan dokumen menjadi knowledge topic dalam workspace
databasesKoneksi RDBMS eksternal (PostgreSQL/MySQL) untuk fitur Text-to-SQL
apisDefinisi API eksternal yang bisa dipanggil oleh chatbot (Text-to-API)
system-promptTemplate system prompt workspace; mendukung tipe report dan prompt permanen
model-managementKonfigurasi model LLM yang tersedia per workspace (QWEN, GLM, dll.)
chat-historiesMenyimpan history percakapan per room; dipakai sebagai context oleh engine
openai-compatEndpoint kompatibel OpenAI (POST /open-api/chat/completions, GET /open-api/models) untuk integrasi pihak ketiga — bukan di path /v1/..., melainkan menyatu dengan namespace open-api
infisicalLoader secret dari Infisical; menginisialisasi process.env sebelum modul lain berjalan
activity-logInterceptor + decorator untuk mencatat setiap aksi user ke index Elasticsearch (INDEX_USER_ACTIVITY_LOG), bukan ke tabel database

Infrastruktur (Development)

Dijalankan via docker-compose.dev.yml:

bash
docker compose -f docker-compose.dev.yml up -d
ContainerImagePortKeterangan
api-jabarinDockerfile.dev (NestJS)3000Aplikasi dengan hot-reload
db-api-jabarinpostgres:16-alpine5432PostgreSQL
cached-api-jabarinredis:7.4.5-alpine3.216379Redis untuk cache & Bull queue
minio-jabarinquay.io/minio/minio9000 (API), 9001 (Console)Object storage untuk file upload
es-jabarinelasticsearch-wolfi:8.17.09200, 9300Single-node Elasticsearch untuk indexing

Semua container terhubung dalam network network-jabarin.

Integrasi Eksternal

ServiceEnv VarKeterangan
Chatbot Engine (opa-data)CHATBOT_URLEngine chatbot RAGA; dipanggil untuk inferensi LLM
PDF Tarantula (OCR)PDF_URLService OCR dokumen; menerima file PDF dan mengembalikan teks per chunk
Speaches (STT)SPEACHES_URLWhisper-based speech-to-text; dipakai untuk transkripsi audio
Summarize EngineSUMMARIZE_URLService summarize + NER untuk dokumen dan audio
WhatsApp GoWHATSAPP_URLBridge WhatsApp untuk integrasi chatbot via WA
InfisicalINFISICAL_SITE_URLSecret management; semua env var sensitif diambil dari sini

Perintah Development

bash
# Install dependencies
npm install

# Jalankan development (hot-reload)
npm run start:dev

# Build production
npm run build

# Jalankan migrations
npm run migration:run

# Buat migration baru
npm run migration:create --name=NamaMigration

# Rollback migration
npm run migration:revert

# Run tests
npm run test

# Run tests + coverage
npm run test:cov

# Sync secrets baru ke Infisical
npm run sync:infisical