Hướng dẫn cài đặt và cấu hình LibreChat trên Docker: Xây dựng cổng AI Chat đa mô hình tự host an toàn cho doanh nghiệp

Artificial Intelligence tutorial - IT technology blog
Artificial Intelligence tutorial - IT technology blog

2 giờ sáng, Slack nổ liên tục — và tất cả bắt đầu từ một câu hỏi

Hôm đó là thứ Sáu, cả team vừa triển khai xong hệ thống nội bộ cho phép nhân viên dùng AI chat để hỗ trợ công việc. Mọi thứ chạy ngon trên staging. Lên production được 3 tiếng thì bắt đầu có vấn đề: container crash liên tục, MongoDB không kết nối được, và quan trọng nhất — dữ liệu conversation của user đang bay về server của OpenAI mà không qua bất kỳ bộ lọc nào. CTO nhắn tin lúc 2:17 sáng: “Fix ngay.”

Đó là lần đầu mình thực sự hiểu tại sao tự host (self-hosted) một AI chat gateway quan trọng đến vậy với doanh nghiệp. Không phải chỉ vì chi phí — mà vì kiểm soát dữ liệu, audit log, và khả năng tích hợp nhiều AI model mà không lock-in vào một provider nào. Từ đó, trước khi tư vấn AI tooling cho bất kỳ team nào, mình đều hỏi một câu: conversation data của bạn đang chạy qua server của ai?

LibreChat là giải pháp mình chọn sau đó. Khác với Open WebUI (tập trung vào Ollama local models), LibreChat được thiết kế để chạy cả OpenAI, Claude, Gemini, Ollama trong một giao diện duy nhất. Điều quan trọng hơn: nó có hệ thống xác thực, phân quyền, conversation management đủ mạnh để deploy cho cả công ty dùng thực sự — không phải chỉ để demo.

LibreChat là gì và tại sao lại khác biệt

LibreChat là một AI chat interface mã nguồn mở, chạy hoàn toàn trên server của bạn. Stack chính gồm:

  • Frontend: React + TypeScript, trải nghiệm gần giống ChatGPT
  • Backend: Node.js + Express
  • Database: MongoDB lưu conversation history và tài khoản user
  • File storage: Hỗ trợ local, S3, Azure Blob tùy cấu hình

Điểm nổi bật nhất là preset system: tạo sẵn cấu hình cho từng AI endpoint (model + system prompt + parameters), user chỉ cần chọn preset và dùng. Không còn cảnh mỗi người trong team chỉnh system prompt khác nhau, dùng model khác nhau — cả team cùng một baseline, dễ kiểm soát hơn hẳn.

Chuẩn bị môi trường

Yêu cầu tối thiểu

  • Server: 2 vCPU, 4GB RAM (production nên dùng 4 vCPU / 8GB)
  • Docker Engine 24+ và Docker Compose v2
  • Domain + SSL — LibreChat không chạy HTTP trong production mode
# Kiểm tra version trước khi bắt đầu
docker --version        # Docker version 24.x.x
docker compose version  # Docker Compose version v2.x.x

Clone repository

git clone https://github.com/danny-avila/LibreChat.git
cd LibreChat

Deploy LibreChat với Docker Compose

Bước 1 — Tạo file cấu hình .env

LibreChat dùng 2 file config chính: .env cho biến môi trường và librechat.yaml cho AI endpoints.

# Copy file mẫu
cp .env.example .env

Mở file .env và chỉnh những giá trị quan trọng. Đây là bước hay bị bỏ qua nhất và cũng là nguyên nhân gây ra hầu hết các lỗi sau này:

# MongoDB URI — giữ nguyên nếu dùng container MongoDB đi kèm
MONGO_URI=mongodb://mongodb:27017/LibreChat

# Secret keys — PHẢI generate ngẫu nhiên, KHÔNG dùng giá trị mặc định
CREDS_KEY=f34be427ebb29de8d88c107a71546019685ed8b241d927a3ad354e35188a4a   # 64 hex chars
CREDS_IV=e2341419ec3dd3d19b13a1a87fafcbfb                                    # 32 hex chars
JWT_SECRET=16f8c0ef4a5d6b3e1f7a9c2d4e6b8f0a2c4e6b8f0a2c4e6b8f0a2c4         # 64 hex chars
JWT_REFRESH_SECRET=eaa5191f2914e082135951f8e6d6fe35ba2e21239aa7b82a3c          # 64 hex chars

# Cho phép đăng ký — set false sau khi tạo đủ tài khoản
ALLOW_REGISTRATION=true

# Domain của bạn
DOMAIN_CLIENT=https://chat.yourdomain.com
DOMAIN_SERVER=https://chat.yourdomain.com

Dùng openssl để generate key — đừng tự gõ, tự gõ kiểu gì cũng có pattern:

# Dùng openssl để tạo key ngẫu nhiên
openssl rand -hex 32   # cho CREDS_KEY, JWT_SECRET, JWT_REFRESH_SECRET
openssl rand -hex 16   # cho CREDS_IV

Bước 2 — Cấu hình AI endpoints (librechat.yaml)

Đây là phần quan trọng nhất — nơi bạn khai báo tất cả AI providers. Copy file mẫu:

cp librechat.example.yaml librechat.yaml

Chỉnh file librechat.yaml theo nhu cầu:

version: 1.1.5

cache: true

