Skip to content

Biến Môi trường

Thông tin Tài liệu

TrườngGiá trị
Tệp Nguồnpackages/core/src/common/environments.ts (93 dòng)
LớpEnvironmentKeys extends BaseEnvironmentKeys
Tổng số Biến65+ (11 kế thừa + 54 dành riêng cho ứng dụng)
FrameworkBiến Môi trường IGNIS

1. Tổng quan

Lớp EnvironmentKeys trong @nx/core mở rộng BaseEnvironmentKeys của framework IGNIS để định nghĩa tất cả biến môi trường được sử dụng trên các dịch vụ BANA. Mọi biến tuân theo quy ước tiền tố APP_ENV_.

typescript
import { EnvironmentKeys as BaseEnvironmentKeys } from '@venizia/ignis';

export class EnvironmentKeys extends BaseEnvironmentKeys {
  static readonly APP_ENV_NODE_ENV = 'APP_ENV_NODE_ENV';
  // ... 54 application-specific keys
}

Chuỗi kế thừa:

BaseEnvironmentKeys (IGNIS)     ← Application, JWT, Server, PostgreSQL
  └── EnvironmentKeys (@nx/core) ← Redis, Minio, Mail, WebSocket, Kafka, etc.

Tất cả biến được truy cập qua applicationEnvironment.get():

typescript
import { applicationEnvironment } from '@venizia/ignis';
import { EnvironmentKeys } from '@nx/core';

const host = applicationEnvironment.get<string>(EnvironmentKeys.APP_ENV_POSTGRES_HOST);

Để tham khảo đầy đủ các biến cơ sở IGNIS, xem tài liệu Biến Môi trường IGNIS.

2. Kế thừa từ IGNIS (BaseEnvironmentKeys)

Các biến này được định nghĩa trong framework IGNIS và được EnvironmentKeys kế thừa thông qua mở rộng lớp. Chúng có sẵn trong mọi dịch vụ BANA mà không cần khai báo lại.

Ứng dụng

BiếnKiểuMặc địnhMô tả
APP_ENV_APPLICATION_NAMEstringAPPTên ứng dụng dùng trong log và nhận dạng
APP_ENV_APPLICATION_SECRETstring--Khóa bí mật mã hóa ứng dụng cho mã hóa payload JWT
APP_ENV_APPLICATION_TIMEZONEstringAsia/Ho_Chi_MinhMúi giờ mặc định cho thao tác ngày tháng
APP_ENV_APPLICATION_ROLESstring--Danh sách phân cách bằng dấu phẩy các định danh vai trò ứng dụng

Xác thực JWT

BiếnKiểuMặc địnhMô tả
APP_ENV_JWT_SECRETstring--Khóa bí mật để ký token JWT
APP_ENV_JWT_EXPIRES_INnumber86400Thời gian hết hạn token JWT tính bằng giây (mặc định 24 giờ)

Máy chủ

BiếnKiểuMặc địnhMô tả
APP_ENV_SERVER_HOSTstringlocalhostĐịa chỉ bind máy chủ
APP_ENV_SERVER_PORTnumber3000Cổng lắng nghe máy chủ
APP_ENV_SERVER_BASE_PATHstring/Tiền tố đường dẫn cơ sở cho tất cả route

PostgreSQL

BiếnKiểuMặc địnhMô tả
APP_ENV_POSTGRES_HOSTstringlocalhostHost máy chủ PostgreSQL
APP_ENV_POSTGRES_PORTnumber5432Cổng máy chủ PostgreSQL
APP_ENV_POSTGRES_DATABASEstring--Tên cơ sở dữ liệu
APP_ENV_POSTGRES_USERNAMEstringpostgresTên người dùng cơ sở dữ liệu
APP_ENV_POSTGRES_PASSWORDstring--Mật khẩu cơ sở dữ liệu

3. Ứng dụng

Các biến dành riêng cho cấu hình ứng dụng BANA.

BiếnKiểuMặc địnhMô tả
APP_ENV_NODE_ENVstringdevelopmentMôi trường runtime (development, test, staging, production)
APP_ENV_APPLICATION_EXPLORER_URLstring--URL cho API explorer / Swagger UI
APP_ENV_PARSE_RESULT_FOLDER_PATHstring--Đường dẫn thư mục tạm cho kết quả phân tích tệp

