0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Giám sát thay đổi website với Firecrawl Observer và Docker

Đăng vào 6 tháng trước

• 9 phút đọc

Giới thiệu

Trong thời đại công nghệ số, việc giám sát các thay đổi trên website là rất quan trọng để đảm bảo rằng nội dung của bạn luôn được cập nhật và an toàn. Bài viết này sẽ hướng dẫn bạn cách sử dụng Firecrawl Observer cùng với Docker để tự động theo dõi và phát hiện các thay đổi trên website của bạn một cách hiệu quả.

Điều kiện tiên quyết

Trước khi bắt đầu, bạn cần chuẩn bị những điều sau:

  • Một máy chủ chạy Linux/Unix. Nếu bạn cần một máy chủ đám mây, có thể sử dụng Digital Ocean với khoản tín dụng $200.
  • Cài đặt DockerDocker Compose trên máy chủ của bạn.
  • Tài khoản Firecrawl Observer với khả năng triển khai sản phẩm.
  • Tài khoản Convex.

Hướng dẫn triển khai

Bước 1: Clone, khởi tạo và chuẩn bị môi trường

bash Copy
git clone https://github.com/mendableai/firecrawl-observer.git
cd firecrawl-observer
npm install
npx convex dev

# Mở một terminal mới và thiết lập xác thực cho sản phẩm
npx @convex-dev/auth --prod

# Thiết lập khóa mã hóa (CẦN THIẾT - chỉ chạy nếu chưa được thiết lập)
npx convex env set ENCRYPTION_KEY "$(openssl rand -base64 32)" --prod

# Xác minh tất cả các biến cần thiết đã được thiết lập
npx convex env list --prod

Các biến cần thiết bao gồm:

  • SITE_URL ✓ (đã được thiết lập)
  • JWT_PRIVATE_KEY ✓ (đã được thiết lập)
  • JWKS ✓ (đã được thiết lập)
  • ENCRYPTION_KEY (thiết lập bây giờ)
bash Copy
# Triển khai các hàm Convex lên sản phẩm
npx convex deploy --prod

Bước 2: Cập nhật tệp môi trường

Thay thế YOUR_PUBLIC_URL bằng miền do Convex cung cấp.

bash Copy
# Tạo/cập nhật tệp .env
cat > .env << 'EOF'
NEXT_PUBLIC_CONVEX_URL=https://YOUR_PUBLIC_URL.convex.cloud
NODE_ENV=production
EOF

Bước 3: Cập nhật Dockerfile

dockerfile Copy
# Giai đoạn 1: Xây dựng ứng dụng
FROM node:20-slim AS builder
WORKDIR /app

# Khai báo các tham số thời gian xây dựng
ARG NEXT_PUBLIC_CONVEX_URL
ARG NODE_ENV=production

# Thiết lập các biến môi trường cho quá trình xây dựng
ENV NEXT_PUBLIC_CONVEX_URL=$NEXT_PUBLIC_CONVEX_URL
ENV NODE_ENV=$NODE_ENV

# Cài đặt các phụ thuộc
COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./
RUN \
    if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
    elif [ -f package-lock.json ]; then npm ci --only=production; \
    elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && pnpm i --frozen-lockfile --prod; \
    else echo "Lockfile not found." && exit 1; \
    fi

# Sao chép mã nguồn và xây dựng
COPY . .
RUN npm run build

# Giai đoạn 2: Thời gian chạy sản phẩm
FROM node:20-slim AS runner
WORKDIR /app

# Cài đặt curl cho các kiểm tra sức khỏe
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*

# Tạo người dùng không phải root
RUN addgroup --system --gid 1001 nodejs && \
    adduser --system --uid 1001 nextjs

# Sao chép ứng dụng đã được xây dựng với quyền sở hữu đúng
COPY --from=builder /app/public ./public
COPY --from=builder --chown=nextjs:nodejs /app/.next ./.next
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./package.json

# Chuyển sang người dùng không phải root
USER nextjs

# Mở cổng và thiết lập môi trường
EXPOSE 3000
ENV PORT=3000
ENV NODE_ENV=production