endpoints:
  openAI:
    apiKey: "${OPENAI_API_KEY}"
    models:
      default: ["gpt-4o", "gpt-4o-mini", "gpt-4-turbo"]
      fetch: false
    titleConvo: true
    titleModel: "gpt-4o-mini"

  anthropic:
    apiKey: "${ANTHROPIC_API_KEY}"
    models:
      default: ["claude-opus-4-8", "claude-sonnet-4-6", "claude-haiku-4-5"]
      fetch: false

  google:
    apiKey: "${GOOGLE_API_KEY}"
    models:
      default: ["gemini-2.0-flash", "gemini-1.5-pro"]
      fetch: false

  # Kết nối Ollama local nếu cần
  custom:
    - name: "Ollama Local"
      apiKey: "ollama"
      baseURL: "http://host.docker.internal:11434/v1/"
      models:
        default: ["llama3.1:8b", "qwen2.5:7b"]
        fetch: true
      titleConvo: false

Thêm API keys vào .env:

OPENAI_API_KEY=sk-...
ANTHROPIC_API_KEY=sk-ant-...
GOOGLE_API_KEY=AIza...

Bước 3 — Khởi động

# Khởi động tất cả services
docker compose up -d

# Theo dõi log — cần thiết cho lần đầu
docker compose logs -f librechat

Lần đầu khởi động sẽ mất 2-3 phút để pull images và init MongoDB. Kiểm tra trạng thái:

docker compose ps
# Kết quả mong đợi:
# NAME                   STATUS
# LibreChat-LibreChat-1  running (healthy)
# LibreChat-mongodb-1    running (healthy)

Bước 4 — Reverse proxy với Nginx

LibreChat chạy ở port 3080. Cần Nginx để expose ra ngoài với SSL:

server {
    listen 443 ssl http2;
    server_name chat.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/chat.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/chat.yourdomain.com/privkey.pem;

    location / {
        proxy_pass http://localhost: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_read_timeout 300s;    # Quan trọng: AI response có thể rất lâu
        proxy_send_timeout 300s;
    }
}

Chú ý proxy_read_timeout 300s — mình đã bị timeout với các model chậm vì để mặc định 60s, dẫn đến user thấy lỗi giữa chừng dù AI vẫn đang generate.

Cấu hình bảo mật cho môi trường doanh nghiệp

Tắt đăng ký sau khi setup xong

Sau khi tạo đủ tài khoản cho team, tắt đăng ký mở ngay. Nhiều server bị quét bot đăng ký và dùng API key của mình mà chủ nhân không hay:

# Trong .env
ALLOW_REGISTRATION=false

# Restart để áp dụng
docker compose restart LibreChat-LibreChat-1

Rate limiting — tránh bị cháy API key

# Giới hạn số message trong .env
LIMIT_CONCURRENT_MESSAGES=1
LIMIT_MESSAGE_IP=100       # 100 messages/IP mỗi 15 phút
LIMIT_MESSAGE_USER=50      # 50 messages/user mỗi 15 phút

Bật xác thực email (tùy chọn)

# Cấu hình SMTP trong .env
EMAIL_SERVICE=gmail
[email protected]
EMAIL_PASSWORD=app-specific-password
[email protected]

# Yêu cầu xác thực email khi đăng ký
EMAIL_VERIFICATION=true

Xử lý các lỗi phổ biến

MongoDB connection refused ngay sau khởi động

Lỗi này xuất hiện vì container LibreChat start trước khi MongoDB init xong — dù đã có depends_on với healthcheck, đôi khi vẫn xảy ra race condition. Fix nhanh:

docker compose restart LibreChat-LibreChat-1

Container crash với lỗi “Invalid CREDS_KEY length”

Key không đúng độ dài. CREDS_KEY phải đúng 64 hex characters, CREDS_IV phải đúng 32 hex characters:

# Kiểm tra độ dài
echo -n "$CREDS_KEY" | wc -c    # phải ra 64
echo -n "$CREDS_IV" | wc -c     # phải ra 32

Streaming response bị cắt giữa chừng

Kiểm tra timeout của reverse proxy trước tiên. Nếu dùng Cloudflare, cần bypass hoặc bật “Disable Response Buffering” cho domain chat — Cloudflare mặc định buffer response và cắt stream.

Backup dữ liệu

# Backup MongoDB thủ công
docker exec LibreChat-mongodb-1 mongodump \
  --db LibreChat \
  --out /data/backup/$(date +%Y%m%d) \
  --gzip

# Copy backup ra ngoài container
docker cp LibreChat-mongodb-1:/data/backup ./backup

# Cron job backup tự động lúc 3 giờ sáng
0 3 * * * docker exec LibreChat-mongodb-1 mongodump --db LibreChat --out /data/backup/$(date +\%Y\%m\%d) --gzip

8 tháng sau cái đêm 2 giờ sáng đó

LibreChat vẫn chạy ổn định cho team 25 người từ đó đến giờ — không downtime, không incident đáng kể. Update cũng đơn giản:

git pull
docker compose pull && docker compose up -d

Điểm mình thích nhất là conversation history lưu trên MongoDB của mình — không còn lo dữ liệu nhạy cảm đi đâu không kiểm soát được. Cộng thêm preset system: mỗi phòng ban có preset riêng với system prompt phù hợp, model chọn sẵn theo use case — onboard người mới vào team 10 phút là xài được.

Setup ban đầu mất khoảng 1-2 tiếng để cấu hình đúng, nhưng sau đó maintenance gần như bằng 0. Nếu team bạn đang dùng AI cho công việc nội bộ mà chưa biết conversation data đó đang đi đâu — đây là câu trả lời cụ thể.

Share: