mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2025-09-11 04:36:20 +00:00
Settings parameters moved to environment variables
This commit is contained in:
parent
522ccda71c
commit
e301e333cb
7 changed files with 261 additions and 55 deletions
95
README.md
95
README.md
|
@ -533,6 +533,101 @@ Enter the user ID in input field number 4. The Telegram accounts with this id wi
|
|||
<details>
|
||||
<summary>Click for environment variables details</summary>
|
||||
|
||||
### Set startup settings via environment variables
|
||||
|
||||
WEB_LISTEN - Panel listening domain / By default, leave blank to monitor all domains and IP addresses
|
||||
|
||||
WEB_DOMAIN Panel IP address / Leave blank to connect from any IP
|
||||
|
||||
WEB_PORT - Port used to display this panel
|
||||
|
||||
WEB_CERT_FILE - Path to the panel's public key file / Enter the full path starting with '/'
|
||||
|
||||
WEB_KEY_FILE - Path to the panel's private key file / Enter the full path starting with '/'
|
||||
|
||||
WEB_BASE_PATH - Root path of the panel's URL
|
||||
Must start with '/' and end with '/'
|
||||
|
||||
SESSION_MAX_AGE - Session duration
|
||||
Duration of a session in the system (value: minute)
|
||||
|
||||
PAGE_SIZE - Pagination size
|
||||
Define the page size for the incoming table. Set to 0 to disable
|
||||
|
||||
EXPIRE_DIFF - Session expiration threshold for notification
|
||||
Receive notification about session expiration before reaching the threshold (value: day)
|
||||
|
||||
TRAFFIC_DIFF - Traffic threshold for notification
|
||||
Receive notification about traffic exhaustion before reaching the threshold (value: GB)
|
||||
|
||||
TIME_LOCATION (def. "Asia/Tehran")- Time zone
|
||||
Scheduled tasks are executed according to the time in this time zone
|
||||
|
||||
TG_BOT_ENABLE (def. "false") - Enable Telegram bot
|
||||
Connect to the functions of this panel via Telegram bot
|
||||
|
||||
TG_BOT_TOKEN - Telegram bot token
|
||||
You need to get a token from Telegram bot manager @botfather
|
||||
|
||||
TG_BOT_PROXY- Socks5 proxy
|
||||
If you need a Socks5 proxy to connect to Telegram. Configure its parameters according to the manual.
|
||||
|
||||
TG_BOT_API_SERVER - Telegram API Server
|
||||
The Telegram API server to use. Leave blank to use the default server.
|
||||
|
||||
TG_BOT_CHAT_ID - Bot Admin Telegram ID
|
||||
One or more bot admin IDs. To get the ID, use @userinfobot or the '/id' command in the bot.
|
||||
|
||||
TG_RUN_TIME - Telegram bot notification frequency
|
||||
Use Crontab time format
|
||||
|
||||
TG_BOT_BACKUP - Database Backup
|
||||
Include database backup file with report notification
|
||||
|
||||
TG_BOT_LOGIN_NOTIFY - Login Notification
|
||||
Displays the username, IP address, and time when someone tries to log into your dashboard.
|
||||
|
||||
TG_CPU - CPU load threshold for notification
|
||||
Receive notification if CPU load exceeds this threshold (value: %)
|
||||
|
||||
TG_LANG - Telegram bot language (def. "en-US")
|
||||
|
||||
SUB_ENABLE - Enable service
|
||||
Subscription feature with separate configuration
|
||||
|
||||
SUB_LISTEN - IP listening
|
||||
Leave empty by default to monitor all IP addresses
|
||||
|
||||
SUB_PORT - Subscription port
|
||||
The port number for serving the subscription service should not be used on the server
|
||||
|
||||
SUB_PATH - Root path of the subscription URL
|
||||
Must start with '/' and end with '/'
|
||||
|
||||
SUB_DOMAIN - Listening domain
|
||||
Leave empty by default to monitor all domains and IP addresses
|
||||
|
||||
SUB_CERT_FILE - Path to the public key file of the subscription certificate
|
||||
Enter the full path starting with '/'
|
||||
|
||||
SUB_KEY_FILE - Path to subscription certificate private key file
|
||||
Enter full path starting with '/'
|
||||
|
||||
SUB_UPDATES - Subscription update intervals
|
||||
Interval between updates in client application (in hours)
|
||||
|
||||
SUB_ENCRYPT - Encrypt configs
|
||||
Encrypt returned configs in subscription
|
||||
|
||||
SUB_SHOW_INFO - Show usage information
|
||||
Show remaining traffic and date after config name
|
||||
|
||||
SUB_URI - Reverse proxy URI
|
||||
Change base URI of subscription URL for use behind proxy servers
|
||||
|
||||
DATEPICKER (def. gregorian) - Date picker
|
||||
Scheduled tasks are executed according to this calendar
|
||||
|
||||
#### Usage
|
||||
|
||||
| Variable | Type | Default |
|
||||
|
|
|
@ -177,6 +177,7 @@ systemctl restart x-ui
|
|||
|
||||
Добавьте параметр ```--pull always``` для автоматического обновления контейнера, когда публикуется новый образ. Подробности: https://docs.docker.com/reference/cli/docker/container/run/#pull
|
||||
|
||||
|
||||
**ИЛИ**
|
||||
|
||||
```sh
|
||||
|
@ -531,6 +532,101 @@ WARP встроен, и дополнительная установка не т
|
|||
<details>
|
||||
<summary>Нажмите для получения информации о переменных среды</summary>
|
||||
|
||||
### Задать стартовые настройки через переменные окружения
|
||||
|
||||
WEB_LISTEN - Домен прослушивания панели / По умолчанию оставьте пустым, чтобы отслеживать все домены и IP-адреса
|
||||
|
||||
WEB_DOMAIN IP-адрес панели / Оставьте пустым для подключения с любого IP
|
||||
|
||||
WEB_PORT - Порт, используемый для отображения этой панели
|
||||
|
||||
WEB_CERT_FILE - Путь к файлу публичного ключа сертификата панели / Введите полный путь, начинающийся с '/'
|
||||
|
||||
WEB_KEY_FILE - Путь к файлу приватного ключа сертификата панели / Введите полный путь, начинающийся с '/'
|
||||
|
||||
WEB_BASE_PATH - Корневой путь URL адреса панели
|
||||
Должен начинаться с '/' и заканчиваться на '/'
|
||||
|
||||
SESSION_MAX_AGE - Продолжительность сессии
|
||||
Продолжительность сессии в системе (значение: минута)
|
||||
|
||||
PAGE_SIZE - Размер нумерации страниц
|
||||
Определить размер страницы для входящей таблицы. Установите 0, чтобы отключить
|
||||
|
||||
EXPIRE_DIFF - Порог истечения срока сессии для уведомления
|
||||
Получение уведомления об истечении срока действия сессии до достижения порогового значения (значение: день)
|
||||
|
||||
TRAFFIC_DIFF - Порог трафика для уведомления
|
||||
Получение уведомления об исчерпании трафика до достижения порога (значение: ГБ)
|
||||
|
||||
TIME_LOCATION (def. "Asia/Tehran")- Часовой пояс
|
||||
Запланированные задачи выполняются в соответствии со временем в этом часовом поясе
|
||||
|
||||
TG_BOT_ENABLE (def. "false") - Включить Telegram бота
|
||||
Подключайтесь к функциям этой панели через Telegram бота
|
||||
|
||||
TG_BOT_TOKEN - Токен Telegram бота
|
||||
Необходимо получить токен у менеджера ботов Telegram @botfather
|
||||
|
||||
TG_BOT_PROXY- Прокси Socks5
|
||||
Если для подключения к Telegram вам нужен прокси Socks5. Настройте его параметры согласно руководству.
|
||||
|
||||
TG_BOT_API_SERVER - API-сервер Telegram
|
||||
Используемый API-сервер Telegram. Оставьте пустым, чтобы использовать сервер по умолчанию.
|
||||
|
||||
TG_BOT_CHAT_ID - Идентификатор Telegram администратора бота
|
||||
Один или несколько идентификаторов администратора бота. Чтобы получить идентификатор, используйте @userinfobot или команду '/id' в боте.
|
||||
|
||||
TG_RUN_TIME - Частота уведомлений бота Telegram
|
||||
Используйте формат времени Crontab
|
||||
|
||||
TG_BOT_BACKUP - Резервное копирование базы данных
|
||||
Включать файл резервной копии базы данных с уведомлением об отчете
|
||||
|
||||
TG_BOT_LOGIN_NOTIFY - Уведомление о входе
|
||||
Отображает имя пользователя, IP-адрес и время, когда кто-то пытается войти в вашу панель.
|
||||
|
||||
TG_CPU - Порог нагрузки на ЦП для уведомления
|
||||
Получение уведомления, если нагрузка на ЦП превышает этот порог (значение: %)
|
||||
|
||||
TG_LANG - Язык телеграмм бота (def. "en-US")
|
||||
|
||||
SUB_ENABLE - Включить службу
|
||||
Функция подписки с отдельной конфигурацией
|
||||
|
||||
SUB_LISTEN - Прослушивание IP
|
||||
Оставьте пустым по умолчанию, чтобы отслеживать все IP-адреса
|
||||
|
||||
SUB_PORT - Порт подписки
|
||||
Номер порта для обслуживания службы подписки не должен использоваться на сервере
|
||||
|
||||
SUB_PATH - Корневой путь URL-адреса подписки
|
||||
Должен начинаться с '/' и заканчиваться на '/'
|
||||
|
||||
SUB_DOMAIN - Домен прослушивания
|
||||
Оставьте пустым по умолчанию, чтобы отслеживать все домены и IP-адреса
|
||||
|
||||
SUB_CERT_FILE - Путь к файлу открытого ключа сертификата подписки
|
||||
Введите полный путь, начинающийся с '/'
|
||||
|
||||
SUB_KEY_FILE - Путь к файлу закрытого ключа сертификата подписки
|
||||
Введите полный путь, начинающийся с '/'
|
||||
|
||||
SUB_UPDATES - Интервалы обновления подписки
|
||||
Интервал между обновлениями в клиентском приложении (в часах)
|
||||
|
||||
SUB_ENCRYPT - Шифровать конфиги
|
||||
Шифровать возвращенные конфиги в подписке
|
||||
|
||||
SUB_SHOW_INFO - Показать информацию об использовании
|
||||
Показывать оставшиеся трафик и дату после имени конфигурации
|
||||
|
||||
SUB_URI - URI обратного прокси
|
||||
Изменить базовый URI URL-адреса подписки для использования за прокси-серверами
|
||||
|
||||
DATEPICKER (def. gregorian) - Выбор даты
|
||||
Запланированные задачи выполняются в соответствии с данным календарём
|
||||
|
||||
#### Использование
|
||||
|
||||
| Переменная | Тип | Значение по умолчанию |
|
||||
|
|
|
@ -7,10 +7,8 @@ import (
|
|||
"strings"
|
||||
)
|
||||
|
||||
//go:embed version
|
||||
var version string
|
||||
|
||||
//go:embed name
|
||||
var name string
|
||||
|
||||
type LogLevel string
|
||||
|
|
|
@ -19,12 +19,6 @@ import (
|
|||
|
||||
var db *gorm.DB
|
||||
|
||||
const (
|
||||
defaultUsername = "admin"
|
||||
defaultPassword = "admin"
|
||||
defaultSecret = ""
|
||||
)
|
||||
|
||||
func initModels() error {
|
||||
models := []interface{}{
|
||||
&model.User{},
|
||||
|
@ -50,10 +44,25 @@ func initUser() error {
|
|||
return err
|
||||
}
|
||||
if empty {
|
||||
username := os.Getenv("DEFAULT_USERNAME")
|
||||
if username == "" {
|
||||
username = "admin"
|
||||
}
|
||||
|
||||
password := os.Getenv("DEFAULT_PASSWORD")
|
||||
if password == "" {
|
||||
password = "admin"
|
||||
}
|
||||
|
||||
secret := os.Getenv("DEFAULT_SECRET")
|
||||
if secret == "" {
|
||||
secret = ""
|
||||
}
|
||||
|
||||
user := &model.User{
|
||||
Username: defaultUsername,
|
||||
Password: defaultPassword,
|
||||
LoginSecret: defaultSecret,
|
||||
Username: username,
|
||||
Password: password,
|
||||
LoginSecret: secret,
|
||||
}
|
||||
return db.Create(user).Error
|
||||
}
|
||||
|
|
BIN
db/x-ui.db
Normal file
BIN
db/x-ui.db
Normal file
Binary file not shown.
|
@ -14,4 +14,4 @@ services:
|
|||
X_UI_ENABLE_FAIL2BAN: "true"
|
||||
tty: true
|
||||
network_mode: host
|
||||
restart: unless-stopped
|
||||
restart: unless-stopped
|
|
@ -5,6 +5,7 @@ import (
|
|||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"reflect"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
@ -23,51 +24,58 @@ import (
|
|||
//go:embed config.json
|
||||
var xrayTemplateConfig string
|
||||
|
||||
func getEnvOrDefault(envKey, defaultValue string) string {
|
||||
if value, exists := os.LookupEnv(envKey); exists {
|
||||
return value
|
||||
}
|
||||
return defaultValue
|
||||
}
|
||||
|
||||
var defaultValueMap = map[string]string{
|
||||
"xrayTemplateConfig": xrayTemplateConfig,
|
||||
"webListen": "",
|
||||
"webDomain": "",
|
||||
"webPort": "2053",
|
||||
"webCertFile": "",
|
||||
"webKeyFile": "",
|
||||
"secret": random.Seq(32),
|
||||
"webBasePath": "/",
|
||||
"sessionMaxAge": "60",
|
||||
"pageSize": "50",
|
||||
"expireDiff": "0",
|
||||
"trafficDiff": "0",
|
||||
"remarkModel": "-ieo",
|
||||
"timeLocation": "Local",
|
||||
"tgBotEnable": "false",
|
||||
"tgBotToken": "",
|
||||
"tgBotProxy": "",
|
||||
"tgBotAPIServer": "",
|
||||
"tgBotChatId": "",
|
||||
"tgRunTime": "@daily",
|
||||
"tgBotBackup": "false",
|
||||
"tgBotLoginNotify": "true",
|
||||
"tgCpu": "80",
|
||||
"tgLang": "en-US",
|
||||
"secretEnable": "false",
|
||||
"subEnable": "false",
|
||||
"subListen": "",
|
||||
"subPort": "2096",
|
||||
"subPath": "/sub/",
|
||||
"subDomain": "",
|
||||
"subCertFile": "",
|
||||
"subKeyFile": "",
|
||||
"subUpdates": "12",
|
||||
"subEncrypt": "true",
|
||||
"subShowInfo": "true",
|
||||
"subURI": "",
|
||||
"subJsonPath": "/json/",
|
||||
"subJsonURI": "",
|
||||
"subJsonFragment": "",
|
||||
"subJsonNoises": "",
|
||||
"subJsonMux": "",
|
||||
"subJsonRules": "",
|
||||
"datepicker": "gregorian",
|
||||
"warp": "",
|
||||
"webListen": getEnvOrDefault("WEB_LISTEN", ""),
|
||||
"webDomain": getEnvOrDefault("WEB_DOMAIN", ""),
|
||||
"webPort": getEnvOrDefault("WEB_PORT", "2053"),
|
||||
"webCertFile": getEnvOrDefault("WEB_CERT_FILE", ""),
|
||||
"webKeyFile": getEnvOrDefault("WEB_KEY_FILE", ""),
|
||||
"secret": getEnvOrDefault("SECRET", random.Seq(32)),
|
||||
"webBasePath": getEnvOrDefault("WEB_BASE_PATH", "/"),
|
||||
"sessionMaxAge": getEnvOrDefault("SESSION_MAX_AGE", "60"),
|
||||
"pageSize": getEnvOrDefault("PAGE_SIZE", "50"),
|
||||
"expireDiff": getEnvOrDefault("EXPIRE_DIFF", "0"),
|
||||
"trafficDiff": getEnvOrDefault("TRAFFIC_DIFF", "0"),
|
||||
"remarkModel": getEnvOrDefault("REMARK_MODEL", "-ieo"),
|
||||
"timeLocation": getEnvOrDefault("TIME_LOCATION", "Asia/Tehran"),
|
||||
"tgBotEnable": getEnvOrDefault("TG_BOT_ENABLE", "false"),
|
||||
"tgBotToken": getEnvOrDefault("TG_BOT_TOKEN", ""),
|
||||
"tgBotProxy": getEnvOrDefault("TG_BOT_PROXY", ""),
|
||||
"tgBotAPIServer": getEnvOrDefault("TG_BOT_API_SERVER", ""),
|
||||
"tgBotChatId": getEnvOrDefault("TG_BOT_CHAT_ID", ""),
|
||||
"tgRunTime": getEnvOrDefault("TG_RUN_TIME", "@daily"),
|
||||
"tgBotBackup": getEnvOrDefault("TG_BOT_BACKUP", "false"),
|
||||
"tgBotLoginNotify": getEnvOrDefault("TG_BOT_LOGIN_NOTIFY", "true"),
|
||||
"tgCpu": getEnvOrDefault("TG_CPU", "80"),
|
||||
"tgLang": getEnvOrDefault("TG_LANG", "en-US"),
|
||||
"secretEnable": getEnvOrDefault("SECRET_ENABLE", "false"),
|
||||
"subEnable": getEnvOrDefault("SUB_ENABLE", "false"),
|
||||
"subListen": getEnvOrDefault("SUB_LISTEN", ""),
|
||||
"subPort": getEnvOrDefault("SUB_PORT", "2096"),
|
||||
"subPath": getEnvOrDefault("SUB_PATH", "/sub/"),
|
||||
"subDomain": getEnvOrDefault("SUB_DOMAIN", ""),
|
||||
"subCertFile": getEnvOrDefault("SUB_CERT_FILE", ""),
|
||||
"subKeyFile": getEnvOrDefault("SUB_KEY_FILE", ""),
|
||||
"subUpdates": getEnvOrDefault("SUB_UPDATES", "12"),
|
||||
"subEncrypt": getEnvOrDefault("SUB_ENCRYPT", "true"),
|
||||
"subShowInfo": getEnvOrDefault("SUB_SHOW_INFO", "true"),
|
||||
"subURI": getEnvOrDefault("SUB_URI", ""),
|
||||
"subJsonPath": getEnvOrDefault("SUB_JSON_PATH", "/json/"),
|
||||
"subJsonURI": getEnvOrDefault("SUB_JSON_URI", ""),
|
||||
"subJsonFragment": getEnvOrDefault("SUB_JSON_FRAGMENT", ""),
|
||||
"subJsonNoises": getEnvOrDefault("SUB_JSON_NOISES", ""),
|
||||
"subJsonMux": getEnvOrDefault("SUB_JSON_MUX", ""),
|
||||
"subJsonRules": getEnvOrDefault("SUB_JSON_RULES", ""),
|
||||
"datepicker": getEnvOrDefault("DATEPICKER", "gregorian"),
|
||||
"warp": getEnvOrDefault("WARP", ""),
|
||||
}
|
||||
|
||||
type SettingService struct{}
|
||||
|
|
Loading…
Reference in a new issue