From 1d2eb2d80cc0c8c6a3141f5f4a4a6b720c64eac7 Mon Sep 17 00:00:00 2001 From: qaq <1937228092@qq.com> Date: Wed, 25 Jun 2025 11:17:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81ipv6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 2 +- panel_install.sh | 260 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 261 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 9f5f538..f484cb4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -37,7 +37,7 @@ services: JWT_SECRET: ${JWT_SECRET} LOG_DIR: /app/logs SERVER_ADDR: ${SERVER_HOST} - JAVA_OPTS: "-Xms128m -Xmx512m -Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai" + JAVA_OPTS: "-Xms256m -Xmx512m -Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai" ports: - "${BACKEND_PORT}:6365" volumes: diff --git a/panel_install.sh b/panel_install.sh index b7553cb..5bcb887 100755 --- a/panel_install.sh +++ b/panel_install.sh @@ -27,6 +27,242 @@ check_docker() { echo "检测到 Docker 命令:$DOCKER_CMD" } +# 检查IPv6支持 +check_ipv6_support() { + echo "🔍 检查IPv6支持..." + + # 检查内核是否支持IPv6 + if [ ! -f /proc/net/if_inet6 ]; then + echo "⚠️ 警告:系统内核不支持IPv6" + return 1 + fi + + # 检查Docker是否支持IPv6 + if ! docker info 2>/dev/null | grep -q "IPv6: true"; then + echo "⚠️ Docker守护进程未启用IPv6支持,正在自动配置..." + + # 自动配置Docker daemon.json + configure_docker_ipv6 + + # 重新检查 + if ! docker info 2>/dev/null | grep -q "IPv6: true"; then + echo "❌ Docker IPv6配置失败,请手动检查" + return 1 + fi + fi + + echo "✅ IPv6支持检查通过" + return 0 +} + +# 配置Docker IPv6支持 +configure_docker_ipv6() { + echo "🔧 正在配置Docker IPv6支持..." + + DAEMON_JSON_PATH="/etc/docker/daemon.json" + + # 检查是否有写入权限 + if [ ! -w "/etc/docker" ] && [ ! -w "$DAEMON_JSON_PATH" ]; then + echo "⚠️ 需要管理员权限来配置Docker" + echo "🔐 正在请求sudo权限..." + fi + + # 备份现有配置 + if [ -f "$DAEMON_JSON_PATH" ]; then + sudo cp "$DAEMON_JSON_PATH" "$DAEMON_JSON_PATH.backup.$(date +%Y%m%d_%H%M%S)" 2>/dev/null || { + echo "❌ 无法备份daemon.json文件,请检查权限" + return 1 + } + echo "✅ 已备份现有daemon.json配置" + fi + + # 创建或更新daemon.json + if [ -f "$DAEMON_JSON_PATH" ]; then + # 文件存在,检查是否已配置IPv6 + if grep -q '"ipv6".*true' "$DAEMON_JSON_PATH" 2>/dev/null; then + echo "ℹ️ daemon.json已配置IPv6支持" + else + echo "🔧 更新现有daemon.json配置..." + # 尝试多种方式更新JSON + JSON_UPDATED=false + + # 方法1: 使用jq + if command -v jq &> /dev/null; then + if sudo jq '. + {"ipv6": true, "fixed-cidr-v6": "2001:db8:1::/64"}' "$DAEMON_JSON_PATH" > /tmp/daemon.json.tmp 2>/dev/null && \ + sudo mv /tmp/daemon.json.tmp "$DAEMON_JSON_PATH" 2>/dev/null; then + JSON_UPDATED=true + echo "✅ 使用jq更新JSON配置" + fi + fi + + # 方法2: 使用Python3 + if [ "$JSON_UPDATED" = false ] && command -v python3 &> /dev/null; then + if sudo python3 -c " +import json +try: + with open('$DAEMON_JSON_PATH', 'r') as f: + config = json.load(f) +except: + config = {} +config['ipv6'] = True +config['fixed-cidr-v6'] = '2001:db8:1::/64' +with open('$DAEMON_JSON_PATH', 'w') as f: + json.dump(config, f, indent=2) +print('JSON updated successfully') +" 2>/dev/null; then + JSON_UPDATED=true + echo "✅ 使用Python3更新JSON配置" + fi + fi + + # 方法3: 手动创建新文件(简单覆盖) + if [ "$JSON_UPDATED" = false ]; then + echo "⚠️ 无法解析现有JSON,将创建新的配置文件" + read -p "这将覆盖现有的daemon.json配置,是否继续?(y/N): " confirm + if [[ "$confirm" == "y" || "$confirm" == "Y" ]]; then + sudo tee "$DAEMON_JSON_PATH" > /dev/null </dev/null || { + echo "❌ 无法创建/etc/docker目录" + return 1 + } + sudo tee "$DAEMON_JSON_PATH" > /dev/null < /dev/null; then + if sudo systemctl restart docker 2>/dev/null; then + echo "⏳ 等待Docker服务启动..." + sleep 5 + if sudo systemctl is-active docker &> /dev/null; then + echo "✅ Docker服务重启成功" + else + echo "❌ Docker服务启动失败" + sudo systemctl status docker --no-pager -l + return 1 + fi + else + echo "❌ 无法重启Docker服务" + return 1 + fi + elif command -v service &> /dev/null; then + if sudo service docker restart 2>/dev/null; then + sleep 5 + echo "✅ Docker服务重启完成" + else + echo "❌ 无法重启Docker服务" + return 1 + fi + else + echo "⚠️ 无法自动重启Docker服务,请手动重启:" + echo " sudo systemctl restart docker" + echo " 或者: sudo service docker restart" + return 1 + fi + + return 0 +} + +# 配置IPv6网络 +configure_ipv6_network() { + if [[ "$ENABLE_IPV6" == "true" ]]; then + echo "🌐 配置IPv6网络..." + + # 检查IPv6支持 + if ! check_ipv6_support; then + echo "❌ IPv6支持检查失败" + echo "" + echo "📋 您有以下选择:" + echo "1. 继续安装(仅使用IPv4网络)" + echo "2. 取消安装,手动配置IPv6后重试" + echo "" + read -p "请选择 (1/2): " ipv6_choice + + case $ipv6_choice in + 1) + echo "ℹ️ 继续安装,将使用IPv4网络" + ENABLE_IPV6=false + return 0 + ;; + 2) + echo "❌ 安装已取消" + echo "ℹ️ 请参考以下步骤手动配置IPv6:" + echo " 1. 确保系统内核支持IPv6" + echo " 2. 编辑 /etc/docker/daemon.json 添加:" + echo ' {"ipv6": true, "fixed-cidr-v6": "2001:db8:1::/64"}' + echo " 3. 重启Docker服务: sudo systemctl restart docker" + echo " 4. 重新运行此安装脚本" + exit 1 + ;; + *) + echo "❌ 无效选择,安装已取消" + exit 1 + ;; + esac + fi + + # 修改docker-compose.yml以支持IPv6 + # 检测操作系统,使用合适的sed语法 + if [[ "$OSTYPE" == "darwin"* ]]; then + # macOS + sed -i '' '/networks:/,/subnet: 172.20.0.0\/16/c\ +networks:\ + gost-network:\ + driver: bridge\ + enable_ipv6: true\ + ipam:\ + config:\ + - subnet: 172.20.0.0/16\ + - subnet: 2001:db8:1::/64' docker-compose.yml + else + # Linux + sed -i.bak '/networks:/,/subnet: 172.20.0.0\/16/c\ +networks:\ + gost-network:\ + driver: bridge\ + enable_ipv6: true\ + ipam:\ + config:\ + - subnet: 172.20.0.0/16\ + - subnet: 2001:db8:1::/64' docker-compose.yml + fi + + echo "✅ IPv6网络配置完成" + echo "ℹ️ IPv6子网: 2001:db8:1::/64" + echo "ℹ️ IPv4子网: 172.20.0.0/16" + else + echo "ℹ️ 跳过IPv6网络配置,仅使用IPv4网络" + fi +} + # 显示菜单 show_menu() { echo "===============================================" @@ -64,6 +300,25 @@ get_config_params() { read -p "后端端口(默认 6365): " BACKEND_PORT BACKEND_PORT=${BACKEND_PORT:-6365} + # 询问是否开启IPv6支持 + echo "" + echo "🌐 IPv6 支持配置" + echo "开启IPv6可以让容器支持IPv6网络连接" + echo "ℹ️ 注意事项:" + echo " - 需要系统内核支持IPv6" + echo " - 需要Docker守护进程启用IPv6支持" + echo " - 如果Docker未启用IPv6,请先配置Docker后再安装" + echo "" + read -p "是否开启IPv6支持?(y/N): " ENABLE_IPV6 + if [[ "$ENABLE_IPV6" == "y" || "$ENABLE_IPV6" == "Y" ]]; then + ENABLE_IPV6=true + echo "✅ 已选择开启IPv6支持" + echo "ℹ️ 将使用IPv6子网: 2001:db8:1::/64" + else + ENABLE_IPV6=false + echo "ℹ️ 未开启IPv6支持,使用IPv4网络" + fi + DB_NAME=$(generate_random) DB_USER=$(generate_random) DB_PASSWORD=$(generate_random) @@ -82,6 +337,9 @@ install_panel() { curl -L -o gost.sql "$GOST_SQL_URL" echo "✅ 下载完成" + # 配置IPv6网络 + configure_ipv6_network + cat > .env <