Compare commits

..

6 commits

Author SHA1 Message Date
menschenfresser
48fe3c3a64
Update x-ui.sh 2026-02-27 18:47:07 +07:00
menschenfresser
9e669d416e
Update x-ui.sh
deleted 'sudo'
2026-02-27 15:35:37 +07:00
menschenfresser
aea0b38145
Merge branch 'main' into main 2026-02-27 15:12:30 +07:00
Alireza Ahmadi
159b85f979
Merge pull request #3828 from MHSanaei/restartXrayOption
Some checks failed
Release 3X-UI / build (386) (push) Has been cancelled
Release 3X-UI / build (amd64) (push) Has been cancelled
Release 3X-UI / build (arm64) (push) Has been cancelled
Release 3X-UI / build (armv5) (push) Has been cancelled
Release 3X-UI / build (armv6) (push) Has been cancelled
Release 3X-UI / build (armv7) (push) Has been cancelled
Release 3X-UI / build (s390x) (push) Has been cancelled
Release 3X-UI / Build for Windows (push) Has been cancelled
[feat] restart xray-core from cli #3825
2026-02-25 21:09:42 +01:00
Alireza Ahmadi
3ec5b3589f fix windows build 2026-02-20 02:07:46 +01:00
Alireza Ahmadi
2b1d3e7347 [feat] restart xray-core from cli #3825 2026-02-20 00:03:16 +01:00
10 changed files with 251 additions and 82 deletions

View file

