优化配置布局
This commit is contained in:
35
install.sh
35
install.sh
@@ -13,7 +13,10 @@ NC='\033[0m'
|
|||||||
|
|
||||||
# Configuration
|
# Configuration
|
||||||
CONFIG_DIR="/etc/sing-box"
|
CONFIG_DIR="/etc/sing-box"
|
||||||
CONFIG_FILE="$CONFIG_DIR/config.json"
|
CONFIG_MERGE_DIR="$CONFIG_DIR/config.d"
|
||||||
|
CONFIG_BASE_FILE="$CONFIG_MERGE_DIR/10-base.json"
|
||||||
|
CONFIG_OUTBOUNDS_FILE="$CONFIG_MERGE_DIR/20-outbounds.json"
|
||||||
|
WORK_DIR="/var/lib/sing-box"
|
||||||
BINARY_PATH="/usr/local/bin/sing-box"
|
BINARY_PATH="/usr/local/bin/sing-box"
|
||||||
SERVICE_NAME="ganclient"
|
SERVICE_NAME="ganclient"
|
||||||
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
|
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
|
||||||
@@ -38,7 +41,8 @@ esac
|
|||||||
|
|
||||||
# Prepare directories
|
# Prepare directories
|
||||||
mkdir -p "$CONFIG_DIR"
|
mkdir -p "$CONFIG_DIR"
|
||||||
mkdir -p "/var/lib/sing-box"
|
mkdir -p "$CONFIG_MERGE_DIR"
|
||||||
|
mkdir -p "$WORK_DIR"
|
||||||
|
|
||||||
# Check and Install Go
|
# Check and Install Go
|
||||||
install_go() {
|
install_go() {
|
||||||
@@ -241,7 +245,7 @@ SERVICE_JSON+=$'\n }'
|
|||||||
|
|
||||||
# Generate Configuration
|
# Generate Configuration
|
||||||
echo -e "${YELLOW}Generating configuration...${NC}"
|
echo -e "${YELLOW}Generating configuration...${NC}"
|
||||||
cat > "$CONFIG_FILE" <<EOF
|
cat > "$CONFIG_BASE_FILE" <<EOF
|
||||||
{
|
{
|
||||||
"log": {
|
"log": {
|
||||||
"level": "info",
|
"level": "info",
|
||||||
@@ -250,7 +254,7 @@ cat > "$CONFIG_FILE" <<EOF
|
|||||||
"experimental": {
|
"experimental": {
|
||||||
"cache_file": {
|
"cache_file": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"path": "/var/lib/sing-box/cache.db"
|
"path": "$WORK_DIR/cache.db"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dns": {
|
"dns": {
|
||||||
@@ -267,12 +271,6 @@ cat > "$CONFIG_FILE" <<EOF
|
|||||||
${SERVICE_JSON}
|
${SERVICE_JSON}
|
||||||
],
|
],
|
||||||
"inbounds": [],
|
"inbounds": [],
|
||||||
"outbounds": [
|
|
||||||
{
|
|
||||||
"type": "direct",
|
|
||||||
"tag": "direct"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"route": {
|
"route": {
|
||||||
"rules": [
|
"rules": [
|
||||||
{
|
{
|
||||||
@@ -285,7 +283,20 @@ ${SERVICE_JSON}
|
|||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
echo -e "${GREEN}Configuration written to $CONFIG_FILE${NC}"
|
cat > "$CONFIG_OUTBOUNDS_FILE" <<EOF
|
||||||
|
{
|
||||||
|
"outbounds": [
|
||||||
|
{
|
||||||
|
"type": "direct",
|
||||||
|
"tag": "direct"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo -e "${GREEN}Base configuration written to $CONFIG_BASE_FILE${NC}"
|
||||||
|
echo -e "${GREEN}Outbound configuration written to $CONFIG_OUTBOUNDS_FILE${NC}"
|
||||||
|
echo -e "${YELLOW}Edit $CONFIG_OUTBOUNDS_FILE when adding custom sing-box outbounds.${NC}"
|
||||||
|
|
||||||
if [[ "$ENABLE_PROXY_PROTOCOL_HINT" =~ ^([yY][eE][sS]|[yY]|1|true|TRUE)$ ]]; then
|
if [[ "$ENABLE_PROXY_PROTOCOL_HINT" =~ ^([yY][eE][sS]|[yY]|1|true|TRUE)$ ]]; then
|
||||||
echo -e "${YELLOW}Proxy Protocol deployment hint enabled.${NC}"
|
echo -e "${YELLOW}Proxy Protocol deployment hint enabled.${NC}"
|
||||||
@@ -308,7 +319,7 @@ After=network.target nss-lookup.target
|
|||||||
[Service]
|
[Service]
|
||||||
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW
|
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW
|
||||||
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW
|
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW
|
||||||
ExecStart=$BINARY_PATH run -c $CONFIG_FILE
|
ExecStart=$BINARY_PATH -D $WORK_DIR -C $CONFIG_MERGE_DIR run
|
||||||
Restart=on-failure
|
Restart=on-failure
|
||||||
RestartSec=10
|
RestartSec=10
|
||||||
LimitNOFILE=infinity
|
LimitNOFILE=infinity
|
||||||
|
|||||||
@@ -106,6 +106,12 @@ type XNodeConfig struct {
|
|||||||
ServerName string `json:"server_name,omitempty"`
|
ServerName string `json:"server_name,omitempty"`
|
||||||
ServerPortText string `json:"server_port_text,omitempty"`
|
ServerPortText string `json:"server_port_text,omitempty"`
|
||||||
Network string `json:"network"`
|
Network string `json:"network"`
|
||||||
|
DisableTCPKeepAlive bool `json:"disable_tcp_keep_alive,omitempty"`
|
||||||
|
DisableTCPKeepAlive_ bool `json:"disableTcpKeepAlive,omitempty"`
|
||||||
|
TCPKeepAlive badoption.Duration `json:"tcp_keep_alive,omitempty"`
|
||||||
|
TCPKeepAlive_ badoption.Duration `json:"tcpKeepAlive,omitempty"`
|
||||||
|
TCPKeepAliveInterval badoption.Duration `json:"tcp_keep_alive_interval,omitempty"`
|
||||||
|
TCPKeepAliveInterval_ badoption.Duration `json:"tcpKeepAliveInterval,omitempty"`
|
||||||
AcceptProxyProtocol bool `json:"accept_proxy_protocol,omitempty"`
|
AcceptProxyProtocol bool `json:"accept_proxy_protocol,omitempty"`
|
||||||
AcceptProxyProtocol_ bool `json:"acceptProxyProtocol,omitempty"`
|
AcceptProxyProtocol_ bool `json:"acceptProxyProtocol,omitempty"`
|
||||||
Multiplex *XMultiplexConfig `json:"multiplex,omitempty"`
|
Multiplex *XMultiplexConfig `json:"multiplex,omitempty"`
|
||||||
@@ -164,6 +170,12 @@ type XInnerConfig struct {
|
|||||||
Dest string `json:"dest,omitempty"`
|
Dest string `json:"dest,omitempty"`
|
||||||
ServerName string `json:"server_name,omitempty"`
|
ServerName string `json:"server_name,omitempty"`
|
||||||
Network string `json:"network"`
|
Network string `json:"network"`
|
||||||
|
DisableTCPKeepAlive bool `json:"disable_tcp_keep_alive,omitempty"`
|
||||||
|
DisableTCPKeepAlive_ bool `json:"disableTcpKeepAlive,omitempty"`
|
||||||
|
TCPKeepAlive badoption.Duration `json:"tcp_keep_alive,omitempty"`
|
||||||
|
TCPKeepAlive_ badoption.Duration `json:"tcpKeepAlive,omitempty"`
|
||||||
|
TCPKeepAliveInterval badoption.Duration `json:"tcp_keep_alive_interval,omitempty"`
|
||||||
|
TCPKeepAliveInterval_ badoption.Duration `json:"tcpKeepAliveInterval,omitempty"`
|
||||||
AcceptProxyProtocol bool `json:"accept_proxy_protocol,omitempty"`
|
AcceptProxyProtocol bool `json:"accept_proxy_protocol,omitempty"`
|
||||||
AcceptProxyProtocol_ bool `json:"acceptProxyProtocol,omitempty"`
|
AcceptProxyProtocol_ bool `json:"acceptProxyProtocol,omitempty"`
|
||||||
Multiplex *XMultiplexConfig `json:"multiplex,omitempty"`
|
Multiplex *XMultiplexConfig `json:"multiplex,omitempty"`
|
||||||
@@ -726,6 +738,66 @@ func acceptProxyProtocolEnabled(inner XInnerConfig, config *XNodeConfig) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
defaultXboardTCPKeepAlive = 30 * time.Second
|
||||||
|
defaultXboardTCPKeepAliveInterval = 15 * time.Second
|
||||||
|
)
|
||||||
|
|
||||||
|
func resolveTCPKeepAlive(inner XInnerConfig, config *XNodeConfig, settings json.RawMessage) (bool, badoption.Duration, badoption.Duration) {
|
||||||
|
disableKeepAlive := inner.DisableTCPKeepAlive || inner.DisableTCPKeepAlive_
|
||||||
|
if !disableKeepAlive && config != nil {
|
||||||
|
disableKeepAlive = config.DisableTCPKeepAlive || config.DisableTCPKeepAlive_
|
||||||
|
}
|
||||||
|
if !disableKeepAlive {
|
||||||
|
if networkDisable, ok := readNetworkBool(unmarshalNetworkSettings(settings), "disable_tcp_keep_alive", "disableTcpKeepAlive"); ok {
|
||||||
|
disableKeepAlive = networkDisable
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if disableKeepAlive {
|
||||||
|
return true, 0, 0
|
||||||
|
}
|
||||||
|
|
||||||
|
keepAlive := inner.TCPKeepAlive
|
||||||
|
if keepAlive == 0 {
|
||||||
|
keepAlive = inner.TCPKeepAlive_
|
||||||
|
}
|
||||||
|
if keepAlive == 0 && config != nil {
|
||||||
|
keepAlive = config.TCPKeepAlive
|
||||||
|
}
|
||||||
|
if keepAlive == 0 && config != nil {
|
||||||
|
keepAlive = config.TCPKeepAlive_
|
||||||
|
}
|
||||||
|
if keepAlive == 0 {
|
||||||
|
if networkKeepAlive, ok := readNetworkDuration(unmarshalNetworkSettings(settings), "tcp_keep_alive", "tcpKeepAlive"); ok {
|
||||||
|
keepAlive = networkKeepAlive
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if keepAlive == 0 {
|
||||||
|
keepAlive = badoption.Duration(defaultXboardTCPKeepAlive)
|
||||||
|
}
|
||||||
|
|
||||||
|
keepAliveInterval := inner.TCPKeepAliveInterval
|
||||||
|
if keepAliveInterval == 0 {
|
||||||
|
keepAliveInterval = inner.TCPKeepAliveInterval_
|
||||||
|
}
|
||||||
|
if keepAliveInterval == 0 && config != nil {
|
||||||
|
keepAliveInterval = config.TCPKeepAliveInterval
|
||||||
|
}
|
||||||
|
if keepAliveInterval == 0 && config != nil {
|
||||||
|
keepAliveInterval = config.TCPKeepAliveInterval_
|
||||||
|
}
|
||||||
|
if keepAliveInterval == 0 {
|
||||||
|
if networkKeepAliveInterval, ok := readNetworkDuration(unmarshalNetworkSettings(settings), "tcp_keep_alive_interval", "tcpKeepAliveInterval"); ok {
|
||||||
|
keepAliveInterval = networkKeepAliveInterval
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if keepAliveInterval == 0 {
|
||||||
|
keepAliveInterval = badoption.Duration(defaultXboardTCPKeepAliveInterval)
|
||||||
|
}
|
||||||
|
|
||||||
|
return false, keepAlive, keepAliveInterval
|
||||||
|
}
|
||||||
|
|
||||||
func (s *Service) setupNode() error {
|
func (s *Service) setupNode() error {
|
||||||
s.logger.Info("Xboard fetching node config...")
|
s.logger.Info("Xboard fetching node config...")
|
||||||
config, err := s.fetchConfig()
|
config, err := s.fetchConfig()
|
||||||
@@ -844,11 +916,27 @@ func (s *Service) setupNode() error {
|
|||||||
} else {
|
} else {
|
||||||
listenAddr = badoption.Addr(netip.IPv4Unspecified())
|
listenAddr = badoption.Addr(netip.IPv4Unspecified())
|
||||||
}
|
}
|
||||||
|
tcpNetworkSettings := inner.NetworkSettings
|
||||||
|
if len(tcpNetworkSettings) == 0 {
|
||||||
|
tcpNetworkSettings = inner.NetworkSettings_
|
||||||
|
}
|
||||||
|
|
||||||
listen := option.ListenOptions{
|
listen := option.ListenOptions{
|
||||||
Listen: &listenAddr,
|
Listen: &listenAddr,
|
||||||
ListenPort: uint16(inner.Port),
|
ListenPort: uint16(inner.Port),
|
||||||
}
|
}
|
||||||
|
disableTCPKeepAlive, tcpKeepAlive, tcpKeepAliveInterval := resolveTCPKeepAlive(inner, config, tcpNetworkSettings)
|
||||||
|
listen.DisableTCPKeepAlive = disableTCPKeepAlive
|
||||||
|
if !disableTCPKeepAlive {
|
||||||
|
listen.TCPKeepAlive = tcpKeepAlive
|
||||||
|
listen.TCPKeepAliveInterval = tcpKeepAliveInterval
|
||||||
|
s.logger.Info(
|
||||||
|
"Xboard TCP keepalive configured. idle=", time.Duration(tcpKeepAlive),
|
||||||
|
", interval=", time.Duration(tcpKeepAliveInterval),
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
s.logger.Warn("Xboard TCP keepalive disabled by panel config")
|
||||||
|
}
|
||||||
if acceptProxyProtocolEnabled(inner, config) {
|
if acceptProxyProtocolEnabled(inner, config) {
|
||||||
listen.ProxyProtocol = true
|
listen.ProxyProtocol = true
|
||||||
s.logger.Info("Xboard PROXY protocol enabled for inbound on ", inner.ListenIP, ":", inner.Port)
|
s.logger.Info("Xboard PROXY protocol enabled for inbound on ", inner.ListenIP, ":", inner.Port)
|
||||||
|
|||||||
Reference in New Issue
Block a user