4. Bộ Tạo Snowflake ID

Cấu hình cho bộ tạo Snowflake ID phân tán. Mỗi instance dịch vụ phải có worker ID duy nhất để tránh xung đột.

BiếnKiểuMặc địnhMô tả
APP_ENV_SNOWFLAKE_WORKER_IDnumber--Worker ID duy nhất (0--1023) cho instance dịch vụ này
APP_ENV_SNOWFLAKE_EPOCH_CHECKPOINTnumber--Dấu thời gian epoch tùy chỉnh tính bằng millisecond (ví dụ: 1704067200000 cho 2024-01-01)

5. Minio (Lưu trữ Tương thích S3)

Cài đặt kết nối cho lưu trữ đối tượng MinIO, được dịch vụ asset sử dụng cho tải lên tệp và tạo URL có chữ ký.

BiếnKiểuMặc địnhMô tả
APP_ENV_MINIO_HOSTstring--Tên host máy chủ MinIO
APP_ENV_MINIO_API_PORTnumber9000Cổng API MinIO
APP_ENV_MINIO_ACCESS_KEYstring--ID khóa truy cập MinIO
APP_ENV_MINIO_SECRET_KEYstring--Khóa truy cập bí mật MinIO

6. Redis -- BullMQ (Hàng đợi Công việc)

Kết nối Redis chuyên dụng cho hàng đợi công việc BullMQ. Được sử dụng bởi các dịch vụ xử lý công việc nền (sale, payment, finance, mq-pay).

BiếnKiểuMặc địnhMô tả
APP_ENV_BULLMQ_REDIS_IDENTIFIERstring--Định danh kết nối cho log và chẩn đoán
APP_ENV_BULLMQ_REDIS_HOSTstring--Host Redis cho BullMQ
APP_ENV_BULLMQ_REDIS_PORTnumber6379Cổng Redis
APP_ENV_BULLMQ_REDIS_DBnumber0Số cơ sở dữ liệu Redis
APP_ENV_BULLMQ_REDIS_PASSWORDstring--Mật khẩu Redis (tùy chọn nếu không có xác thực)
APP_ENV_BULLMQ_REDIS_MAX_RETRYnumber--Số lần thử kết nối lại tối đa

7. Redis -- Cache

Kết nối Redis chuyên dụng cho bộ nhớ đệm ứng dụng. Được sử dụng bởi các dịch vụ để cache tra cứu (ví dụ: loại theo dõi kho, cấu hình thanh toán).

BiếnKiểuMặc địnhMô tả
APP_ENV_CACHE_REDIS_IDENTIFIERstring--Định danh kết nối cho log và chẩn đoán
APP_ENV_CACHE_REDIS_HOSTstring--Host Redis cho bộ nhớ đệm
APP_ENV_CACHE_REDIS_PORTnumber6379Cổng Redis
APP_ENV_CACHE_REDIS_DBnumber0Số cơ sở dữ liệu Redis
APP_ENV_CACHE_REDIS_PASSWORDstring--Mật khẩu Redis (tùy chọn nếu không có xác thực)
APP_ENV_CACHE_REDIS_MAX_RETRYnumber--Số lần thử kết nối lại tối đa

8. Redis -- PubSub Subscriber

Kết nối Redis chuyên dụng cho phía subscriber của pub/sub. Được sử dụng bởi các dịch vụ lắng nghe sự kiện liên dịch vụ (ví dụ: finance lắng nghe sự kiện payment).

BiếnKiểuMặc địnhMô tả
APP_ENV_PUBSUB_SUBSCRIBER_REDIS_IDENTIFIERstring--Định danh kết nối cho log và chẩn đoán
APP_ENV_PUBSUB_SUBSCRIBER_REDIS_HOSTstring--Host Redis cho subscriber
APP_ENV_PUBSUB_SUBSCRIBER_REDIS_PORTnumber6379Cổng Redis
APP_ENV_PUBSUB_SUBSCRIBER_REDIS_DBnumber0Số cơ sở dữ liệu Redis
APP_ENV_PUBSUB_SUBSCRIBER_REDIS_PASSWORDstring--Mật khẩu Redis (tùy chọn nếu không có xác thực)
APP_ENV_PUBSUB_SUBSCRIBER_REDIS_MAX_RETRYnumber--Số lần thử kết nối lại tối đa

