Compare commits

..

121 Commits
v1.0 ... master

Author SHA1 Message Date
Olia Lisa
cd44ce6ebf 增加远程调用脚本 2026-01-17 17:07:28 +08:00
Olia Lisa
4fb0893859 修正注释 2026-01-17 16:45:49 +08:00
Olia Lisa
f85766154c 函数里的变量, 改为局部变量 2026-01-15 14:02:40 +08:00
Olia Lisa
6ef7ad5744 修正注释 2026-01-15 13:52:49 +08:00
Olia Lisa
e0dcba6b0f 将choice变量改为函数局部变量 2026-01-15 13:46:51 +08:00
Olia Lisa
2c4a44f924 重构代码,统一项目入口为install.sh 2026-01-15 13:38:07 +08:00
Olia Lisa
737378d7ee fix bug 2026-01-14 17:21:42 +08:00
Olia Lisa
7ddf0842bd 移除创建空白配置文件的逻辑 2026-01-14 17:20:22 +08:00
Olia Lisa
584d6ba143 update 2026-01-14 17:14:07 +08:00
Olia Lisa
16a80faea4 update 2026-01-14 17:08:51 +08:00
Olia Lisa
ec61e2c3d2 增加绿色输出函数 2026-01-14 00:43:15 +08:00
Olia Lisa
753473370c 增加提示语 2026-01-14 00:42:07 +08:00
Olia Lisa
8805f263f1 移除初始化完成的输出信息 2026-01-14 00:40:50 +08:00
Olia Lisa
3d0d7edd98 update 2026-01-14 00:38:26 +08:00
Olia Lisa
fc5257a341 增加配置文件检查和重新生成提示 2026-01-14 00:34:18 +08:00
Olia Lisa
e1488af75e 在启动容器时增加配置检查 2026-01-14 00:25:22 +08:00
Olia Lisa
f334002761 优化容器启动逻辑,增加重启确认提示,简化配置文件路径处理 2026-01-14 00:24:42 +08:00
Olia Lisa
f5cbfff75f update 2026-01-14 00:08:44 +08:00
Olia Lisa
8558a9eff4 update 2026-01-14 00:06:14 +08:00
Olia Lisa
d6188ebafb update 2026-01-14 00:01:18 +08:00
Olia Lisa
cf6edeec37 update 2026-01-11 19:49:07 +08:00
Olia Lisa
e0b47b92b8 重构安装依赖逻辑,动态安装缺失的软件包,移除冗余代码 2026-01-11 19:41:22 +08:00
Olia Lisa
7e452337ac 修改uuid生成方式 2026-01-11 19:28:13 +08:00
Olia Lisa
3eff16ead8 update, 简化文档 2026-01-11 16:54:46 +08:00
Olia Lisa
efc947960d 简化IPv4分享连接生成逻辑,移除冗余条件判断 2026-01-11 16:52:51 +08:00
Olia Lisa
e56be61c90 优化分享链接输出,简化IPv4连接信息 2026-01-11 16:52:03 +08:00
Olia Lisa
57ba8f7002 update 2026-01-11 16:46:53 +08:00
Olia Lisa
63ad2fda54 update 2026-01-11 16:44:32 +08:00
Olia Lisa
ccd3968acd 重构脚本,优化配置检查逻辑并更新菜单选项 2026-01-11 16:43:17 +08:00
Olia Lisa
a01dd9cfa0 update 2026-01-10 20:20:28 +08:00
Olia Lisa
630aea138a 修改日志配置 2026-01-10 20:16:42 +08:00
Olia Lisa
0662a71930 格式化代码, 增加注释 2026-01-10 20:09:39 +08:00
Olia Lisa
4532785d20 补充注释 2026-01-10 20:07:45 +08:00
Olia Lisa
c360a63f8a 修改模板的reality域名 2026-01-10 20:05:44 +08:00
Olia Lisa
60165d8252 将变量改为局部变量 2026-01-10 19:58:27 +08:00
Olia Lisa
181ac506d5 重构代码 2026-01-10 19:56:57 +08:00
Olia Lisa
dd0de70578 重构代码 2026-01-10 19:51:21 +08:00
Olia Lisa
00cdf70b0b 优化逻辑 2026-01-10 19:48:19 +08:00
Olia Lisa
3ef5c64c30 优化逻辑 2026-01-10 19:43:16 +08:00
Olia Lisa
8f70ddc2ce update 2026-01-10 19:14:10 +08:00
Olia Lisa
de20bbd4ab 完善逻辑 2026-01-10 19:10:00 +08:00
Olia Lisa
ca1bdbcd2a fix bug 2026-01-10 19:03:19 +08:00
Olia Lisa
65a7f10cb1 fix bug 2026-01-10 18:47:04 +08:00
Olia Lisa
fb704a08fe 删除函数change_reality_dest 2026-01-10 18:46:54 +08:00
Olia Lisa
08ebda7617 减少提示语 2025-12-09 12:14:57 +08:00
Olia Lisa
9dc4858d2f fix bug 2025-12-09 12:13:11 +08:00
Olia Lisa
62ec78ac54 fix bug 2025-12-09 12:11:38 +08:00
Olia Lisa
990f42843e update 2025-11-26 16:47:37 +08:00
Olia Lisa
a03b0f397a update, 增加检查依赖和安装依赖操作 2025-11-26 16:39:53 +08:00
Olia Lisa
b7d979e8a0 update 2025-11-26 16:26:56 +08:00
Olia Lisa
9e5865219b 重构代码 2025-11-26 16:10:31 +08:00
Olia Lisa
683a9a68f0 重构代码 2025-11-26 16:08:48 +08:00
Olia Lisa
f86de491ed refactor(install.sh): remove unused 2025-11-26 10:52:02 +08:00
Olia Lisa
f1078a2ecd 动态容器名称 2025-11-26 09:47:16 +08:00
Olia Lisa
70f71d4b5e fix bug 2025-11-24 22:08:06 +08:00
Olia Lisa
97686c7908 update 2025-11-23 22:57:21 +08:00
Olia Lisa
c925536970 修正文字描述 2025-11-23 17:58:06 +08:00
Olia Lisa
7a847caa5c update 2025-11-23 17:55:26 +08:00
Olia Lisa
00e91414e6 update 2025-11-23 17:45:45 +08:00
Olia Lisa
0c58672c3b 修正部分文字描述 2025-11-23 17:30:16 +08:00
Olia Lisa
f45ed259cb 删除重复的判断 2025-11-23 17:25:12 +08:00
Olia Lisa
d962dcd36e fix bug 2025-11-23 17:21:46 +08:00
Olia Lisa
bf72ff2521 feat(install): add config validation checks for uuid and file integrity
- Added comments for clarity on config file existence and blank checks
- Included UUID validation to prevent uninitialized config usage
- Improves robustness by prompting users to create proper configs upfront
2025-11-23 14:18:44 +08:00
Olia Lisa
9a3e20082c refactor: reorganize menu options and add config validation checks
- Extracted common config file validation into a new `check_config` function
- Renumbered menu options for logical order, with exit as the last option
- Added config checks before viewing share links, updating port, and changing Reality destination
- Removed trailing backslash and added final newline for proper formatting

