diff --git a/.vscode/launch.json b/.vscode/launch.json
deleted file mode 100644
index 8a969702..00000000
--- a/.vscode/launch.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "$schema": "vscode://schemas/launch",
- "version": "0.2.0",
- "configurations": [
- {
- "name": "Run 3x-ui (Debug)",
- "type": "go",
- "request": "launch",
- "mode": "auto",
- "program": "${workspaceFolder}",
- "cwd": "${workspaceFolder}",
- "env": {
- "XUI_DEBUG": "true"
- },
- "console": "integratedTerminal"
- },
- {
- "name": "Run 3x-ui (Debug, custom env)",
- "type": "go",
- "request": "launch",
- "mode": "auto",
- "program": "${workspaceFolder}",
- "cwd": "${workspaceFolder}",
- "env": {
- // Set to true to serve assets/templates directly from disk for development
- "XUI_DEBUG": "true",
- // Uncomment to override DB folder location (by default uses working dir on Windows when debug)
- // "XUI_DB_FOLDER": "${workspaceFolder}",
- // Example: override log level (debug|info|notice|warn|error)
- // "XUI_LOG_LEVEL": "debug"
- },
- "console": "integratedTerminal"
- }
- ]
-}
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
deleted file mode 100644
index 337d694f..00000000
--- a/.vscode/tasks.json
+++ /dev/null
@@ -1,75 +0,0 @@
-{
- "version": "2.0.0",
- "tasks": [
- {
- "label": "go: build",
- "type": "shell",
- "command": "go",
- "args": [
- "build",
- "-o",
- "bin/3x-ui.exe",
- "./main.go"
- ],
- "options": {
- "cwd": "${workspaceFolder}"
- },
- "problemMatcher": [
- "$go"
- ],
- "group": {
- "kind": "build",
- "isDefault": true
- }
- },
- {
- "label": "go: run",
- "type": "shell",
- "command": "go",
- "args": [
- "run",
- "./main.go"
- ],
- "options": {
- "cwd": "${workspaceFolder}",
- "env": {
- "XUI_DEBUG": "true"
- }
- },
- "problemMatcher": [
- "$go"
- ]
- },
- {
- "label": "go: test",
- "type": "shell",
- "command": "go",
- "args": [
- "test",
- "./..."
- ],
- "options": {
- "cwd": "${workspaceFolder}"
- },
- "problemMatcher": [
- "$go"
- ],
- "group": "test"
- },
- {
- "label": "go: vet",
- "type": "shell",
- "command": "go",
- "args": [
- "vet",
- "./..."
- ],
- "options": {
- "cwd": "${workspaceFolder}"
- },
- "problemMatcher": [
- "$go"
- ]
- }
- ]
-}
\ No newline at end of file
diff --git a/SpaceSaver/index.html b/SpaceSaver/index.html
new file mode 100644
index 00000000..e7aebbdf
--- /dev/null
+++ b/SpaceSaver/index.html
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+ SpaceSaver
+
+
+
+
SpaceSaver (Безопасное хранилище)
+
+
+
+
\ No newline at end of file
diff --git a/SpaceSaver/script.js b/SpaceSaver/script.js
new file mode 100644
index 00000000..9028d1d2
--- /dev/null
+++ b/SpaceSaver/script.js
@@ -0,0 +1,6 @@
+document.getElementById('loginForm').addEventListener('submit', function(e) {
+ e.preventDefault();
+ document.getElementById('errorMsg').style.display = 'block';
+ document.querySelector('input[name="username"]').value = '';
+ document.querySelector('input[name="password"]').value = '';
+ });
\ No newline at end of file
diff --git a/SpaceSaver/style.css b/SpaceSaver/style.css
new file mode 100644
index 00000000..b946a8af
--- /dev/null
+++ b/SpaceSaver/style.css
@@ -0,0 +1,64 @@
+body {
+ min-height: 100vh;
+ background: #0a0e14;
+ color: #e0e7ff;
+ font-family: system-ui, sans-serif;
+
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+ }
+
+.error-message {
+ color: #f85149;
+ font-size: 0.95rem;
+ margin-top: 1rem;
+ min-height: 1.2rem;
+ display: none;
+ }
+
+.input-group {
+ position: relative;
+ margin-bottom: 1.2rem;
+ }
+
+.icon {
+ position: absolute;
+ left: 1rem;
+ top: 50%;
+ transform: translateY(-50%);
+ width: 20px;
+ height: 20px;
+ color: #8b949e;
+ pointer-events: none;
+ }
+
+input {
+ width: 100%;
+ height: 44px;
+ padding: 0 1rem 0 2.8rem;
+ background: #0d1117;
+ border: 1px solid #30363d;
+ border-radius: 6px;
+ color: #e6edf3;
+ font-size: 1rem;
+ line-height: 1.4;
+ }
+
+button {
+ width: 100%;
+ padding: 0.95rem;
+ background: #238636;
+ color: white;
+ border: none;
+ border-radius: 6px;
+ font-size: 1.05rem;
+ cursor: pointer;
+ margin-top: 0.8rem;
+ }
\ No newline at end of file
diff --git a/install.sh b/install.sh
index 46207777..53a995e2 100644
--- a/install.sh
+++ b/install.sh
@@ -580,7 +580,7 @@ prompt_and_setup_ssl() {
# 3.1 Request Domain to compose Panel URL later
read -rp "Please enter domain name certificate issued for: " custom_domain
- custom_domain="${custom_domain// /}" # Убираем пробелы
+ custom_domain="${custom_domain// /}" # Delete spaces
# 3.2 Loop for Certificate Path
while true; do
diff --git a/x-ui.sh b/x-ui.sh
index 933a964e..cb639625 100644
--- a/x-ui.sh
+++ b/x-ui.sh
@@ -1671,7 +1671,237 @@ run_speedtest() {
speedtest
}
+run_librespeed() {
+ if command -v librespeed-cli &>/dev/null; then
+ librespeed-cli
+ else
+ #Intalling LibreSpeed
+ echo -e "${yellow} Installing LibreSpeed..."
+ VERSION=$(curl -s "https://api.github.com/repos/librespeed/speedtest-cli/releases/latest"| grep '"tag_name":' | sed -E 's/.*"v?([^"]+)".*/\1/')
+ wget https://github.com/librespeed/speedtest-cli/releases/download/v${VERSION}/librespeed-cli_${VERSION}_linux_amd64.tar.gz
+ tar -xzvf librespeed-cli_${VERSION}_linux_amd64.tar.gz && mv librespeed-cli /usr/bin
+ librespeed-cli
+ fi
+}
+
+create_honeypot() {
+ local server_ip=$(curl -s --max-time 3 https://4.ident.me)
+
+ echo -e "${plain}Do you want to use: ${green}Apache ${plain}or ${green}Nginx"
+
+ read -p "Apache or Nginx: " nginx_or_apache
+
+ echo -e "${yellow}Downloading sources and Utilites..."
+
+ if [ "$nginx_or_apache" = "Apache" ]; then
+ case "${release}" in
+ ubuntu)
+ apt-get update
+ apt-get install apache2 -y
+ ;;
+ debian)
+ apt-get update
+ apt-get install -y apache2
+ ;;
+ armbian)
+ apt-get update && apt-get install apache2 -y
+ ;;
+ fedora | amzn | virtuozzo | rhel | almalinux | rocky | ol)
+ dnf -y update && dnf -y install httpd
+ ;;
+ centos)
+ yum -y install apache2
+ ;;
+ arch | manjaro | parch)
+ pacman -Syu --noconfirm apache
+ ;;
+ *)
+ echo -e "${red}Unsupported operating system. Please check the script and install the necessary packages manually.${plain}\n"
+ exit 1
+ ;;
+ esac
+
+ # Start apache server for HoneyPot
+ case "${release}" in
+ ubuntu)
+ systemctl enable apache2
+ systemctl start apache2
+ ;;
+ debian)
+ systemctl enable apache2
+ systemctl start apache2
+ ;;
+ armbian)
+ systemctl enable apache2
+ systemctl start apache2
+ ;;
+ fedora | amzn | virtuozzo | rhel | almalinux | rocky | ol)
+ systemctl enable httpd
+ systemctl start httpd
+ ;;
+ centos)
+ systemctl enable httpd
+ systemctl start httpd
+ ;;
+ arch | manjaro | parch)
+ systemctl enable apache
+ systemctl start apache
+ ;;
+ *)
+ echo -e "${red}Cannot start apache service.${plain}\n"
+ exit 1
+ ;;
+ esac
+
+
+ echo -e "${yellow}Installing HoneyPot..."
+ mv SpaceSaver/ /var/www/html/
+
+ # Config for apache2
+ echo """
+
+ ServerName SpaceSaver
+ DocumentRoot /var/www/html/SpaceSaver
+
+
+ Options Indexes FollowSymLinks
+ AllowOverride All
+ Require all granted
+
+
+ ErrorLog ${APACHE_LOG_DIR}/error.log
+ CustomLog ${APACHE_LOG_DIR}/access.log combined
+""" >> /etc/apache2/sites-available/spacesaver.conf
+
+ ln -sf /etc/apache2/sites-available/spacesaver.conf /etc/apache2/sites-enabled/
+
+ # Restarting apache server
+ case "${release}" in
+ ubuntu)
+ systemctl reload apache2
+ ;;
+ debian)
+ systemctl reload apache2
+ ;;
+ armbian)
+ systemctl reload apache2
+ ;;
+ fedora | amzn | virtuozzo | rhel | almalinux | rocky | ol)
+ systemctl reload httpd
+ ;;
+ centos)
+ systemctl reload httpd
+ ;;
+ arch | manjaro | parch)
+ systemctl reload httpd
+ ;;
+ *)
+ echo -e "${red}Cannot reload apache service.${plain}\n"
+ exit 1
+ ;;
+ esac
+
+ # Access rights to HoneyPot's files
+ chown -R www-data:www-data /var/www/html/SpaceSaver
+ chmod -R 755 /var/www/html/SpaceSaver
+ chmod 644 /var/www/html/SpaceSaver/index.html
+
+ echo -e "${plain}Done!"
+ echo -e "${green}Available here -> http://$server_ip:80"
+
+ elif [ "$nginx_or_apache" = "Nginx" ]; then
+ case "${release}" in
+ ubuntu)
+ apt-get update
+ apt-get install nginx -y
+ ;;
+ debian)
+ apt-get update
+ apt-get install -y nginx
+ ;;
+ armbian)
+ apt-get update && apt-get install nginx -y
+ ;;
+ fedora | amzn | virtuozzo | rhel | almalinux | rocky | ol)
+ dnf -y update && dnf -y install nginx
+ ;;
+ centos)
+ yum -y install nginx
+ ;;
+ arch | manjaro | parch)
+ pacman -Syu --noconfirm nginx
+ ;;
+ *)
+ echo -e "${red}Unsupported operating system. Please check the script and install the necessary packages manually.${plain}\n"
+ exit 1
+ ;;
+ esac
+
+ # Start nginx server for HoneyPot
+ systemctl enable nginx
+ systemctl start nginx
+
+ #Downloading HoneyPot's files
+ git clone https://github.com/d3l1f3r/SpaceSaver.git
+ mv SpaceSaver/ /var/www/html/
+
+ # Config for nginx
+ tee /etc/nginx/sites-available/spacesaver.conf >/dev/null << 'EOF'
+ server {
+ listen 80 default_server; # ← важно для локального доступа
+ server_name 127.0.0.1 localhost SpaceSaver _;
+
+ root /var/www/html/SpaceSaver;
+ index index.html;
+
+ # Security Headers
+ add_header X-Content-Type-Options nosniff always;
+ add_header X-Frame-Options SAMEORIGIN always;
+ add_header X-XSS-Protection "1; mode=block" always;
+ add_header Referrer-Policy strict-origin-when-cross-origin always;
+ add_header Permissions-Policy "interest-cohort=()" always;
+ add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
+
+ server_tokens off;
+
+ location / {
+ try_files $uri $uri/ /index.html;
+ }
+
+ location ~ /\. {
+ deny all;
+ access_log off;
+ log_not_found off;
+ }
+
+ access_log /var/log/nginx/spacesaver.access.log;
+ error_log /var/log/nginx/spacesaver.error.log;
+ }
+EOF
+
+ rm -f /etc/nginx/sites-enabled/default
+ ln -sf /etc/nginx/sites-available/spacesaver.conf /etc/nginx/sites-enabled/
+ systemctl reload nginx
+
+ echo -e "${plain}Done!"
+ echo -e "${green}Available here -> http://$server_ip:80"
+
+ fi
+}
+
+change_dns() {
+ echo -e "${yellow}${plain}Changing DNS resolver"
+ echo -e "${plain}Enter resolver (default: 9.9.9.9): "
+ read resolver
+
+ if [ -n "$resolver" ]; then
+ echo "nameserver $resolver" > /etc/resolv.conf
+ else
+ echo "nameserver 9.9.9.9" > /etc/resolv.conf
+ fi
+ echo -e "${green}${plain}Done!"
+}
ip_validation() {
ipv6_regex="^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$"
@@ -2064,11 +2294,11 @@ iplimit_remove_conflicts() {
SSH_port_forwarding() {
local URL_lists=(
"https://api4.ipify.org"
- "https://ipv4.icanhazip.com"
- "https://v4.api.ipinfo.io/ip"
- "https://ipv4.myexternalip.com/raw"
- "https://4.ident.me"
- "https://check-host.net/ip"
+ "https://ipv4.icanhazip.com"
+ "https://v4.api.ipinfo.io/ip"
+ "https://ipv4.myexternalip.com/raw"
+ "https://4.ident.me"
+ "https://check-host.net/ip"
)
local server_ip=""
for ip_address in "${URL_lists[@]}"; do
@@ -2212,14 +2442,17 @@ show_menu() {
│ ${green}21.${plain} IP Limit Management │
│ ${green}22.${plain} Firewall Management │
│ ${green}23.${plain} SSH Port Forwarding Management │
+│ ${green}24.${plain} HoneyPot (Fakesite) │
+│ ${green}25.${plain} Change DNS resolver │
│────────────────────────────────────────────────│
-│ ${green}24.${plain} Enable BBR │
-│ ${green}25.${plain} Update Geo Files │
-│ ${green}26.${plain} Speedtest by Ookla │
+│ ${green}26.${plain} Enable BBR │
+│ ${green}27.${plain} Update Geo Files │
+│ ${green}28.${plain} Speedtest by Ookla │
+│ ${green}29.${plain} Librespeed │
╚────────────────────────────────────────────────╝
"
show_status
- echo && read -rp "Please enter your selection [0-26]: " num
+ echo && read -rp "Please enter your selection [0-29]: " num
case "${num}" in
0)
@@ -2295,16 +2528,25 @@ show_menu() {
SSH_port_forwarding
;;
24)
- bbr_menu
+ create_honeypot
;;
25)
- update_geo
+ change_dns
;;
26)
+ bbr_menu
+ ;;
+ 27)
+ update_geo
+ ;;
+ 28)
run_speedtest
;;
+ 29)
+ run_librespeed
+ ;;
*)
- LOGE "Please enter the correct number [0-26]"
+ LOGE "Please enter the correct number [0-29]"
;;
esac
}
@@ -2360,4 +2602,4 @@ if [[ $# > 0 ]]; then
esac
else
show_menu
-fi
+fi
\ No newline at end of file