src/utils/env.ts. File này export một object env duy nhất được dùng xuyên suốt toàn bộ codebase. Không có nơi nào trong code đọc process.env trực tiếp ngoài env.ts.loadEnv() được gọi một lần duy nhất.env được freeze và export.env từ @/utils/env hoặc @/utils.env.ts phân biệt hai chế độ dựa trên biến NODE_ENV:isLocal = true, một số giới hạn được nới lỏng:TASK_RETRY_LIMIT: Không giới hạn (Number.MAX_SAFE_INTEGER).PROXY_RETRY_LIMIT: Không giới hạn.MAX_RETRY_COUNT: Không giới hạn.BROWSER_LIMIT_PER_PROCESS: Luôn là 1.SEARCH_TASK_LIMIT: Không giới hạn.env.ts và không thể override qua .env:CRON_TASK_LIMIT = 25: Số task traffic đồng thời tối đa.CRON_REPORT_LIMIT = 2: Số report task đồng thời tối đa.CRON_SEARCH_LIMIT = 1: Số search task đồng thời tối đa.BROWSER_LIMIT = 100: Hard limit tuyệt đối cho browser instances..env Và .env.example.env: File thực tế chứa credentials. Không bao giờ commit vào Git..env.example: Template với cấu trúc đầy đủ và giá trị mẫu. Luôn commit vào Git..env.backup: Bản backup cấu hình. Không dùng trực tiếp.| Biến | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
PORT | number | 3005 | Cổng HTTP server lắng nghe |
NODE_ENV | string | development | Chế độ chạy: development hoặc production |
DEBUG | boolean | false | Bật debug logging chi tiết |
RUNTIME | string | bun | Phải là bun để bật AOT compilation trong Elysia |
SERVER_ID | string | tools_v2_server | Định danh duy nhất của worker instance |
PORT:3005.ports trong docker-compose.yml.http://localhost:{PORT}/swagger.NODE_ENV:development, production.isLocal flag trong env.ts.development: Giới hạn retry được nới lỏng, browser limit = 1.production: Giới hạn nghiêm ngặt, browser limit đọc từ env.DEBUG:true: Browser chạy có giao diện (không headless) trong development.false: Browser chạy headless.DEBUG.RUNTIME:bun để createElysia() bật aot: true.SERVER_ID:"10.0.0.2", "192.168.1.5".SERVER_ID để tracking worker health và phân phối tasks.SERVER_ID khác nhau.| Biến | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
API_KEY | string | "" | Token xác thực cho requests từ Tools V2 đến Go API |
WEBHOOK_API_KEY | string | "webhook-key" | Token xác thực cho webhook từ Go API vào Tools V2 |
PROXY_API_KEY | string | "" | Token xác thực riêng cho proxy endpoints |
IP_ALLOWED | string | "" | Danh sách IP được phép gọi API, phân cách bằng dấu phẩy |
API_KEY:X-API-Key khi Tools V2 gọi Go API.API_KEY được cấu hình trên Go API Backend.'#!6f1!0#aa77%@G$%8262x4AaD460c*3TExbqS9@0fPHF2F&!!^468J72W'WEBHOOK_API_KEY:ipValidationMiddleware kiểm tra key này.WEBHOOK_KEY (cả hai đều được đọc, ưu tiên WEBHOOK_API_KEY).PROXY_API_KEY:API_KEY để có thể revoke độc lập.IP_ALLOWED:"127.0.0.1,11.0.3.11,10.0.0.1".ipValidationMiddleware kiểm tra IP nguồn của mỗi request.11.0.3.11 nên cần thêm vào list.| Biến | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
API_HOST | string | https://traffic-api.longtu.club | URL của Go API Backend |
API_BASE_URL | string | Giống API_HOST | Alias cho API_HOST |
WEBHOOK_HOST | string | Giống API_HOST | Alias cho API_HOST |
API_HOST:http://localhost:33001.https://traffic-api.longtu.club.{API_HOST}/api/task/request để lấy tasks.{API_HOST}/webhook/task/update-status để gửi kết quả.API_BASE_URL và WEBHOOK_HOST đều fallback về API_HOST.API_HOST > WEBHOOK_HOST > default.| Biến | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
DB_MONGO_HOST | string | localhost | Hostname của MongoDB server |
DB_MONGO_PORT | number | 27017 | Port của MongoDB |
DB_MONGO_USERNAME | string | "" | Username MongoDB |
DB_MONGO_PASSWORD | string | "" | Password MongoDB |
DB_MONGO_DATABASE | string | traffic-tool | Tên database |
env.ts tự động xây dựng MONGODB_URI từ các biến trên:DB_MONGO_HOST=localhost
DB_MONGO_PORT=27017
DB_MONGO_USERNAME=root
DB_MONGO_PASSWORD=PwDev123
DB_MONGO_DATABASE=tool-traffic-toolsDB_MONGO_HOST=traffic_tool_mongodb_v2
DB_MONGO_PORT=27017
DB_MONGO_USERNAME=root
DB_MONGO_PASSWORD=PwDev123
DB_MONGO_DATABASE=tool-traffic-toolstraffic_tool_mongodb_v2 thay vì localhost vì cả hai container trong cùng Docker network.docker-compose.yml khởi động MongoDB với c ấu hình:11.0.3.11.mongodb_data.DB_MONGO_PORT.| Biến | Kiểu | Giá trị Dev | Giá trị Prod | Mô tả |
|---|---|---|---|---|
CRON_TASK_LIMIT | number | 25 (hardcode) | 25 (hardcode) | Số traffic task đồng thời tối đa |
CRON_REPORT_LIMIT | number | 2 (hardcode) | 2 (hardcode) | Số report task đồng thời tối đa |
CRON_SEARCH_LIMIT | number | 1 (hardcode) | 1 (hardcode) | Số search task đồng thời tối đa |
BROWSER_LIMIT_PER_PROCESS | number | 1 (forced) | Đọc từ env | Tổng số Chrome instances tối đa |
BROWSER_LIMIT | number | 100 (hardcode) | 100 (hardcode) | Hard limit tuyệt đối |
CRON_TASK_LIMIT, CRON_REPORT_LIMIT, CRON_SEARCH_LIMIT được hardcode trong env.ts và không thể override qua .env. Giá trị trong .env.example chỉ là tham khảo, không có tác dụng.BROWSER_LIMIT_PER_PROCESS trong development luôn là 1 bất kể giá trị trong .env. Chỉ trong production mới đọc từ env.BROWSER_LIMIT_PER_PROCESS cho production, tính toán như sau:BROWSER_LIMIT_PER_PROCESS = RAM khả dụng / 300MB × 0.7 (buffer 30%).BROWSER_LIMIT_PER_PROCESS=28.| Biến | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
TASK_RETRY_LIMIT | number | 8 (prod), unlimited (dev) | Số lần retry tối đa cho một task |
PROXY_RETRY_LIMIT | number | 15 (prod), unlimited (dev) | Số lần retry tối đa cho một proxy |
MAX_RETRY_COUNT | number | 3 (prod), unlimited (dev) | Số lần retry tối đa chung |
KILL_TRAFFIC_RATIO | number | 0.8 | Tỷ lệ kill traffic trong tổng allocation |
HOME_TRAFFIC_RATIO | number | 0.25 | Tỷ lệ home traffic trong tổng allocation |
HOME_TRAFFIC_PER_TARGET_LIMIT | number | 3 | Số home traffic task đồng thời cho cùng một URL |
HOME_TRAFFIC_LIMIT | number | 2 | Giới hạn tổng home traffic tasks |
TASK_TRAFFIC_LIMIT | number | CRON_TASK_LIMIT * 2 | Tổng traffic tasks tối đa trong queue |
SEARCH_TASK_LIMIT | number | 1000 (prod) | Tổng search tasks tối đa |
GEOLOCATION_RANDOM_RADIUS_KM | number | 2.0 | Bán kính ngẫu nhiên geolocation (km) |
FAKE_SUCCESS | boolean | false | Giả lập thành công (chỉ dùng để test) |
FAKE_SUCCESS_RATIO | number | 0.5 | Tỷ lệ giả lập thành công |
MODE | string | browser | Chế độ chạy: browser hoặc api |
ENABLE_ADS_RELATIONS | boolean | false | Bật ads relations matching |
ENABLE_GEOLOCATION | boolean | true | Bật geolocation spoofing |
ORIGINAL_SESSION_TASK_LIMIT | number | 0 | Giới hạn task dùng original session |
SEARCH_FLOW | string | click | Loại search flow: click hoặc report |
TASK_RETRY_LIMIT:retries_total tăng 1.retries_total > TASK_RETRY_LIMIT, task bị xóa và đánh dấu ERROR.KILL_TRAFFIC_RATIO:ResourceAllocator.0.8 = 80% slots cho kill traffic khi có kill tasks._getDefaultAllocation() trong resource-allocator.ts.HOME_TRAFFIC_PER_TARGET_LIMIT:LinkTracker dùng giá trị này để giới hạn.3: Tối đa 3 phiên Chrome cùng truy cập một URL.GEOLOCATION_RANDOM_RADIUS_KM:2.0 km: Vị trí có thể lệch tối đa 2km so với vị trí proxy.FAKE_SUCCESS:true, task được đánh dấu thành công mà không thực sự thực thi.FAKE_SUCCESS_RATIO: Tỷ lệ task được fake thành công (0.5 = 50%).| Biến | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
CAPTCHA_SOLVING_ENABLED | boolean | true | Bật/tắt toàn bộ module giải CAPTCHA |
CAPTCHA_FALLBACK_TO_MANUAL | boolean | true | Fallback sang OpenAI Vision khi Anti-Captcha thất bại |
ANTICAPTCHA_API_KEY | string | — | API key của anti-captcha.com |
ANTICAPTCHA_BASE_URL | string | https://api.anti-captcha.com | Base URL của Anti-Captcha API |
ANTICAPTCHA_TIMEOUT | number | 300000 | Timeout chờ giải CAPTCHA (ms) = 5 phút |
ANTICAPTCHA_RETRY_ATTEMPTS | number | 3 | Số lần retry khi giải thất bại |
CAPTCHA_SOLVING_ENABLED:false: Toàn bộ module CAPTCHA bị tắt. Tasks gặp CAPTCHA sẽ thất bại.true: Hệ thống tự động phát hiện và giải CAPTCHA.CAPTCHA_FALLBACK_TO_MANUAL:true: Nếu Anti-Captcha API thất bại, thử OpenAI Vision.false: Chỉ dùng Anti-Captcha API, không fallback.ANTICAPTCHA_API_KEY:ANTICAPTCHA_TIMEOUT:| Biến | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
CHATGPT_API_KEY | string | — | OpenAI API key (alias chính) |
OPENAI_API_KEY | string | Fallback về CHATGPT_API_KEY | OpenAI API key (alias phụ) |
CHATGPT_MODEL | string | gpt-4o-mini | Model mặc định (alias chính) |
OPENAI_MODEL | string | Fallback về CHATGPT_MODEL | Model mặc định (alias phụ) |
CHATGPT_API_KEY / OPENAI_API_KEY:CHATGPT_API_KEY.CHATGPT_MODEL / OPENAI_MODEL:gpt-4o-mini.gpt-4o-mini được chọn vì cân bằng giữa chi phí và chất lượng.gpt-4o vì chi phí cao hơn nhiều.| Biến | Mô tả |
|---|---|
DIGITAL_OCEAN_BUCKET_NAME | Tên bucket, ví dụ tools-greeting1073 |
DIGITAL_OCEAN_REGION | Region: sgp1 (Singapore) |
DIGITAL_OCEAN_ACCESS_KEY_ID | Access Key ID |
DIGITAL_OCEAN_SECRET_ACCESS_KEY | Secret Access Key |
DIGITAL_OCEAN_ENDPOINT | Endpoint: https://sgp1.digitaloceanspaces.com |
DIGITAL_OCEAN_CDN_URL | CDN URL: https://tools-greeting1073.sgp1.cdn.digitaloceanspaces.com |
| Biến | Mô tả |
|---|---|
CLOUDINARY_CLOUD_NAME | Cloud name |
CLOUDINARY_API_KEY | API Key |
CLOUDINARY_API_SECRET | API Secret |
CLOUDINARY_UPLOAD_PRESET | Upload preset |
storage/screenshots/.| Biến | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
SMTP_HOST | string | smtp.gmail.com | SMTP server hostname |
SMTP_PORT | string | 587 | SMTP port |
SMTP_SECURE | string | false | Dùng SSL/TLS (true) hay STARTTLS (false) |
SMTP_USER | string | — | Email address |
SMTP_PASS | string | — | App password (không phải mật khẩu Gmail thường) |
SMTP_PASS.SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_SECURE=false
SMTP_USER=your-email@gmail.com
SMTP_PASS=xxxx xxxx xxxx xxxxSMTP_HOST=smtp.sendgrid.net
SMTP_PORT=587
SMTP_SECURE=false
SMTP_USER=apikey
SMTP_PASS=SG.your-sendgrid-api-key| Biến | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
ZING_PROXY_API_KEY | string | JWT token mặc định | API key của ZingProxy |
ZING_PROXY_BASE_URL | string | https://api.zingproxy.com/proxy | Base URL của ZingProxy API |
ZING_PROXY_BASE_URL là endpoint để lấy proxy mới từ ZingProxy. Được dùng bởi zing-proxy.service.ts.| Biến | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
LOG_LEVEL | string | info | Mức log: debug, info, warn, error |
LOG_SERVICE | string | app | Tên service mặc định trong log |
LOG_TIMESTAMP | boolean | false | Thêm timestamp vào log |
LOG_COLORIZED | boolean | false | Tô màu log trong console |
LOG_WRITE_TO_FILE | boolean | false | Ghi log ra file |
LOG_WRITE_TO_CONSOLE | boolean | false | In log ra console |
LOG_DIR | string | storage/log | Thư mục lưu log files |
LOG_FOR_RECORD | boolean | false | Ghi log chi tiết cho audit |
ENABLE_SCREENSHOTS | string | true | Bật/tắt chụp màn hình bằng chứng |
LOG_LEVEL=debug
LOG_COLORIZED=true
LOG_WRITE_TO_FILE=true
LOG_WRITE_TO_CONSOLE=true
LOG_TIMESTAMP=true
LOG_FOR_RECORD=trueLOG_LEVEL=info
LOG_COLORIZED=false
LOG_WRITE_TO_FILE=true
LOG_WRITE_TO_CONSOLE=true
LOG_TIMESTAMP=true
LOG_FOR_RECORD=truedebug: Log tất cả, bao gồm cursor coordinates, network calls. Rất verbose.info: Log các sự kiện quan trọng: task start/complete, proxy rotation.warn: Log cảnh báo: proxy chậm, retry attempts.error: Chỉ log lỗi nghiêm trọng.info để tránh log quá nhiều làm đầy disk.| Biến | Development | Staging | Production |
|---|---|---|---|
NODE_ENV | development | production | production |
DEBUG | true | false | false |
PORT | 3005 | 3005 | 3005 |
API_HOST | http://localhost:33001 | URL staging | URL production |
SERVER_ID | IP máy dev | IP server staging | IP server production |
CRON_TASK_LIMIT | 25 (hardcode) | 25 (hardcode) | 25 (hardcode) |
BROWSER_LIMIT_PER_PROCESS | 1 (forced) | Theo RAM server | Theo RAM server |
TASK_RETRY_LIMIT | Unlimited | 8 | 8 |
PROXY_RETRY_LIMIT | Unlimited | 15 | 15 |
LOG_LEVEL | debug | info | info |
LOG_COLORIZED | true | false | false |
CAPTCHA_SOLVING_ENABLED | true | true | true |
CAPTCHA_FALLBACK_TO_MANUAL | false | true | true |
DB_MONGO_HOST | localhost | Container name | Container name |
NODE_ENV: Ảnh hưởng đến isLocal flag và nhiều behaviors.API_HOST: URL của Go API Backend tương ứng.SERVER_ID: Phải là IP hoặc identifier duy nhất của server.DB_MONGO_HOST: localhost khi dev, container name khi trong Docker.IP_ALLOWED: Danh sách IP được phép gọi API.BROWSER_LIMIT_PER_PROCESS: Tùy theo RAM của server..docker/dev/Dockerfileoven/bun:latest làm base image.bun run dev)..docker/dev/. Thay vào đó, CI/CD pipeline build image riêng trên Bastion Build Server và push lên AWS ECR.docker buildx build.latest và commit hash.env_file: .env trong docker-compose.yml.environment: section trong docker-compose.yml.-e VAR=value khi chạy docker run..env trên server và mount vào container.API_KEY: Token xác thực với Go API.WEBHOOK_API_KEY: Token xác thực webhook.ANTICAPTCHA_API_KEY: API key Anti-Captcha (tính phí).CHATGPT_API_KEY / OPENAI_API_KEY: OpenAI API key (tính phí).DIGITAL_OCEAN_SECRET_ACCESS_KEY: AWS-compatible secret key.CLOUDINARY_API_SECRET: Cloudinary secret.SMTP_PASS: Gmail App Password.ZING_PROXY_API_KEY: ZingProxy JWT token.DB_MONGO_PASSWORD: MongoDB password..env phải có trong .gitignore..gitignore.gitignore phải bao gồm:.env
.env.backup
storage/
tmp/
dist/
node_modules/.env trên tất cả servers.