9. Redis -- PubSub Publisher

Kết nối Redis chuyên dụng cho phía publisher của pub/sub. Được sử dụng bởi các dịch vụ phát sự kiện liên dịch vụ (ví dụ: payment phát sự kiện thanh toán thành công).

BiếnKiểuMặc địnhMô tả
APP_ENV_PUBSUB_PUBLISHER_REDIS_IDENTIFIERstring--Định danh kết nối cho log và chẩn đoán
APP_ENV_PUBSUB_PUBLISHER_REDIS_HOSTstring--Host Redis cho publisher
APP_ENV_PUBSUB_PUBLISHER_REDIS_PORTnumber6379Cổng Redis
APP_ENV_PUBSUB_PUBLISHER_REDIS_DBnumber0Số cơ sở dữ liệu Redis
APP_ENV_PUBSUB_PUBLISHER_REDIS_PASSWORDstring--Mật khẩu Redis (tùy chọn nếu không có xác thực)
APP_ENV_PUBSUB_PUBLISHER_REDIS_MAX_RETRYnumber--Số lần thử kết nối lại tối đa

10. Redis -- WebSocket

Kết nối Redis cho phân phối tin nhắn WebSocket liên instance. Hỗ trợ cả chế độ đơn node và cluster. Được sử dụng riêng bởi dịch vụ @nx/signal.

BiếnKiểuMặc địnhMô tả
APP_ENV_WEBSOCKET_REDIS_MODEstringsingleChế độ Redis: single hoặc cluster
APP_ENV_WEBSOCKET_REDIS_IDENTIFIERstring--Định danh kết nối (chế độ single)
APP_ENV_WEBSOCKET_REDIS_HOSTstring--Host Redis (chế độ single)
APP_ENV_WEBSOCKET_REDIS_PORTnumber6379Cổng Redis (chế độ single)
APP_ENV_WEBSOCKET_REDIS_DBnumber0Số cơ sở dữ liệu Redis (chế độ single)
APP_ENV_WEBSOCKET_REDIS_PASSWORDstring--Mật khẩu Redis (chế độ single, tùy chọn)
APP_ENV_WEBSOCKET_REDIS_MAX_RETRYnumber--Số lần thử kết nối lại tối đa (chế độ single)
APP_ENV_WEBSOCKET_REDIS_CLUSTER_IDENTIFIERstring--Định danh kết nối (chế độ cluster)
APP_ENV_WEBSOCKET_REDIS_CLUSTER_NODESstring--Địa chỉ các node cluster phân cách bằng dấu phẩy (ví dụ: node1:6379,node2:6379,node3:6379)

Ví dụ chế độ single:

bash
APP_ENV_WEBSOCKET_REDIS_MODE=single
APP_ENV_WEBSOCKET_REDIS_HOST=localhost
APP_ENV_WEBSOCKET_REDIS_PORT=6379
APP_ENV_WEBSOCKET_REDIS_DB=0

Ví dụ chế độ cluster:

bash
APP_ENV_WEBSOCKET_REDIS_MODE=cluster
APP_ENV_WEBSOCKET_REDIS_CLUSTER_NODES=redis-node1:6379,redis-node2:6379,redis-node3:6379

11. Mã hóa WebSocket ECDH

Tham số mã hóa cho trao đổi khóa ECDH P-256 được sử dụng bởi dịch vụ signal. Giá trị này được dùng làm tham số info trong dẫn xuất khóa HKDF để tạo khóa mã hóa AES-256-GCM dùng chung.

BiếnKiểuMặc địnhMô tả
APP_ENV_WEBSOCKET_ECDH_INFOstring--Chuỗi info HKDF cho dẫn xuất khóa chia sẻ ECDH

12. Mail (SMTP)

Cấu hình SMTP và OAuth2 cho thành phần email. Hỗ trợ xác thực SMTP cơ bản và Gmail OAuth2.

