reader-api
Đây là backend API dùng chung cho cả web app reader và mobile app reader-app.
🚀 Tính năng nổi bật
- Xác thực & Phân quyền: Đăng nhập bằng Google Authentication (NextAuth). Hỗ trợ phân quyền người dùng (USER, MOD, ADMIN).
- Quản lý nội dung (Dành cho MOD/ADMIN): Dashboard quản lý truyện, tải lên chương mới, quản lý trạng thái truyện (Đang ra, Hoàn thành, Tạm ngưng).
- Trải nghiệm đọc: Khám phá truyện theo thể loại, tìm kiếm truyện, đọc chương truyện với hiệu suất cao (nội dung lưu ở MongoDB).
- Tương tác người dùng: Tính năng tủ sách (bookmark) giúp lưu lại tiến độ đọc, hỗ trợ bình luận ở truyện và từng chương.
🛠 Tech Stack
- Framework: Next.js (App Router), React 19
- Styling: TailwindCSS v4 & Radix UI (shadcn/ui)
- Database Hybrid:
- PostgreSQL: Lưu trữ dữ liệu cấu trúc (Tài khoản, Truyện, Thể loại, Bình luận, Tủ sách) thông qua Prisma ORM.
- MongoDB: Lưu trữ nội dung lớn (Chương truyện) thông qua Mongoose.
- Auth: NextAuth.js
💻 Hướng dẫn chạy Local (Phát triển)
1. Yêu cầu cài đặt
- Node.js (Khuyến nghị bản LTS)
- pnpm (Tool quản lý package)
- Database: PostgreSQL và MongoDB đang chạy cục bộ hoặc trên máy chủ.
2. Cấu hình môi trường
Tạo file .env ở thư mục gốc dựa trên .env.example (nếu có) hoặc điền các thông tin sau:
# URL kết nối PostgreSQL
DATABASE_URL="postgresql://user:password@localhost:5432/reader?schema=public"
# URL kết nối MongoDB
MONGODB_URI="mongodb://user:password@localhost:27017/reader?authSource=admin"
# Cấu hình NextAuth
NEXTAUTH_SECRET="your-super-secret-key"
NEXTAUTH_URL="http://localhost:3000"
# Cấu hình Google Login
GOOGLE_CLIENT_ID="your_google_client_id"
GOOGLE_CLIENT_SECRET="your_google_client_secret"
# AI Tool cho MOD (LLM + web search)
OPENAI_API_KEY="your_openai_api_key"
# Tùy chọn, mặc định: gpt-4o-mini-search-preview
OPENAI_WEB_MODEL="gpt-4o-mini-search-preview"
# Cloudflare R2 (lưu ảnh bìa)
R2_ACCOUNT_ID="your_cloudflare_account_id"
R2_ACCESS_KEY_ID="your_r2_access_key_id"
R2_SECRET_ACCESS_KEY="your_r2_secret_access_key"
R2_BUCKET_NAME="your_r2_bucket_name"
R2_PUBLIC_BASE_URL="https://your-public-r2-domain"
3. Cài đặt dependencies và khởi tạo DB
# Cài đặt các gói thư viện
pnpm install
# Đồng bộ schema xuống PostgreSQL và generate Prisma client
npx prisma db push
# hoặc (nếu muốn dùng migrate)
# npx prisma migrate dev
# Generate thư viện Prisma
npx prisma generate
4. Chạy môi trường phát triển
pnpm dev
API chạy mặc định ở http://localhost:3001. Ví dụ endpoint: http://localhost:3001/api/novels/browse.
🏗 Hướng dẫn Build
Để build project cho môi trường production:
# Đảm bảo Prisma Client đã được generate
npx prisma generate
# Chạy lệnh build của Next.js
pnpm build
Sau khi build xong, bạn có thể khởi chạy server production bằng:
pnpm start
🐳 Triển khai dưới dạng Docker
Bạn có thể dễ dàng triển khai ứng dụng bằng nền tảng Docker. Dưới đây là cách đóng gói và chạy thông qua docker-compose.
1. Tạo file Dockerfile
Tạo file Dockerfile ở thư mục gốc của dự án với cấu hình multi-stage build để tối ưu dung lượng:
# Stage 1: Dependencies
FROM node:22-alpine AS deps
WORKDIR /app
COPY package.json pnpm-lock.yaml ./
RUN corepack enable pnpm && pnpm install --frozen-lockfile
# Stage 2: Builder
FROM node:22-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
# Tạo prisma client
RUN npx prisma generate
# Chạy build
RUN corepack enable pnpm && pnpm build
# Stage 3: Runner
FROM node:22-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /app/public ./public
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
EXPOSE 3000
ENV PORT=3000
CMD ["node", "server.js"]
(Lưu ý: Để build mục standalone hoạt động, bạn cần bổ sung output: 'standalone' trong file next.config.mjs)
2. Tạo file docker-compose.yml
Sử dụng Docker Compose để chạy ứng dụng (giả sử Database của bạn được host riêng hoặc bạn có thể thêm service DB vào file này):
version: '3.8'
services:
web:
build:
context: .
dockerfile: Dockerfile
image: reader-web:latest
container_name: reader-app
ports:
- "3000:3000"
env_file:
- .env
restart: unless-stopped
3. Khởi chạy bằng Docker
Chạy lệnh sau để build image và start container:
# Build và chạy ngầm (detached mode)
docker-compose up -d --build
Để xem log của container:
docker-compose logs -f web
Dừng và xóa container:
docker-compose down