159 lines
5.2 KiB
Python
159 lines
5.2 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
V2Ray Docker 管理脚本
|
||
|
||
功能描述:
|
||
该脚本用于管理 V2Ray Docker 容器的安装、配置以及删除操作。用户可以通过输入操作命令来实现以下功能:
|
||
|
||
1. **安装 (install)**:
|
||
- 根据给定的服务器信息列表,为每个服务器生成对应的 V2Ray 配置文件,并启动 Docker 容器。
|
||
- 配置文件包括 V2Ray 的 `inbounds` 和 `outbounds` 设置,使用 WebSocket 协议。
|
||
- 每个 Docker 容器的端口号从 9001 开始递增。
|
||
|
||
2. **删除 (remove)**:
|
||
- 根据给定的服务器信息列表,停止并删除 Docker 容器,并删除相关的配置文件夹。
|
||
- 清理 Docker 容器和配置目录,以便完全删除相关的配置和容器。
|
||
|
||
功能详情:
|
||
- 配置文件目录:`/etc/v2ray{port}/config.json`
|
||
- Docker 容器名称:`v2ray_{port}`
|
||
- 每个服务器对应的端口号从 9001 开始递增。
|
||
|
||
依赖:
|
||
- `Docker`:需要在系统中安装 Docker,脚本通过 Docker 命令来启动和删除容器。
|
||
- `os` 和 `shutil` 模块:用于操作文件和目录。
|
||
- `json` 模块:用于处理配置文件的 JSON 格式。
|
||
|
||
使用示例:
|
||
1. 安装并配置 V2Ray:
|
||
python v2ray_docker_manager.py install
|
||
2. 删除已安装的 V2Ray 配置和 Docker 容器:
|
||
python v2ray_docker_manager.py remove
|
||
|
||
作者:
|
||
- 由用户定制的 V2Ray Docker 容器管理脚本
|
||
|
||
"""
|
||
import os
|
||
import json
|
||
import shutil
|
||
|
||
def write_config(file_path, server_address, user, password, port):
|
||
"""
|
||
将格式化的 JSON 配置写入指定文件。如果文件的目录不存在,则创建该目录。
|
||
|
||
:param file_path: str,配置文件的路径
|
||
:param server_address: str,服务器地址
|
||
:param user: str,用户名
|
||
:param password: str,密码
|
||
:param port: int,端口号
|
||
"""
|
||
# 定义客户端 ID
|
||
client_id = "2ee57806-f6e4-482a-ef08-7360c04cd3e5"
|
||
|
||
# 创建配置字典
|
||
config = {
|
||
"inbounds": [{
|
||
"port": 9000,
|
||
"protocol": "vless",
|
||
"settings": {
|
||
"clients": [{
|
||
"id": client_id,
|
||
"alterId": 64
|
||
}],
|
||
"decryption": "none"
|
||
},
|
||
"streamSettings": {
|
||
"network": "ws",
|
||
"wsSettings": {
|
||
"path": "/"
|
||
}
|
||
}
|
||
}],
|
||
"outbounds": [{
|
||
"protocol": "socks",
|
||
"settings": {
|
||
"servers": [{
|
||
"address": server_address,
|
||
"port": port,
|
||
"users": [{
|
||
"user": user,
|
||
"pass": password
|
||
}]
|
||
}]
|
||
}
|
||
}]
|
||
}
|
||
|
||
# 获取文件的目录路径
|
||
dir_name = os.path.dirname(file_path)
|
||
|
||
# 如果目录不存在,则创建目录
|
||
if dir_name and not os.path.exists(dir_name):
|
||
os.makedirs(dir_name)
|
||
|
||
# 将配置写入文件
|
||
with open(file_path, 'w', encoding='utf-8') as file:
|
||
json.dump(config, file, ensure_ascii=False, indent=4)
|
||
|
||
def install_v2ray(server_info_list):
|
||
"""
|
||
安装并配置 V2Ray Docker 容器
|
||
"""
|
||
for server_info in server_info_list:
|
||
# 使用冒号分割字符串
|
||
server_address, server_port, user, password, port = server_info.split(':')
|
||
|
||
# 构建配置文件路径
|
||
file_path = f'/etc/v2ray{port}/config.json'
|
||
|
||
# 写入配置
|
||
write_config(file_path, server_address, user, password, int(server_port))
|
||
|
||
# 运行 Docker 容器
|
||
docker_run_command = f'docker run -d -p {port}:9000 --name v2ray_{port} --restart=always -v /etc/v2ray{port}:/etc/v2ray teddysun/v2ray'
|
||
os.system(docker_run_command)
|
||
print(f"V2Ray 配置已写入 {file_path},并启动了 Docker 容器 v2ray_{port}。")
|
||
|
||
def remove_v2ray(server_info_list):
|
||
"""
|
||
删除 V2Ray Docker 容器及其配置文件
|
||
"""
|
||
for server_info in server_info_list:
|
||
# 使用冒号分割字符串
|
||
_, _, _, _, port = server_info.split(':')
|
||
|
||
# 删除 Docker 容器
|
||
docker_stop_command = f'docker stop v2ray_{port} && docker rm v2ray_{port}'
|
||
os.system(docker_stop_command)
|
||
|
||
# 删除配置文件
|
||
config_dir = f'/etc/v2ray{port}'
|
||
if os.path.exists(config_dir):
|
||
shutil.rmtree(config_dir)
|
||
print(f"已删除 Docker 容器 v2ray_{port} 和配置目录 {config_dir}。")
|
||
else:
|
||
print(f"未找到配置目录 {config_dir},跳过删除。")
|
||
|
||
# 示例用法
|
||
if __name__ == "__main__":
|
||
# 定义服务器信息列表
|
||
server_info_list = [
|
||
"38.33.77.252:17888:666666:666666:9001",
|
||
"38.6.101.39:17888:666666:666666:9002",
|
||
"38.6.126.202:17888:666666:666666:9003",
|
||
"38.6.102.89:17888:666666:666666:9004",
|
||
"38.6.103.77:17888:666666:666666:9005",
|
||
"38.33.74.197:17888:666666:666666:9006",
|
||
]
|
||
|
||
action = input("请输入操作 (install / remove): ").strip().lower()
|
||
|
||
if action == "install":
|
||
install_v2ray(server_info_list)
|
||
elif action == "remove":
|
||
remove_v2ray(server_info_list)
|
||
else:
|
||
print("无效的操作。请输入 'install' 或 'remove'。")
|