BiếnKiểuMặc địnhMô tả
APP_ENV_MAIL_HOSTstringsmtp.gmail.comTên host máy chủ SMTP
APP_ENV_MAIL_PORTnumber465Cổng máy chủ SMTP
APP_ENV_MAIL_SECUREbooleantrueBật TLS cho kết nối SMTP
APP_ENV_MAIL_USERstring--Tên người dùng SMTP hoặc địa chỉ email người gửi
APP_ENV_MAIL_CLIENT_IDstring--OAuth2 client ID (cho Gmail)
APP_ENV_MAIL_CLIENT_SECRETstring--OAuth2 client secret
APP_ENV_MAIL_REFRESH_TOKENstring--OAuth2 refresh token
APP_ENV_MAIL_QUEUE_TYPEstringinternalKiểu hàng đợi cho gửi mail (internal hoặc hàng đợi bên ngoài)
APP_ENV_MAIL_INTERNAL_QUEUE_IDENTIFIERstring--Định danh cho hàng đợi mail nội bộ

13. URL Dịch vụ (Giao tiếp Liên Dịch vụ)

URL cơ sở cho giao tiếp HTTP liên dịch vụ qua IdentityNetworkService và các dịch vụ mạng khác.

BiếnKiểuMặc địnhMô tả
APP_ENV_IDENTITY_SERVICE_BASE_URLstring--URL cơ sở dịch vụ Identity (ví dụ: http://localhost:3001)
APP_ENV_COMMERCE_SERVICE_BASE_URLstring--URL cơ sở dịch vụ Commerce (ví dụ: http://localhost:3002)

14. T-VAN / IIAPI (Hóa đơn Điện tử Việt Nam)

Cấu hình cho tích hợp hóa đơn điện tử Việt Nam.

BiếnKiểuMặc địnhMô tả
APP_ENV_VNPAY_IIAPI_CLIENT_NAMEstring--Định danh client có tên cho registry IIAPI
APP_ENV_VNPAY_TVAN_API_KEYstring--API key cho xác thực dịch vụ T-VAN

15. Kafka

Cài đặt kết nối Apache Kafka cho truyền phát sự kiện. Được sử dụng khi nhắn tin dựa trên Kafka được bật.

BiếnKiểuMặc địnhMô tả
APP_ENV_KAFKA_BROKERSstring--Địa chỉ broker phân cách bằng dấu phẩy (ví dụ: kafka1:9092,kafka2:9092)
APP_ENV_KAFKA_CLIENT_IDstring--Định danh Kafka client
APP_ENV_KAFKA_GROUP_IDstring--Định danh nhóm consumer

16. Tải Tệp Môi trường

BANA sử dụng dotenv-flow để tải biến môi trường. Mỗi gói duy trì tập hợp tệp .env riêng.

Cấu trúc Tệp

packages/<service>/
├── .env                    # Base defaults (committed)
├── .env.local              # Local overrides (gitignored)
├── .env.development        # Development environment
├── .env.test               # Test environment
├── .env.staging            # Staging environment
├── .env.production         # Production environment
└── .env.example            # Template for team reference (committed)

Thứ tự Tải (dotenv-flow)

Các tệp được tải theo thứ tự sau. Tệp sau ghi đè tệp trước:

  1. .env -- giá trị mặc định cơ sở
  2. .env.local -- ghi đè cục bộ
  3. .env.{NODE_ENV} -- giá trị dành riêng cho môi trường (ví dụ: .env.development)
  4. .env.{NODE_ENV}.local -- ghi đè cục bộ dành riêng cho môi trường

17. Tệp .env.example Đầy đủ

bash
# =============================================
# NX-SELLER ENVIRONMENT VARIABLES
# =============================================
# Copy this file to .env.development and fill in values.

# =============================================
# APPLICATION
# =============================================
APP_ENV_NODE_ENV=development
APP_ENV_APPLICATION_NAME=my-service
APP_ENV_APPLICATION_SECRET=generate-a-strong-random-secret
APP_ENV_APPLICATION_EXPLORER_URL=
APP_ENV_APPLICATION_TIMEZONE=Asia/Ho_Chi_Minh
APP_ENV_PARSE_RESULT_FOLDER_PATH=/tmp/parsed-results

# =============================================
# SERVER
# =============================================
APP_ENV_SERVER_HOST=0.0.0.0
APP_ENV_SERVER_PORT=3000
APP_ENV_SERVER_BASE_PATH=/v1/api

# =============================================
# JWT AUTHENTICATION
# =============================================
APP_ENV_JWT_SECRET=generate-another-strong-random-secret
APP_ENV_JWT_EXPIRES_IN=86400

# =============================================
# POSTGRESQL
# =============================================
APP_ENV_POSTGRES_HOST=localhost
APP_ENV_POSTGRES_PORT=5432
APP_ENV_POSTGRES_DATABASE=bana
APP_ENV_POSTGRES_USERNAME=postgres
APP_ENV_POSTGRES_PASSWORD=password

# =============================================
# SNOWFLAKE ID GENERATOR
# =============================================
APP_ENV_SNOWFLAKE_WORKER_ID=1
APP_ENV_SNOWFLAKE_EPOCH_CHECKPOINT=1704067200000

# =============================================
# MINIO (S3-Compatible Storage)
# =============================================
APP_ENV_MINIO_HOST=localhost
APP_ENV_MINIO_API_PORT=9000
APP_ENV_MINIO_ACCESS_KEY=minioadmin
APP_ENV_MINIO_SECRET_KEY=minioadmin

# =============================================
# REDIS - BullMQ (Job Queues)
# =============================================
APP_ENV_BULLMQ_REDIS_IDENTIFIER=bullmq
APP_ENV_BULLMQ_REDIS_HOST=localhost
APP_ENV_BULLMQ_REDIS_PORT=6379
APP_ENV_BULLMQ_REDIS_DB=1
APP_ENV_BULLMQ_REDIS_PASSWORD=
APP_ENV_BULLMQ_REDIS_MAX_RETRY=5

# =============================================
# REDIS - Cache
# =============================================
APP_ENV_CACHE_REDIS_IDENTIFIER=cache
APP_ENV_CACHE_REDIS_HOST=localhost
APP_ENV_CACHE_REDIS_PORT=6379
APP_ENV_CACHE_REDIS_DB=0
APP_ENV_CACHE_REDIS_PASSWORD=
APP_ENV_CACHE_REDIS_MAX_RETRY=5

# =============================================
# REDIS - PubSub Subscriber
# =============================================
APP_ENV_PUBSUB_SUBSCRIBER_REDIS_IDENTIFIER=pubsub-subscriber
APP_ENV_PUBSUB_SUBSCRIBER_REDIS_HOST=localhost
APP_ENV_PUBSUB_SUBSCRIBER_REDIS_PORT=6379
APP_ENV_PUBSUB_SUBSCRIBER_REDIS_DB=0
APP_ENV_PUBSUB_SUBSCRIBER_REDIS_PASSWORD=
APP_ENV_PUBSUB_SUBSCRIBER_REDIS_MAX_RETRY=5

# =============================================
# REDIS - PubSub Publisher
# =============================================
APP_ENV_PUBSUB_PUBLISHER_REDIS_IDENTIFIER=pubsub-publisher
APP_ENV_PUBSUB_PUBLISHER_REDIS_HOST=localhost
APP_ENV_PUBSUB_PUBLISHER_REDIS_PORT=6379
APP_ENV_PUBSUB_PUBLISHER_REDIS_DB=0
APP_ENV_PUBSUB_PUBLISHER_REDIS_PASSWORD=
APP_ENV_PUBSUB_PUBLISHER_REDIS_MAX_RETRY=5

# =============================================
# REDIS - WebSocket (Single Mode)
# =============================================
APP_ENV_WEBSOCKET_REDIS_MODE=single
APP_ENV_WEBSOCKET_REDIS_IDENTIFIER=websocket
APP_ENV_WEBSOCKET_REDIS_HOST=localhost
APP_ENV_WEBSOCKET_REDIS_PORT=6379
APP_ENV_WEBSOCKET_REDIS_DB=0
APP_ENV_WEBSOCKET_REDIS_PASSWORD=
APP_ENV_WEBSOCKET_REDIS_MAX_RETRY=5

# REDIS - WebSocket (Cluster Mode — uncomment to use)
# APP_ENV_WEBSOCKET_REDIS_MODE=cluster
# APP_ENV_WEBSOCKET_REDIS_CLUSTER_IDENTIFIER=websocket-cluster
# APP_ENV_WEBSOCKET_REDIS_CLUSTER_NODES=node1:6379,node2:6379,node3:6379

# =============================================
# WEBSOCKET ECDH ENCRYPTION
# =============================================
APP_ENV_WEBSOCKET_ECDH_INFO=bana-websocket-encryption

# =============================================
# MAIL (SMTP / Gmail OAuth2)
# =============================================
APP_ENV_MAIL_HOST=smtp.gmail.com
APP_ENV_MAIL_PORT=465
APP_ENV_MAIL_SECURE=true
APP_ENV_MAIL_USER=noreply@example.com
APP_ENV_MAIL_CLIENT_ID=
APP_ENV_MAIL_CLIENT_SECRET=
APP_ENV_MAIL_REFRESH_TOKEN=
APP_ENV_MAIL_QUEUE_TYPE=internal
APP_ENV_MAIL_INTERNAL_QUEUE_IDENTIFIER=

# =============================================
# INTER-SERVICE COMMUNICATION
# =============================================
APP_ENV_IDENTITY_SERVICE_BASE_URL=http://localhost:3001
APP_ENV_COMMERCE_SERVICE_BASE_URL=http://localhost:3002

# =============================================
# T-VAN / IIAPI (Vietnam E-Invoice)
# =============================================
APP_ENV_VNPAY_IIAPI_CLIENT_NAME=
APP_ENV_VNPAY_TVAN_API_KEY=

# =============================================
# KAFKA (Event Streaming)
# =============================================
APP_ENV_KAFKA_BROKERS=localhost:9092
APP_ENV_KAFKA_CLIENT_ID=bana
APP_ENV_KAFKA_GROUP_ID=bana-group

18. Sử dụng trong Mã nguồn

Đọc Biến

typescript
import { applicationEnvironment } from '@venizia/ignis';
import { EnvironmentKeys } from '@nx/core';

// String value
const host = applicationEnvironment.get<string>(EnvironmentKeys.APP_ENV_POSTGRES_HOST);

// Number value (requires parsing)
const port = parseInt(
  applicationEnvironment.get<string>(EnvironmentKeys.APP_ENV_POSTGRES_PORT) || '5432',
);

// Boolean value
const secure = applicationEnvironment.get<string>(EnvironmentKeys.APP_ENV_MAIL_SECURE) === 'true';

// With fallback default
const nodeEnv = applicationEnvironment.get<string>(EnvironmentKeys.APP_ENV_NODE_ENV)
  ?? 'development';

Xác thực Khi Khởi động

typescript
function validateEnvironment() {
  const required = [
    EnvironmentKeys.APP_ENV_POSTGRES_HOST,
    EnvironmentKeys.APP_ENV_POSTGRES_DATABASE,
    EnvironmentKeys.APP_ENV_SNOWFLAKE_WORKER_ID,
    EnvironmentKeys.APP_ENV_JWT_SECRET,
    EnvironmentKeys.APP_ENV_APPLICATION_SECRET,
  ];

  const missing = required.filter(key => !applicationEnvironment.get(key));

  if (missing.length > 0) {
    throw new Error(`Missing required environment variables: ${missing.join(', ')}`);
  }
}

19. Thực hành Bảo mật Tốt nhất

Không Bao giờ Commit Bí mật

bash
# .gitignore
.env.local
.env.*.local
.env.production

Sử dụng Bí mật Khác nhau cho Mỗi Môi trường

bash
# Development
APP_ENV_JWT_SECRET=dev-secret-not-for-production

# Production (from secret manager)
APP_ENV_JWT_SECRET=<from-vault-or-k8s-secret>

Sử dụng Trình Quản lý Bí mật trong Production

yaml
# Kubernetes Secret
apiVersion: v1
kind: Secret
metadata:
  name: app-secrets
stringData:
  APP_ENV_JWT_SECRET: "production-jwt-secret"
  APP_ENV_APPLICATION_SECRET: "production-app-secret"
  APP_ENV_POSTGRES_PASSWORD: "production-db-password"

Xoay vòng Bí mật Thường xuyên

Lên lịch xoay vòng thường xuyên cho:

  • APP_ENV_JWT_SECRET
  • APP_ENV_APPLICATION_SECRET
  • APP_ENV_POSTGRES_PASSWORD
  • APP_ENV_MINIO_SECRET_KEY
  • APP_ENV_MAIL_CLIENT_SECRET
  • APP_ENV_VNPAY_TVAN_API_KEY

Tài liệu Liên quan

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.