This update improves code reusability, prevents errors from missing configs, and enhances menu usability.
2025-11-23 14:15:50 +08:00
Olia Lisa
f1f54ce1b5 update 2025-11-23 14:07:28 +08:00
Olia Lisa
796ac78f05 删除config文件 2025-11-23 13:57:24 +08:00
Olia Lisa
d0341d1324 update 2025-11-23 13:56:34 +08:00
Olia Lisa
3f5c3eb348 fix bug 2025-11-23 13:49:20 +08:00
Olia Lisa
8adfd590fa update 2025-11-22 17:46:19 +08:00
Olia Lisa
5ed3434bf3 fix bug 2025-11-22 17:10:56 +08:00
Olia Lisa
0e9714c3f0 update 2025-11-22 17:09:30 +08:00
Olia Lisa
774b5955ad 函数改名 2025-11-22 16:54:46 +08:00
Olia Lisa
f79590b229 减少提示语 2025-11-22 16:53:18 +08:00
Olia Lisa
0c884a87fc 重构代码, 改为函数形式 2025-11-22 16:51:09 +08:00
Olia Lisa
dd80d3601b update 2025-11-22 16:45:35 +08:00
Olia Lisa
f3bc373407 重构代码 2025-11-22 16:41:58 +08:00
Olia Lisa
adca43cbba 增加新的配置文件模板 2025-11-22 16:39:46 +08:00
Olia Lisa
bb01321871 重构代码 2025-11-22 16:34:18 +08:00
Olia Lisa
745e09c77f update 2025-11-22 16:24:55 +08:00
Olia Lisa
3e9a22b044 更新模板 2025-11-22 16:10:27 +08:00
Olia Lisa
77a86350a8 增加配置文件模板 2025-11-22 16:07:22 +08:00
Olia Lisa
6101e89a57 update 2025-10-31 13:28:10 +08:00
Olia Lisa
e9f4747a12 修改提示语 2025-10-09 22:47:20 +08:00
Olia Lisa
fdfc3b5e11 增加提示语 2025-10-09 22:42:47 +08:00
Olia Lisa
b2a81f7964 初始化操作中, 增加设置端口 2025-10-09 22:41:11 +08:00
Olia Lisa
48604a2692 修改Reality目标域名, 重启docker容器 2025-10-09 22:40:45 +08:00
Olia Lisa
05bc3fb9b4 update 2025-10-09 22:37:12 +08:00
Olia Lisa
6163d72e2a 修改设置端口 2025-10-09 22:32:05 +08:00
Olia Lisa
18adcb65ce [fix] 修复新版本xray-core publickey 字段变更问题 2025-09-11 10:08:34 +08:00
Olia Lisa
0319d932e3 update 2025-08-16 11:43:24 +08:00
Olia Lisa
e3801150c0 update 2025-08-15 21:43:15 +08:00
Olia Lisa
5cab57adf4 docs: 更新快速开始指南格式和内容 2025-02-08 22:28:53 +08:00
Olia Lisa
35a9f84893 feat: 添加更新端口选项并修改退出选项 2025-02-08 22:02:52 +08:00
Olia Lisa
9286478963 feat: 添加端口更新脚本 2025-02-08 22:01:24 +08:00
Olia Lisa
0cab56158a refactor: 修改脚本引用文件并添加错误提示 2025-02-08 21:36:55 +08:00
Olia Lisa
27e9871c8b style: 删除不必要的输出信息 2025-02-08 21:26:40 +08:00
Olia Lisa
016d4103a8 fix: 更新容器选项说明和脚本内容 2025-02-08 21:18:40 +08:00
Olia Lisa
44bf650f26 fix: 添加初始化脚本执行前后的提示信息 2025-02-08 21:16:30 +08:00
Olia Lisa
2bbde50393 feat: 添加安装脚本菜单功能 2025-02-08 21:14:02 +08:00
Olia Lisa
496eb641e6 refactor: 移除重复的jq安装检查并使用外部脚本 2025-02-08 18:12:01 +08:00
Olia Lisa
14e6d30cd3 refactor: 简化jq安装检查逻辑 2025-02-08 18:10:21 +08:00
Olia Lisa
9d0fed291e feat: 添加检查和安装 jq 的功能 2025-02-08 18:10:14 +08:00
Olia Lisa
1409916165 refactor: 使用函数简化配置文件修改 2025-02-08 17:56:11 +08:00
Olia Lisa
319ae7be6c refactor: 使用函数修改 JSON 文件 2025-02-08 17:52:54 +08:00
Olia Lisa
6951d0d46f feat: 新增获取系统包管理器的函数 2025-02-08 17:49:52 +08:00
Kiolow
c68d16b360 fix bug, 修改删除"正在删除未使用的镜像"命令 2025-01-11 13:04:30 +08:00
Kiolow
d9d342437f 修正项目下载地址 2024-12-15 21:17:48 +08:00
Kiolow
4858bfa772 更新文档, 修改快速开始 2024-12-15 21:16:29 +08:00
Kiolow
63839669ce 修改注释 2024-12-15 21:12:14 +08:00
Kiolow
a76a47ffab 修改docker-compose启动命令 2024-12-15 21:06:56 +08:00
Kiolow
544eb665b8 增加启动脚本, 初始化脚本不再打印分享链接, 2024-12-15 21:02:02 +08:00
Kiolow
b80d7dc367 update 2024-12-14 20:30:23 +08:00
Kiolow
26d0d36b31 update 2024-12-14 20:27:01 +08:00
Kiolow
305c40ab16 增加映射log文件夹 2024-12-14 20:24:48 +08:00
Kiolow
fa6f416c13 update 2024-12-14 20:23:59 +08:00
Kiolow
16184ffd47 update 2024-11-03 00:25:34 +08:00
Kiolow
7307383451 修改生成uuid方式 2024-10-27 14:30:08 +08:00
Kiolow
4ac024f8a7 优化生成密钥对逻辑 2024-07-19 18:19:30 +08:00
Kiolow
c6349dba03 修复bug 2024-07-19 17:57:56 +08:00
Kiolow
b2c8f5178e update, 增加功能: 删除无用镜像.. 2024-07-05 14:43:51 +08:00
Kiolow
1fcad6d680 新增bash工具函数 2024-06-07 13:10:23 +08:00
21 changed files with 851 additions and 147 deletions

