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 Docker và Docker 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
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
# 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
# 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
# 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
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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
- 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 - Lỗi xây dựng: Xác minh tệp
.envvàNEXT_PUBLIC_CONVEX_URL - 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
- 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!