40 Commits

Author SHA1 Message Date
Olia Lisa bad0bcc602 chore: 适配 sing-box v1.14 2026-06-10 14:40:01 +08:00
Olia Lisa 334b0629b0 fix: 增加检查docker-compose文件是否存在 2026-06-10 14:20:34 +08:00
Olia Lisa 2379022f7f refactor: 迁移run函数, 删除run.sh文件 2026-06-10 14:16:48 +08:00
Olia Lisa 2d09268c4d 修改docker compose 的检查方式, 放入到run函数中 2026-06-10 14:13:12 +08:00
Olia Lisa 9dfd39e67b fix: 增加检查docker是否包含子命令compose. 如果没有compose子命令, 提示用户升级docker 2026-06-09 22:45:10 +08:00
Olia Lisa 97cd1e6b70 chore: 补充注释 2026-06-07 23:32:23 +08:00
Olia Lisa e90a7e7d25 refactor: 迁移密码生成函数 2026-06-07 23:26:27 +08:00
Olia Lisa 149d8a2cb0 refactor: 重构创建配置文件函数 2026-05-31 23:31:04 +08:00
Olia Lisa 1ef1799a51 udpate readme.md 2026-05-28 19:04:05 +08:00
Olia Lisa 07e3ec7a77 重构代码, 将变量名改为大写 2026-05-28 18:57:33 +08:00
Olia Lisa a58cfd0fe6 迁移bbr函数到bbr.sh 2026-05-28 18:49:33 +08:00
Olia Lisa 1ee54f0f48 fix bug 2026-05-28 15:36:45 +08:00
Olia Lisa 6b01c65ea6 fix bug 2026-05-28 15:35:44 +08:00
Olia Lisa 6a2e902fb3 重构代码, 2026-05-28 15:34:42 +08:00
Olia Lisa 7de9fcf0a9 重构代码 2026-05-28 15:30:41 +08:00
Olia Lisa 250952e5dd fix bug 2026-05-28 15:24:46 +08:00
Olia Lisa 506894d145 重构查看分享连接代码 2026-05-28 15:16:18 +08:00
Olia Lisa 245bac6056 补充注释 2026-05-28 15:11:49 +08:00
Olia Lisa f58c341a28 重构代码, 重构update_uuid函数 2026-05-28 15:10:40 +08:00
Olia Lisa c0824d99c0 重构代码, update 端口相关函数 2026-05-28 15:08:00 +08:00
Olia Lisa 499b085f05 重构代码, 更新密码函数,支持传入配置文件路径并增加错误处理 2026-05-28 14:51:17 +08:00
Olia Lisa 30a50c0292 update: bbr函数增加"测容器环境" 2026-05-28 09:05:03 +08:00
Olia Lisa 4bd898a067 增加l bbr加速 功能 2026-05-28 08:43:55 +08:00
Olia Lisa 900378b8ec update 2026-05-23 10:13:28 +08:00
Olia Lisa b88d670967 update 2026-05-23 06:57:33 +08:00
Olia Lisa 2aea194f35 重构代码 2026-05-23 00:12:14 +08:00
Olia Lisa 0f4857999b 重构代码 2026-05-22 23:36:08 +08:00
Olia Lisa d8559dafb4 重构代码, 优化自签名证书和ACME TLS配置生成逻辑 2026-05-22 18:37:56 +08:00
Olia Lisa 348862520c 重构代码, 修改生成自签名证书文件 2026-05-22 18:30:08 +08:00
Olia Lisa 553529e9b8 重构代码, 增加函数文件, 用于设置tls 2026-05-22 17:29:44 +08:00
Olia Lisa a68c38986d 配置文件, 混淆密码和密码位置代码位置调整 2026-05-22 14:03:39 +08:00
Olia Lisa 9e03cff9aa 修改hysteria模板, 修改上行速度up为50 2026-05-22 13:45:01 +08:00
Olia Lisa f3d61b6fe4 修改文案 2026-05-22 12:46:11 +08:00
Olia Lisa 486ceb7bb3 拆分创建配置脚本文件我 2026-05-22 12:40:11 +08:00
Olia Lisa 7378d8f53f 迁移create_config函数到install.sh文件 2026-05-22 12:33:45 +08:00
Olia Lisa 68269add4b 完善hysteria配置 2026-05-22 12:20:30 +08:00
Olia Lisa ef17816b2d 增加对hysteria2协议的分享链接生成支持 2026-05-22 11:36:01 +08:00
Olia Lisa f2bf6371f0 增加创建hysteria自签名证书方式配置 2026-05-22 11:15:56 +08:00
Olia Lisa 3f69ba589b 重构代码, 为加入heystia功能做准备 2026-05-22 11:02:05 +08:00
Olia Lisa 69e60bd5d7 重构代码, 函数改名 2026-05-22 10:58:33 +08:00
19 changed files with 618 additions and 225 deletions
+1
View File
@@ -54,6 +54,7 @@ apt install -y curl wget curl
7. 修改端口
8. 更新镜像
9. 更新脚本
10. 开启BBR加速
输入您的选择:
```
+71
View File
@@ -0,0 +1,71 @@
# 开启BBR加速
enable_kernel_bbr(){
if [ "$(id -u)" -ne 0 ]; then
echo "请使用 root 权限运行该操作"
return 1
fi
# 检测容器环境
local virt_type=""
if command -v systemd-detect-virt >/dev/null 2>&1; then
virt_type=$(systemd-detect-virt 2>/dev/null)
fi
case "$virt_type" in
lxc|openvz|docker|podman|container-other)
echo "检测到当前运行于容器环境: $virt_type"
echo "请在宿主机开启 BBR"
return 1
;;
esac
if [ "$(sysctl -n net.ipv4.tcp_congestion_control 2>/dev/null)" = "bbr" ]; then
echo "BBR加速 已经开启,无需重复操作"
return 0
fi
# 尝试加载 bbr 模块(新内核可能已内建)
if command -v modprobe >/dev/null 2>&1; then
modprobe tcp_bbr 2>/dev/null || true
fi
# 检查内核是否支持 BBR
if ! sysctl net.ipv4.tcp_available_congestion_control 2>/dev/null | grep -qw bbr; then
echo "当前系统内核不支持 BBR"
return 1
fi
set_sysctl_conf(){
local key="$1"
local value="$2"
local file="/etc/sysctl.conf"
touch "$file"
# 转义 key,避免 . 被 grep/sed 当作正则
local escaped_key
escaped_key=$(printf '%s\n' "$key" | sed 's/[.[\*^$()+?{|]/\\&/g')
if grep -qE "^[[:space:]]*#?[[:space:]]*$escaped_key[[:space:]]*=" "$file"; then
sed -i "s|^[[:space:]]*#\?[[:space:]]*$escaped_key[[:space:]]*=.*|$key = $value|" "$file"
else
echo "$key = $value" >> "$file"
fi
}
# 写入配置
set_sysctl_conf "net.core.default_qdisc" "fq"
set_sysctl_conf "net.ipv4.tcp_congestion_control" "bbr"
# 立即生效
sysctl -w net.core.default_qdisc=fq >/dev/null 2>&1
sysctl -w net.ipv4.tcp_congestion_control=bbr >/dev/null 2>&1
# 验证是否成功
if [ "$(sysctl -n net.ipv4.tcp_congestion_control 2>/dev/null)" = "bbr" ]; then
echo "BBR加速 已开启"
else
echo "BBR开启失败"
return 1
fi
}
-106
View File
@@ -1,106 +0,0 @@
#!/bin/bash
create_acme_tls_config() {
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径
local CONFIG_DIR="$SCRIPT_DIR/../config"
local CONFIG_FILE="$CONFIG_DIR/config.json"
cp "$CONFIG_DIR/template/tuic/tuic_acme_tls_config.json" "$CONFIG_FILE"
# 获取邮箱
local USER_EMAIL
read -p "请输入你的邮箱(可留空): " USER_EMAIL
if [[ -z "$USER_EMAIL" ]]; then
USER_EMAIL="example@example.com"
fi
# 获取域名
local USER_DOMAIN
read -p "请输入你的域名 (例如: example.com): " USER_DOMAIN
while [[ -z "$USER_DOMAIN" ]]; do
echo "[错误] 域名不能为空"
read -p "请输入你的域名: " USER_DOMAIN
done
# 获取 Cloudflare API Token
local CLOUDFLARE_TOKEN
read -p "请输入你的 Cloudflare API Token: " CLOUDFLARE_TOKEN
while [[ -z "$CLOUDFLARE_TOKEN" ]]; do
echo "[错误] Cloudflare API Token 不能为空"
read -p "请输入你的 Cloudflare API Token: " CLOUDFLARE_TOKEN
done
sed -i "s/你的邮箱/$USER_EMAIL/g" "$CONFIG_FILE"
sed -i "s/你的域名/$USER_DOMAIN/g" "$CONFIG_FILE"
sed -i "s/你的Cloudflare_API_Token/$CLOUDFLARE_TOKEN/g" "$CONFIG_FILE"
# 设置端口
update_port
# 设置密码
update_password
# 设置UUID
update_uuid
green "成功创建配置"
}
create_self_tls_config() {
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径
local CONFIG_FILE="$SCRIPT_DIR/../config/config.json"
cp "$SCRIPT_DIR/../config/template/tuic/tuic_self_tls_config.json" "$CONFIG_FILE"
# 生成自签名证书和设置域名
local DOMAIN="bing.com"
create_self_tls "$DOMAIN"
sed -i "s/你的域名/$DOMAIN/g" "$CONFIG_FILE"
# 设置端口
update_port
# 设置密码
update_password
# 设置UUID
update_uuid
green "成功创建配置"
}
create_config(){
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径
local CONFIG_FILE="$SCRIPT_DIR/../config/config.json"
# 如果配置文件已存在,提示用户是否重新生成
if [ -e "$CONFIG_FILE" ]; then
local REGENERATE
read -p "检测到配置已存在,是否重新生成配置?(y/n): " REGENERATE
if [ "$REGENERATE" != "y" ] && [ "$REGENERATE" != "Y" ]; then
echo "取消重新生成配置."
return
fi
fi
echo "请选择配置类型:"
echo "1. 自签名证书配置"
echo "2. tls证书配置"
local CHOICE
read -p "输入您的选择: " CHOICE
case $CHOICE in
1)
echo "重置为自签名证书配置..."
create_self_tls_config
;;
2)
echo "重置为acme tls证书配置..."
create_acme_tls_config
;;
*)
echo "无效的选择, 请重新选择."
;;
esac
}
+66
View File
@@ -0,0 +1,66 @@
#!/bin/bash
create_hysteria_config(){
local CONFIG_DIR="${1}" # 配置文件目录
echo "请选择配置类型:"
echo "1. Hysteria 自签名证书配置"
echo "2. Hysteria tls证书配置"
local CHOICE
read -p "输入您的选择: " CHOICE
case $CHOICE in
1)
echo "重置为hysteria自签名证书配置..."
create_hysteria_self_tls_config $CONFIG_DIR
;;
2)
echo "重置为hysteria acme tls证书配置..."
create_hysteria_acme_tls_config $CONFIG_DIR
;;
*)
echo "无效的选择, 请重新选择."
;;
esac
}
create_hysteria_self_tls_config() {
local CONFIG_DIR="${1}" # 配置文件目录
local CONFIG_FILE="$CONFIG_DIR/config.json"
cp "$CONFIG_DIR/template/hysteria/hysteria_self_tls_config.json" "$CONFIG_FILE"
# 生成自签名证书和设置域名
update_self_tls "$CONFIG_FILE" "bing.com"
# 设置端口
update_port "$CONFIG_FILE"
# 设置密码
update_password "$CONFIG_FILE"
# 设置混淆密码
update_obfs_password "$CONFIG_FILE"
green "成功创建配置"
}
create_hysteria_acme_tls_config() {
local CONFIG_DIR="${1}" # 配置文件目录
local CONFIG_FILE="$CONFIG_DIR/config.json"
cp "$CONFIG_DIR/template/hysteria/hysteria_acme_tls_config.json" "$CONFIG_FILE"
update_acme_tls "$CONFIG_FILE"
# 设置端口
update_port "$CONFIG_FILE"
# 设置密码
update_password "$CONFIG_FILE"
# 设置混淆密码
update_obfs_password "$CONFIG_FILE"
green "成功创建配置"
}
+66
View File
@@ -0,0 +1,66 @@
#!/bin/bash
create_tuic_config(){
local CONFIG_DIR="${1}" # 配置文件目录
echo "请选择配置类型:"
echo "1. Tuic 自签名证书配置"
echo "2. Tuic tls证书配置"
local CHOICE
read -p "输入您的选择: " CHOICE
case $CHOICE in
1)
echo "重置为 tuic 自签名证书配置..."
create_tuic_self_tls_config $CONFIG_DIR
;;
2)
echo "重置为 tuic acme tls证书配置..."
create_tuic_acme_tls_config $CONFIG_DIR
;;
*)
echo "无效的选择, 请重新选择."
;;
esac
}
create_tuic_acme_tls_config() {
local CONFIG_DIR="${1}" # 配置文件目录
local CONFIG_FILE="$CONFIG_DIR/config.json"
cp "$CONFIG_DIR/template/tuic/tuic_acme_tls_config.json" "$CONFIG_FILE"
update_acme_tls "$CONFIG_FILE"
# 设置端口
update_port "$CONFIG_FILE"
# 设置密码
update_password "$CONFIG_FILE"
# 设置UUID
update_uuid "$CONFIG_FILE"
green "成功创建配置"
}
create_tuic_self_tls_config() {
local CONFIG_DIR="${1}"
local CONFIG_FILE="$CONFIG_DIR/config.json"
cp "$CONFIG_DIR/template/tuic/tuic_self_tls_config.json" "$CONFIG_FILE"
# 生成自签名证书和设置域名
update_self_tls "$CONFIG_FILE" "bing.com"
# 设置端口
update_port "$CONFIG_FILE"
# 设置密码
update_password "$CONFIG_FILE"
# 设置UUID
update_uuid "$CONFIG_FILE"
green "成功创建配置"
}
-19
View File
@@ -1,19 +0,0 @@
#!/bin/bash
# 生成自签名证书
create_self_tls() {
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径
local KEY_DIR="$SCRIPT_DIR/../tls/self-tls" # 自签tls证书文件夹
# 创建存放证书的目录
mkdir -p "$KEY_DIR"
# 生成自签名证书
local DOMAIN="${1:-bing.com}" # 域名,默认为bing.com
openssl req -x509 -nodes -newkey ec:<(openssl ecparam -name prime256v1) \
-keyout "$KEY_DIR/server.key" \
-out "$KEY_DIR/server.crt" \
-subj "/CN=$DOMAIN" \
-days 36500
}
+38 -6
View File
@@ -4,6 +4,7 @@
restart_docker() {
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径
local COMPOSE_FILE="$SCRIPT_DIR/../docker-compose.yml"
check_docker_compose_file $COMPOSE_FILE
# 如果容器未运行,提示启动
local RUNNING_COUNT=$(docker compose -f $COMPOSE_FILE ps -q | wc -l)
@@ -30,12 +31,7 @@ restart_docker() {
update_docker_images(){
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径
local COMPOSE_FILE="$SCRIPT_DIR/../docker-compose.yml" # docker-compose.yml文件路径
# 检查是否存在 docker-compose.yml 文件
if [ ! -f $COMPOSE_FILE ]; then
echo "Error: docker-compose.yml 文件不存在."
exit 1
fi
check_docker_compose_file $COMPOSE_FILE
echo "正在关闭容器.."
docker compose -f $COMPOSE_FILE down
@@ -49,3 +45,39 @@ update_docker_images(){
echo "正在启动容器.."
docker compose -f $COMPOSE_FILE up -d
}
run() {
check_docker_compose
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径
local COMPOSE_FILE="$SCRIPT_DIR/../docker-compose.yml"
check_docker_compose_file $COMPOSE_FILE
# 如果容器已经启动, 则先停止容器
if docker compose -f "$COMPOSE_FILE" ps | grep -q "Up"; then
docker compose -f "$COMPOSE_FILE" down
fi
# 启动docker容器
docker compose -f "$COMPOSE_FILE" up -d
}
# 检查docker版本是否支持docker compose子命令
check_docker_compose(){
# 检查 docker compose 子命令是否可用
if ! docker compose version &>/dev/null; then
echo "Docker 不支持 'compose' 子命令,请升级 Docker"
exit 1
fi
}
check_docker_compose_file(){
local COMPOSE_FILE=${1}
# 检查是否存在 docker-compose.yml 文件
if [ ! -f $COMPOSE_FILE ]; then
echo "Error: docker-compose.yml 文件不存在."
exit 1
fi
}
+42 -8
View File
@@ -2,15 +2,49 @@
# 更新密码的函数
update_password() {
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径
local CONFIG_FILE="$SCRIPT_DIR/../config/config.json"
local CONFIG_FILE="${1}"
if [[ -z "$CONFIG_FILE" ]]; then
echo "[Error] config_file配置文件路径 不能为空"
return 1
fi
# 生成一个长度为16的随机密码
local NEW_PASSWORD=$(gen_password 16)
local NEW_PASSWORD
NEW_PASSWORD=$(gen_password 16)
# 修改密码
sed -i 's/你的密码/'"$NEW_PASSWORD"'/g' $CONFIG_FILE
sed -i 's/你的密码/'"$NEW_PASSWORD"'/g' "$CONFIG_FILE"
echo "设置密码成功"
}
# 更新混淆密码
update_obfs_password() {
local CONFIG_FILE="${1}"
if [[ -z "$CONFIG_FILE" ]]; then
echo "[Error] config_file配置文件路径 不能为空"
return 1
fi
# 生成一个长度为16的随机密码
local NEW_PASSWORD
NEW_PASSWORD=$(gen_password 16)
# 修改密码
sed -i 's/你的混淆密码/'"$NEW_PASSWORD"'/g' "$CONFIG_FILE"
echo "设置密码成功"
}
# 生成密码
gen_password() {
local PASS_LENGTH=$1 # 密码长度作为第一个参数
local CHARS='[:alnum:]' # 只允许出现字母和数字
local RAND
RAND=$(< /dev/urandom tr -dc "$CHARS" | head -c "$PASS_LENGTH")
echo "$RAND"
}
+25 -13
View File
@@ -2,21 +2,25 @@
# ==========================================
# 更新 sing-box 配置文件中的监听端口,并开放对应防火墙规则
# 参数: 端口号(可选,不传则设置一个5000 到 15000的空闲端口)
# 参数1: 配置文件路径
# 参数2: 端口号(可选,不传则设置一个5000 到 15000的空闲端口)
# --- 使用示例 ---
# 指定端口
# update_port 8080
# update_port "$CONFIG_FILE" 8080
# ==========================================
update_port(){
local PORT=$1
local CONFIG_FILE="$1"
local PORT="$2"
if [[ -z "$CONFIG_FILE" ]]; then
echo "[Error] config_file配置文件路径 不能为空"
return 1
fi
# 如果没有提供端口参数,则自动查找一个随机空闲端口
if [[ -z "$PORT" ]]; then
PORT=$(find_free_port 5000 15000)
fi
fi
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径
local CONFIG_DIR="$SCRIPT_DIR/../config"
modify_json_file "$CONFIG_DIR/config.json" ".inbounds[0].listen_port" "$PORT"
modify_json_file "$CONFIG_FILE" ".inbounds[0].listen_port" "$PORT"
port_manage allow "$PORT"
echo "设置端口成功"
}
@@ -187,18 +191,26 @@ port_manage() {
# 通过交互方式更新端口
ask_update_port(){
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
local CONFIG_FILE="$SCRIPT_DIR/../config/config.json"
local CONFIG_FILE="${1}"
local CURRENT_PORT=$(get_listen_port)
if [[ -z "$CONFIG_FILE" ]]; then
echo "[Error] config_file配置文件路径 不能为空"
return 1
fi
local CURRENT_PORT=$(get_listen_port "$CONFIG_FILE")
local NEW_PORT=$(ask_update "请输入新的端口号" "$CURRENT_PORT")
update_port "$NEW_PORT"
update_port "$CONFIG_FILE" "$NEW_PORT"
}
# 获取当前配置的监听端口
get_listen_port(){
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
local CONFIG_FILE="$SCRIPT_DIR/../config/config.json"
local CONFIG_FILE="${1}"
if [[ -z "$CONFIG_FILE" ]]; then
echo "[Error] config_file配置文件路径 不能为空"
return 1
fi
local PORT=$(jq -r ".inbounds[0].listen_port" "$CONFIG_FILE")
echo $PORT
+69 -8
View File
@@ -1,14 +1,27 @@
#!/bin/bash
print_share_link() {
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径
local CONFIG_DIR=$(readlink -f "$SCRIPT_DIR/../config")
# 检查jq是否安装
check_jq
# 检查jq是否安装
check_jq
CONFIG_FILE="$CONFIG_DIR/config.json"
local CONFIG_FILE=${1}
local TYPE=$(jq -r '.inbounds[0].type' "$CONFIG_FILE")
if [ "$TYPE" = "tuic" ]; then
print_tuic_share_link "$CONFIG_FILE"
return 0
fi
if [ "$TYPE" = "hysteria2" ]; then
print_hysteria_share_link "$CONFIG_FILE"
return 0
fi
red "error: 不支持的协议类型: $TYPE"
}
print_tuic_share_link() {
local CONFIG_FILE=${1} # 配置文件路径
# 检查配置是否正确
local UUID=$(jq -r '.inbounds[0].users[0].uuid' "$CONFIG_FILE")
@@ -31,7 +44,7 @@ print_share_link() {
local INSECURE=1 # 是否允许不安全连接,1表示允许,0表示不允许
# 检查是否使用ACME申请证书
if jq -e '.inbounds[0].tls.acme' "$CONFIG_DIR/config.json" > /dev/null 2>&1; then
if is_config_use_acme "$CONFIG_FILE"; then
ALLOW_INSECURE=0 # 不跳过证书验证
INSECURE=0
fi
@@ -52,3 +65,51 @@ print_share_link() {
echo -e "\033[0m"
}
print_hysteria_share_link(){
local CONFIG_FILE=${1} # 配置文件路径
local INSECURE=1
local ALLOW_INSECURE=1
# 检查是否使用ACME申请证书
if is_config_use_acme "$CONFIG_FILE"; then
ALLOW_INSECURE=0 # 不跳过证书验证
INSECURE=0
fi
# 读取配置文件内容
local CONFIG=$(cat "$CONFIG_FILE")
# 提取所需信息
local IPV4=$(curl -4 -sSL --connect-timeout 3 --retry 2 ip.sb || echo "null")
local PORT=$(echo "$CONFIG" | jq -r '.inbounds[0].listen_port')
local SNI=$(echo "$CONFIG" | jq -r '.inbounds[0].tls.server_name')
local PASSWORD=$(echo "$CONFIG" | jq -r '.inbounds[0].users[0].password')
local OBFS_TYPE=$(echo "$CONFIG" | jq -r '.inbounds[0].obfs.type')
local OBFS_PASSWORD=$(echo "$CONFIG" | jq -r '.inbounds[0].obfs.password')
# 构建分享链接
local SHARE_LINK="hysteria2://${PASSWORD}@${IPV4}:${PORT}/?sni=${SNI}&insecure=${INSECURE}&obfs=${OBFS_TYPE}&obfs-password=${OBFS_PASSWORD}&allowInsecure=${ALLOW_INSECURE}#Hysteria2节点"
# 输出分享链接
echo -e "\033[32m"
echo "IPV4: $IPV4"
echo "port: $PORT"
echo "password: $PASSWORD"
echo "sni: $SNI"
echo "obfs_type: $OBFS_TYPE"
echo "obfs_password(混淆密码): $OBFS_PASSWORD"
echo ""
echo "分享链接: $SHARE_LINK"
echo -e "\033[0m"
}
# 检查是否使用ACME申请证书
is_config_use_acme(){
local CONFIG_FILE="$1"
if jq -e '.inbounds[0].tls.acme' "$CONFIG_FILE" > /dev/null 2>&1; then
return 0
fi
return 1;
}
-15
View File
@@ -1,15 +0,0 @@
#!/bin/bash
run() {
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径
local COMPOSE_FILE="$SCRIPT_DIR/../docker-compose.yml"
# 如果容器已经启动, 则先停止容器
if docker compose -f "$COMPOSE_FILE" ps | grep -q "Up"; then
docker compose -f "$COMPOSE_FILE" down
fi
# 启动docker容器
docker compose -f "$COMPOSE_FILE" up -d
}
+90
View File
@@ -0,0 +1,90 @@
#!/bin/bash
# 生成自签名证书
create_self_tls_file() {
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径
local KEY_DIR="$SCRIPT_DIR/../tls/self-tls" # 自签tls证书文件夹
# 创建存放证书的目录
mkdir -p "$KEY_DIR"
# 生成自签名证书文件
local DOMAIN="${1:-bing.com}" # 域名,默认为bing.com
openssl req -x509 -nodes -newkey ec:<(openssl ecparam -name prime256v1) \
-keyout "$KEY_DIR/server.key" \
-out "$KEY_DIR/server.crt" \
-subj "/CN=$DOMAIN" \
-days 36500
}
update_self_tls(){
local CONFIG_FILE="${1}" # 配置文件
local DOMAIN="${2}" # 域名
if [[ -z "$CONFIG_FILE" ]]; then
echo "[Error] config_file配置文件路径 不能为空"
return 1
fi
# 生成自签名证书, 设置域名
create_self_tls_file "$DOMAIN"
sed -i "s/你的域名/$DOMAIN/g" "$CONFIG_FILE"
}
update_acme_tls(){
local CONFIG_FILE="${1}" # 配置文件
if [[ -z "$CONFIG_FILE" ]]; then
echo "[Error] config_file配置文件路径 不能为空"
return 1
fi
# 获取邮箱
local USER_EMAIL
read -p "请输入你的邮箱: " USER_EMAIL
while [[ -z "$USER_EMAIL" ]]; do
echo "[Error] 邮箱不能为空"
read -p "请输入你的邮箱: " USER_EMAIL
done
# 获取域名
local USER_DOMAIN
read -p "请输入你的域名 (例如: example.com): " USER_DOMAIN
while [[ -z "$USER_DOMAIN" ]]; do
echo "[Error] 域名不能为空"
read -p "请输入你的域名: " USER_DOMAIN
done
# 获取 Cloudflare API Token
local CLOUDFLARE_TOKEN
read -p "请输入你的 Cloudflare API Token: " CLOUDFLARE_TOKEN
while [[ -z "$CLOUDFLARE_TOKEN" ]]; do
echo "[Error] Cloudflare API Token 不能为空"
read -p "请输入你的 Cloudflare API Token: " CLOUDFLARE_TOKEN
done
sed -i "s/你的邮箱/$USER_EMAIL/g" "$CONFIG_FILE"
sed -i "s/你的域名/$USER_DOMAIN/g" "$CONFIG_FILE"
sed -i "s/你的Cloudflare_API_Token/$CLOUDFLARE_TOKEN/g" "$CONFIG_FILE"
}
# 修改ACME域名
update_acme_domain(){
local CONFIG_FILE="${1}" # 配置文件
local DOMAIN="${2}" # 域名
if [[ -z "$CONFIG_FILE" ]]; then
echo "[Error] config_file配置文件路径 不能为空"
return 1
fi
modify_json_file "$CONFIG_FILE" ".inbounds[0].tls.certificate_provider.domain[0]" "$DOMAIN"
}
update_server_name(){
local CONFIG_FILE="${1}" # 配置文件
local DOMAIN="${2}" # 域名
if [[ -z "$CONFIG_FILE" ]]; then
echo "[Error] config_file配置文件路径 不能为空"
return 1
fi
modify_json_file "$CONFIG_FILE" ".inbounds[0].tls.server_name" "$DOMAIN"
}
-10
View File
@@ -54,16 +54,6 @@ check_jq() {
fi
}
# 生成密码
gen_password() {
local PASS_LENGTH=$1 # 密码长度作为第一个参数
local CHARS='[:alnum:]' # 只允许出现字母和数字
local RAND
RAND=$(< /dev/urandom tr -dc "$CHARS" | head -c "$PASS_LENGTH")
echo "$RAND"
}
# URL编码
url_encode() {
+8 -3
View File
@@ -1,11 +1,16 @@
#!/bin/bash
update_uuid(){
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径
local CONFIG_FILE="$SCRIPT_DIR/../config/config.json"
local CONFIG_FILE="${1}"
if [[ -z "$CONFIG_FILE" ]]; then
echo "[Error] config_file配置文件路径 不能为空"
return 1
fi
# 生成 UUID
local UUID=$(cat /proc/sys/kernel/random/uuid)
local UUID
UUID=$(cat /proc/sys/kernel/random/uuid)
# 修改 UUID
sed -i 's/你的UUID/'"$UUID"'/g' "$CONFIG_FILE"
@@ -10,23 +10,24 @@
"tag": "hysteria2-in",
"listen": "::",
"listen_port": 8443,
"obfs": {
"type": "salamander",
"password": "你的混淆密码"
},
"users": [
{
"name": "user1",
"password": "你的密码"
}
],
"up_mbps": 100,
"obfs": {
"type": "salamander",
"password": "你的混淆密码"
},
"up_mbps": 50,
"down_mbps": 100,
"tls": {
"enabled": true,
"server_name": "你的域名",
"alpn": ["h3"],
"acme": {
"certificate_provider": {
"type":"acme",
"domain": ["你的域名"],
"email": "你的邮箱",
"data_directory": "/etc/sing-box/tls/acme",
@@ -0,0 +1,53 @@
{
"log": {
"level": "info",
"timestamp": true,
"output": "/var/log/sing-box/sing-box.log"
},
"inbounds": [
{
"type": "hysteria2",
"tag": "hysteria2-in",
"listen": "::",
"listen_port": 8443,
"users": [
{
"name": "user1",
"password": "你的密码"
}
],
"obfs": {
"type": "salamander",
"password": "你的混淆密码"
},
"up_mbps": 50,
"down_mbps": 100,
"tls": {
"enabled": true,
"server_name": "你的域名",
"alpn": ["h3"],
"key_path": "/etc/sing-box/tls/self-tls/server.key",
"certificate_path": "/etc/sing-box/tls/self-tls/server.crt"
}
}
],
"outbounds": [
{
"type": "direct",
"tag": "direct"
},
{
"type": "block",
"tag": "block"
}
],
"route": {
"rules": [
{
"ip_is_private": true,
"outbound": "block"
}
],
"final": "direct"
}
}
@@ -25,7 +25,8 @@
"enabled": true,
"server_name": "你的域名",
"alpn": ["h3"],
"acme": {
"certificate_provider": {
"type": "acme",
"domain": ["你的域名"],
"email": "你的邮箱",
"data_directory": "/etc/sing-box/tls/acme",
+11
View File
@@ -0,0 +1,11 @@
services:
sing-box:
image: ghcr.io/sagernet/sing-box:v1.14.0-alpha.26
container_name: ${COMPOSE_PROJECT_NAME}
restart: unless-stopped
network_mode: host
volumes:
- ./config/config.json:/etc/sing-box/config.json
- ./tls:/etc/sing-box/tls
- ./logs:/var/log/sing-box
command: -C /etc/sing-box run
+69 -30
View File
@@ -36,16 +36,16 @@ install(){
# 查询运行状态
check_container_status(){
local compose_file="./docker-compose.yml"
local COMPOSE_FILE="./docker-compose.yml"
local GREEN='\033[0;32m'
local RED='\033[0;31m'
local RESET='\033[0m'
local status
status=$(docker compose -f "$compose_file" ps --status running --quiet 2>/dev/null)
local STATUS
STATUS=$(docker compose -f "$COMPOSE_FILE" ps --status running --quiet 2>/dev/null)
if [ -n "$status" ]; then
if [ -n "$STATUS" ]; then
echo -e "${GREEN}运行中${RESET}"
else
echo -e "${RED}未运行${RESET}"
@@ -54,8 +54,7 @@ check_container_status(){
# 修改域名
ask_update_domain(){
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/bin" # 脚本文件夹绝对路径
local CONFIG_FILE="$SCRIPT_DIR/../config/config.json"
local CONFIG_FILE="${1}"
# 检查jq是否安装
check_jq
@@ -74,12 +73,11 @@ ask_update_domain(){
fi
# 修改server_name
modify_json_file "$CONFIG_FILE" ".inbounds[0].tls.server_name" "$DOMAIN"
update_server_name "$CONFIG_FILE" "$DOMAIN"
# 是否存在acme域名, 存在则修改
local ACME_EXISTS=$(jq -r 'has("inbounds") and (.inbounds[0] | has("tls")) and (.inbounds[0].tls | has("acme"))' "$CONFIG_FILE")
if [[ "$ACME_EXISTS" == "true" ]]; then
modify_json_file "$CONFIG_FILE" ".inbounds[0].tls.acme.domain[0]" "$DOMAIN"
if is_config_use_acme "$CONFIG_FILE"; then
update_acme_domain "$CONFIG_FILE" "$DOMAIN"
fi
echo "修改域名成功"
@@ -87,8 +85,7 @@ ask_update_domain(){
# 检查配置文件
check_config_file(){
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/bin" # 脚本文件夹绝对路径
local CONFIG_FILE="$SCRIPT_DIR/../config/config.json"
local CONFIG_FILE="${1}" # 配置文件
# 检查配置文件是否存在
if [ ! -e "$CONFIG_FILE" ]; then
@@ -103,11 +100,48 @@ check_config_file(){
fi
}
# 创建配置文件
create_config(){
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/bin" # 脚本文件夹绝对路径
local CONFIG_DIR="$SCRIPT_DIR/../config"
local CONFIG_FILE="$CONFIG_DIR/config.json"
# 如果配置文件已存在,提示用户是否重新生成
if [ -e "$CONFIG_FILE" ]; then
local REGENERATE
read -p "检测到配置已存在,是否重新生成配置?(y/n): " REGENERATE
if [ "$REGENERATE" != "y" ] && [ "$REGENERATE" != "Y" ]; then
echo "取消重新生成配置."
return
fi
fi
echo "请选择配置类型:"
echo "1. Tuic"
echo "2. Hysteria"
local CHOICE
read -p "输入您的选择: " CHOICE
case $CHOICE in
1)
create_tuic_config $CONFIG_DIR
;;
2)
create_hysteria_config $CONFIG_DIR
;;
*)
echo "无效的选择, 请重新选择."
;;
esac
}
main(){
local container_status=$(check_container_status)
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/bin" # 脚本文件夹绝对路径
local CONFIG_FILE="$SCRIPT_DIR/../config/config.json"
local CONTAINER_STATUS=$(check_container_status)
# 显示菜单
echo ""
echo 运行状态: $container_status
echo 运行状态: $CONTAINER_STATUS
echo "=============================="
echo "请选择一个操作:"
echo "1. 一键部署"
@@ -119,20 +153,21 @@ main(){
echo "7. 修改端口"
echo "8. 更新镜像"
echo "9. 更新脚本"
echo "10. 开启BBR加速"
# 读取用户选择
local choice
read -p "输入您的选择: " choice
local CHOICE
read -p "输入您的选择: " CHOICE
# 根据用户选择执行相应的操作
case $choice in
case $CHOICE in
1)
# 一键部署
install
create_config
port_manage allow $(get_listen_port) # 开放端口
port_manage allow $(get_listen_port "$CONFIG_FILE") # 开放端口
run
print_share_link
print_share_link "$CONFIG_FILE"
;;
2)
# 生成配置 / 重置配置
@@ -140,19 +175,19 @@ main(){
;;
3)
# 查看分享链接
check_config_file
print_share_link
check_config_file "$CONFIG_FILE"
print_share_link "$CONFIG_FILE"
;;
4)
# 启动
check_config_file
port_manage allow $(get_listen_port) # 开放端口
check_config_file "$CONFIG_FILE"
port_manage allow $(get_listen_port "$CONFIG_FILE") # 开放端口
run
print_share_link
print_share_link "$CONFIG_FILE"
;;
5)
# 停止
if echo "$container_status" | grep -q "未运行"; then
if echo "$CONTAINER_STATUS" | grep -q "未运行"; then
echo "程序已停止"
return
fi
@@ -160,15 +195,15 @@ main(){
;;
6)
# 修改域名
check_config_file
ask_update_domain
check_config_file "$CONFIG_FILE"
ask_update_domain "$CONFIG_FILE"
restart_docker
;;
7)
# 修改端口
check_config_file
ask_update_port
port_manage allow $(get_listen_port) # 开放端口
check_config_file "$CONFIG_FILE"
ask_update_port "$CONFIG_FILE"
port_manage allow $(get_listen_port "$CONFIG_FILE") # 开放端口
restart_docker
;;
8)
@@ -180,6 +215,10 @@ main(){
# 更新脚本
git pull
;;
10)
# 开启BBR加速
enable_kernel_bbr
;;
*)
echo "无效的选择, 请重新选择."
;;