changes virables

This commit is contained in:
Dmitrii 2025-01-14 16:56:09 +03:00
parent 783f1a073e
commit 1e190d9799
6 changed files with 265 additions and 54 deletions

View file

@ -335,6 +335,101 @@ If you choose not to modify these settings, they will be generated randomly (thi
- **Password:** admin
- **Port:** 2053
### 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
### Database Management:
You can conveniently perform database Backups and Restores directly from the panel.

View file

@ -177,6 +177,7 @@ systemctl restart x-ui
Добавьте параметр ```--pull always``` для автоматического обновления контейнера, когда публикуется новый образ. Подробности: https://docs.docker.com/reference/cli/docker/container/run/#pull
**ИЛИ**
```sh
@ -332,6 +333,101 @@ location /sub {
- **Пароль:** admin
- **Порт:** 2053
### Задать стартовые настройки через переменные окружения
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) - Выбор даты
Запланированные задачи выполняются в соответствии с данным календарём
### Управление базой данных:
Вы можете удобно выполнять резервное копирование и восстановление базы данных прямо из панели.

View file

@ -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,26 @@ func initUser() error {
return err
}
if empty {
// Получаем значения из переменных окружения с fallback на значения по умолчанию
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

Binary file not shown.

View file

@ -3,15 +3,17 @@ version: "3"
services:
3x-ui:
image: ghcr.io/mhsanaei/3x-ui:latest
image: 3x-ui:latest
container_name: 3x-ui
hostname: yourhostname
hostname: localhost
volumes:
- $PWD/db/:/etc/x-ui/
- $PWD/cert/:/root/cert/
environment:
XRAY_VMESS_AEAD_FORCED: "false"
X_UI_ENABLE_FAIL2BAN: "true"
WEB_PORT: "2067"
WEB_BASE_PATH: "/control/"
tty: true
network_mode: host
restart: unless-stopped

View file

@ -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{}