2
.gitignore vendored
View File

@ -1 +1,3 @@
conf/key.txt
conf/config.json
log/*

View File

@ -1,76 +1,32 @@
# 说明
## 前提
提前安装好以下软件
- git
- curl
- wget
- docker
- docker-compose
- jq - 用于查看json文件, 提取json文件信息. 编辑json文件
- qrencode - (可选, 非必要)用于生成二维码
- jq - 用于查看 json 文件, 提取 json 文件信息. 编辑 json 文件
## 快速开始
1. 下载项目
```bash
git clone https://gittea.wingogo.top/William/xray_docker.git
git clone https://gitea.9001001.xyz/William/xray_docker.git
```
2. 进入项目目录
```bash
cd xray_docker
```
3. 初始化xray配置, 设置密钥和uuid, **第一次运行必须执行**
3. 一键部署
```bash
bash ./bin/init.sh
bash install.sh
```
4. 启动
```
docker-compose up -d
```
5. 查看分享链接
```bash
bash ./bin/print_share_link.sh
```
## 停止
如果需要停止服务, 进入项目目录, 执行以下命令
```bash
docker-compose down
```
## 更新镜像
进入项目目录, 执行以下命令
```bash
bash ./bin/update_docker_images.sh
```
## 查看分享链接
进入项目目录, 执行以下命令
```bash
bash ./bin/print_share_link.sh
```
## 修改端口
修改conf/config.json
```json
// ...
"inbounds": [
{
"listen": "0.0.0.0",
"port": 8003, // 修改为你想要的端口, 比如:9991
"protocol": "vless",
// ...
}
]
//...
```
## 参考信息
- [xray官方文档](https://xtls.github.io/)
- [xray代码仓库](https://github.com/xtls/xray-core)
- [xray docker镜像](https://hub.docker.com/r/teddysun/xray)
- [xray安装命令](https://github.com/XTLS/Xray-install)

76
bin/create_config.sh Normal file
View File

@ -0,0 +1,76 @@
#!/bin/bash
create_reality_config(){
local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
local config_dir=$(readlink -f "$script_dir/../conf") # 配置文件绝对路径
cp "$config_dir/template/reality_config.json" "$config_dir/config.json"
# 生成uui, 写入到config.json文件
update_uuid
# 生成密钥对, 修改config.json中的密钥属性
update_key
# 设置端口
update_port
# 设置reality_dest目标域名
update_reality_dest
green "成功创建配置"
}
create_xhttp_reality_config(){
local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件绝对路径
local config_dir=$(readlink -f "$script_dir/../conf") # 配置文件绝对路径
cp "$config_dir/template/xhttp_reality_config.json" "$config_dir/config.json"
# 生成uuid, 写入到config.json文件
update_uuid
# 生成密钥对, 修改config.json中的密钥属性
update_key
# 生成xhttp_path, 写入到config.json文件
update_xhttp_path
# 设置reality_dest目标域名
update_reality_dest
# 设置端口
update_port
green "成功创建配置"
}
create_config(){
local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件绝对路径
# 检查jq是否安装
check_jq
local config_file="$script_dir/../conf/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. 创建reality配置"
echo "2. 创建xhttp_reality配置"
local choice
read -p "请输入选择 (1 或 2): " choice
case $choice in
1) create_reality_config ;;
2) create_xhttp_reality_config ;;
*) echo "无效选择,退出" ;;
esac
}

View File

@ -1,15 +0,0 @@
#!/bin/bash
# 安装xray
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install
script_dir=$(cd "$(dirname "$0")"; pwd) # 脚本文件绝对路径
# 生成uui, 写入到config.json文件
bash $script_dir/update_uuid.sh
# 生成密钥对, 修改config.json中的密钥属性
bash $script_dir/update_key.sh
# 打印分享链接
bash $script_dir/print_share_link.sh

View File

@ -1,40 +1,82 @@
#!/bin/bash
# 检查 jq 是否安装
if ! command -v jq &> /dev/null; then
echo "jq 未安装"
exit 1
fi
print_reality_share_link(){
local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件绝对路径
local config_dir=$(readlink -f "$script_dir/../conf") # 配置文件绝对路径
# 获取本机IP
local ipv4=$(curl -4 -sSL --connect-timeout 3 --retry 2 ip.sb || echo "null")
local uuid=$(jq -r '.inbounds[0].settings.clients[0].id' $config_dir/config.json)
local port=$(jq -r '.inbounds[0].port' $config_dir/config.json)
local dest=$(jq -r '.inbounds[0].streamSettings.realitySettings.dest' $config_dir/config.json)
local sni=$(echo $dest | awk -F ':' '{print $1}')
local network="tcp"
local public_key=$(cat $config_dir/key.txt | grep "Password" | awk -F ': ' '{print $2}')
# 打印配置信息
echo -e "\033[32m" # config info with green color
echo "ipv4: $ipv4"
echo "port: $port"
echo "uuid: $uuid"
echo "dest: $dest"
echo "sni: $sni"
echo "publicKey/password: $public_key"
echo "network: $network"
local sub_ipv4="vless://$uuid@$ipv4:$port?encryption=none&security=reality&type=$network&sni=$sni&fp=chrome&pbk=$public_key&flow=xtls-rprx-vision#我的最新vless机场"
echo ""
echo "分享连接: $sub_ipv4"
echo ""
echo -e "\033[0m"
}
script_dir=$(cd "$(dirname "$0")"; pwd) # 脚本文件绝对路径
config_dir=$(readlink -f "$script_dir/../conf") # 配置文件绝对路径
print_xhttp_reality_share_link(){
local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件绝对路径
local config_dir=$(readlink -f "$script_dir/../conf") # xray配置文件绝对路径
# 获取本机IP
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") # 本机IP
local uuid=$(jq -r '.inbounds[0].settings.clients[0].id' $config_dir/config.json)
local port=$(jq -r '.inbounds[0].port' $config_dir/config.json)
local dest=$(jq -r '.inbounds[0].streamSettings.realitySettings.dest' $config_dir/config.json)
local sni=$(echo $dest | awk -F ':' '{print $1}')
local network=$(jq -r '.inbounds[0].streamSettings.network' $config_dir/config.json)
local xhttp_path=$(jq -r ".inbounds[0].streamSettings.xhttpSettings.path" $config_dir/config.json)
local public_key=$(cat $config_dir/key.txt | grep "Password" | awk -F ': ' '{print $2}')
uuid=$(jq -r '.inbounds[0].settings.clients[0].id' $config_dir/config.json)
port=$(jq -r '.inbounds[0].port' $config_dir/config.json)
dest=$(jq -r '.inbounds[0].streamSettings.realitySettings.dest' $config_dir/config.json)
sni=$(echo $dest | awk -F ':' '{print $1}')
network="tcp"
public_key=$(cat $config_dir/key.txt | grep "Public" | awk -F ': ' '{print $2}')
# 打印配置信息
echo -e "\033[32m" # config info with green color
echo "IPV4: $ipv4"
echo "PORT: $port"
echo "UUID: $uuid"
echo "DEST: $dest"
echo "PUBLIC_KEY: $public_key"
echo "NETWORK: $network"
if [ "$ipv4" != "null" ]; then
sub_ipv4="vless://$uuid@$ipv4:$port?encryption=none&security=reality&type=$network&sni=$sni&fp=chrome&pbk=$public_key&flow=xtls-rprx-vision#my_docker_vless_reality_vision"
echo "IPV4 订阅连接: $sub_ipv4"
# 如果qrencode安装了则打印二维码
if command -v qrencode &> /dev/null; then
echo -e "IPV4 订阅二维码:\n$(echo "$sub_ipv4" | qrencode -o - -t UTF8)"
# 打印配置信息
echo -e "\033[32m" # config info with green color
echo "ipv4: $ipv4"
echo "port: $port"
echo "uuid: $uuid"
echo "dest: $dest"
echo "sni: $sni"
echo "publicKey/password: $public_key"
echo "network: $network"
echo "xhttp_path: $xhttp_path"
local sub_ipv4="vless://$uuid@$ipv4:$port?encryption=none&security=reality&type=$network&sni=$sni&fp=chrome&pbk=$public_key&path=$xhttp_path&mode=auto#${ipv4}-my_xray_xhttp_reality"
echo ""
echo "ipv4 分享连接: $sub_ipv4"
echo ""
echo -e "\033[0m"
}
print_share_link(){
local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件绝对路径
local config_dir=$(readlink -f "$script_dir/../conf") # xray配置文件绝对路径
# 检查 jq 是否安装
check_jq
local xhttp_path=$(jq -r ".inbounds[0].streamSettings.xhttpSettings.path" $config_dir/config.json)
if [ -z $xhttp_path ] || [ "$xhttp_path" = "null" ];then
print_reality_share_link
else
print_xhttp_reality_share_link
fi
fi
echo -e "\033[0m"
}

3
bin/remote/README.md Normal file
View File

@ -0,0 +1,3 @@
## 说明
这个文件夹的文件只用于远程调用. 不要导入使用.

View File

@ -0,0 +1,28 @@
#!/bin/bash
update_docker_images(){
local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/../" # 脚本文件绝对路径
local docker_compose_file="$script_dir/../docker-compose.yml" # docker-compose.yml文件路径
# 检查是否存在 docker-compose.yml 文件
if [ ! -f $docker_compose_file ]; then
echo "Error: docker-compose.yml 文件不存在."
exit 1
fi
echo "正在关闭容器.."
docker-compose -f $docker_compose_file down
echo "正在更新镜像.."
docker-compose -f $docker_compose_file pull
echo "正在删除未使用的镜像..."
docker image prune -f
echo "正在启动容器.."
docker-compose -f $docker_compose_file up -d
}
update_docker_images

View File

@ -1,4 +0,0 @@
#!/bin/bash
# Remove Xray
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ remove

14
bin/run.sh Normal file
View File

@ -0,0 +1,14 @@
#!/bin/bash
run(){
local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
local docker_compose_file="$script_dir/../docker-compose.yml"
local running_count=$(docker-compose -f "$docker_compose_file" ps -q --filter "status=running" | wc -l)
# 如果容器已启动
if [ "$running_count" -gt 0 ]; then
docker-compose -f "$docker_compose_file" down # 关闭容器
fi
docker-compose -f "$docker_compose_file" up -d # 启动容器
}

View File

@ -1,19 +1,25 @@
#!/bin/bash
script_dir=$(cd "$(dirname "$0")"; pwd) # 脚本文件绝对路径
docker_compose_file="$script_dir/../docker-compose.yml" # docker-compose.yml文件路径
# 检查是否存在 docker-compose.yml 文件
if [ ! -f $docker_compose_file ]; then
echo "Error: docker-compose.yml 文件不存在."
exit 1
fi
update_docker_images(){
local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件绝对路径
local docker_compose_file="$script_dir/../docker-compose.yml" # docker-compose.yml文件路径
echo "正在关闭容器.."
docker-compose -f $docker_compose_file down
# 检查是否存在 docker-compose.yml 文件
if [ ! -f $docker_compose_file ]; then
echo "Error: docker-compose.yml 文件不存在."
exit 1
fi
echo "正在更新镜像.."
docker-compose -f $docker_compose_file pull
echo "正在关闭容器.."
docker-compose -f $docker_compose_file down
echo "正在启动容器.."
docker-compose -f $docker_compose_file up -d
echo "正在更新镜像.."
docker-compose -f $docker_compose_file pull
echo "正在删除未使用的镜像..."
docker image prune -f
echo "正在启动容器.."
docker-compose -f $docker_compose_file up -d
}

View File

@ -1,15 +1,18 @@
#!/bin/bash
script_dir=$(cd "$(dirname "$0")"; pwd) # 脚本文件绝对路径
config_dir="$script_dir/../conf"
update_key(){
local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件绝对路径
local config_dir="$script_dir/../conf"
# Save keys to key.txt
xray x25519 > $config_dir/key.txt
# 使用docker运行xray镜像生成密钥文件
docker run --rm teddysun/xray:latest /usr/bin/xray x25519 > $config_dir/key.txt
private_key=$(grep "Private key" $config_dir/key.txt | awk -F ': ' '{print $2}')
# 获取私钥
local private_key=$(grep "Private" $config_dir/key.txt | awk -F ': ' '{print $2}')
# 修改config.json密钥属性
jq ".inbounds[0].streamSettings.realitySettings.privateKey=\"$private_key\"" $config_dir/config.json > $config_dir/config_temp.json
mv $config_dir/config_temp.json $config_dir/config.json
# 修改config.json密钥属性
modify_json_file "$config_dir/config.json" ".inbounds[0].streamSettings.realitySettings.privateKey" "$private_key"
echo "生成和设置密钥成功."
echo "生成和设置密钥成功."
}

84
bin/update_port.sh Normal file
View File

@ -0,0 +1,84 @@
#!/bin/bash
# 查找随机空闲端口
# 用途:
# 在指定端口范围内随机选择一个当前未被监听TCP/UDP的端口
# 参数:
# $1: 起始端口(默认 10001
# $2: 结束端口(默认 65535
# $3: 最大随机尝试次数(默认 100
find_free_port() {
local start="${1:-10001}"
local max="${2:-65535}"
local attempts="${3:-100}"
# ------------------------------------------------------------
# 收集当前正在监听的端口TCP + UDP
# 优先使用 ss其次 netstat
# ------------------------------------------------------------
local used_ports raw
if command -v ss >/dev/null 2>&1; then
# ss 输出示例:
# LISTEN 0 128 0.0.0.0:22
raw=$(ss -lntu 2>/dev/null || true)
used_ports=$(printf "%s\n" "$raw" \
| awk '{print $5}' \
| sed -E 's/.*[:]//g')
elif command -v netstat >/dev/null 2>&1; then
# netstat 输出示例:
# tcp 0 0 0.0.0.0:22
raw=$(netstat -lntu 2>/dev/null || true)
used_ports=$(printf "%s\n" "$raw" \
| awk '{print $4}' \
| sed -E 's/.*[:]//g')
else
echo "Error: ss or netstat is required to check listening ports." >&2
return 2
fi
# ------------------------------------------------------------
# 将已占用端口存入关联数组,便于 O(1) 判断
# 需要 bash 4+
# ------------------------------------------------------------
declare -A used_map
local p
for p in $used_ports; do
# 过滤非数字字段(如 *、:::
if [[ $p =~ ^[0-9]+$ ]]; then
used_map["$p"]=1
fi
done
# ------------------------------------------------------------
# 随机尝试若干次
# 每次随机生成一个端口,只要未被监听就立即返回
# ------------------------------------------------------------
local port i
for ((i=0; i<attempts; i++)); do
# 在 [start, max] 范围内生成随机端口
port=$(( RANDOM % (max - start + 1) + start ))
# 如果端口不在已监听表中,则认为可用
if [[ -z "${used_map[$port]}" ]]; then
echo "$port"
return 0
fi
done
# ------------------------------------------------------------
# 多次随机尝试后仍未找到可用端口
# 通常意味着端口范围过小或已被大量占用
# ------------------------------------------------------------
echo "Error: no free port found after $attempts random attempts." >&2
return 1
}
update_port(){
local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件夹路径
local config_file="$script_dir/../conf/config.json"
local port=$(find_free_port)
modify_json_file "$config_file" ".inbounds[0].port" "$port"
echo "设置端口成功"
}

View File

@ -0,0 +1,34 @@
#!/bin/bash
update_reality_dest(){
local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
local config_dir="$script_dir/../conf"
# 获取当前dest值
local old_dest=$(jq -r '.inbounds[0].streamSettings.realitySettings.dest' "$config_dir/config.json")
# 输入新的dest地址
local dest
read -p "请输入新的dest地址[当前地址: $old_dest]: " dest
# 如果输入为空, 不修改直接退出
if [[ -z "$dest" ]]; then
return 0
fi
# 如果未指定端口号,默认加上 :443
if [[ "$dest" != *:* ]]; then
dest="${dest}:443"
fi
# 提取域名部分,去掉端口号
local domain=$(echo "$dest" | cut -d: -f1)
# 修改配置文件中的dest
modify_json_file "$config_dir/config.json" ".inbounds[0].streamSettings.realitySettings.dest" "$dest"
# 修改配置文件中的serverNames不带端口号
modify_json_file "$config_dir/config.json" ".inbounds[0].streamSettings.realitySettings.serverNames" "[\"$domain\"]"
echo "修改reality_dest成功"
}

View File

@ -1,16 +1,15 @@
#!/bin/bash
script_dir=$(cd "$(dirname "$0")"; pwd) # 脚本文件绝对路径
config_dir="$script_dir/../conf"
update_uuid(){
# 生成 UUID
uuid=$(xray uuid)
local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件绝对路径
local config_dir="$script_dir/../conf"
# 使用 jq 修改 JSON 文件
jq ".inbounds[0].settings.clients[0].id=\"$uuid\"" $config_dir/config.json > $config_dir/config.json_tmp
# 生成 UUID
local uuid=$(cat /proc/sys/kernel/random/uuid)
# 替换原始文件
mv $config_dir/config.json_tmp $config_dir/config.json
#修改 UUID
modify_json_file "$config_dir/config.json" ".inbounds[0].settings.clients[0].id" "$uuid"
# 验证结果
echo "设置UUID成功."
echo "设置UUID成功."
}

16
bin/update_xhttp_path.sh Normal file
View File

@ -0,0 +1,16 @@
#!/bin/bash
update_xhttp_path(){
local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 脚本文件绝对路径
local config_dir="$script_dir/../conf"
local path_length="$(( RANDOM % 4 + 8 ))"
local uuid=$(cat /proc/sys/kernel/random/uuid)
local xhttp_path="/"$(docker run --rm teddysun/xray:latest xray uuid | tr -d '-' | cut -c 1-$path_length)
# 修改config.json的xhttp_path
modify_json_file "$config_dir/config.json" ".inbounds[0].streamSettings.xhttpSettings.path" "$xhttp_path"
echo "设置xhttp_path成功"
}

137
bin/utils/base.sh Normal file
View File

@ -0,0 +1,137 @@
#!/bin/bash
red(){
echo -e "\033[31m$1\033[0m"
}
green(){
echo -e "\033[32m$1\033[0m"
}
# 获取系统包管理器
get_package_manager(){
if command -v apt-get &> /dev/null; then
echo "apt-get"
elif command -v yum &> /dev/null; then
echo "yum"
else
echo "未知的系统包管理器"
return 1 # 返回错误状态码
fi
}
# 检查 jq 是否已安装
check_jq() {
if command -v jq >/dev/null 2>&1; then
return 0
else
echo "jq 未安装"
return 1
fi
}
# 检查 Docker 是否已安装
check_docker() {
if command -v docker >/dev/null 2>&1; then
return 0
else
echo "Docker 未安装"
return 1
fi
}
# 检查 docker-compose 是否已安装
check_docker_compose() {
if command -v docker-compose >/dev/null 2>&1; then
return 0
elif docker compose version >/dev/null 2>&1; then ## Docker 内置 compose 已安装
return 0
else
echo "docker-compose 未安装"
return 1
fi
}
# 安装docker
install_docker(){
echo 安装docker...
curl -fsSL https://get.docker.com | bash -s docker
}
# 安装docker-compose
install_docker_compose(){
echo 安装docker-compose...
wget -O /usr/local/bin/docker-compose https://github.com/docker/compose/releases/download/v2.29.0/docker-compose-linux-x86_64
chmod +x /usr/local/bin/docker-compose
}
# 动态安装软件包
install_package() {
local package_name=$1
if command -v "$package_name" &> /dev/null; then
echo "$package_name 已安装, 跳过."
return 0
fi
echo "安装 $package_name..."
local package_manager=$(get_package_manager)
if [ "$package_manager" == "apt-get" ]; then
sudo apt-get update
sudo apt-get install -y "$package_name"
elif [ "$package_manager" == "yum" ]; then
sudo yum install -y "$package_name"
else
echo "未知的包管理器, 请手动安装 $package_name."
return 1
fi
}
check_config(){
local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/../" # 脚本文件夹绝对路径
local config_file="$script_dir/../conf/config.json"
# 如果配置文件不存在或者空白
if [ ! -e "$config_file" ] || [ ! -s "$config_file" ];then
echo "请先'创建配置'"
exit 1
fi
# 如果配置未初始化
local uuid=$(jq -r '.inbounds[0].settings.clients[0].id' "$config_file")
if [ "$uuid" = "你的UUID" ] || [ -z "$uuid" ]; then
echo "请先'创建配置'"
exit 1
fi
# 检查配置文件是否为有效的JSON格式
if ! jq '.' "$config_file" >/dev/null 2>&1; then
echo "配置文件不是有效的JSON格式, 请重新生成配置文件."
exit 1
fi
}
restart_docker() {
local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/../" # 脚本文件夹绝对路径
# 如果容器未运行,提示启动
local running_count=$(docker-compose -f $script_dir/../docker-compose.yml ps -q | wc -l)
if [ "$running_count" -eq 0 ]; then
local choice
read -p "容器未启动,是否启动容器?(y/n): " choice
case "$choice" in
Y|y)
docker-compose -f $script_dir/../docker-compose.yml up -d
return
;;
*)
echo "已取消启动"
return
;;
esac
fi
echo "正在重启容器..."
docker-compose -f $script_dir/../docker-compose.yml down
docker-compose -f $script_dir/../docker-compose.yml up -d
}

27
bin/utils/jq_util.sh Normal file
View File

@ -0,0 +1,27 @@
#!/bin/bash
# 修改json文件的属性值
# 案例1modify_json_file "/foo/bar.json" "person.name" "张三"
# 案例2modify_json_file "/foo/bar.json" "servers" '["a.com", "b.com"]'
# 该函数能自动处理不同数据类型,包括数组、对象和数字等。
function modify_json_file() {
local json_file=$1 # json文件路径
local key=$2 # 要修改的key
local value=$3 # 要修改的value
#如果key的值是.开头, 则去掉.号
if [[ ${key} == "."* ]]; then
key=${key:1}
fi
# 检查值是否为有效的 JSON 格式(如数组、对象或数字)。
# 如果是,则直接将值传递给 jq无需引号。
if echo "${value}" | jq . >/dev/null 2>&1; then
jq ".${key} = ${value}" "${json_file}" > "${json_file}.tmp"
else
# 否则,将值视为字符串,并添加引号。
jq ".${key} = \"${value}\"" "${json_file}" > "${json_file}.tmp"
fi
mv ${json_file}.tmp ${json_file}
}

View File

@ -1,8 +1,10 @@
{
"log": {
"loglevel": "error",
"dnsLog": false,
"access": "/var/log/xray/access.log",
"error": "/var/log/xray/error.log"
"error": "/var/log/xray/error.log",
"loglevel": "error",
"maskAddress": ""
},
"api": {
"tag": "api",
@ -56,12 +58,12 @@
"security": "reality",
"realitySettings": {
"show": true,
"dest": "www.expedia.com:443",
"dest": "www.microsoft.com:443",
"xver": 0,
"maxTimeDiff": 0,
"minClientVer": "",
"serverNames": [
"www.expedia.com"
"www.microsoft.com"
],
"privateKey": "你的密钥",
"shortIds": [

View File

@ -0,0 +1,182 @@
{
"log": {
"dnsLog": false,
"access": "/var/log/xray/access.log",
"error": "/var/log/xray/error.log",
"loglevel": "error",
"maskAddress": ""
},
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"inboundTag": [
"api"
],
"outboundTag": "api",
"type": "field"
},
{
"domain": [
"domain:byr.pt"
],
"type": "field",
"outboundTag": "direct"
},
{
"domain": [
"domain:iqiyi.com",
"domain:video.qq.com",
"domain:youku.com"
],
"type": "field",
"outboundTag": "blocked"
},
{
"type": "field",
"ip": [
"geoip:cn",
"geoip:private"
],
"outboundTag": "blocked"
},
{
"protocol": [
"bittorrent"
],
"type": "field",
"outboundTag": "blocked"
}
]
},
"dns": {
"servers": [
"https+local://cloudflare-dns.com/dns-query",
"1.1.1.1",
"1.0.0.1",
"8.8.8.8",
"8.8.4.4",
"localhost"
]
},
"inbounds": [
{
"listen": "0.0.0.0",
"port": 8005,
"protocol": "vless",
"settings": {
"clients": [
{
"id": "你的UUID",
"flow": ""
}
],
"decryption": "none",
"fallbacks": []
},
"streamSettings": {
"network": "xhttp",
"realitySettings": {
"dest": "www.microsoft.com:443",
"maxClient": "",
"maxTimediff": 0,
"minClient": "",
"privateKey": "",
"serverNames": [
"www.microsoft.com"
],
"shortIds": [
""
],
"show": false,
"xver": 0
},
"security": "reality",
"xhttpSettings": {
"headers": {},
"host": "",
"mode": "auto",
"noSSEHeader": false,
"path": "/14e077b4",
"scMaxBufferedPosts": 30,
"scMaxEachPostBytes": "1000000",
"scStreamUpServerSecs": "20-80",
"xPaddingBytes": "100-1000"
}
},
"tag": "inbound-xx",
"sniffing": {
"enabled": false,
"destOverride": [
"http",
"tls",
"quic",
"fakedns"
],
"metadataOnly": false,
"routeOnly": false
},
"allocate": {
"strategy": "always",
"refresh": 5,
"concurrency": 3
}
},
{
"listen": "127.0.0.1",
"port": 65432,
"protocol": "dokodemo-door",
"settings": {
"address": "127.0.0.1"
},
"streamSettings": null,
"tag": "api",
"sniffing": null,
"allocate": null
}
],
"outbounds": [
{
"tag": "direct",
"protocol": "freedom",
"settings": {
"domainStrategy": "AsIs",
"redirect": "",
"noises": []
}
},
{
"tag": "blocked",
"protocol": "blackhole",
"settings": {}
}
],
"transport": null,
"policy": {
"levels": {
"0": {
"statsUserDownlink": true,
"statsUserUplink": true
}
},
"system": {
"statsInboundDownlink": true,
"statsInboundUplink": true,
"statsOutboundDownlink": false,
"statsOutboundUplink": false
}
},
"api": {
"tag": "api",
"services": [
"HandlerService",
"LoggerService",
"StatsService"
]
},
"stats": {},
"reverse": null,
"fakedns": null,
"observatory": null,
"burstObservatory": null
}

View File

@ -1,10 +1,9 @@
version: "3.9"
services:
xray:
image: teddysun/xray:latest
restart: always
container_name: xray
container_name: "${COMPOSE_PROJECT_NAME}" # 容器名为文件夹名称
network_mode: "host"
volumes:
- "./conf:/etc/xray"
- "./log:/var/log/xray"

113
install.sh Normal file
View File

@ -0,0 +1,113 @@
#!/bin/bash
# 导入依赖脚本文件
BASE_DIR="$(cd "$(dirname "$0")" && pwd)"
for f in "$BASE_DIR"/bin/utils/*.sh; do
[ -f "$f" ] && source "$f"
done
for f in "$BASE_DIR"/bin/*.sh; do
[ -f "$f" ] && source "$f"
done
# 安装依赖
install_dependencies(){
local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/bin" # 脚本文件夹路径
source "${script_dir}/utils/base.sh"
if ! command -v curl >/dev/null 2>&1; then
install_package curl
fi
if ! command -v wget >/dev/null 2>&1; then
install_package wget
fi
if ! command -v jq >/dev/null 2>&1; then
echo 安装jq...
install_package jq
fi
if ! command -v docker >/dev/null 2>&1; then
echo 安装docker...
curl -fsSL https://get.docker.com | bash -s docker
fi
if ! command -v docker-compose >/dev/null 2>&1; then
echo 安装docker-compose...
wget -O /usr/local/bin/docker-compose https://github.com/docker/compose/releases/download/v2.29.0/docker-compose-linux-x86_64
chmod +x /usr/local/bin/docker-compose
fi
}
main(){
local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/bin" # 脚本文件夹路径
source "${script_dir}/utils/base.sh"
# 显示菜单
echo "请选择一个操作:"
echo "1. 一键部署"
echo "2. 创建配置 / 重置配置"
echo "3. 查看分享链接"
echo "4. 启动容器"
echo "5. 停止容器"
echo "6. 更新镜像"
echo "7. 修改端口"
echo "8. 修改Reality目标域名"
# 读取用户选择
local choice
read -p "输入您的选择: " choice
# 根据用户选择执行相应的操作
case $choice in
1)
# 一键部署
install_dependencies
create_config
run
print_share_link
;;
2)
# 创建配置 / 重置配置
create_config
;;
3)
# 查看分享链接
check_config
print_share_link
;;
4)
# 启动容器
check_config
run
print_share_link
;;
5)
# 停止容器
docker-compose -f ./docker-compose.yml down
;;
6)
# 更新镜像
update_docker_images
;;
7)
# 修改端口
check_config
update_port
restart_docker
;;
8)
# 修改Reality目标域名
check_config
update_reality_dest
restart_docker
;;
*)
echo "无效的选择, 请重新选择."
;;
esac
}
main