# Kiểm tra sức khỏe
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
    CMD curl -f http://localhost:3000/api/health || exit 1

# Khởi động ứng dụng
CMD ["npm", "start"]

Bước 4: Cập nhật docker-compose.yml

yaml Copy
version: '3.8'

services:
  app:
    image: firecrawl-observer-app
    build:
      context: .
      args:
        - NEXT_PUBLIC_CONVEX_URL=${NEXT_PUBLIC_CONVEX_URL}
        - NODE_ENV=production
    restart: unless-stopped
    env_file:
      - .env
    networks:
      - app-network
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s
    deploy:
      resources:
        limits:
          memory: 1G
          cpus: '0.5'
        reservations:
          memory: 512M
          cpus: '0.25'

  nginx:
    image: nginx:alpine
    restart: unless-stopped
    ports:
      - "5001:80"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro
      - ./nginx/nginx.htpasswd:/etc/nginx/conf.d/nginx.htpasswd:ro
    depends_on:
      app:
        condition: service_healthy
    networks:
      - app-network
    deploy:
      resources:
        limits:
          memory: 128M
          cpus: '0.1'

networks:
  app-network:
    driver: bridge

volumes:
  nginx_cache:

Bước 5: Tối ưu hóa cấu hình Nginx

nginx Copy
# Cập nhật nginx.conf với các tối ưu hóa cho sản phẩm
cat > nginx/nginx.conf << 'EOF'
upstream app_backend {
    server app:3000;
    keepalive 32;
}

server {
    listen 80;
    server_name _;

    # Tiêu đề bảo mật
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;

    # Nén gzip
    gzip on;
    gzip_vary on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    # Xác thực cơ bản cho tất cả các route
    auth_basic "Restricted Content";
    auth_basic_user_file /etc/nginx/conf.d/nginx.htpasswd;

    # Điểm kiểm tra sức khỏe (bỏ qua xác thực)
    location /api/health {
        access_log off;
        proxy_pass http://app_backend;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }

    # Ứng dụng chính
    location / {
        proxy_pass http://app_backend;
        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_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # Thời gian chờ
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;

        # Cài đặt bộ đệm
        proxy_buffering on;
        proxy_buffer_size 8k;
        proxy_buffers 8 8k;

        # Cache tài sản tĩnh
        location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
            expires 1y;
            add_header Cache-Control "public, immutable";
            proxy_pass http://app_backend;
        }
    }
}
EOF

Bước 6: Thêm Điểm Kiểm tra Sức khỏe

typescript Copy
# Tạo route API kiểm tra sức khỏe
mkdir -p src/app/api/health
cat > src/app/api/health/route.ts << 'EOF'
import { NextResponse } from 'next/server';

export async function GET() {
  try {
    return NextResponse.json({ 
      status: 'healthy',
      timestamp: new Date().toISOString(),
      uptime: process.uptime(),
      environment: process.env.NODE_ENV || 'development'
    }, { status: 200 });
  } catch (error) {
    return NextResponse.json({ 
      status: 'unhealthy',
      error: 'Health check failed',
      timestamp: new Date().toISOString()
    }, { status: 503 });
  }
}
EOF

Bước 7: Triển khai với Chiến lược Không Gián đoạn

bash Copy
# Dừng các container hiện tại một cách nhẹ nhàng
docker-compose down

# Dọn dẹp hình ảnh cũ (tùy chọn, tiết kiệm không gian đĩa)
docker image prune -f

# Xây dựng và triển khai với ghi chú tốt hơn
docker-compose up --build -d

# Giám sát khởi động
echo "Đang chờ các dịch vụ khởi động..."
sleep 10

# Kiểm tra sức khỏe dịch vụ
docker-compose ps
docker-compose logs --tail=50 app

Bước 8: Xác minh và Giám sát

Thay thế SERVER_IP & PORT bằng của bạn.

bash Copy
# Kiểm tra endpoint sức khỏe
curl -I http://SERVER_IP:PORT/api/health

