Stille пре 4 година
родитељ
комит
8f6b1af2ad

+ 7 - 1
x-ui/README.md

@@ -8,7 +8,13 @@ Docker [stilleshan/x-ui](https://hub.docker.com/r/stilleshan/x-ui)
 基于 [sprov065/x-ui](https://github.com/sprov065/x-ui) 项目的 docker 镜像.
 基于 [sprov065/x-ui](https://github.com/sprov065/x-ui) 项目的 docker 镜像.
 
 
 ## 更新
 ## 更新
-- **2021-08-01** 更新`0.3.1`版 docker 镜像,新增同时支持 X86 和 ARM 架构.
+- **2021-08-01** 更新`0.3.1`版 docker 镜像,同时支持 X86 和 ARM 架构.
+
+## 注意
+x-ui 还在开发测试中,如果遇到 xray 状态 为`error`,尝试切换版本即可.
+
+## x-ui-ssl 一键安装脚本部署
+一键安装脚本部署请访问子目录 [x-ui-ssl](./x-ui-ssl) 查看详情.
 
 
 ## x-ui 手动部署
 ## x-ui 手动部署
 ### docker
 ### docker

+ 78 - 0
x-ui/x-ui-ssl/README.md

@@ -0,0 +1,78 @@
+# x-ui-ssl
+
+GitHub [stilleshan/dockerfiles](https://github.com/stilleshan/dockerfiles)  
+Docker [stilleshan/x-ui](https://hub.docker.com/r/stilleshan/x-ui)
+> *docker image support for X86 and ARM*
+
+## 简介
+整合 x-ui 和 acme.sh 的 docker compose 一键部署方案
+- 支持全自动证书申请,定时每月续签证书.
+- 备份和迁移方便,仅需保存 x-ui-ssl 一个目录,一条命令即可在其他服务器启动使用.
+- 支持 X86 和 ARM 架构
+
+## 更新
+**2021-08-01** 更新`一键安装脚本`.
+
+## 注意
+x-ui 还在开发测试中,如果遇到 xray 状态 为`error`,尝试切换版本即可.
+
+## 一键安装脚本部署
+- 使用一键安装脚本后无需继续参考以下`手动部署`段落.
+- 一键安装脚本依旧需要基于本服务器安装 docker 和 docker compose 环境.
+- 一键安装脚本仅限于首次使用,确保服务器之前没有使用过本仓库的`x-ui`或`x-ui-ssl`项目.
+- 脚本安装完毕后,会自行删除,避免误操作.
+- 脚本安装完毕后,依旧需要手动执行以下`自动更新证书`段落的操作,以便`x-ui`定时重启使得证书生效.
+```shell
+wget https://raw.githubusercontent.com/stilleshan/dockerfiles/main/x-ui/x-ui-ssl/install.sh && chmod +x install.sh && ./install.sh
+```
+
+
+## 手动部署
+### 下载文件
+部署所需文件已打包,方便直接下载解压使用.
+```shell
+wget https://raw.githubusercontent.com/stilleshan/dockerfiles/main/x-ui/x-ui-ssl/x-ui-ssl.tar
+tar -xvf x-ui-ssl.tar
+cd x-ui-ssl
+```
+
+### 配置
+修改`conf/account.conf`文件,在`DOMAIN=`之后填写域名,并参考一下官方文档,填写其他对应的 API 信息.  
+https://github.com/acmesh-official/acme.sh/wiki/dnsapi  
+https://www.ioiox.com/archives/87.html
+
+
+### 启动
+执行以下命令启动,请确保`account.conf`填写正确,容器每次启动都会检测`account.conf`中的`DOMAIN`变量,以及`ssl`目录下是否存在该域名证书,如果没有将会自动申请证书,如已存在则不会申请.
+```shell
+docker-compose up -d
+```
+> 启动后稍等一分钟, **ssl** 目录下将会生成证书文件.
+
+### 自动更新证书
+由于系统将在 GMT 时间每月`1`日`0`点,也就是北京时间`1`日早`8`点重新强制更新证书,并覆盖至`ssl`目录下.则需要同时为`x-ui`服务设置一个定时重启计划任务:
+```shell
+crontab -e
+# 添加以下计划任务
+0 0 2 * * docker restart x-ui
+# 为避免时区问题,将在每月 2 号 0 点执行
+```
+
+### 手动更新证书
+也可以手动执行更新证书命令:
+```shell
+docker exec acme sh -c /conf/acme.sh
+```
+
+## 使用
+访问`http://服务器IP:54321`使用账号`admin`密码`admin`登录.注意需开放相关端口防火墙,并及时修改账号密码.
+
+### 证书使用
+**x-ui** 中创建账户开启`tls`时所需用到的证书路径为
+> /ssl/yourdomain.cer  
+/ssl/yourdomain.key
+
+
+## 参考
+GitHub [sprov065/x-ui](https://github.com/sprov065/x-ui)
+

+ 4 - 0
x-ui/x-ui-ssl/conf/account.conf

@@ -0,0 +1,4 @@
+export DP_Id=""
+export DP_Key=""
+export DOMAIN=
+export DNSAPI=

+ 34 - 0
x-ui/x-ui-ssl/conf/acme.sh

@@ -0,0 +1,34 @@
+PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
+export PATH
+
+# fonts color
+Green="\033[32m"
+Red="\033[31m"
+Yellow="\033[33m"
+GreenBG="\033[42;37m"
+RedBG="\033[41;37m"
+Font="\033[0m"
+# fonts color
+
+
+DOMAIN=$(cat /conf/account.conf | awk -F= '{if($1~"DOMAIN")print $2}')
+DNSAPI=$(cat /conf/account.conf | awk -F= '{if($1~"DNSAPI")print $2}')
+
+acme (){
+    cat /conf/account.conf > /acme.sh/account.conf
+    /root/.acme.sh/acme.sh --upgrade
+    /root/.acme.sh/acme.sh --issue --server letsencrypt $* --dns ${DNSAPI} -d ${DOMAIN} -d \*.${DOMAIN}
+    cp /acme.sh/${DOMAIN}/fullchain.cer /ssl/${DOMAIN}.cer
+    cp /acme.sh/${DOMAIN}/${DOMAIN}.key /ssl/${DOMAIN}.key
+    mv /acme.sh/${DOMAIN} /acme.sh/${DOMAIN}-$(date +%Y)-$(date +%m)-$(date +%d)-${RANDOM}
+}
+
+if [ ! -n "${DOMAIN}" ] ; then
+    echo "请检查 account.conf 信息是否正确"
+else
+    acme $*
+fi
+
+cat >/var/spool/cron/crontabs/root<<EOF
+0 0 1 * * /conf/acme.sh >/dev/null 2>&1
+EOF

+ 24 - 0
x-ui/x-ui-ssl/conf/start.sh

@@ -0,0 +1,24 @@
+PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
+export PATH
+
+# fonts color
+Green="\033[32m"
+Red="\033[31m"
+Yellow="\033[33m"
+GreenBG="\033[42;37m"
+RedBG="\033[41;37m"
+Font="\033[0m"
+# fonts color
+
+DOMAIN=$(cat /conf/account.conf | awk -F= '{if($1~"DOMAIN")print $2}')
+DNSAPI=$(cat /conf/account.conf | awk -F= '{if($1~"DNSAPI")print $2}')
+
+cat >/var/spool/cron/crontabs/root<<EOF
+0 0 1 * * /conf/acme.sh >/dev/null 2>&1
+EOF
+
+if [ ! -f "/ssl/${DOMAIN}.cer" ] && [ -n "${DOMAIN}" ]; then
+    /conf/acme.sh
+fi
+
+/entry.sh daemon

BIN
x-ui/x-ui-ssl/data/x-ui.db


+ 20 - 0
x-ui/x-ui-ssl/docker-compose.yml

@@ -0,0 +1,20 @@
+version: '3.7'
+services:
+  x-ui:
+    image: stilleshan/x-ui
+    container_name: x-ui
+    volumes:
+      - ./data/x-ui.db:/etc/x-ui/x-ui.db
+      - ./ssl:/ssl
+    restart: always
+    network_mode: host
+
+  acme:
+    image: neilpang/acme.sh
+    container_name: acme
+    volumes:
+      - ./conf:/conf
+      - ./ssl:/ssl
+    restart: always
+    network_mode: host
+    command: ["sh", "-c", "/conf/start.sh"]

+ 187 - 0
x-ui/x-ui-ssl/install.sh

@@ -0,0 +1,187 @@
+PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
+export PATH
+
+# fonts color
+Green="\033[32m"
+Red="\033[31m"
+Yellow="\033[33m"
+GreenBG="\033[42;37m"
+RedBG="\033[41;37m"
+Font="\033[0m"
+# fonts color
+
+WORK_PATH=$(dirname $(readlink -f $0))
+
+
+v2_ui_ssl (){
+clear
+echo -e "${Green}请输入需要申请证书的根域名(例如:ioiox.com):${Font}"
+read -p "请输入:" DOMAIN_INPUT
+if [ ! -n "${DOMAIN_INPUT}" ]; then
+    echo -e "${Red}输入错误,请重新运行脚本.${Font}"
+    exit 0
+fi
+DOMAIN=$DOMAIN_INPUT
+echo -e "${Green}请选择域名服务商:${Font}"
+echo -e "1) 腾讯云 dnspod.cn"
+echo -e "2) 阿里云 aliyun"
+echo -e "3) Cloudflare"
+read -p "请选择:" DNSAPI_INPUT
+case "$DNSAPI_INPUT" in
+    1)
+    PLATFORM_NAME='dnspod.cn'
+    DNSAPI='dns_dp'
+    API_ID_HEADER='DP_Id'
+    API_KEY_HEADER='DP_Key'
+    ;;
+    2)
+    PLATFORM_NAME='aliyun'
+    DNSAPI='dns_ali'
+    API_ID_HEADER='Ali_Key'
+    API_KEY_HEADER='Ali_Secret'
+    ;;
+    3)
+    ;;
+    *)
+    echo -e "${Red}输入错误,请重新运行脚本.${Font}"
+    exit 0
+    esac
+
+if [ "$DNSAPI_INPUT" == "3" ]; then
+    echo -e "${Green}=========================================================================================${Font}"
+    echo -e  "${Red}注意: Cloudflare API 有三种:${Font}"
+    echo -e  "${Red}请参考 https://github.com/acmesh-official/acme.sh/wiki/dnsapi#1-cloudflare-option 选择.${Font}"
+    echo "1) Using the global API key"
+    echo "2) Using the new cloudflare api token"
+    echo "3) Using the new cloudflare api token for Single Zone"
+    read -p "请选择:" CHOICE_CLOUDFLARE_INPUT
+    echo -e "${Green}=========================================================================================${Font}"
+    case "$CHOICE_CLOUDFLARE_INPUT" in
+        1)
+        PLATFORM_NAME='Cloudflare'
+        DNSAPI='dns_cf'
+        API_ID_HEADER='CF_Key'
+        API_KEY_HEADER='CF_Email'
+        ;;
+        2)
+        PLATFORM_NAME='Cloudflare'
+        DNSAPI='dns_cf'
+        API_ID_HEADER='CF_Token'
+        API_KEY_HEADER='CF_Account_ID'
+        ;;
+        3)
+        PLATFORM_NAME='Cloudflare'
+        DNSAPI='dns_cf'
+        API_ID_HEADER='CF_Token'
+        API_KEY_HEADER='CF_Account_ID'
+        API_ZONE_HEADER='CF_Zone_ID'
+        ;;
+        *)
+        echo -e "${Red}输入错误,请重新运行脚本.${Font}"
+        exit 0
+        esac
+fi
+
+read -p "请输入 $API_ID_HEADER :" API_ID_INPUT
+read -p "请输入 $API_KEY_HEADER :" API_KEY_INPUT
+if [ "$CHOICE_CLOUDFLARE_INPUT" == "3" ]; then
+    read -p "请输入 $API_ZONE_HEADER :" API_ZONE_HEADER_INPUT
+fi
+
+
+echo -e "${Green}=========================================================================================${Font}"
+echo -e "${Red}请确认以下信息正确无误!${Font}"
+echo -e "${Green}域名: ${Font}${Red}${DOMAIN}${Font}"
+echo -e "${Green}域名服务商: ${Font}${Red}${PLATFORM_NAME}${Font}"
+echo -e "${Green}${API_ID_HEADER}:${Font} ${Red}${API_ID_INPUT}${Font}"
+echo -e "${Green}${API_KEY_HEADER}:${Font} ${Red}${API_KEY_INPUT}${Font}"
+if [ "$CHOICE_CLOUDFLARE_INPUT" == "3" ]; then
+    echo -e "${Green}${API_ZONE_HEADER}:${Font} ${Red}${API_ZONE_HEADER_INPUT}${Font}"
+fi
+echo -e "${Red}请再次确认以上信息正确无误!${Font}"
+echo -e "${Green}=========================================================================================${Font}"
+echo -e "1) 开始部署"
+echo -e "2) 退出脚本"
+read -p "请输入:" START_INPUT
+case "$START_INPUT" in
+    1)
+    echo -e "${Green}开始部署中......${Font}"
+    accout_conf $*
+    ;;
+    2)
+    exit 0
+    ;;
+    *)
+    echo -e "${Red}输入有误,请重新运行脚本.${Font}"
+    exit 0
+    esac
+}
+
+
+accout_conf (){
+WORK_PATH=$(dirname $(readlink -f $0))
+wget https://raw.githubusercontent.com/stilleshan/dockerfiles/main/x-ui/x-ui-ssl/x-ui-ssl.tar
+tar -xvf x-ui-ssl.tar
+cat >${WORK_PATH}/x-ui-ssl/conf/account.conf<<EOF
+export ${API_ID_HEADER}="${API_ID_INPUT}"
+export ${API_KEY_HEADER}="${API_KEY_INPUT}"
+export DOMAIN=${DOMAIN}
+export DNSAPI=${DNSAPI}
+EOF
+if [ "$CHOICE_CLOUDFLARE_INPUT" == "3" ]; then
+    sed -i "2a export ${API_ZONE_HEADER}=\"${API_ZONE_HEADER_INPUT}\"" x-ui-ssl/conf/account.conf
+fi
+docker_compose_ssl
+}
+
+docker_compose_ssl (){
+    cd x-ui-ssl
+    docker-compose up -d
+    cd ${WORK_PATH}
+    rm -rf ${WORK_PATH}/x-ui-ssl.tar
+    echo -e "${Green}部署完毕,静等 1 分钟查看 ssl 目录下是否生成证书文件.${Font}"
+    echo -e "${Green}访问 http://服务器IP:65432 使用帐号 admin 密码 admin 登陆,尽快修改帐号密码.${Font}"
+    rm $0
+}
+
+docker_compose_nossl (){
+    WORK_PATH=$(dirname $(readlink -f $0))
+    wget https://raw.githubusercontent.com/stilleshan/dockerfiles/main/x-ui/x-ui-ssl/x-ui-ssl.tar
+    tar -xvf x-ui-ssl.tar
+    sed -i '8d' ${WORK_PATH}/x-ui-ssl/docker-compose.yml
+    sed -i '11,20d' ${WORK_PATH}/x-ui-ssl/docker-compose.yml
+    rm -rf ${WORK_PATH}/x-ui-ssl/conf
+    mv ${WORK_PATH}/x-ui-ssl ${WORK_PATH}/x-ui
+    cd x-ui
+    docker-compose up -d
+    cd ${WORK_PATH}
+    rm -rf ${WORK_PATH}/x-ui-ssl.tar
+    echo -e "${Green}部署完毕.访问 http://服务器IP:65432 使用帐号 admin 密码 admin 登陆,尽快修改帐号密码.${Font}"
+    rm $0
+}
+
+
+if [ ! type docker >/dev/null 2>&1 ] || [ ! type docker-compose >/dev/null 2>&1 ]; then
+    echo -e "${Red}本机未安装 docker 或 docker compose 已退出脚本.${Font}";
+    exit 0
+fi
+
+clear
+echo -e "${Green}=========================================================================================${Font}"
+echo -e "${Green}开始安装 x-ui-ssl${Font}"
+echo -e "${Red}注意:本脚本需要服务器有 docker 和 docker compose 环境${Font}"
+echo -e "${Green}=========================================================================================${Font}"
+echo "1) x-ui + acme 自动申请和续签证书"
+echo "2) x-ui 独立版本"
+read -p "请输入:" VS_INPUT
+case "$VS_INPUT" in
+    1)
+    v2_ui_ssl
+    ;;
+    2)
+    docker_compose_nossl
+    ;;
+    *)
+    echo -e "${Red}输入有误,请重新运行脚本.${Font}"
+    exit 0
+    esac

BIN
x-ui/x-ui-ssl/x-ui-ssl.tar