환경 변수
환경 변수를 변경하려면 Remnawave 컨테이너를 다시 생성해야 합니다.
컨테이너를 단순히 재시작하면 컨테이너 내 환경이 교체되지 않습니다!
docker compose를 사용하여 컨테이너를 다시 생성하려면 docker compose down && docker compose up -d를 실행하세요.
환경 변수 변경
.env 파일을 편집하여 환경 변수를 변경할 수 있습니다. 대부분 /opt/remnawave에 위치합니다.
cd /opt/remnawave && nano .env
포트
| 변수 | 설명 | 기본값 |
|---|---|---|
APP_PORT | Remnawave 패널이 실행되는 포트 | 3000 |
METRICS_PORT | Metrics 엔드포인트가 실행되는 포트 | 3001 |
예시
APP_PORT=3000
METRICS_PORT=3001
API 스케일링
실행할 API 인스턴스 수.
가능한 값:
max(모든 코어에서 인스턴스 시작)<number>(특정 코어 수에서 인스턴스 시작)-1(모든 코어 - 1에서 인스턴스 시작)
인스턴스 1개만 시작하려면 기본값 그대로 두세요.
대부분의 사용자는 이 값을 변경할 필요가 없지만 40,000명 이상의 사용자로 더 나은 성능을 달성하는 데 도움이 될 수 있습니다.
이 값을 머신의 CPU 코어 수보다 큰 숫자로 설정하지 마세요.
| 변수 | 설명 | 기본값 |
|---|---|---|
API_INSTANCES | 실행할 API 인스턴스 수 | 1 |
예시
API_INSTANCES=1
Redis
| 변수 | 설명 | 기본값 | 필수 |
|---|---|---|---|
REDIS_HOST | Redis 서버의 호스트 | remnawave-redis | 예 |
REDIS_PORT | Redis 서버의 포트 | 6379 | 예 |
REDIS_DB | Redis 서버의 데이터베이스 | 0 | 아니요 |
REDIS_PASSWORD | Redis 서버의 비밀번호 | 아니요 | |
REDIS_SOCKET | Redis 서버의 소켓 | 아니요 |
예시
REDIS_HOST=remnawave-redis
REDIS_PORT=6379
데이터베이스
아래 변수들은 Remnawave가 아닌 데이터베이스 컨테이너에서 사용됩니다.
| 변수 | 설명 | 기본값 | 필수 |
|---|---|---|---|
POSTGRES_USER | Postgres 서버의 사용자 이름 | postgres | 아니요 |
POSTGRES_PASSWORD | Postgres 서버의 비밀번호 | postgres | 아니요 |
POSTGRES_DB | Postgres 서버의 데이터베이스 | postgres | 아니요 |
Remnawave는 PostgreSQL URL을 사용하여 데이터베이스에 연결합니다.
postgresql://{user}:{password}@{host}:{port}/{database}
DATABASE_URL="postgresql://postgres:postgres@remnawave-db:5432/postgres"
예시
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DB=postgres
DATABASE_URL="postgresql://postgres:postgres@remnawave-db:5432/postgres"
시크릿 키
최소 64자 길이의 시크릿을 생성하기 위해 랜덤 문자열 생성기를 사용하는 것이 좋습니다.
프로덕션에서 기본 자격 증명을 사용하지 마세요. 강력한 시크릿을 반드시 생성하세요!
openssl rand -hex 64
| 변수 | 설명 | 기본값 | 필수 |
|---|---|---|---|
JWT_AUTH_SECRET | 인증 JWT의 시크릿 키 | change_me | 예 |
JWT_API_TOKENS_SECRET | API 토큰 JWT의 시크릿 키 | change_me | 예 |
예시
JWT_AUTH_SECRET=strong_secret_key
JWT_API_TOKENS_SECRET=strong_secret_key
Telegram 알림
각 알림 변수는 통합 형식을 사용합니다: chat_id:thread_id, thread_id는 선택 사항.
| 변수 | 설명 | 기본값 | 가능한 값 |
|---|---|---|---|
IS_TELEGRAM_NOTIFICATIONS_ENABLED | Telegram 알림 비활성화/활성화 | false | true, false |
TELEGRAM_BOT_TOKEN | Telegram 봇의 토큰 | ||
TELEGRAM_BOT_API_ROOT | 사용자 지정 Telegram Bot API 루트 URL (선택) | https://api.telegram.org | |
TELEGRAM_BOT_PROXY | Telegram 봇용 프록시 (선택) | protocol://user:password@host:port | |
TELEGRAM_NOTIFY_USERS | 사용자 이벤트 알림 | chat_id 또는 chat_id:thread_id | |
TELEGRAM_NOTIFY_NODES | 노드 이벤트 알림 | chat_id 또는 chat_id:thread_id | |
TELEGRAM_NOTIFY_CRM | CRM 이벤트 알림 | chat_id 또는 chat_id:thread_id | |
TELEGRAM_NOTIFY_SERVICE | 서비스 이벤트 알림 | chat_id 또는 chat_id:thread_id | |
TELEGRAM_NOTIFY_TBLOCKER | Torrent Blocker 이벤트 알림 | chat_id 또는 chat_id:thread_id |
Telegram 그룹 채팅 ID는 항상 -100으로 시작합니다.
예시
# Telegram 알림 비활성화/활성화
IS_TELEGRAM_NOTIFICATIONS_ENABLED=false
# Telegram 봇 토큰
TELEGRAM_BOT_TOKEN=change_me
# 선택: Telegram 봇용 프록시
# TELEGRAM_BOT_PROXY=socks5://user:password@host:port
# 알림 (형식: chat_id 또는 chat_id:thread_id)
TELEGRAM_NOTIFY_USERS=change_me
TELEGRAM_NOTIFY_NODES=change_me
TELEGRAM_NOTIFY_CRM=change_me
TELEGRAM_NOTIFY_SERVICE=change_me
TELEGRAM_NOTIFY_TBLOCKER=change_me
도메인
| 변수 | 설명 | 기본값 | 필수 |
|---|---|---|---|
FRONT_END_DOMAIN | Remnawave 패널의 도메인. CORS 헤더 설정에 사용. | * | 예 |
| 변수 | 설명 | 기본값 | 필수 |
|---|---|---|---|
SUB_PUBLIC_DOMAIN | 공개 구독 URL의 도메인과 경로 | example.com/api/sub | 예 |
| 변수 | 설명 | 기본값 | 필수 |
|---|---|---|---|
PANEL_DOMAIN | 직접 링크 생성을 위한 패널 도메인 (예: 인라인 버튼이 있는 Telegram 알림) | 아니요 |
SUB_PUBLIC_DOMAIN은 RestAPI 응답/대시보드 UI에서 공개 구독 URL을 설정하는 데 사용됩니다.
패널과 함께 사용하는 경우 yourpanel.com/api/sub로 설정하세요
예시
FRONT_END_DOMAIN=yourpanel.com
SUB_PUBLIC_DOMAIN=yourpanel.com/api/sub
PANEL_DOMAIN=yourpanel.com
문서
| 변수 | 설명 | 기본값 | 가능한 값 |
|---|---|---|---|
IS_DOCS_ENABLED | 문서 비활성화/활성화 | false | true, false |
IS_DOCS_ENABLED는 문서를 비활성화/활성화하는 데 사용됩니다.
관리자 대시보드의 API Keys 페이지(IS_DOCS_ENABLED가 true로 설정된 경우)에서 문서로의 빠른 링크를 사용할 수 있습니다.
| 변수 | 설명 | 기본값 |
|---|---|---|
SWAGGER_PATH | Swagger UI 경로 | /docs |
SCALAR_PATH | Scalar UI 경로 | /scalar |
예시
IS_DOCS_ENABLED=true
SWAGGER_PATH=/docs
SCALAR_PATH=/scalar
Prometheus 메트릭
다음 명령을 사용하여 메트릭용 랜덤 비밀번호를 생성할 수 있습니다:
openssl rand -hex 64
| 변수 | 설명 | 기본값 |
|---|---|---|
METRICS_USER | 메트릭 사용자 | admin |
METRICS_PASS | 메트릭 비밀번호 | change_me |
예시
METRICS_USER=admin
METRICS_PASS=change_me
샘플 Prometheus 설정:
global:
# scrape_interval: 15s
scrape_timeout: 10s
evaluation_interval: 15s
scrape_configs:
- job_name: 'remnawave'
scheme: http
metrics_path: /metrics
static_configs:
- targets: ['remnawave:3001']
scrape_interval: 30s
basic_auth:
username: admin
password: change_me
수집된 메트릭을 시각화하기 위해 준비된 Grafana 대시보드를 사용할 수 있습니다: Remnawave Panel Dashboard
Prometheus 메트릭 샘플
# HELP remnawave_node_online_users Number of online users on a node
# TYPE remnawave_node_online_users gauge
remnawave_node_online_users{node_uuid="d86d8c63-944c-4398-9cf4-c3882a54a5d5",app="remnawave"} 0
Webhook
| 변수 | 설명 | 기본값 | 가능한 값 |
|---|---|---|---|
WEBHOOK_ENABLED | Webhook 알림 활성화/비활성화 | false | true, false |
WEBHOOK_URL | Webhook의 URL, http:// 또는 https:// 가능 | ||
WEBHOOK_SECRET_HEADER | 서명용 키, 최소 32자. a-z, 0-9, A-Z만 허용. |
다음 명령을 사용하여 Webhook 시크릿용 랜덤 비밀번호를 생성할 수 있습니다:
openssl rand -hex 64
예시
WEBHOOK_ENABLED=true
WEBHOOK_URL=https://your-server.com/webhook-path
WEBHOOK_SECRET_HEADER=strong_secret_key
대역폭 사용량 알림
| 변수 | 설명 | 기본값 | 가능한 값 |
|---|---|---|---|
BANDWIDTH_USAGE_NOTIFICATIONS_ENABLED | 대역폭 사용량 알림 활성화/비활성화 | false | true, false |
BANDWIDTH_USAGE_NOTIFICATIONS_THRESHOLD | 대역폭 사용량 알림 임계값. 오름차순으로만 (예: [60, 80]), 정수 배열(min: 25, max: 95)이어야 합니다. 최대 5개 값. |
예시
BANDWIDTH_USAGE_NOTIFICATIONS_ENABLED=true
BANDWIDTH_USAGE_NOTIFICATIONS_THRESHOLD=[60, 80]
미연결 사용자 알림
| 변수 | 설명 | 기본값 | 가능한 값 |
|---|---|---|---|
NOT_CONNECTED_USERS_NOTIFICATIONS_ENABLED | 미연결 사용자 알림 활성화/비활성화 | false | true, false |
NOT_CONNECTED_USERS_NOTIFICATIONS_AFTER_HOURS | 연결하지 않은 사용자에게 알림을 보낼 시간. 오름차순으로만 (예: [6, 12, 24]), 정수 배열(min: 1, max: 168)이어야 합니다. 최대 3개 값. |
예시
### 미연결 사용자 알림 (webhook, telegram)
NOT_CONNECTED_USERS_NOTIFICATIONS_ENABLED=false
# 오름차순으로만 (예: [6, 12, 24]), 정수 배열(min: 1, max: 168)이어야 합니다. 최대 3개 값.
# 각 값은 사용자 생성(user.createdAt) 이후 경과된 시간(HOURS)을 나타냅니다
NOT_CONNECTED_USERS_NOTIFICATIONS_AFTER_HOURS=[6, 24, 48]
기타
| 변수 | 설명 | 기본값 | 가능한 값 |
|---|---|---|---|
SHORT_UUID_LENGTH | 생성된 짧은 UUID (구독)의 길이. 최소 16, 최대 64 | 16 | |
IS_HTTP_LOGGING_ENABLED | HTTP 로깅 활성화/비활성화 | false | true, false |
ENABLE_DEBUG_LOGS | 디버그 로그 활성화/비활성화 | false | true, false |
JWT_AUTH_LIFETIME | 인증 JWT의 수명(시간). 12에서 168 사이의 값 가능. | 12 | |
SERVICE_CLEAN_USAGE_HISTORY | 사용 기록 정리 활성화/비활성화 | false | true, false |
SERVICE_DISABLE_USER_USAGE_RECORDS | 사용자 사용 데이터 기록 비활성화 | false | true, false |
USER_USAGE_IGNORE_BELOW_BYTES | 이 임계값 미만의 사용자 사용량 무시 (바이트 단위, 최대 1048576) | 0 |
예시
SHORT_UUID_LENGTH=16
IS_HTTP_LOGGING_ENABLED=true
ENABLE_DEBUG_LOGS=false
JWT_AUTH_LIFETIME=12
SERVICE_CLEAN_USAGE_HISTORY=false
SERVICE_DISABLE_USER_USAGE_RECORDS=false
USER_USAGE_IGNORE_BELOW_BYTES=0