# Kiểm tra toàn bộ ứng dụng (sẽ yêu cầu xác thực cơ bản)
curl -I http://SERVER_IP:PORT/

# Giám sát nhật ký theo thời gian thực
docker-compose logs -f --tail=20

# Kiểm tra mức sử dụng tài nguyên
docker stats --no-stream

Kịch bản Giám sát Sản phẩm

bash Copy
# Tạo kịch bản giám sát
cat > monitor.sh << 'EOF'
#!/bin/bash
echo "=== Trạng thái Container ==="
docker-compose ps

echo -e "\n=== Kiểm tra Sức khỏe ==="
curl -s http://localhost:3000/api/health | jq '.' 2>/dev/null || echo "Kiểm tra sức khỏe thất bại"

echo -e "\n=== Mức sử dụng Tài nguyên ==="
docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}"

echo -e "\n=== Nhật ký Gần đây ==="
docker-compose logs --tail=5 app
EOF

chmod +x monitor.sh

Kịch bản Triển khai Tự động

bash Copy
# Tạo kịch bản triển khai cho các bản cập nhật trong tương lai
cat > deploy.sh << 'EOF'
#!/bin/bash
set -e

echo "Bắt đầu triển khai..."

# Lấy các thay đổi mới nhất (nếu sử dụng git)
# git pull origin main

# Triển khai các hàm Convex
echo "Triển khai các hàm Convex..."
npx convex deploy --prod

# Xây dựng và triển khai các container
echo "Xây dựng và triển khai các container..."
docker-compose down
docker-compose up --build -d

# Đợi kiểm tra sức khỏe
echo "Đang chờ ứng dụng khỏe mạnh..."
for i in {1..30}; do
    if curl -f http://localhost:3000/api/health >/dev/null 2>&1; then
        echo "Ứng dụng khỏe mạnh!"
        break
    fi
    echo "Đang chờ... ($i/30)"
    sleep 10
done

echo "Triển khai hoàn tất!"
docker-compose ps
EOF

chmod +x deploy.sh

Danh sách Kiểm tra Bảo mật

  • Containers không phải root: Ứng dụng chạy với người dùng nextjs
  • Xác thực cơ bản: Bảo vệ mật khẩu qua nginx
  • Tiêu đề bảo mật: Bảo vệ XSS, CSRF và khung
  • Giới hạn tài nguyên: Giới hạn bộ nhớ và CPU
  • Kiểm tra sức khỏe: Giám sát container tự động
  • Bí mật mã hóa: Các khóa API được lưu trữ trong đám mây Convex
  • ⚠️ HTTPS: Cân nhắc thêm SSL/TLS cho sản phẩm
  • ⚠️ Tường lửa: Đảm bảo chỉ mở các cổng cần thiết

Khắc phục sự cố

Chẩn đoán nhanh

bash Copy
# Kiểm tra toàn bộ hệ thống
./monitor.sh

# Xem tất cả nhật ký
docker-compose logs

# Khởi động lại dịch vụ cụ thể
docker-compose restart app

# Buộc xây dựng lại
docker-compose up --build --force-recreate -d

Vấn đề thường gặp

  1. Lỗi xác thực: Kiểm tra các biến môi trường Convex bằng npx convex env list --prod
  2. Lỗi xây dựng: Xác minh tệp .envNEXT_PUBLIC_CONVEX_URL
  3. Lỗi kiểm tra sức khỏe: Kiểm tra xem cổng 3000 có thể truy cập bên trong container không
  4. Vấn đề nginx: Xác minh quyền truy cập tệp nginx.htpasswd

Kết luận

Với hướng dẫn này, bạn đã có thể triển khai Firecrawl Observer trên Docker để giám sát các thay đổi trên website của mình. Đừng quên kiểm tra sức khỏe của hệ thống thường xuyên và tối ưu hóa cấu hình để đảm bảo hiệu suất tốt nhất. Nếu bạn có bất kỳ câu hỏi nào, hãy để lại câu hỏi dưới bài viết này!

Nội dung bài viết

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào