mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2025-09-11 20:50:06 +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>
|
<details>
|
||||||
<summary>Click for environment variables details</summary>
|
<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
|
#### Usage
|
||||||
|
|
||||||
| Variable | Type | Default |
|
| Variable | Type | Default |
|
||||||
|
|
|
@ -177,6 +177,7 @@ systemctl restart x-ui
|
||||||
|
|
||||||
Добавьте параметр ```--pull always``` для автоматического обновления контейнера, когда публикуется новый образ. Подробности: https://docs.docker.com/reference/cli/docker/container/run/#pull
|
Добавьте параметр ```--pull always``` для автоматического обновления контейнера, когда публикуется новый образ. Подробности: https://docs.docker.com/reference/cli/docker/container/run/#pull
|
||||||
|
|
||||||
|
|
||||||
**ИЛИ**
|
**ИЛИ**
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
|
@ -531,6 +532,101 @@ WARP встроен, и дополнительная установка не т
|
||||||
<details>
|
<details>
|
||||||
<summary>Нажмите для получения информации о переменных среды</summary>
|
<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"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
//go:embed version
|
|
||||||
var version string
|
var version string
|
||||||
|
|
||||||
//go:embed name
|
|
||||||
var name string
|
var name string
|
||||||
|
|
||||||
type LogLevel string
|
type LogLevel string
|
||||||
|
|
|
@ -19,12 +19,6 @@ import (
|
||||||
|
|
||||||
var db *gorm.DB
|
var db *gorm.DB
|
||||||
|
|
||||||
const (
|
|
||||||
defaultUsername = "admin"
|
|
||||||
defaultPassword = "admin"
|
|
||||||
defaultSecret = ""
|
|
||||||
)
|
|
||||||
|
|
||||||
func initModels() error {
|
func initModels() error {
|
||||||
models := []interface{}{
|
models := []interface{}{
|
||||||
&model.User{},
|
&model.User{},
|
||||||
|
@ -50,10 +44,25 @@ func initUser() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if empty {
|
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{
|
user := &model.User{
|
||||||
Username: defaultUsername,
|
Username: username,
|
||||||
Password: defaultPassword,
|
Password: password,
|
||||||
LoginSecret: defaultSecret,
|
LoginSecret: secret,
|
||||||
}
|
}
|
||||||
return db.Create(user).Error
|
return db.Create(user).Error
|
||||||
}
|
}
|
||||||
|
|
BIN
db/x-ui.db
Normal file
BIN
db/x-ui.db
Normal file
Binary file not shown.
|
@ -5,6 +5,7 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"os"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -23,51 +24,58 @@ import (
|
||||||
//go:embed config.json
|
//go:embed config.json
|
||||||
var xrayTemplateConfig string
|
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{
|
var defaultValueMap = map[string]string{
|
||||||
"xrayTemplateConfig": xrayTemplateConfig,
|
"xrayTemplateConfig": xrayTemplateConfig,
|
||||||
"webListen": "",
|
"webListen": getEnvOrDefault("WEB_LISTEN", ""),
|
||||||
"webDomain": "",
|
"webDomain": getEnvOrDefault("WEB_DOMAIN", ""),
|
||||||
"webPort": "2053",
|
"webPort": getEnvOrDefault("WEB_PORT", "2053"),
|
||||||
"webCertFile": "",
|
"webCertFile": getEnvOrDefault("WEB_CERT_FILE", ""),
|
||||||
"webKeyFile": "",
|
"webKeyFile": getEnvOrDefault("WEB_KEY_FILE", ""),
|
||||||
"secret": random.Seq(32),
|
"secret": getEnvOrDefault("SECRET", random.Seq(32)),
|
||||||
"webBasePath": "/",
|
"webBasePath": getEnvOrDefault("WEB_BASE_PATH", "/"),
|
||||||
"sessionMaxAge": "60",
|
"sessionMaxAge": getEnvOrDefault("SESSION_MAX_AGE", "60"),
|
||||||
"pageSize": "50",
|
"pageSize": getEnvOrDefault("PAGE_SIZE", "50"),
|
||||||
"expireDiff": "0",
|
"expireDiff": getEnvOrDefault("EXPIRE_DIFF", "0"),
|
||||||
"trafficDiff": "0",
|
"trafficDiff": getEnvOrDefault("TRAFFIC_DIFF", "0"),
|
||||||
"remarkModel": "-ieo",
|
"remarkModel": getEnvOrDefault("REMARK_MODEL", "-ieo"),
|
||||||
"timeLocation": "Local",
|
"timeLocation": getEnvOrDefault("TIME_LOCATION", "Asia/Tehran"),
|
||||||
"tgBotEnable": "false",
|
"tgBotEnable": getEnvOrDefault("TG_BOT_ENABLE", "false"),
|
||||||
"tgBotToken": "",
|
"tgBotToken": getEnvOrDefault("TG_BOT_TOKEN", ""),
|
||||||
"tgBotProxy": "",
|
"tgBotProxy": getEnvOrDefault("TG_BOT_PROXY", ""),
|
||||||
"tgBotAPIServer": "",
|
"tgBotAPIServer": getEnvOrDefault("TG_BOT_API_SERVER", ""),
|
||||||
"tgBotChatId": "",
|
"tgBotChatId": getEnvOrDefault("TG_BOT_CHAT_ID", ""),
|
||||||
"tgRunTime": "@daily",
|
"tgRunTime": getEnvOrDefault("TG_RUN_TIME", "@daily"),
|
||||||
"tgBotBackup": "false",
|
"tgBotBackup": getEnvOrDefault("TG_BOT_BACKUP", "false"),
|
||||||
"tgBotLoginNotify": "true",
|
"tgBotLoginNotify": getEnvOrDefault("TG_BOT_LOGIN_NOTIFY", "true"),
|
||||||
"tgCpu": "80",
|
"tgCpu": getEnvOrDefault("TG_CPU", "80"),
|
||||||
"tgLang": "en-US",
|
"tgLang": getEnvOrDefault("TG_LANG", "en-US"),
|
||||||
"secretEnable": "false",
|
"secretEnable": getEnvOrDefault("SECRET_ENABLE", "false"),
|
||||||
"subEnable": "false",
|
"subEnable": getEnvOrDefault("SUB_ENABLE", "false"),
|
||||||
"subListen": "",
|
"subListen": getEnvOrDefault("SUB_LISTEN", ""),
|
||||||
"subPort": "2096",
|
"subPort": getEnvOrDefault("SUB_PORT", "2096"),
|
||||||
"subPath": "/sub/",
|
"subPath": getEnvOrDefault("SUB_PATH", "/sub/"),
|
||||||
"subDomain": "",
|
"subDomain": getEnvOrDefault("SUB_DOMAIN", ""),
|
||||||
"subCertFile": "",
|
"subCertFile": getEnvOrDefault("SUB_CERT_FILE", ""),
|
||||||
"subKeyFile": "",
|
"subKeyFile": getEnvOrDefault("SUB_KEY_FILE", ""),
|
||||||
"subUpdates": "12",
|
"subUpdates": getEnvOrDefault("SUB_UPDATES", "12"),
|
||||||
"subEncrypt": "true",
|
"subEncrypt": getEnvOrDefault("SUB_ENCRYPT", "true"),
|
||||||
"subShowInfo": "true",
|
"subShowInfo": getEnvOrDefault("SUB_SHOW_INFO", "true"),
|
||||||
"subURI": "",
|
"subURI": getEnvOrDefault("SUB_URI", ""),
|
||||||
"subJsonPath": "/json/",
|
"subJsonPath": getEnvOrDefault("SUB_JSON_PATH", "/json/"),
|
||||||
"subJsonURI": "",
|
"subJsonURI": getEnvOrDefault("SUB_JSON_URI", ""),
|
||||||
"subJsonFragment": "",
|
"subJsonFragment": getEnvOrDefault("SUB_JSON_FRAGMENT", ""),
|
||||||
"subJsonNoises": "",
|
"subJsonNoises": getEnvOrDefault("SUB_JSON_NOISES", ""),
|
||||||
"subJsonMux": "",
|
"subJsonMux": getEnvOrDefault("SUB_JSON_MUX", ""),
|
||||||
"subJsonRules": "",
|
"subJsonRules": getEnvOrDefault("SUB_JSON_RULES", ""),
|
||||||
"datepicker": "gregorian",
|
"datepicker": getEnvOrDefault("DATEPICKER", "gregorian"),
|
||||||
"warp": "",
|
"warp": getEnvOrDefault("WARP", ""),
|
||||||
}
|
}
|
||||||
|
|
||||||
type SettingService struct{}
|
type SettingService struct{}
|
||||||
|
|
Loading…
Reference in a new issue