26 Commits

Author SHA1 Message Date
Olia Lisa 821051a52e chore: 修改格式化配置文件 2026-07-20 16:00:06 +08:00
Olia Lisa 2137b008a8 chore: 将tls文件夹作为忽略文件 2026-06-13 14:22:14 +08:00
Olia Lisa 62d83786c3 doc: 修改项目描述 2026-06-12 19:28:13 +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
15 changed files with 304 additions and 199 deletions
+15 -30
View File
@@ -1,45 +1,30 @@
# EditorConfig is awesome: https://EditorConfig.org # EditorConfig is awesome: https://EditorConfig.org
# top-most EditorConfig file # 根目录配置文件
root = true root = true
# Unix-style newlines with a newline ending every file
# 默认规则
[*] [*]
charset = utf-8
end_of_line = lf end_of_line = lf
insert_final_newline = true insert_final_newline = true
trim_trailing_whitespace = true
# Matches multiple files with brace expansion notation
# Set default charset
[*.{js,py}]
charset = utf-8
# 4 space indentation # Shell scripts
[*.py]
indent_style = space
indent_size = 4
# Tab indentation (no size specified)
[Makefile]
indent_style = tab
# Indentation override for all JS under lib directory
[lib/**.js]
indent_style = space
indent_size = 2
# Matches the exact files either package.json or .travis.yml
[{package.json,.travis.yml}]
indent_style = space
indent_size = 2
# Bash scripts
[*.sh] [*.sh]
charset = utf-8
indent_style = space indent_style = space
indent_size = 2 indent_size = 2
# JSON files
[*.json] # Markdown documents
charset = utf-8 [*.md]
indent_style = space
indent_size = 2
trim_trailing_whitespace = false
[*.{json,yml,yaml}]
indent_style = space indent_style = space
indent_size = 2 indent_size = 2
+1
View File
@@ -1,2 +1,3 @@
config/config.json config/config.json
logs logs
tls
+2 -1
View File
@@ -1,6 +1,6 @@
## 说明 ## 说明
一个基于 docker 容器快速部署 tuic 服务器端的项目 通过 Docker 容器快速搭建翻墙服务器,支持 Hysteria 与 TUIC 协议,并提供一键脚本,实现轻松部署
## 快速开始 ## 快速开始
@@ -54,6 +54,7 @@ apt install -y curl wget curl
7. 修改端口 7. 修改端口
8. 更新镜像 8. 更新镜像
9. 更新脚本 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
}
+15 -16
View File
@@ -2,8 +2,7 @@
create_hysteria_config(){ create_hysteria_config(){
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径 local CONFIG_DIR="${1}" # 配置文件目录
local CONFIG_FILE="$SCRIPT_DIR/../config/config.json"
echo "请选择配置类型:" echo "请选择配置类型:"
echo "1. Hysteria 自签名证书配置" echo "1. Hysteria 自签名证书配置"
@@ -13,11 +12,11 @@ create_hysteria_config(){
case $CHOICE in case $CHOICE in
1) 1)
echo "重置为hysteria自签名证书配置..." echo "重置为hysteria自签名证书配置..."
create_hysteria_self_tls_config create_hysteria_self_tls_config $CONFIG_DIR
;; ;;
2) 2)
echo "重置为hysteria acme tls证书配置..." echo "重置为hysteria acme tls证书配置..."
create_hysteria_acme_tls_config create_hysteria_acme_tls_config $CONFIG_DIR
;; ;;
*) *)
echo "无效的选择, 请重新选择." echo "无效的选择, 请重新选择."
@@ -26,42 +25,42 @@ create_hysteria_config(){
} }
create_hysteria_self_tls_config() { create_hysteria_self_tls_config() {
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径 local CONFIG_DIR="${1}" # 配置文件目录
local CONFIG_FILE="$SCRIPT_DIR/../config/config.json" local CONFIG_FILE="$CONFIG_DIR/config.json"
cp "$SCRIPT_DIR/../config/template/hysteria/hysteria_self_tls_config.json" "$CONFIG_FILE" cp "$CONFIG_DIR/template/hysteria/hysteria_self_tls_config.json" "$CONFIG_FILE"
# 生成自签名证书和设置域名 # 生成自签名证书和设置域名
update_self_tls "$CONFIG_FILE" "bing.com" update_self_tls "$CONFIG_FILE" "bing.com"
# 设置端口 # 设置端口
update_port update_port "$CONFIG_FILE"
# 设置密码 # 设置密码
update_password update_password "$CONFIG_FILE"
# 设置混淆密码 # 设置混淆密码
update_obfs_password update_obfs_password "$CONFIG_FILE"
green "成功创建配置" green "成功创建配置"
} }
create_hysteria_acme_tls_config() { create_hysteria_acme_tls_config() {
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径 local CONFIG_DIR="${1}" # 配置文件目录
local CONFIG_FILE="$SCRIPT_DIR/../config/config.json" local CONFIG_FILE="$CONFIG_DIR/config.json"
cp "$SCRIPT_DIR/../config/template/hysteria/hysteria_acme_tls_config.json" "$CONFIG_FILE" cp "$CONFIG_DIR/template/hysteria/hysteria_acme_tls_config.json" "$CONFIG_FILE"
update_acme_tls "$CONFIG_FILE" update_acme_tls "$CONFIG_FILE"
# 设置端口 # 设置端口
update_port update_port "$CONFIG_FILE"
# 设置密码 # 设置密码
update_password update_password "$CONFIG_FILE"
# 设置混淆密码 # 设置混淆密码
update_obfs_password update_obfs_password "$CONFIG_FILE"
green "成功创建配置" green "成功创建配置"
} }
+13 -15
View File
@@ -2,8 +2,7 @@
create_tuic_config(){ create_tuic_config(){
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径 local CONFIG_DIR="${1}" # 配置文件目录
local CONFIG_FILE="$SCRIPT_DIR/../config/config.json"
echo "请选择配置类型:" echo "请选择配置类型:"
echo "1. Tuic 自签名证书配置" echo "1. Tuic 自签名证书配置"
@@ -13,11 +12,11 @@ create_tuic_config(){
case $CHOICE in case $CHOICE in
1) 1)
echo "重置为 tuic 自签名证书配置..." echo "重置为 tuic 自签名证书配置..."
create_tuic_self_tls_config create_tuic_self_tls_config $CONFIG_DIR
;; ;;
2) 2)
echo "重置为 tuic acme tls证书配置..." echo "重置为 tuic acme tls证书配置..."
create_tuic_acme_tls_config create_tuic_acme_tls_config $CONFIG_DIR
;; ;;
*) *)
echo "无效的选择, 请重新选择." echo "无效的选择, 请重新选择."
@@ -26,8 +25,7 @@ create_tuic_config(){
} }
create_tuic_acme_tls_config() { create_tuic_acme_tls_config() {
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径 local CONFIG_DIR="${1}" # 配置文件目录
local CONFIG_DIR="$SCRIPT_DIR/../config"
local CONFIG_FILE="$CONFIG_DIR/config.json" local CONFIG_FILE="$CONFIG_DIR/config.json"
cp "$CONFIG_DIR/template/tuic/tuic_acme_tls_config.json" "$CONFIG_FILE" cp "$CONFIG_DIR/template/tuic/tuic_acme_tls_config.json" "$CONFIG_FILE"
@@ -35,34 +33,34 @@ create_tuic_acme_tls_config() {
update_acme_tls "$CONFIG_FILE" update_acme_tls "$CONFIG_FILE"
# 设置端口 # 设置端口
update_port update_port "$CONFIG_FILE"
# 设置密码 # 设置密码
update_password update_password "$CONFIG_FILE"
# 设置UUID # 设置UUID
update_uuid update_uuid "$CONFIG_FILE"
green "成功创建配置" green "成功创建配置"
} }
create_tuic_self_tls_config() { create_tuic_self_tls_config() {
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径 local CONFIG_DIR="${1}"
local CONFIG_FILE="$SCRIPT_DIR/../config/config.json" local CONFIG_FILE="$CONFIG_DIR/config.json"
cp "$SCRIPT_DIR/../config/template/tuic/tuic_self_tls_config.json" "$CONFIG_FILE" cp "$CONFIG_DIR/template/tuic/tuic_self_tls_config.json" "$CONFIG_FILE"
# 生成自签名证书和设置域名 # 生成自签名证书和设置域名
update_self_tls "$CONFIG_FILE" "bing.com" update_self_tls "$CONFIG_FILE" "bing.com"
# 设置端口 # 设置端口
update_port update_port "$CONFIG_FILE"
# 设置密码 # 设置密码
update_password update_password "$CONFIG_FILE"
# 设置UUID # 设置UUID
update_uuid update_uuid "$CONFIG_FILE"
green "成功创建配置" green "成功创建配置"
} }
+38 -6
View File
@@ -4,6 +4,7 @@
restart_docker() { restart_docker() {
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径 local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径
local COMPOSE_FILE="$SCRIPT_DIR/../docker-compose.yml" 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) local RUNNING_COUNT=$(docker compose -f $COMPOSE_FILE ps -q | wc -l)
@@ -30,12 +31,7 @@ restart_docker() {
update_docker_images(){ update_docker_images(){
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径 local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径
local COMPOSE_FILE="$SCRIPT_DIR/../docker-compose.yml" # docker-compose.yml文件路径 local COMPOSE_FILE="$SCRIPT_DIR/../docker-compose.yml" # docker-compose.yml文件路径
check_docker_compose_file $COMPOSE_FILE
# 检查是否存在 docker-compose.yml 文件
if [ ! -f $COMPOSE_FILE ]; then
echo "Error: docker-compose.yml 文件不存在."
exit 1
fi
echo "正在关闭容器.." echo "正在关闭容器.."
docker compose -f $COMPOSE_FILE down docker compose -f $COMPOSE_FILE down
@@ -49,3 +45,39 @@ update_docker_images(){
echo "正在启动容器.." echo "正在启动容器.."
docker compose -f $COMPOSE_FILE up -d 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
}
+27 -8
View File
@@ -2,30 +2,49 @@
# 更新密码的函数 # 更新密码的函数
update_password() { update_password() {
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径 local CONFIG_FILE="${1}"
local CONFIG_FILE="$SCRIPT_DIR/../config/config.json"
if [[ -z "$CONFIG_FILE" ]]; then
echo "[Error] config_file配置文件路径 不能为空"
return 1
fi
# 生成一个长度为16的随机密码 # 生成一个长度为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 "设置密码成功" echo "设置密码成功"
} }
# 更新混淆密码 # 更新混淆密码
update_obfs_password() { update_obfs_password() {
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径 local CONFIG_FILE="${1}"
local CONFIG_FILE="$SCRIPT_DIR/../config/config.json"
if [[ -z "$CONFIG_FILE" ]]; then
echo "[Error] config_file配置文件路径 不能为空"
return 1
fi
# 生成一个长度为16的随机密码 # 生成一个长度为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 "设置密码成功" echo "设置密码成功"
} }
# 生成密码
gen_password() {
local PASS_LENGTH=$1 # 密码长度作为第一个参数
local CHARS='[:alnum:]' # 只允许出现字母和数字
local RAND
RAND=$(< /dev/urandom tr -dc "$CHARS" | head -c "$PASS_LENGTH")
echo "$RAND"
}
+24 -12
View File
@@ -2,21 +2,25 @@
# ========================================== # ==========================================
# 更新 sing-box 配置文件中的监听端口,并开放对应防火墙规则 # 更新 sing-box 配置文件中的监听端口,并开放对应防火墙规则
# 参数: 端口号(可选,不传则设置一个5000 到 15000的空闲端口) # 参数1: 配置文件路径
# 参数2: 端口号(可选,不传则设置一个5000 到 15000的空闲端口)
# --- 使用示例 --- # --- 使用示例 ---
# 指定端口 # 指定端口
# update_port 8080 # update_port "$CONFIG_FILE" 8080
# ========================================== # ==========================================
update_port(){ 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 if [[ -z "$PORT" ]]; then
PORT=$(find_free_port 5000 15000) PORT=$(find_free_port 5000 15000)
fi fi
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径 modify_json_file "$CONFIG_FILE" ".inbounds[0].listen_port" "$PORT"
local CONFIG_DIR="$SCRIPT_DIR/../config"
modify_json_file "$CONFIG_DIR/config.json" ".inbounds[0].listen_port" "$PORT"
port_manage allow "$PORT" port_manage allow "$PORT"
echo "设置端口成功" echo "设置端口成功"
} }
@@ -187,18 +191,26 @@ port_manage() {
# 通过交互方式更新端口 # 通过交互方式更新端口
ask_update_port(){ ask_update_port(){
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" local CONFIG_FILE="${1}"
local CONFIG_FILE="$SCRIPT_DIR/../config/config.json"
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") local NEW_PORT=$(ask_update "请输入新的端口号" "$CURRENT_PORT")
update_port "$NEW_PORT" update_port "$CONFIG_FILE" "$NEW_PORT"
} }
# 获取当前配置的监听端口 # 获取当前配置的监听端口
get_listen_port(){ get_listen_port(){
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" local CONFIG_FILE="${1}"
local CONFIG_FILE="$SCRIPT_DIR/../config/config.json"
if [[ -z "$CONFIG_FILE" ]]; then
echo "[Error] config_file配置文件路径 不能为空"
return 1
fi
local PORT=$(jq -r ".inbounds[0].listen_port" "$CONFIG_FILE") local PORT=$(jq -r ".inbounds[0].listen_port" "$CONFIG_FILE")
echo $PORT echo $PORT
+25 -31
View File
@@ -4,18 +4,16 @@ print_share_link() {
# 检查jq是否安装 # 检查jq是否安装
check_jq check_jq
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径 local CONFIG_FILE=${1}
local CONFIG_DIR=$(readlink -f "$SCRIPT_DIR/../config")
local CONFIG_FILE="$CONFIG_DIR/config.json"
local TYPE=$(jq -r '.inbounds[0].type' "$CONFIG_FILE") local TYPE=$(jq -r '.inbounds[0].type' "$CONFIG_FILE")
if [ "$TYPE" = "tuic" ]; then if [ "$TYPE" = "tuic" ]; then
print_tuic_share_link print_tuic_share_link "$CONFIG_FILE"
return 0 return 0
fi fi
if [ "$TYPE" = "hysteria2" ]; then if [ "$TYPE" = "hysteria2" ]; then
print_hysteria_share_link print_hysteria_share_link "$CONFIG_FILE"
return 0 return 0
fi fi
@@ -23,9 +21,7 @@ print_share_link() {
} }
print_tuic_share_link() { print_tuic_share_link() {
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径 local CONFIG_FILE=${1} # 配置文件路径
local CONFIG_DIR=$(readlink -f "$SCRIPT_DIR/../config")
local CONFIG_FILE="$CONFIG_DIR/config.json"
# 检查配置是否正确 # 检查配置是否正确
local UUID=$(jq -r '.inbounds[0].users[0].uuid' "$CONFIG_FILE") local UUID=$(jq -r '.inbounds[0].users[0].uuid' "$CONFIG_FILE")
@@ -71,42 +67,40 @@ print_tuic_share_link() {
print_hysteria_share_link(){ print_hysteria_share_link(){
local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" local CONFIG_FILE=${1} # 配置文件路径
local config_dir=$(readlink -f "$script_dir/../config") local INSECURE=1
local config_file="$config_dir/config.json" local ALLOW_INSECURE=1
local insecure=1
local allow_insecure=1
# 检查是否使用ACME申请证书 # 检查是否使用ACME申请证书
if is_config_use_acme "$config_file"; then if is_config_use_acme "$CONFIG_FILE"; then
allow_insecure=0 # 不跳过证书验证 ALLOW_INSECURE=0 # 不跳过证书验证
insecure=0 INSECURE=0
fi fi
# 读取配置文件内容 # 读取配置文件内容
local config=$(cat "$config_file") local CONFIG=$(cat "$CONFIG_FILE")
# 提取所需信息 # 提取所需信息
local ipv4=$(curl -4 -sSL --connect-timeout 3 --retry 2 ip.sb || echo "null") 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 PORT=$(echo "$CONFIG" | jq -r '.inbounds[0].listen_port')
local sni=$(echo "$config" | jq -r '.inbounds[0].tls.server_name') local SNI=$(echo "$CONFIG" | jq -r '.inbounds[0].tls.server_name')
local password=$(echo "$config" | jq -r '.inbounds[0].users[0].password') local PASSWORD=$(echo "$CONFIG" | jq -r '.inbounds[0].users[0].password')
local obfs_type=$(echo "$config" | jq -r '.inbounds[0].obfs.type') local OBFS_TYPE=$(echo "$CONFIG" | jq -r '.inbounds[0].obfs.type')
local obfs_password=$(echo "$config" | jq -r '.inbounds[0].obfs.password') 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节点" 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 -e "\033[32m"
echo "IPV4: $ipv4" echo "IPV4: $IPV4"
echo "port: $port" echo "port: $PORT"
echo "password: $password" echo "password: $PASSWORD"
echo "sni: $sni" echo "sni: $SNI"
echo "obfs_type: $obfs_type" echo "obfs_type: $OBFS_TYPE"
echo "obfs_password(混淆密码): $obfs_password" echo "obfs_password(混淆密码): $OBFS_PASSWORD"
echo "" echo ""
echo "分享链接: $share_link" echo "分享链接: $SHARE_LINK"
echo -e "\033[0m" echo -e "\033[0m"
} }
-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
}
+18 -12
View File
@@ -18,13 +18,12 @@ create_self_tls_file() {
} }
update_self_tls(){ update_self_tls(){
local CONFIG_FILE="${1:-}" local CONFIG_FILE="${1}" # 配置文件
local DOMAIN="${2:-bing.com}" # 域名,默认为bing.com local DOMAIN="${2}" # 域名
if [[ -z "$CONFIG_FILE" ]]; then if [[ -z "$CONFIG_FILE" ]]; then
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径 echo "[Error] config_file配置文件路径 不能为空"
local CONFIG_DIR=$(readlink -f "$SCRIPT_DIR/../config") return 1
CONFIG_FILE="$CONFIG_DIR/config.json"
fi fi
# 生成自签名证书, 设置域名 # 生成自签名证书, 设置域名
@@ -33,19 +32,18 @@ update_self_tls(){
} }
update_acme_tls(){ update_acme_tls(){
local CONFIG_FILE="${1:-}" local CONFIG_FILE="${1}" # 配置文件
if [[ -z "$CONFIG_FILE" ]]; then if [[ -z "$CONFIG_FILE" ]]; then
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径 echo "[Error] config_file配置文件路径 不能为空"
local CONFIG_DIR=$(readlink -f "$SCRIPT_DIR/../config") return 1
CONFIG_FILE="$CONFIG_DIR/config.json"
fi fi
# 获取邮箱 # 获取邮箱
local USER_EMAIL local USER_EMAIL
read -p "请输入你的邮箱: " USER_EMAIL read -p "请输入你的邮箱: " USER_EMAIL
while [[ -z "$USER_EMAIL" ]]; do while [[ -z "$USER_EMAIL" ]]; do
echo "[错误] 邮箱不能为空" echo "[Error] 邮箱不能为空"
read -p "请输入你的邮箱: " USER_EMAIL read -p "请输入你的邮箱: " USER_EMAIL
done done
@@ -53,7 +51,7 @@ update_acme_tls(){
local USER_DOMAIN local USER_DOMAIN
read -p "请输入你的域名 (例如: example.com): " USER_DOMAIN read -p "请输入你的域名 (例如: example.com): " USER_DOMAIN
while [[ -z "$USER_DOMAIN" ]]; do while [[ -z "$USER_DOMAIN" ]]; do
echo "[错误] 域名不能为空" echo "[Error] 域名不能为空"
read -p "请输入你的域名: " USER_DOMAIN read -p "请输入你的域名: " USER_DOMAIN
done done
@@ -61,7 +59,7 @@ update_acme_tls(){
local CLOUDFLARE_TOKEN local CLOUDFLARE_TOKEN
read -p "请输入你的 Cloudflare API Token: " CLOUDFLARE_TOKEN read -p "请输入你的 Cloudflare API Token: " CLOUDFLARE_TOKEN
while [[ -z "$CLOUDFLARE_TOKEN" ]]; do while [[ -z "$CLOUDFLARE_TOKEN" ]]; do
echo "[错误] Cloudflare API Token 不能为空" echo "[Error] Cloudflare API Token 不能为空"
read -p "请输入你的 Cloudflare API Token: " CLOUDFLARE_TOKEN read -p "请输入你的 Cloudflare API Token: " CLOUDFLARE_TOKEN
done done
@@ -74,11 +72,19 @@ update_acme_tls(){
update_acme_domain(){ update_acme_domain(){
local CONFIG_FILE="${1}" # 配置文件 local CONFIG_FILE="${1}" # 配置文件
local DOMAIN="${2}" # 域名 local DOMAIN="${2}" # 域名
if [[ -z "$CONFIG_FILE" ]]; then
echo "[Error] config_file配置文件路径 不能为空"
return 1
fi
modify_json_file "$CONFIG_FILE" ".inbounds[0].tls.acme.domain[0]" "$DOMAIN" modify_json_file "$CONFIG_FILE" ".inbounds[0].tls.acme.domain[0]" "$DOMAIN"
} }
update_server_name(){ update_server_name(){
local CONFIG_FILE="${1}" # 配置文件 local CONFIG_FILE="${1}" # 配置文件
local DOMAIN="${2}" # 域名 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" modify_json_file "$CONFIG_FILE" ".inbounds[0].tls.server_name" "$DOMAIN"
} }
-10
View File
@@ -54,16 +54,6 @@ check_jq() {
fi 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编码
url_encode() { url_encode() {
+8 -3
View File
@@ -1,11 +1,16 @@
#!/bin/bash #!/bin/bash
update_uuid(){ update_uuid(){
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹绝对路径 local CONFIG_FILE="${1}"
local CONFIG_FILE="$SCRIPT_DIR/../config/config.json"
if [[ -z "$CONFIG_FILE" ]]; then
echo "[Error] config_file配置文件路径 不能为空"
return 1
fi
# 生成 UUID # 生成 UUID
local UUID=$(cat /proc/sys/kernel/random/uuid) local UUID
UUID=$(cat /proc/sys/kernel/random/uuid)
# 修改 UUID # 修改 UUID
sed -i 's/你的UUID/'"$UUID"'/g' "$CONFIG_FILE" sed -i 's/你的UUID/'"$UUID"'/g' "$CONFIG_FILE"
+36 -29
View File
@@ -36,16 +36,16 @@ install(){
# 查询运行状态 # 查询运行状态
check_container_status(){ check_container_status(){
local compose_file="./docker-compose.yml" local COMPOSE_FILE="./docker-compose.yml"
local GREEN='\033[0;32m' local GREEN='\033[0;32m'
local RED='\033[0;31m' local RED='\033[0;31m'
local RESET='\033[0m' local RESET='\033[0m'
local status local STATUS
status=$(docker compose -f "$compose_file" ps --status running --quiet 2>/dev/null) 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}" echo -e "${GREEN}运行中${RESET}"
else else
echo -e "${RED}未运行${RESET}" echo -e "${RED}未运行${RESET}"
@@ -54,8 +54,7 @@ check_container_status(){
# 修改域名 # 修改域名
ask_update_domain(){ ask_update_domain(){
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/bin" # 脚本文件夹绝对路径 local CONFIG_FILE="${1}"
local CONFIG_FILE="$SCRIPT_DIR/../config/config.json"
# 检查jq是否安装 # 检查jq是否安装
check_jq check_jq
@@ -86,8 +85,7 @@ ask_update_domain(){
# 检查配置文件 # 检查配置文件
check_config_file(){ check_config_file(){
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/bin" # 脚本文件夹绝对路径 local CONFIG_FILE="${1}" # 配置文件
local CONFIG_FILE="$SCRIPT_DIR/../config/config.json"
# 检查配置文件是否存在 # 检查配置文件是否存在
if [ ! -e "$CONFIG_FILE" ]; then if [ ! -e "$CONFIG_FILE" ]; then
@@ -105,7 +103,8 @@ check_config_file(){
# 创建配置文件 # 创建配置文件
create_config(){ create_config(){
local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/bin" # 脚本文件夹绝对路径 local SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/bin" # 脚本文件夹绝对路径
local CONFIG_FILE="$SCRIPT_DIR/../config/config.json" local CONFIG_DIR="$SCRIPT_DIR/../config"
local CONFIG_FILE="$CONFIG_DIR/config.json"
# 如果配置文件已存在,提示用户是否重新生成 # 如果配置文件已存在,提示用户是否重新生成
if [ -e "$CONFIG_FILE" ]; then if [ -e "$CONFIG_FILE" ]; then
@@ -124,10 +123,10 @@ create_config(){
read -p "输入您的选择: " CHOICE read -p "输入您的选择: " CHOICE
case $CHOICE in case $CHOICE in
1) 1)
create_tuic_config create_tuic_config $CONFIG_DIR
;; ;;
2) 2)
create_hysteria_config create_hysteria_config $CONFIG_DIR
;; ;;
*) *)
echo "无效的选择, 请重新选择." echo "无效的选择, 请重新选择."
@@ -136,10 +135,13 @@ create_config(){
} }
main(){ 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 ""
echo 运行状态: $container_status echo 运行状态: $CONTAINER_STATUS
echo "==============================" echo "=============================="
echo "请选择一个操作:" echo "请选择一个操作:"
echo "1. 一键部署" echo "1. 一键部署"
@@ -151,20 +153,21 @@ main(){
echo "7. 修改端口" echo "7. 修改端口"
echo "8. 更新镜像" echo "8. 更新镜像"
echo "9. 更新脚本" echo "9. 更新脚本"
echo "10. 开启BBR加速"
# 读取用户选择 # 读取用户选择
local choice local CHOICE
read -p "输入您的选择: " choice read -p "输入您的选择: " CHOICE
# 根据用户选择执行相应的操作 # 根据用户选择执行相应的操作
case $choice in case $CHOICE in
1) 1)
# 一键部署 # 一键部署
install install
create_config create_config
port_manage allow $(get_listen_port) # 开放端口 port_manage allow $(get_listen_port "$CONFIG_FILE") # 开放端口
run run
print_share_link print_share_link "$CONFIG_FILE"
;; ;;
2) 2)
# 生成配置 / 重置配置 # 生成配置 / 重置配置
@@ -172,19 +175,19 @@ main(){
;; ;;
3) 3)
# 查看分享链接 # 查看分享链接
check_config_file check_config_file "$CONFIG_FILE"
print_share_link print_share_link "$CONFIG_FILE"
;; ;;
4) 4)
# 启动 # 启动
check_config_file check_config_file "$CONFIG_FILE"
port_manage allow $(get_listen_port) # 开放端口 port_manage allow $(get_listen_port "$CONFIG_FILE") # 开放端口
run run
print_share_link print_share_link "$CONFIG_FILE"
;; ;;
5) 5)
# 停止 # 停止
if echo "$container_status" | grep -q "未运行"; then if echo "$CONTAINER_STATUS" | grep -q "未运行"; then
echo "程序已停止" echo "程序已停止"
return return
fi fi
@@ -192,15 +195,15 @@ main(){
;; ;;
6) 6)
# 修改域名 # 修改域名
check_config_file check_config_file "$CONFIG_FILE"
ask_update_domain ask_update_domain "$CONFIG_FILE"
restart_docker restart_docker
;; ;;
7) 7)
# 修改端口 # 修改端口
check_config_file check_config_file "$CONFIG_FILE"
ask_update_port ask_update_port "$CONFIG_FILE"
port_manage allow $(get_listen_port) # 开放端口 port_manage allow $(get_listen_port "$CONFIG_FILE") # 开放端口
restart_docker restart_docker
;; ;;
8) 8)
@@ -212,6 +215,10 @@ main(){
# 更新脚本 # 更新脚本
git pull git pull
;; ;;
10)
# 开启BBR加速
enable_kernel_bbr
;;
*) *)
echo "无效的选择, 请重新选择." echo "无效的选择, 请重新选择."
;; ;;