diff --git a/x-ui/README.md b/x-ui/README.md index 8413a5c..23bc3c1 100644 --- a/x-ui/README.md +++ b/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 镜像. ## 更新 -- **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 手动部署 ### docker diff --git a/x-ui/x-ui-ssl/README.md b/x-ui/x-ui-ssl/README.md new file mode 100644 index 0000000..28e4d6f --- /dev/null +++ b/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) + diff --git a/x-ui/x-ui-ssl/conf/account.conf b/x-ui/x-ui-ssl/conf/account.conf new file mode 100644 index 0000000..a00d5fc --- /dev/null +++ b/x-ui/x-ui-ssl/conf/account.conf @@ -0,0 +1,4 @@ +export DP_Id="" +export DP_Key="" +export DOMAIN= +export DNSAPI= diff --git a/x-ui/x-ui-ssl/conf/acme.sh b/x-ui/x-ui-ssl/conf/acme.sh new file mode 100755 index 0000000..38fe39f --- /dev/null +++ b/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</dev/null 2>&1 +EOF diff --git a/x-ui/x-ui-ssl/conf/start.sh b/x-ui/x-ui-ssl/conf/start.sh new file mode 100755 index 0000000..5f69d0a --- /dev/null +++ b/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</dev/null 2>&1 +EOF + +if [ ! -f "/ssl/${DOMAIN}.cer" ] && [ -n "${DOMAIN}" ]; then + /conf/acme.sh +fi + +/entry.sh daemon diff --git a/x-ui/x-ui-ssl/data/x-ui.db b/x-ui/x-ui-ssl/data/x-ui.db new file mode 100644 index 0000000..e542d31 Binary files /dev/null and b/x-ui/x-ui-ssl/data/x-ui.db differ diff --git a/x-ui/x-ui-ssl/docker-compose.yml b/x-ui/x-ui-ssl/docker-compose.yml new file mode 100644 index 0000000..fa67914 --- /dev/null +++ b/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"] diff --git a/x-ui/x-ui-ssl/install.sh b/x-ui/x-ui-ssl/install.sh new file mode 100755 index 0000000..ccd0599 --- /dev/null +++ b/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</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 diff --git a/x-ui/x-ui-ssl/x-ui-ssl.tar b/x-ui/x-ui-ssl/x-ui-ssl.tar new file mode 100644 index 0000000..2db114b Binary files /dev/null and b/x-ui/x-ui-ssl/x-ui-ssl.tar differ