diff --git a/README.md b/README.md index 6d765f54..1d77d80a 100644 --- a/README.md +++ b/README.md @@ -533,6 +533,101 @@ Enter the user ID in input field number 4. The Telegram accounts with this id wi
Click for environment variables details +### 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 | diff --git a/README.ru_RU.md b/README.ru_RU.md index 448a3a66..ed989d7b 100644 --- a/README.ru_RU.md +++ b/README.ru_RU.md @@ -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 встроен, и дополнительная установка не т
Нажмите для получения информации о переменных среды +### Задать стартовые настройки через переменные окружения + +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) - Выбор даты +Запланированные задачи выполняются в соответствии с данным календарём + #### Использование | Переменная | Тип | Значение по умолчанию | diff --git a/config/config.go b/config/config.go index 70be5ae6..e0c1491a 100644 --- a/config/config.go +++ b/config/config.go @@ -7,10 +7,8 @@ import ( "strings" ) -//go:embed version var version string -//go:embed name var name string type LogLevel string diff --git a/database/db.go b/database/db.go index 300a73c0..48e04aa0 100644 --- a/database/db.go +++ b/database/db.go @@ -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 } diff --git a/db/x-ui.db b/db/x-ui.db new file mode 100644 index 00000000..26b1a43a Binary files /dev/null and b/db/x-ui.db differ diff --git a/docker-compose.yml b/docker-compose.yml index 00a82901..6d0a1769 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -14,4 +14,4 @@ services: X_UI_ENABLE_FAIL2BAN: "true" tty: true network_mode: host - restart: unless-stopped + restart: unless-stopped \ No newline at end of file diff --git a/web/service/setting.go b/web/service/setting.go index d238c33d..2eca2da2 100644 --- a/web/service/setting.go +++ b/web/service/setting.go @@ -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{}