@ -16,6 +16,7 @@ import (
"github.com/mhsanaei/3x-ui/v2/logger"
"github.com/mhsanaei/3x-ui/v2/sub"
"github.com/mhsanaei/3x-ui/v2/util/crypto"
"github.com/mhsanaei/3x-ui/v2/util/sys"
"github.com/mhsanaei/3x-ui/v2/web"
"github.com/mhsanaei/3x-ui/v2/web/global"
"github.com/mhsanaei/3x-ui/v2/web/service"
@ -70,7 +71,7 @@ func runWebServer() {
sigCh := make(chan os.Signal, 1)
// Trap shutdown signals
signal.Notify(sigCh, syscall.SIGHUP, syscall.SIGTERM)
signal.Notify(sigCh, syscall.SIGHUP, syscall.SIGTERM, sys.SIGUSR1)
for {
sig := <-sigCh
@ -108,6 +109,12 @@ func runWebServer() {
return
}
log.Println("Sub server restarted successfully.")
case sys.SIGUSR1:
logger.Info("Received USR1 signal, restarting xray-core...")
err := server.RestartXray()
if err != nil {
logger.Error("Failed to restart xray-core:", err)
}
default:
// --- FIX FOR TELEGRAM BOT CONFLICT (409) on full shutdown ---

View file

@ -7,11 +7,14 @@ import (
"encoding/binary"
"fmt"
"sync"
"syscall"
"github.com/shirou/gopsutil/v4/net"
"golang.org/x/sys/unix"
)
var SIGUSR1 = syscall.SIGUSR1
func GetTCPCount() (int, error) {
stats, err := net.Connections("tcp")
if err != nil {

View file

@ -12,8 +12,11 @@ import (
"strconv"
"strings"
"sync"
"syscall"
)
var SIGUSR1 = syscall.SIGUSR1
func getLinesNum(filename string) (int, error) {
file, err := os.Open(filename)
if err != nil {

View file

@ -12,6 +12,8 @@ import (
"github.com/shirou/gopsutil/v4/net"
)
var SIGUSR1 = syscall.Signal(0)
// GetConnectionCount returns the number of active connections for the specified protocol ("tcp" or "udp").
func GetConnectionCount(proto string) (int, error) {
if proto != "tcp" && proto != "udp" {

View file

@ -490,3 +490,7 @@ func (s *Server) GetCron() *cron.Cron {
func (s *Server) GetWSHub() any {
return s.wsHub
}
func (s *Server) RestartXray() error {
return s.xrayService.RestartXray(true)
}

View file

@ -11,3 +11,8 @@ depend() {
start_pre(){
cd /usr/local/x-ui
}
reload() {
ebegin "Reloading ${RC_SVCNAME}"
kill -USR1 $pidfile
eend $?
}

View file

@ -9,6 +9,7 @@ Environment="XRAY_VMESS_AEAD_FORCED=false"
Type=simple
WorkingDirectory=/usr/lib/x-ui/
ExecStart=/usr/lib/x-ui/x-ui
ExecReload=kill -USR1 $MAINPID
Restart=on-failure
RestartSec=5s

View file

@ -9,6 +9,7 @@ Environment="XRAY_VMESS_AEAD_FORCED=false"
Type=simple
WorkingDirectory=/usr/local/x-ui/
ExecStart=/usr/local/x-ui/x-ui
ExecReload=kill -USR1 $MAINPID
Restart=on-failure
RestartSec=5s

View file

@ -9,6 +9,7 @@ Environment="XRAY_VMESS_AEAD_FORCED=false"
Type=simple
WorkingDirectory=/usr/local/x-ui/
ExecStart=/usr/local/x-ui/x-ui
ExecReload=kill -USR1 $MAINPID
Restart=on-failure
RestartSec=5s

302
x-ui.sh
View file

@ -408,6 +408,16 @@ restart() {
fi
}
restart_xray() {
systemctl reload x-ui
LOGI "xray-core Restart signal sent successfully, Please check the log information to confirm whether xray restarted successfully"
sleep 2
show_xray_status
if [[ $# == 0 ]]; then
before_show_menu
fi
}
status() {
if [[ $release == "alpine" ]]; then
rc-service x-ui status
@ -1688,56 +1698,82 @@ run_librespeed() {
}
create_honeypot() {
local pkg_manager=""
local server_ip=$(curl -s --max-time 3 https://4.ident.me)
echo -e "${yellow}${plain}Downloading sources and Utilites..."
if command -v dnf &>/dev/null; then
pkg_manager="dnf"
dnf install httpd -y
elif command -v yum &>/dev/null; then
pkg_manager="yum"
yum install httpd
elif command -v apt-get &>/dev/null; then
pkg_manager="apt-get"
apt-get install apache2
elif command -v apt &>/dev/null; then
pkg_manager="apt"
apt install apache2
fi
echo -e "${plain}Do you want to use: ${green}Apache ${plain}or ${green}Nginx"
if [[ -z $pkg_manager ]]; then
echo "Error: Package manager not found. You may need to install HoneyPot manually."
return 1
fi
read -p "Apache or Nginx: " nginx_or_apache
# Start apache server for HoneyPot
systemctl enable apache2
systemctl start apache2
echo -e "${yellow}Downloading sources and Utilites..."
echo -e "${yellow}${plain}Installing HoneyPot..."
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
git clone https://github.com/d3l1f3r/SpaceSaver.git
mv SpaceSaver/ /var/www/html/
# 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
# Configs
echo """
<VirtualHost *:80>
ServerName SpaceSaver
DocumentRoot /var/www/html/SpaceSaver
<Directory /var/www/html/SpaceSaver>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
echo -e "${yellow}Installing HoneyPot..."
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>""" >> /etc/apache2/sites-enabled/spacesaver.conf
git clone https://github.com/d3l1f3r/SpaceSaver.git
mv SpaceSaver/ /var/www/html/
echo """
# Config for apache2
echo """
<VirtualHost *:80>
ServerName SpaceSaver
DocumentRoot /var/www/html/SpaceSaver
@ -1752,18 +1788,120 @@ create_honeypot() {
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>""" >> /etc/apache2/sites-available/spacesaver.conf
# Restarting apache server
sudo systemctl reload apache2
ln -sf /etc/apache2/sites-available/spacesaver.conf /etc/apache2/sites-enabled/
# Access rights to HoneyPot's files
sudo chown -R www-data:www-data /var/www/html/SpaceSaver
sudo chmod -R 755 /var/www/html/SpaceSaver
chmod 644 /var/www/html/SpaceSaver/index.html
# 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
sudo systemctl reload apache2
# 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 "${green}${plain}Done!"
echo -e "${green}${plain}Available here -> http://$server_ip:80"
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() {
@ -2305,28 +2443,29 @@ show_menu() {
${green}11.${plain} Start │
${green}12.${plain} Stop │
${green}13.${plain} Restart │
${green}14.${plain} Check Status │
${green}15.${plain} Logs Management │
| ${green}14.${plain} Restart Xray │
${green}15.${plain} Check Status │
${green}16.${plain} Logs Management │
│────────────────────────────────────────────────│
${green}16.${plain} Enable Autostart │
${green}17.${plain} Disable Autostart │
${green}17.${plain} Enable Autostart │
${green}18.${plain} Disable Autostart │
│────────────────────────────────────────────────│
${green}18.${plain} SSL Certificate Management │
${green}19.${plain} Cloudflare SSL Certificate │
${green}20.${plain} IP Limit Management │
${green}21.${plain} Firewall Management │
${green}22.${plain} SSH Port Forwarding Management │
${green}23.${plain} HoneyPot (Fakesite)
${green}24.${plain} Change DNS resolver │
${green}19.${plain} SSL Certificate Management │
${green}20.${plain} Cloudflare SSL Certificate │
${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}25.${plain} Enable BBR │
${green}26.${plain} Update Geo Files │
${green}27.${plain} Speedtest by Ookla │
${green}28.${plain} Librespeed │
${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-28]: " num
echo && read -rp "Please enter your selection [0-29]: " num
case "${num}" in
0)
@ -2372,52 +2511,55 @@ show_menu() {
check_install && restart
;;
14)
check_install && status
check_install && restart_xray
;;
15)
check_install && show_log
check_install && status
;;
16)
check_install && enable
check_install && show_log
;;
17)
check_install && disable
check_install && enable
;;
18)
ssl_cert_issue_main
check_install && disable
;;
19)
ssl_cert_issue_CF
ssl_cert_issue_main
;;
20)
iplimit_main
ssl_cert_issue_CF
;;
21)
firewall_menu
iplimit_main
;;
22)
SSH_port_forwarding
firewall_menu
;;
23)
create_honeypot
SSH_port_forwarding
;;
24)
change_dns
create_honeypot
;;
25)
bbr_menu
change_dns
;;
26)
update_geo
bbr_menu
;;
27)
run_speedtest
update_geo
;;
28)
run_speedtest
;;
29)
run_librespeed
;;
*)
LOGE "Please enter the correct number [0-28]"
LOGE "Please enter the correct number [0-29]"
;;
esac
}