├── LICENSE ├── README.md ├── docker-compose-dev.yml ├── docker-compose.yml ├── img ├── server.png ├── server_port_edit.png ├── server_port_edit_rule_gost.png ├── server_port_edit_rule_iptables.png ├── server_port_users.png ├── servers.png └── servers_edit.png └── install.sh /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Aurora-Admin-Panel 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 极光面板 2 | 3 | ## 这是什么? 4 | 5 | 这是一个多服务器端口租用管理面板,你可以添加多台服务器及端口,并将其分配给任意注册用户,租户则可以很方便地使用被分配的端口来完成各种操作,目前支持的端口功能(**以下功能均支持 AMD64 或 ARM64 架构运行**): 6 | 7 | - [iptables](https://www.netfilter.org/) 8 | - [socat](http://www.dest-unreach.org/socat/) 9 | - [gost](https://github.com/ginuerzh/gost) 10 | - [ehco](https://github.com/Ehco1996/ehco) 11 | - [realm](https://github.com/zephyrchien/realm) 12 | - [v2ray](https://github.com/v2fly/v2ray-core) 13 | - [brook](https://github.com/txthinking/brook) 14 | - [iperf](https://iperf.fr) 15 | - [haproxy](http://www.haproxy.org) 16 | - [wstunnel](https://github.com/erebe/wstunnel) 17 | - [shadowsocks](https://github.com/shadowsocks) 18 | - [tinyPortMapper](https://github.com/wangyu-/tinyPortMapper) 19 | - [Prometheus Node Exporter](https://github.com/leishi1313/node_exporter) 20 | 21 | 目前,全部端口转发功能均已支持 `IPV6` 。除 `iptables` 以外的转发方式,如果中转机器本身同时具备 `IPV4` 和 `IPV6` 网络访问能力,可以借助端口转发实现 `IPV4 to IPV6` 或 `IPV6 to IPV4`。 22 | 23 | ### 面板服务器与被控机说明 24 | 25 | **面板建议安装在单独的一台服务器上,建议安装配置为不低于单核 512M 内存的 VPS 中**,可以直接部署到本地。**被控机端无需做任何特别配置,只需保证面板服务器能够通过 ssh 连接至被控机即可。** 26 | 27 | 面板服务器在连接被控机的时候会检测被控机是否已经安装好 python (python 为被控机必须依赖),如果被控机上没安装会自动在被控机上通过 apt / yum 执行 python 安装(优先安装python3),如果被控机没有自带 python 且自动安装失败会导致面板显示被控机连接失败(表现为被控机连接状态持续转圈)。 28 | 29 | #### 面板(主控机)支持进度: 30 | 31 | - 操作系统 32 | - [x] CentOS 7+ 33 | - [x] Debian 8+ 34 | - [x] Ubuntu 18+ 35 | - [x] Alpine Linux 3.15.0+ (请使用一键脚本安装) 36 | - 虚拟平台 37 | - [x] KVM 38 | - [x] VMware 39 | - [x] OVZ (需要 OVZ 支持 docker) 40 | - CPU 架构 41 | - [x] AMD64 42 | - [x] ARM64 43 | - 网络类型 44 | - [x] IPV4 45 | - [X] IPV6 46 | 47 | 特别说明:由于 docker 默认不开启 IPV6,如果需要在面板通过 IPV6 连接被控机 SSH,请在面板机器的配置文件中开启 `ipv6` 选项,并使用 `ip6tables` 命令为容器添加 IPV6 NAT,**命令中的 IPV6 地址不需要做任何更改**: 48 | 49 | ```shell 50 | # 1. docker-compose.yml 配置开启 ipv6 选项,该配置文件默认在 ~/aurora/ 目录下 51 | # 找到 enable_ipv6: false 该行,将 false 改为 true,重建容器 52 | cd ~/aurora/ && docker-compose up -d 53 | # 2. ip6tables 命令,直接复制粘贴回车即可(注意,重启系统会导致 ip6tables 规则被重置,需要手动重新添加) 54 | ip6tables -t nat -A POSTROUTING -s fd00:ea23:9c80:4a54:e242:5f97::/96 -j MASQUERADE 55 | ``` 56 | 57 | #### 中转机器(被控机)支持进度: 58 | 59 | - 操作系统 60 | - [x] CentOS 7+ 61 | - [x] Debian 8+ 62 | - [x] Ubuntu 18+ 63 | - [ ] Alpine Linux 3.15.0+ (正在开发中,仅支持 iptables 转发和流量统计) 64 | - [x] 其他操作系统如果支持 docker,可以参考下面的手动安装方法 65 | - 虚拟平台 66 | - [x] KVM 67 | - [x] VMware 68 | - [x] OVZ 69 | - CPU 架构 70 | - [x] AMD64 71 | - [x] ARM64 72 | - 网络类型 73 | - [x] IPV4 74 | - [X] IPV6 75 | - Linux init process 76 | - [x] systemd 77 | - [ ] SysVinit 78 | - [ ] OpenRC 79 | 80 | ## 怎么跑起来? 81 | 82 | ## 一键脚本(推荐) 83 | 84 | 目前已支持一键安装、更新(自动同步旧配置)、卸载面板以及备份数据库、添加超级管理员帐号、更换面板端口等操作。**使用一键脚本安装后,如果仍需使用一脚脚本更新,请勿更改数据库用户名和密码,否则会使得更新后无法同步更改后的数据库用户名和密码,导致数据库连接出错。** 85 | 86 | ```shell 87 | bash <(curl -fsSL https://raw.githubusercontent.com/Aurora-Admin-Panel/deploy/main/install.sh) 88 | ``` 89 | 90 | **由于公开的 github 代理以及 docker 代理不稳定,一键脚本已经移除所有代理选项,如需在国内机器安装,请自行解决相关网络问题**。一键脚本也支持更新测试版本,只需要添加 `--dev` 参数执行脚本即可,但是测试版本并不稳定,可能会出现各种问题,不建议在生产环境中使用。 91 | 92 | ## 手动安装 — 中转被控机 93 | 94 | **对于不在中转机器(被控机)支持进度里面的系统版本,无法直接使用面板连接中转机器。** 如果被控机支持运行 docker,则可以利用被控机运行一个网络模式为 host 的特权 centos7 容器,并利用面板连接到 centos7 docker 中,实现转发功能的操作。(或可以参考 [aurora-client](https://github.com/smartcatboy/aurora-client) 直接编译被控端镜像运行) 95 | 96 | ```shell 97 | # 启动 centos 7 特权容器,设置网络模式为 host ,并设置为开机自启动 98 | sudo docker run -d --privileged --name aurora-client --network=host --restart=always -v /lib/modules:/lib/modules centos:7 /usr/sbin/init 99 | # 进入 centos 7 容器内 100 | sudo docker exec -it aurora-client bash 101 | # 在 docker 内安装 openssh 服务端,并修改容器的 ssh 端口(避免跟主机 ssh 服务冲突) 102 | yum makecache -y && yum install -y openssh-server 103 | sed -i "s/#Port 22/Port 62222/" /etc/ssh/sshd_config 104 | # 启用 ssh 服务 105 | systemctl enable --now sshd 106 | # 安装 iptables 转发必须的依赖 107 | yum install -y iproute 108 | # 为 root 账号设置密码 109 | passwd 110 | # 直接在面板添加中转机器 ip:62222 ,用户名 root ,密码为刚刚设置的密码 111 | # 卸载时候只需要在面板删除对应中转机,并删除 aurora-client 容器即可 112 | sudo docker stop aurora-client && sudo docker rm aurora-client 113 | ``` 114 | 115 | ## 手动安装 — 面板主控机 116 | 117 | 如果一键脚本提示不支持当前系统版本时,可以尝试使用手动安装的方式。 118 | 119 | ### 1. 安装 docker(必须) 120 | 121 | ```shell 122 | curl -fsSL https://get.docker.com | sudo bash -s docker && sudo systemctl enable --now docker 123 | 124 | # 如果当前执行安装命令的不是 root 用户,请执行下面部分 125 | # =================非root用户执行================== 126 | sudo groupadd docker 127 | sudo usermod -aG docker $USER 128 | newgrp docker 129 | # =================非root用户执行================== 130 | ``` 131 | 132 | ### 2. 安装 docker-compose(必须) 133 | 134 | ```shell 135 | sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && sudo chmod +x /usr/local/bin/docker-compose 136 | 137 | # 如果 /usr/local/bin 不在环境变量 PATH 里 138 | # ============================可选================================ 139 | sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose 140 | # ============================可选================================ 141 | ``` 142 | 143 | ### 3. 生成 SSH 密钥(建议,非必须) 144 | 145 | 此步操作目的为让面板服务器通过密钥连接被控机 ssh ,**可以提高被控机安全性,非必须步骤**,如果不采用密钥连接方式,后续在面板添加被控机使可以选择使用密码连接的方式。 146 | 147 | ```shell 148 | # 如果面板服务器并没有已经生成好的 ssh 密钥 149 | ssh-keygen -t rsa -b 4096 -C "your_email@example.com" 150 | # 后面一直回车,跳过设置 passphase 即可 151 | # 然后还需要将面板服务器 ~/.ssh/id_rsa.pub 里面的内容复制到每一台被控机的 ~/.ssh/authorized_keys 文件中去。 152 | ``` 153 | 154 | ### 4. 安装并启动面板(必须) 155 | 156 | ```shell 157 | mkdir -p ~/aurora && cd ~/aurora && wget https://raw.githubusercontent.com/Aurora-Admin-Panel/deploy/main/docker-compose.yml -O docker-compose.yml && docker-compose up -d 158 | # 创建管理员用户(密码必须设置8位以上,否则无法登陆) 159 | docker-compose exec backend python app/initial_data.py 160 | ``` 161 | 之后可以访问 `http://你的IP:8000` 进入面板。 162 | 163 | ## 配置说明 164 | 165 | 1. 修改所有的 `POSTGRES_USER` 和 `POSTGRES_PASSWORD` ,以及相应的 `DATABASE_URL` ,虽然数据库不公开,但使用默认的数据库用户和密码并不安全! 166 | 167 | 2. 后端默认会发送错误信息到 Sentry (**建议使用测试版本不要关闭,方便排查错误**),可能会导致信息泄漏,移除 `ENABLE_SENTRY: 'yes'` 就好。 168 | 169 | 3. 默认挂载 `~/.ssh/id_rsa` 作为连接服务器的密钥,如使用其他密钥或者不使用密钥可以删除配置文件中的 `- $HOME/.ssh/id_rsa:/app/ansible/env/ssh_key` 。 170 | 171 | ## 更新 172 | 173 | ### 正式版 174 | ```shell 175 | cd ~/aurora 176 | wget https://raw.githubusercontent.com/Aurora-Admin-Panel/deploy/main/docker-compose.yml -O docker-compose.yml 177 | docker-compose pull && docker-compose down --remove-orphans && docker-compose up -d 178 | ``` 179 | 180 | ### ~~内测版(目前已不维护,请不要使用)~~ 181 | ```shell 182 | cd ~/aurora 183 | wget https://raw.githubusercontent.com/Aurora-Admin-Panel/deploy/main/docker-compose-dev.yml -O docker-compose.yml 184 | docker-compose pull && docker-compose down --remove-orphans && docker-compose up -d 185 | ``` 186 | 187 | ## 数据库备份与恢复 188 | 189 | ### 备份 190 | ```shell 191 | docker-compose exec -T postgres pg_dump -d aurora -U [数据库用户名,默认aurora] -c > data.sql 192 | ``` 193 | 194 | ### 恢复 195 | ```shell 196 | # 首先先把所有服务停下 197 | docker-compose down 198 | # 只启动数据库服务 199 | docker-compose up -d postgres 200 | # 执行数据恢复 201 | docker-compose exec -T postgres psql -d aurora -U [数据库用户名,默认aurora] < data.sql 202 | # 然后正常启动所有服务 203 | docker-compose up -d 204 | ``` 205 | 206 | ## 卸载面板 207 | ```shell 208 | docker-compose down 209 | docker volume rm aurora_db-data 210 | docker volume rm aurora_app-data 211 | ``` 212 | 213 | ## 面板长什么样? 214 | 215 | ### 服务器管理页面 216 | 217 | ![](https://raw.githubusercontent.com/Aurora-Admin-Panel/deploy/main/img/servers.png) 218 | 219 | #### 修改/添加服务器 220 | 221 | ![](https://raw.githubusercontent.com/Aurora-Admin-Panel/deploy/main/img/servers_edit.png) 222 | 223 | ### 服务器端口管理页面 224 | 225 | ![](https://raw.githubusercontent.com/Aurora-Admin-Panel/deploy/main/img/server.png) 226 | 227 | #### 添加/编辑端口 228 | 229 | ![](https://raw.githubusercontent.com/Aurora-Admin-Panel/deploy/main/img/server_port_edit.png) 230 | 231 | #### 端口分配页面 232 | 233 | ![](https://raw.githubusercontent.com/Aurora-Admin-Panel/deploy/main/img/server_port_users.png) 234 | 235 | #### 端口设置 iptables 236 | 237 | ![](https://raw.githubusercontent.com/Aurora-Admin-Panel/deploy/main/img/server_port_edit_rule_iptables.png) 238 | 239 | #### 端口设置 gost 240 | 241 | ![](https://raw.githubusercontent.com/Aurora-Admin-Panel/deploy/main/img/server_port_edit_rule_gost.png) 242 | -------------------------------------------------------------------------------- /docker-compose-dev.yml: -------------------------------------------------------------------------------- 1 | version: '3.7' 2 | services: 3 | worker: 4 | image: leishi1313/aurora-admin-backend:dev-latest 5 | restart: always 6 | command: bash worker.sh 7 | environment: 8 | ENABLE_SENTRY: 'yes' 9 | DATABASE_URL: 'postgresql://aurora:AuroraAdminPanel321@postgres:5432/aurora' 10 | TRAFFIC_INTERVAL_SECONDS: 600 11 | DDNS_INTERVAL_SECONDS: 120 12 | volumes: 13 | - $HOME/.ssh/id_rsa:/app/ansible/env/ssh_key 14 | - app-data:/app/ansible/priv_data_dirs 15 | 16 | backend: 17 | image: leishi1313/aurora-admin-backend:dev-latest 18 | restart: always 19 | command: bash -c "while ! /dev/null 2>&1; then 73 | DOCKER_COMPOSE_CMD='docker compose' 74 | elif docker-compose > /dev/null 2>&1; then 75 | DOCKER_COMPOSE_CMD='docker-compose' 76 | else 77 | # 新安装的 docker 默认自带 compose 插件 78 | DOCKER_COMPOSE_CMD='docker compose' 79 | fi 80 | } 81 | 82 | function install_software() { 83 | [[ -z $1 ]] || \ 84 | (type $1 > /dev/null 2>&1 || (echo -e "开始安装依赖 $1 ..." && $INSTALL $1) || ($UPDATE && $INSTALL $1)) 85 | } 86 | 87 | function install_docker() { 88 | if [[ $OS_FAMILY = "centos" || $OS_FAMILY = "debian" ]]; then 89 | if ! docker > /dev/null 2>&1; then 90 | curl -fsSL ${DOCKER_INSTALL_URL} | bash -s docker 91 | fi 92 | systemctl enable --now docker && \ 93 | while ! systemctl is-active --quiet docker; do sleep 3; done 94 | elif [[ $OS_FAMILY = "alpine" ]]; then 95 | if ! docker > /dev/null 2>&1; then 96 | ($INSTALL docker || ($UPDATE && $INSTALL docker)) 97 | fi 98 | rc-update add docker boot && \ 99 | service docker start && \ 100 | while [[ -z $(service docker status | grep started) ]]; do sleep 3; done 101 | fi 102 | } 103 | 104 | function install_docker_compose() { 105 | if ! docker compose > /dev/null 2>&1; then 106 | curl -fsSL ${DOCKER_COMPOSE_URL} -o /usr/local/bin/docker-compose && \ 107 | chmod +x /usr/local/bin/docker-compose && \ 108 | ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose 109 | # update docker compose cmd 110 | check_docker_compose 111 | fi 112 | } 113 | 114 | function install_all() { 115 | install_software wget 116 | install_software curl 117 | install_docker 118 | install_docker_compose 119 | } 120 | 121 | function get_config() { 122 | echo -e "${Info} 正在下载最新配置文件 ..." 123 | [[ $AURORA_VERSION == "DEV" ]] && YML_URL=${AURORA_DEV_YML_URL} || YML_URL=${AURORA_YML_URL} 124 | wget -q $YML_URL -O ${AURORA_DOCKER_YML_TEMP} 125 | [[ -z $(grep aurora ${AURORA_DOCKER_YML_TEMP}) ]] && echo -e "${Error} 配置文件下载失败,请检查网络连接是否正常!" && exit 1 126 | mv -f ${AURORA_DOCKER_YML_TEMP} ${AURORA_DOCKER_YML} 127 | } 128 | 129 | function check_install() { 130 | [ -f ${AURORA_DOCKER_YML} ] || (echo -e "${Tip} 未检测到已经安装极光面板,请先安装!" && exit 1) 131 | } 132 | 133 | function match_config() { 134 | [[ -z $1 ]] || TEMP=$(cat ${AURORA_DOCKER_YML} | awk -v name="$1" '{ if ( $0 ~ name ){ print $2; } }' | head -n 1) 135 | [[ -z $TEMP ]] && [[ -n $2 ]] && echo $2 || echo $TEMP 136 | } 137 | 138 | function read_config() { 139 | ENABLE_SENTRY=$(match_config ENABLE_SENTRY \'no\') 140 | TRAFFIC_INTERVAL_SECONDS=$(match_config TRAFFIC_INTERVAL_SECONDS 600) 141 | DDNS_INTERVAL_SECONDS=$(match_config DDNS_INTERVAL_SECONDS 120) 142 | check_ipv6_enabled && ENABLE_IPV6=true || ENABLE_IPV6=false 143 | } 144 | 145 | function set_config() { 146 | [[ -z $ENABLE_SENTRY ]] || sed -i "s/ENABLE_SENTRY:.*$/ENABLE_SENTRY: $ENABLE_SENTRY/" ${AURORA_DOCKER_YML} 147 | [[ -z $TRAFFIC_INTERVAL_SECONDS ]] || sed -i "s/TRAFFIC_INTERVAL_SECONDS:.*$/TRAFFIC_INTERVAL_SECONDS: $TRAFFIC_INTERVAL_SECONDS/" ${AURORA_DOCKER_YML} 148 | [[ -z $DDNS_INTERVAL_SECONDS ]] || sed -i "s/DDNS_INTERVAL_SECONDS:.*$/DDNS_INTERVAL_SECONDS: $DDNS_INTERVAL_SECONDS/" ${AURORA_DOCKER_YML} 149 | } 150 | 151 | function read_port() { 152 | IP=$(grep -A 1 port ${AURORA_DOCKER_YML} | grep -Eo "((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)") 153 | [[ -z $IP ]] && PORT=$(grep -A 1 port ${AURORA_DOCKER_YML} | grep -Eo "[[:digit:]]+:" | grep -Eo "[[:digit:]]+") || \ 154 | PORT=$(grep -A 1 port ${AURORA_DOCKER_YML} | grep -Eo ":[[:digit:]]+:" | grep -Eo "[[:digit:]]+") 155 | [[ -z $PORT ]] && echo -e "${Error} 未检测到旧端口号,请检查配置文件是否正确!" && exit 1 156 | } 157 | 158 | function set_port() { 159 | [[ -z $1 ]] && PORT=${AURORA_DEF_PORT} || PORT=$1 160 | NEW_PORT=$(echo $2 | grep -Eo "[[:digit:]]+") 161 | [[ -z $NEW_PORT ]] && echo -e "${Error} 未检测到新端口号!" && exit 1 162 | [[ -z $IP ]] && sed -i "s/- $PORT:80/- $NEW_PORT:80/" ${AURORA_DOCKER_YML} || \ 163 | (sed -i "s/- $PORT:80/- $IP:$NEW_PORT:80/" ${AURORA_DOCKER_YML} && \ 164 | sed -i "s/- $IP:$PORT:80/- $IP:$NEW_PORT:80/" ${AURORA_DOCKER_YML}) 165 | } 166 | 167 | function check_run() { 168 | LEVEL=$1 && [[ -z $LEVEL || $LEVEL != ${Info} || $LEVEL != ${Tip} || $LEVEL != ${Error} ]] && LEVEL=${Tip} 169 | TIPS=$2 && [[ -z $TIPS ]] && TIPS="极光面板未在运行!" 170 | [[ -z $(docker ps | grep aurora) ]] && echo -e "${LEVEL} $TIPS" 171 | } 172 | 173 | 174 | function change_port() { 175 | check_install || exit 1 176 | check_run && exit 1 177 | read_port 178 | echo -e "${Info} 旧端口号: $PORT" 179 | read -r -e -p "请输入新端口: " NEW_PORT 180 | set_port $PORT $NEW_PORT 181 | read_port 182 | [[ $PORT = $NEW_PORT ]] && cd ${AURORA_HOME} && $DOCKER_COMPOSE_CMD up -d && \ 183 | echo -e "${Info} 端口修改成功!" || echo -e "${Error} 端口修改失败!" 184 | } 185 | 186 | function sec_to_min() { 187 | [[ -z $1 ]] || sec=$(echo $1 | grep -v "\." | grep -Eo "[[:digit:]]+") 188 | [[ -z $sec ]] || ((min=$sec/60)) 189 | echo $min 190 | } 191 | 192 | function min_to_sec() { 193 | [[ -z $1 ]] || min=$(echo $1 | grep -v "\." | grep -Eo "[[:digit:]]+") 194 | [[ -z $min ]] || ((sec=$min*60)) 195 | echo $sec 196 | } 197 | 198 | function echo_config() { 199 | [[ -z $IP ]] || echo -e "${Info} 面板监听地址: $IP" 200 | [[ -z $PORT ]] || echo -e "${Info} 面板监听端口: $PORT" 201 | [[ -z $ENABLE_SENTRY ]] || echo -e "${Info} 开启错误跟踪: $ENABLE_SENTRY" 202 | [[ -z $TRAFFIC_INTERVAL_SECONDS ]] || echo -e "${Info} 流量同步周期: $(sec_to_min $TRAFFIC_INTERVAL_SECONDS) 分钟" 203 | [[ -z $DDNS_INTERVAL_SECONDS ]] || echo -e "${Info} DDNS同步周期: $(sec_to_min $DDNS_INTERVAL_SECONDS) 分钟" 204 | $ENABLE_IPV6 && echo -e "${Info} 已开启 IPV6 支持" || echo -e "${Info} 未开启 IPV6 支持" 205 | } 206 | 207 | function install() { 208 | install_all 209 | [[ -n $(docker ps | grep aurora) ]] && echo -e "${Tip} 极光面板已经安装,且正在运行!" && exit 0 210 | [[ -d ${AURORA_HOME} ]] || mkdir -p ${AURORA_HOME} 211 | cd ${AURORA_HOME} 212 | get_config || exit 1 213 | echo "-----------------------------------" 214 | read_config 215 | read_port 216 | echo_config 217 | echo "-----------------------------------" 218 | [[ ! -d "$HOME"/.ssh ]] && mkdir -p "$HOME"/.ssh 219 | # avoid docker creating a directory automatically 220 | [[ ! -f "$HOME"/.ssh/id_rsa ]] && touch "$HOME"/.ssh/id_rsa 221 | $DOCKER_COMPOSE_CMD up -d && $DOCKER_COMPOSE_CMD exec backend python app/initial_data.py && \ 222 | (echo -e "${Info} 极光面板安装成功,已启动!" && exit 0) || (echo -e "${Error} 极光面板安装失败!" && exit 1) 223 | } 224 | 225 | function update() { 226 | check_install && install_all || exit 1 227 | cd ${AURORA_HOME} 228 | echo -e "${Info} 同步旧配置文件中 ..." 229 | echo "-----------------------------------" 230 | read_config 231 | read_port 232 | echo_config 233 | echo "-----------------------------------" 234 | get_config || exit 1 235 | set_config 236 | set_port ${AURORA_DEF_PORT} $PORT 237 | echo -e "${Info} 同步新配置文件完成!" 238 | [[ -z $(docker ps | grep aurora | grep postgres) ]] && \ 239 | echo -e "${Error} 请先运行极光面板,以保证更新前完成自动备份旧数据库!" && exit 1 || \ 240 | (echo -e "${Tip} 正在备份旧数据库,如果更新后出现问题,请回退旧版本并恢复旧数据库!" && backup) 241 | $DOCKER_COMPOSE_CMD pull 242 | if $ENABLE_IPV6 ; then 243 | enable_ipv6 244 | else 245 | recreate 246 | fi 247 | OLD_IMG_IDS=$(docker images | grep aurora | grep -v latest | awk '{ print $3; }') 248 | [[ -z $OLD_IMG_IDS ]] || (docker image rm $OLD_IMG_IDS && echo -e "${Info} 旧版镜像清理完成!") 249 | $DOCKER_COMPOSE_CMD up -d && \ 250 | (echo -e "${Info} 极光面板更新成功!" && exit 0) || (echo -e "${Error} 极光面板更新失败!" && exit 1) 251 | } 252 | 253 | function backup_data_before_uninstall(){ 254 | if [ ! -d ${AURORA_HOME_BACKUP} ]; then 255 | mkdir ${AURORA_HOME_BACKUP} 256 | fi 257 | cp -f ${AURORA_HOME}/data-*.sql ${AURORA_HOME_BACKUP}/ 258 | echo -e "${Tip} 已有的数据库备份文件已移动到备份目录:${AURORA_HOME_BACKUP}" && \ 259 | echo -e "${Tip} 如果不需要备份,可自行删除文件 rm -rf ${AURORA_HOME_BACKUP}" 260 | } 261 | 262 | function uninstall() { 263 | [ -f ${AURORA_DOCKER_YML} ] || (echo -e "${Tip} 未检测到已经安装极光面板!" && exit 0) 264 | [[ -n $(docker ps | grep aurora | grep postgres) ]] && \ 265 | echo -e "${Tip} 正在备份数据库,如果意外卸载请重新安装面板并恢复数据库!" && backup 266 | backup_data_before_uninstall 267 | cd ${AURORA_HOME} 268 | [[ -n $(docker ps | grep aurora) ]] && $DOCKER_COMPOSE_CMD down 269 | OLD_IMG_IDS=$(docker images | grep aurora | awk '{ print $3; }') 270 | [[ -z $OLD_IMG_IDS ]] || (docker image rm $OLD_IMG_IDS && echo -e "${Info} 镜像清理完成!") 271 | docker volume rm aurora_db-data && docker volume rm aurora_app-data && \ 272 | (rm -rf ${AURORA_HOME} && echo -e "${Info} 卸载成功!" && exit 0) || (echo -e "${Error} 卸载失败!" && exit 1) 273 | } 274 | 275 | function start() { 276 | check_install || exit 1 277 | [[ -n $(docker ps | grep aurora) ]] && echo -e "${Info} 极光面板正在运行" && exit 0 278 | cd ${AURORA_HOME} && $DOCKER_COMPOSE_CMD up -d && echo -e "${Info} 启动成功!" || echo -e "${Error} 启动失败!" 279 | } 280 | 281 | function stop() { 282 | check_install || exit 1 283 | check_run ${Info} && exit 0 284 | cd ${AURORA_HOME} && $DOCKER_COMPOSE_CMD down --remove-orphans && echo -e "${Info} 停止成功!" || echo -e "${Error} 停止失败!" 285 | } 286 | 287 | function restart() { 288 | check_install || exit 1 289 | check_run ${Tip} "极光面板未在运行,请直接启动!" && exit 0 290 | cd ${AURORA_HOME} && $DOCKER_COMPOSE_CMD restart && echo -e "${Info} 重启成功!" || echo -e "${Error} 重启失败!" 291 | } 292 | 293 | function recreate() { 294 | stop 295 | start 296 | } 297 | 298 | function backend_logs() { 299 | check_install || exit 1 300 | check_run && exit 1 301 | cd ${AURORA_HOME} && $DOCKER_COMPOSE_CMD logs -f --tail="100" backend worker 302 | } 303 | 304 | function frontend_logs() { 305 | check_install || exit 1 306 | check_run && exit 1 307 | cd ${AURORA_HOME} && $DOCKER_COMPOSE_CMD logs -f --tail="100" frontend 308 | } 309 | 310 | function all_logs() { 311 | check_install || exit 1 312 | check_run && exit 1 313 | cd ${AURORA_HOME} && $DOCKER_COMPOSE_CMD logs -f --tail="100" 314 | } 315 | 316 | function export_logs() { 317 | check_install || exit 1 318 | check_run && exit 1 319 | cd ${AURORA_HOME} && $DOCKER_COMPOSE_CMD logs > logs && \ 320 | echo -e "${Info} 日志导出成功:${AURORA_HOME}/logs" || echo -e "${Error} 日志导出失败!" 321 | } 322 | 323 | function read_db_info() { 324 | DB_USER=$(grep POSTGRES_USER ${AURORA_DOCKER_YML} | awk '{print $2}') 325 | [[ -z $DB_USER ]] && DB_USER="aurora" 326 | DB_NAME=$(grep POSTGRES_DB ${AURORA_DOCKER_YML} | awk '{print $2}') 327 | [[ -z $DB_NAME ]] && DB_NAME="aurora" 328 | } 329 | 330 | function backup() { 331 | check_install || exit 1 332 | [[ -z $(docker ps | grep aurora | grep postgres) ]] && echo -e "${Tip} 极光面板未在运行,请先启动!" && exit 1 333 | BACKUP_FILE="data-$(date +%Y%m%d%H%M%S).sql" 334 | read_db_info 335 | cd ${AURORA_HOME} && $DOCKER_COMPOSE_CMD exec -T postgres pg_dump -d $DB_NAME -U $DB_USER -c > $BACKUP_FILE && \ 336 | echo -e "${Info} 数据库备份成功:${AURORA_HOME}/$BACKUP_FILE" || echo -e "${Error} 数据库备份失败!" 337 | } 338 | 339 | function restore() { 340 | check_install || exit 1 341 | [[ -z $(docker ps | grep aurora | grep postgres) ]] && \ 342 | echo -e "${Error} 请先运行极光面板,以保证还原前完成自动备份旧数据库!" && exit 1 || \ 343 | (echo -e "${Tip} 正在备份旧数据库,如果还原后出现问题,请恢复旧数据库!" && backup) 344 | read -r -e -p "请输入需恢复的数据库文件路径: " BACKUP_FILE 345 | [[ ! -f $BACKUP_FILE ]] && echo -e "${Error} 无法找到数据库文件!" && exit 1 346 | cd ${AURORA_HOME} 347 | read_db_info 348 | docker stop $($DOCKER_COMPOSE_CMD ps | grep aurora | grep -v postgres | awk '{ print $1; }') && \ 349 | $DOCKER_COMPOSE_CMD exec -T postgres psql -d $DB_NAME -U $DB_USER < $BACKUP_FILE > /dev/null && \ 350 | $DOCKER_COMPOSE_CMD up -d && \ 351 | echo -e "${Info} 数据库还原成功!" || echo -e "${Error} 数据库还原失败!" 352 | } 353 | 354 | function add_superu() { 355 | check_install || exit 1 356 | [[ -z $(docker ps | grep aurora | grep backend) ]] && echo -e "${Tip} 极光面板未在运行,请先启动!" && exit 1 357 | cd ${AURORA_HOME} && $DOCKER_COMPOSE_CMD exec backend python app/initial_data.py 358 | } 359 | 360 | function set_traffic_interval() { 361 | check_install || exit 1 362 | check_run && exit 1 363 | read_config 364 | echo -e "${Info} 旧流量同步间隔: $(sec_to_min $TRAFFIC_INTERVAL_SECONDS) 分钟" 365 | read -r -e -p "请输入新同步间隔 [分钟]: " NEW_TRAFFIC_INTERVAL_MIN 366 | NEW_TRAFFIC_INTERVAL_SEC=$(min_to_sec $NEW_TRAFFIC_INTERVAL_MIN) 367 | [[ -z $NEW_TRAFFIC_INTERVAL_SEC ]] && echo -e "${Error} 请输入整数分钟!" && exit 1 || \ 368 | sed -i "s/TRAFFIC_INTERVAL_SECONDS:.*$/TRAFFIC_INTERVAL_SECONDS: $NEW_TRAFFIC_INTERVAL_SEC/" ${AURORA_DOCKER_YML} 369 | read_config 370 | [[ $TRAFFIC_INTERVAL_SECONDS = $NEW_TRAFFIC_INTERVAL_SEC ]] && cd ${AURORA_HOME} && $DOCKER_COMPOSE_CMD up -d && \ 371 | echo -e "${Info} 流量同步间隔修改成功!" || echo -e "${Error} 流量同步间隔修改失败!" 372 | } 373 | 374 | function set_ddns_interval() { 375 | check_install || exit 1 376 | check_run && exit 1 377 | read_config 378 | echo -e "${Info} 旧DDNS同步间隔: $(sec_to_min $DDNS_INTERVAL_SECONDS) 分钟" 379 | read -r -e -p "请输入新同步间隔 [分钟]: " NEW_DDNS_INTERVAL_MIN 380 | NEW_DDNS_INTERVAL_SEC=$(min_to_sec $NEW_DDNS_INTERVAL_MIN) 381 | [[ -z $NEW_DDNS_INTERVAL_SEC ]] && echo -e "${Error} 请输入整数分钟!" && exit 1 || \ 382 | sed -i "s/DDNS_INTERVAL_SECONDS:.*$/DDNS_INTERVAL_SECONDS: $NEW_DDNS_INTERVAL_SEC/" ${AURORA_DOCKER_YML} 383 | read_config 384 | [[ $DDNS_INTERVAL_SECONDS = $NEW_DDNS_INTERVAL_SEC ]] && cd ${AURORA_HOME} && $DOCKER_COMPOSE_CMD up -d && \ 385 | echo -e "${Info} DDNS同步间隔修改成功!" || echo -e "${Error} DDNS同步间隔修改失败!" 386 | } 387 | 388 | function check_ipv6_enabled() { 389 | cat ${AURORA_DOCKER_YML} | grep ' enable_ipv6' | grep true > /dev/null 2>&1 390 | } 391 | 392 | function check_ip6tables_masq() { 393 | [[ -n $(ip6tables -t nat -nxvL | grep "${AURORA_IP6TABLES_MASQ_COMMENT}") ]] && echo -e "${Info} IPV6 MASQ 规则已存在!" 394 | } 395 | 396 | function enable_ipv6() { 397 | check_install || exit 1 398 | ip6tables -V > /dev/null || (echo -e "${Error} 请先安装 ip6tables!" && exit 1) 399 | IPV6_SUBNET=$(sed -n 's/^.*subnet:\s*\(.*\)$/\1/p' ${AURORA_DOCKER_YML}) 400 | check_ip6tables_masq || (ip6tables -t nat -A POSTROUTING -s ${IPV6_SUBNET} -j MASQUERADE -m comment --comment "${AURORA_IP6TABLES_MASQ_COMMENT}" && \ 401 | echo -e "${Info} 已添加 IPV6 MASQ 规则!") 402 | sed -i "s/ enable_ipv6:.*$/ enable_ipv6: true/" ${AURORA_DOCKER_YML} 403 | recreate 404 | check_ipv6_enabled && echo -e "${Info} 已开启 IPV6 支持!" 405 | echo -e "${Tip} 重启系统会导致 ip6tables 规则被重置,需要重新添加!" 406 | } 407 | 408 | function welcome_aurora() { 409 | check_system 410 | check_docker_compose 411 | echo -e "${Green_font_prefix} 412 | 极光面板 一键脚本 413 | -------------------------------- 414 | 1. 安装 极光面板 ${AURORA_VERSION} 415 | 2. 更新 极光面板 ${AURORA_VERSION} 416 | 3. 卸载 极光面板 417 | ———————————— 418 | 4. 启动 极光面板 419 | 5. 停止 极光面板 420 | 6. 重启 极光面板 421 | ———————————— 422 | 7. 查看 后端实时日志 423 | 8. 查看 前端实时日志 424 | 9. 查看 全部实时日志 425 | 10. 导出 全部日志 426 | ———————————— 427 | 11. 备份 数据库 428 | 12. 还原 数据库 429 | 13. 添加 管理员用户 430 | 14. 修改 面板访问端口(默认 ${AURORA_DEF_PORT}) 431 | 15. 修改 面板流量同步间隔(默认 ${AURORA_DEF_TRAFF_MIN} 分钟) 432 | 16. 修改 DDNS同步间隔(默认 ${AURORA_DEF_DDNS_MIN} 分钟) 433 | 17. 开启 IPV6 支持(需要本机支持 IPV6) 434 | ———————————— 435 | 0. 退出脚本 436 | ———————————— 437 | ${Font_color_suffix}" 438 | read -r -e -p " 请输入数字 [1-16]: " num && echo 439 | case "$num" in 440 | 1) 441 | install 442 | ;; 443 | 2) 444 | update 445 | ;; 446 | 3) 447 | uninstall 448 | ;; 449 | 4) 450 | start 451 | ;; 452 | 5) 453 | stop 454 | ;; 455 | 6) 456 | restart 457 | ;; 458 | 7) 459 | backend_logs 460 | ;; 461 | 8) 462 | frontend_logs 463 | ;; 464 | 9) 465 | all_logs 466 | ;; 467 | 10) 468 | export_logs 469 | ;; 470 | 11) 471 | backup 472 | ;; 473 | 12) 474 | restore 475 | ;; 476 | 13) 477 | add_superu 478 | ;; 479 | 14) 480 | change_port 481 | ;; 482 | 15) 483 | set_traffic_interval 484 | ;; 485 | 16) 486 | set_ddns_interval 487 | ;; 488 | 17) 489 | enable_ipv6 490 | ;; 491 | 0) 492 | exit 0 493 | ;; 494 | *) 495 | echo -e "${Error} 请输入正确数字 [1-16]" 496 | ;; 497 | esac 498 | } 499 | 500 | welcome_aurora 501 | --------------------------------------------------------------------------------