RivaLMS
Vận hành

Triển khai

Bản build production của RivaLMS chạy trong Docker. Môi trường UAT dựng bằng docker-compose.uat.yml với PostgreSQL và MinIO riêng; production dùng cùng image, trỏ biến môi trường tới PostgreSQL và kho lưu file S3 của môi trường đó.

UAT trên Docker

Stack UAT tách biệt với môi trường dev (khác project, network, volume và cổng) nên chạy song song được.

Bước 1: Tạo file môi trường

cp .env.uat.example .env.uat

Trong .env.uat, đặt AUTH_SECRET mới (khác dev), chọn LLM qua các biến OPENAI_*, và quyết định DEMO_MODE, ALLOW_SELF_REGISTER.

Bước 2: Build và khởi động

docker compose -f docker-compose.uat.yml up -d --build
docker compose -f docker-compose.uat.yml ps -a
# kết quả mong đợi:
#   db          Up (healthy)
#   init        Exited (0)
#   minio       Up (healthy)
#   minio-init  Exited (0)
#   app         Up (healthy)

Container init chạy một lần: áp dụng migration bằng prisma migrate deploy và seed dữ liệu nếu DB còn rỗng. minio-init tạo bucket private. App chỉ khởi động khi hai bước này thành công.

Bước 3: Kiểm tra

Mở http://localhost:3100 và đăng nhập bằng tài khoản dùng thử. Không mở cổng 3100 ra Internet.

Cập nhật sau khi sửa code

Chạy lại lệnh build ở bước 2. init áp dụng migration mới và không seed lại vì DB đã có dữ liệu; dữ liệu UAT được giữ nguyên. Chỉ đổi .env.uat thì dùng up -d --force-recreate app, không cần build lại.

Cơ sở dữ liệu

Mọi môi trường dùng migration có phiên bản; không dùng db push.

# chạy trước khi khởi động bản mới (UAT: container init tự chạy)
npm run db:deploy

Seed tạo khoa, khóa học mẫu và tài khoản dùng thử, chỉ dùng cho dev và UAT.

Biến môi trường production

Các biến cần đặt cho production. Danh sách đầy đủ xem .env.example và .env.uat.example.

# Cơ sở dữ liệu PostgreSQL
DATABASE_URL="postgresql://..."

# Xác thực: tạo khóa mới bằng npx auth secret
AUTH_SECRET="..."
AUTH_URL="https://..."

# Trợ lý AI (OpenAI)
OPENAI_BASE_URL="https://api.openai.com/v1"
OPENAI_API_KEY="sk-proj-..."
OPENAI_MODEL="gpt-4o-mini"

# Kho lưu file S3 (bucket private)
S3_ENDPOINT="https://..."
S3_REGION="..."
S3_BUCKET="..."
S3_ACCESS_KEY_ID="..."
S3_SECRET_ACCESS_KEY="..."

# Tắt đăng nhập nhanh và tự đăng ký
DEMO_MODE=false
ALLOW_SELF_REGISTER=false

Danh sách kiểm tra

Tạo AUTH_SECRET riêng cho production (npx auth secret)
Đặt DEMO_MODE=false và ALLOW_SELF_REGISTER=false
Chạy npm run db:deploy trước khi khởi động bản mới
Không seed dữ liệu mẫu và tài khoản dùng thử
Cấu hình OpenAI: đặt ngân sách tháng, dùng model chat thường (ví dụ gpt-4o-mini)
Để bucket lưu file ở chế độ private
Chỉ đặt AUTH_GOOGLE_* hoặc AUTH_GITHUB_* khi đã thống nhất (đăng nhập OAuth tự tạo tài khoản Học viên)
Không mở cổng PostgreSQL và MinIO ra Internet

Tài liệu liên quan

Hướng dẫn chi tiết nằm trong thư mục docs/ của mã nguồn:

docs/UAT_DOCKER.md

Dựng và cập nhật môi trường UAT

docs/LOCAL_SETUP.md

Môi trường dev, lưu trữ file, xử lý sự cố

docs/OPENAI_SETUP.md

Tạo API key, chọn model và kiểm soát chi phí OpenAI

docs/LLM_CONFIG.md

Yêu cầu với LLM, đánh giá model chạy trên máy