├── update_app_version.sh ├── .github └── workflows │ ├── build-1panel-cn-docker-image.yml │ └── build-1panel-global-docker-image.yml ├── Dockerfile-Global ├── Dockerfile ├── README.md └── install.override.sh /update_app_version.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 更新数据库 4 | update_database() { 5 | if [[ -f /opt/1panel/db/1Panel.db ]]; then 6 | # 备份数据库文件 7 | cp /opt/1panel/db/1Panel.db /opt/1panel/db/1Panel.db.bak 8 | 9 | # 使用 sqlite3 执行更新操作 10 | sqlite3 /opt/1panel/db/1Panel.db <&2 20 | exit 0 21 | fi 22 | } 23 | 24 | # 主函数 25 | main() { 26 | update_database 27 | } 28 | 29 | # 调用主函数 30 | main -------------------------------------------------------------------------------- /.github/workflows/build-1panel-cn-docker-image.yml: -------------------------------------------------------------------------------- 1 | name: Build 1Panel-CN Docker Image 2 | on: 3 | schedule: 4 | - cron: "0 14 * * 2" # 每周二(星期二)北京时间22:00执行 5 | - cron: "0 11 * * 5" # 每周五(星期五)北京时间19:00执行 6 | workflow_dispatch: 7 | inputs: 8 | version: 9 | description: "1Panel Version (Empty for latest)" 10 | type: string 11 | push: 12 | branches: 13 | - main 14 | 15 | jobs: 16 | build_images: 17 | name: Build Multi-platform Images 18 | runs-on: ubuntu-latest 19 | steps: 20 | - 21 | name: Checkout 22 | uses: actions/checkout@v3 23 | - 24 | name: Set up QEMU 25 | uses: docker/setup-qemu-action@v2 26 | - 27 | name: Set up Docker Buildx 28 | uses: docker/setup-buildx-action@v2 29 | - 30 | name: Login to Docker Hub 31 | uses: docker/login-action@v2 32 | with: 33 | username: ${{ secrets.DOCKERHUB_USERNAME }} 34 | password: ${{ secrets.DOCKERHUB_TOKEN }} 35 | - 36 | name: Get Version 37 | id: get_version 38 | run: | 39 | VER_INPUT=${{ github.event.inputs.version }} 40 | VER_LATEST=$(curl -fsSL https://resource.fit2cloud.com/1panel/package/stable/latest) 41 | if [ -z "${VER_INPUT}" ]; then echo "PANELVER=${VER_LATEST}" >> $GITHUB_OUTPUT; else echo "PANELVER=${VER_INPUT}" >> $GITHUB_OUTPUT; fi 42 | - 43 | name: Build and push stable 44 | uses: docker/build-push-action@v4 45 | if: github.event_name != 'workflow_dispatch' 46 | with: 47 | push: true 48 | file: ./Dockerfile 49 | build-args: | 50 | PANELVER=${{ steps.get_version.outputs.PANELVER }} 51 | platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/ppc64le,linux/s390x 52 | tags: ${{ secrets.DOCKERHUB_USERNAME }}/1panel:${{ steps.get_version.outputs.PANELVER }}, ${{ secrets.DOCKERHUB_USERNAME }}/1panel:latest 53 | - 54 | name: Build and push stable (Manually) 55 | uses: docker/build-push-action@v4 56 | if: github.event_name == 'workflow_dispatch' 57 | with: 58 | push: true 59 | file: ./Dockerfile 60 | build-args: | 61 | PANELVER=${{ steps.get_version.outputs.PANELVER }} 62 | platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/ppc64le,linux/s390x 63 | tags: ${{ secrets.DOCKERHUB_USERNAME }}/1panel:${{ steps.get_version.outputs.PANELVER }}, ${{ secrets.DOCKERHUB_USERNAME }}/1panel:latest 64 | -------------------------------------------------------------------------------- /.github/workflows/build-1panel-global-docker-image.yml: -------------------------------------------------------------------------------- 1 | name: Build 1Panel-Global Docker Image 2 | on: 3 | schedule: 4 | - cron: "0 14 * * 2" # 每周二(星期二)北京时间22:00执行 5 | - cron: "0 11 * * 5" # 每周五(星期五)北京时间19:00执行 6 | workflow_dispatch: 7 | inputs: 8 | version: 9 | description: "1Panel Version (Empty for latest)" 10 | type: string 11 | push: 12 | branches: 13 | - main 14 | 15 | jobs: 16 | build_images: 17 | name: Build Multi-platform Images 18 | runs-on: ubuntu-latest 19 | steps: 20 | - 21 | name: Checkout 22 | uses: actions/checkout@v3 23 | - 24 | name: Set up QEMU 25 | uses: docker/setup-qemu-action@v2 26 | - 27 | name: Set up Docker Buildx 28 | uses: docker/setup-buildx-action@v2 29 | - 30 | name: Login to Docker Hub 31 | uses: docker/login-action@v2 32 | with: 33 | username: ${{ secrets.DOCKERHUB_USERNAME }} 34 | password: ${{ secrets.DOCKERHUB_TOKEN }} 35 | - 36 | name: Get Version 37 | id: get_version 38 | run: | 39 | VER_INPUT=${{ github.event.inputs.version }} 40 | VER_LATEST=$(curl -fsSL https://resource.1panel.pro/stable/latest) 41 | if [ -z "${VER_INPUT}" ]; then echo "PANELVER=${VER_LATEST}" >> $GITHUB_OUTPUT; else echo "PANELVER=${VER_INPUT}" >> $GITHUB_OUTPUT; fi 42 | - 43 | name: Build and push stable 44 | uses: docker/build-push-action@v4 45 | if: github.event_name != 'workflow_dispatch' 46 | with: 47 | push: true 48 | file: ./Dockerfile-Global 49 | build-args: | 50 | PANELVER=${{ steps.get_version.outputs.PANELVER }} 51 | platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/ppc64le,linux/s390x 52 | tags: ${{ secrets.DOCKERHUB_USERNAME }}/1panel:global-${{ steps.get_version.outputs.PANELVER }}, ${{ secrets.DOCKERHUB_USERNAME }}/1panel:global-latest 53 | - 54 | name: Build and push stable (Manually) 55 | uses: docker/build-push-action@v4 56 | if: github.event_name == 'workflow_dispatch' 57 | with: 58 | push: true 59 | file: ./Dockerfile-Global 60 | build-args: | 61 | PANELVER=${{ steps.get_version.outputs.PANELVER }} 62 | platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/ppc64le,linux/s390x 63 | tags: ${{ secrets.DOCKERHUB_USERNAME }}/1panel:global-${{ steps.get_version.outputs.PANELVER }}, ${{ secrets.DOCKERHUB_USERNAME }}/1panel:global-latest 64 | -------------------------------------------------------------------------------- /Dockerfile-Global: -------------------------------------------------------------------------------- 1 | # 使用 Ubuntu 22.04 作为基础镜像 2 | FROM ubuntu:22.04 3 | 4 | # 设置环境变量,避免交互式配置 5 | ARG DEBIAN_FRONTEND=noninteractive 6 | 7 | # 设置时区为亚洲/上海 8 | ENV TZ=Asia/Shanghai 9 | 10 | # 安装所需的软件包并清理APT缓存 11 | RUN apt-get update && apt-get install -y \ 12 | wget \ 13 | tar \ 14 | unzip \ 15 | zip \ 16 | curl \ 17 | git \ 18 | sudo \ 19 | gnupg \ 20 | sqlite3 \ 21 | tzdata \ 22 | && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && \ 23 | curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg && \ 24 | echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" > /etc/apt/sources.list.d/docker.list && \ 25 | apt-get update && apt-get install -y docker-ce-cli && \ 26 | curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \ 27 | ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose && \ 28 | chmod +x /usr/local/bin/docker-compose && \ 29 | apt-get clean && rm -rf /var/lib/apt/lists/* 30 | 31 | # 设置工作目录为/app 32 | WORKDIR /app 33 | 34 | # 复制必要的文件 35 | COPY ./install.override.sh . 36 | COPY ./update_app_version.sh . 37 | 38 | # 定义版本参数 39 | ARG PANELVER=$PANELVER 40 | 41 | # 设置环境变量 42 | ENV PANELVER=$PANELVER 43 | 44 | # 下载并安装 1Panel 45 | RUN INSTALL_MODE="stable" && \ 46 | ARCH=$(dpkg --print-architecture) && \ 47 | if [ "$ARCH" = "armhf" ]; then ARCH="armv7"; fi && \ 48 | if [ "$ARCH" = "ppc64el" ]; then ARCH="ppc64le"; fi && \ 49 | package_file_name="1panel-${PANELVER}-linux-${ARCH}.tar.gz" && \ 50 | package_download_url="https://resource.1panel.pro/${INSTALL_MODE}/${PANELVER}/release/${package_file_name}" && \ 51 | echo "Downloading ${package_download_url}" && \ 52 | curl -sSL -o ${package_file_name} "$package_download_url" && \ 53 | tar zxvf ${package_file_name} --strip-components 1 && \ 54 | rm /app/install.sh && \ 55 | mv -f /app/install.override.sh /app/install.sh && \ 56 | chmod +x /app/install.sh && \ 57 | chmod +x /app/update_app_version.sh && \ 58 | bash /app/install.sh && \ 59 | cp /app/1panel.service /etc/systemd/system/1panel.service && \ 60 | find /app -type f ! -name 'update_app_version.sh' -delete 61 | 62 | # 设置工作目录为根目录 63 | WORKDIR / 64 | 65 | # 暴露端口 10086 66 | EXPOSE 10086 67 | 68 | # 创建 Docker 套接字的卷 69 | VOLUME /var/run/docker.sock 70 | 71 | # 启动 72 | CMD ["/bin/bash", "-c", "/usr/local/bin/1panel & sleep 3 && kill $(jobs -p) || true && /app/update_app_version.sh && /usr/local/bin/1panel"] 73 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # 使用 Ubuntu 22.04 作为基础镜像 2 | FROM ubuntu:22.04 3 | 4 | # 设置环境变量,避免交互式配置 5 | ARG DEBIAN_FRONTEND=noninteractive 6 | 7 | # 设置时区为亚洲/上海 8 | ENV TZ=Asia/Shanghai 9 | 10 | # 安装所需的软件包并清理APT缓存 11 | RUN apt-get update && apt-get install -y \ 12 | wget \ 13 | tar \ 14 | unzip \ 15 | zip \ 16 | curl \ 17 | git \ 18 | sudo \ 19 | gnupg \ 20 | sqlite3 \ 21 | tzdata \ 22 | && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && \ 23 | curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg && \ 24 | echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" > /etc/apt/sources.list.d/docker.list && \ 25 | apt-get update && apt-get install -y docker-ce-cli && \ 26 | curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \ 27 | ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose && \ 28 | chmod +x /usr/local/bin/docker-compose && \ 29 | apt-get clean && rm -rf /var/lib/apt/lists/* 30 | 31 | # 设置工作目录为/app 32 | WORKDIR /app 33 | 34 | # 复制必要的文件 35 | COPY ./install.override.sh . 36 | COPY ./update_app_version.sh . 37 | 38 | # 定义版本参数 39 | ARG PANELVER=$PANELVER 40 | 41 | # 设置环境变量 42 | ENV PANELVER=$PANELVER 43 | 44 | # 下载并安装 1Panel 45 | RUN INSTALL_MODE="stable" && \ 46 | ARCH=$(dpkg --print-architecture) && \ 47 | if [ "$ARCH" = "armhf" ]; then ARCH="armv7"; fi && \ 48 | if [ "$ARCH" = "ppc64el" ]; then ARCH="ppc64le"; fi && \ 49 | package_file_name="1panel-${PANELVER}-linux-${ARCH}.tar.gz" && \ 50 | package_download_url="https://resource.fit2cloud.com/1panel/package/${INSTALL_MODE}/${PANELVER}/release/${package_file_name}" && \ 51 | echo "Downloading ${package_download_url}" && \ 52 | curl -sSL -o ${package_file_name} "$package_download_url" && \ 53 | tar zxvf ${package_file_name} --strip-components 1 && \ 54 | rm /app/install.sh && \ 55 | mv -f /app/install.override.sh /app/install.sh && \ 56 | chmod +x /app/install.sh && \ 57 | chmod +x /app/update_app_version.sh && \ 58 | bash /app/install.sh && \ 59 | cp /app/1panel.service /etc/systemd/system/1panel.service && \ 60 | find /app -type f ! -name 'update_app_version.sh' -delete 61 | 62 | # 设置工作目录为根目录 63 | WORKDIR / 64 | 65 | # 暴露端口 10086 66 | EXPOSE 10086 67 | 68 | # 创建 Docker 套接字的卷 69 | VOLUME /var/run/docker.sock 70 | 71 | # 启动 72 | CMD ["/bin/bash", "-c", "/usr/local/bin/1panel & sleep 3 && kill $(jobs -p) || true && /app/update_app_version.sh && /usr/local/bin/1panel"] 73 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Docker Image Version (latest semver)](https://img.shields.io/docker/v/moelin/1panel/latest?color=%2348BB78&logo=docker&label=version)](https://hub.docker.com/r/moelin/1panel) 2 | [![Docker Pulls](https://img.shields.io/docker/pulls/moelin/1panel?color=%2348BB78&logo=docker&label=pulls)](https://hub.docker.com/r/moelin/1panel) 3 | [![Docker Stars](https://img.shields.io/docker/stars/moelin/1panel?color=%2348BB78&logo=docker&label=stars)](https://hub.docker.com/r/moelin/1panel) 4 | [![GitHub Repo stars](https://img.shields.io/github/stars/okxlin/docker-1panel)](https://star-history.com/#okxlin/docker-1panel&Date) 5 | 6 | - [简介](#简介) 7 | - [1. 注意事项](#1-注意事项) 8 | - [2. docker方式安装](#2-docker方式安装) 9 | - [3. docker-compose方式安装](#3-docker-compose方式安装) 10 | - [4. 修改面板显示版本](#4-修改面板显示版本) 11 | - [4.1 安装`SQLite3`](#41-安装sqlite3) 12 | - [4.2 修改面板显示版本](#42-修改面板显示版本) 13 | - [5. 镜像编译](#5-镜像编译) 14 | 15 | *** 16 | 17 | ## 简介 18 | 19 | 偶然看到[**1panel-dood**](https://github.com/tangger2000/1panel-dood)的关于`docker`部署`1panel`的方法,确实好想法,点赞。 20 | 21 | 受到启发编写了一下相关文件,把`1panel`套娃一下。 22 | 23 | 与[**1panel-dood**](https://github.com/tangger2000/1panel-dood)有所不同的是,我是以替换二进制文件的形式来的, 24 | 25 | 因为如果使用原始安装脚本作为启动命令,当更换容器时,需要事先备份数据库文件,否则会出现数据库覆盖问题。 26 | 27 | 单主程序的好处了,正好是和之前适配[1Panel 应用商店的非官方应用适配库](https://github.com/okxlin/appstore)写的`GO`语言的应用的`Dockerfile`异曲同工。 28 | 29 | ## 1. 注意事项 30 | 31 | - 由于容器内部`systemd`限制,部分功能目前尚不完整。 32 | 33 | - **不要点击容器化部署的 `1Panel` 右下角进行更新,应该拉取新镜像,再重新部署来应用更新。** 34 | 35 | - **20230919:添加自动修改面板显示应用版本,无需手动修改数据库。** 36 | 37 | ~~如果更新了更高版本的镜像,实际是更新了对应版本的二进制程序,面板显示的相关版本还需要手动更新。~~ 38 | 39 | 40 | 相关操作查看下文。 41 | *** 42 | - 默认端口:`10086` 43 | - 默认账户:`1panel` 44 | - 默认密码:`1panel_password` 45 | - 默认入口:`entrance` 46 | *** 47 | - 不可调整参数 48 | - `/var/run/docker.sock`的相关映射 49 | *** 50 | - 可调整参数 51 | > **推荐使用/opt路径,否则有些调用本地文件的应用可能出现异常** 52 | - `/opt:/opt` 文件存储映射 53 | - `TZ=Asia/Shanghai` 时区设置 54 | - `1panel` 容器名 55 | - `/var/lib/docker/volumes:/var/lib/docker/volumes` 存储卷映射 56 | *** 57 | **架构平台对应镜像** 58 | - amd64 59 | - arm64 60 | - armv7 61 | - ppc64le 62 | - s390x 63 | > 2023年9月3日已经更新单标签多镜像 64 | ``` 65 | docker pull moelin/1panel:latest 66 | ``` 67 | 68 | ## 2. docker方式安装 69 | ``` 70 | docker run -d \ 71 | --name 1panel \ 72 | --restart always \ 73 | --network host \ 74 | -v /var/run/docker.sock:/var/run/docker.sock \ 75 | -v /var/lib/docker/volumes:/var/lib/docker/volumes \ 76 | -v /opt:/opt \ 77 | -v /root:/root \ 78 | -e TZ=Asia/Shanghai \ 79 | moelin/1panel:latest 80 | ``` 81 | 82 | ## 3. docker-compose方式安装 83 | 84 | 创建一个`docker-compose.yml`文件,内容类似如下 85 | ``` 86 | version: '3' 87 | services: 88 | 1panel: 89 | container_name: 1panel # 容器名 90 | restart: always 91 | network_mode: "host" 92 | volumes: 93 | - /var/run/docker.sock:/var/run/docker.sock 94 | - /var/lib/docker/volumes:/var/lib/docker/volumes 95 | - /opt:/opt # 文件存储映射 96 | - /root:/root # 可选的文件存储映射 97 | environment: 98 | - TZ=Asia/Shanghai # 时区设置 99 | image: moelin/1panel:latest 100 | labels: 101 | createdBy: "Apps" 102 | ``` 103 | 104 | 然后`docker-compose up -d`运行 105 | 106 | ## 4. 修改面板显示版本 107 | ### 4.1 安装`SQLite3` 108 | 109 | 以`Debian`系统为例,其他系统对应更改包管理器命令。 110 | - Debian/Ubuntu: apt-get 111 | - RedHat/CentOS: yum 112 | 113 | ``` 114 | # 更新软件包列表 115 | apt-get update 116 | 117 | # 安装 SQLite3,并自动回答所有提示为“是” 118 | apt-get install sqlite3 -y 119 | ``` 120 | ### 4.2 修改面板显示版本 121 | - 获取文件存储实际路径 122 | 123 | 在宿主机上的实际路径,假设如下 124 | ``` 125 | /opt 126 | ``` 127 | 128 | - 备份旧数据库 129 | ``` 130 | # 将原始数据库文件备份为 .bak 文件 131 | cp /opt/1panel/db/1Panel.db /opt/1panel/db/1Panel.db.bak 132 | ``` 133 | 134 | - 打开数据库文件 135 | ``` 136 | # 打开 SQLite3 数据库 137 | sqlite3 /opt/1panel/db/1Panel.db 138 | ``` 139 | 140 | - 修改版本信息,按需修改`v1.5.2` 141 | ``` 142 | UPDATE settings 143 | SET value = 'v1.5.2' 144 | WHERE key = 'SystemVersion'; 145 | ``` 146 | 147 | - 退出修改 148 | ``` 149 | .exit 150 | ``` 151 | - 重启面板应用更改 152 | ``` 153 | # 重新启动 1panel 容器 154 | docker restart 1panel 155 | ``` 156 | 157 | ## 5. 镜像编译 158 | 159 | ``` 160 | docker build --build-arg PANELVER=your_desired_version -t your_image_name:tag . 161 | 162 | ``` 163 | - 例子1: 164 | ``` 165 | docker build --build-arg PANELVER=v1.4.3 -t 1panel:v1.4.3 . 166 | 167 | ``` 168 | - 例子2: 169 | ``` 170 | docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7,linux/ppc64le,linux/s390x \ 171 | --build-arg PANELVER=v1.4.3 -t moelin/1panel:v1.4.3 --push . 172 | ``` 173 | -------------------------------------------------------------------------------- /install.override.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PANEL_BASE_DIR=/opt 4 | PANEL_PORT=10086 5 | DEFAULT_ENTRANCE="entrance" 6 | DEFAULT_USERNAME="1panel" 7 | DEFAULT_PASSWORD="1panel_password" 8 | 9 | CURRENT_DIR=$( 10 | cd "$(dirname "$0")" 11 | pwd 12 | ) 13 | 14 | function log() { 15 | message="[1Panel Log]: $1 " 16 | echo -e "${message}" 2>&1 | tee -a ${CURRENT_DIR}/install.log 17 | } 18 | 19 | echo 20 | cat << EOF 21 | ██╗ ██████╗ █████╗ ███╗ ██╗███████╗██╗ 22 | ███║ ██╔══██╗██╔══██╗████╗ ██║██╔════╝██║ 23 | ╚██║ ██████╔╝███████║██╔██╗ ██║█████╗ ██║ 24 | ██║ ██╔═══╝ ██╔══██║██║╚██╗██║██╔══╝ ██║ 25 | ██║ ██║ ██║ ██║██║ ╚████║███████╗███████╗ 26 | ╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═══╝╚══════╝╚══════╝ 27 | EOF 28 | 29 | log "======================= 开始安装 =======================" 30 | 31 | function Prepare_System(){ 32 | if which 1panel >/dev/null 2>&1; then 33 | log "1Panel Linux 服务器运维管理面板已安装,请勿重复安装" 34 | #exit 1 35 | 1panel 36 | fi 37 | } 38 | 39 | function Set_Dir(){ 40 | if [[ ! -d $PANEL_BASE_DIR ]]; then 41 | mkdir -p $PANEL_BASE_DIR 42 | log "安装路径已设置为 $PANEL_BASE_DIR" 43 | fi 44 | 45 | } 46 | 47 | function Install_Docker(){ 48 | if which docker >/dev/null 2>&1; then 49 | log "检测到 Docker 已安装,跳过安装步骤" 50 | log "启动 Docker " 51 | systemctl start docker 2>&1 | tee -a ${CURRENT_DIR}/install.log 52 | else 53 | log "... 在线安装 docker" 54 | 55 | curl -fsSL https://get.docker.com -o get-docker.sh 2>&1 | tee -a ${CURRENT_DIR}/install.log 56 | if [[ ! -f get-docker.sh ]];then 57 | log "docker 在线安装脚本下载失败,请稍候重试" 58 | exit 1 59 | fi 60 | if [[ $(curl -s ipinfo.io/country) == "CN" ]]; then 61 | sh get-docker.sh --mirror Aliyun 2>&1 | tee -a ${CURRENT_DIR}/install.log 62 | else 63 | sh get-docker.sh 2>&1 | tee -a ${CURRENT_DIR}/install.log 64 | fi 65 | 66 | log "... 启动 docker" 67 | systemctl enable docker; systemctl daemon-reload; systemctl start docker 2>&1 | tee -a ${CURRENT_DIR}/install.log 68 | 69 | docker_config_folder="/etc/docker" 70 | if [[ ! -d "$docker_config_folder" ]];then 71 | mkdir -p "$docker_config_folder" 72 | fi 73 | 74 | docker version >/dev/null 2>&1 75 | if [[ $? -ne 0 ]]; then 76 | log "docker 安装失败" 77 | exit 1 78 | else 79 | log "docker 安装成功" 80 | fi 81 | fi 82 | } 83 | 84 | function Install_Compose(){ 85 | docker-compose version >/dev/null 2>&1 86 | if [[ $? -ne 0 ]]; then 87 | log "... 在线安装 docker-compose" 88 | 89 | arch=$(uname -m) 90 | if [ "$arch" == 'armv7l' ]; then 91 | arch='armv7' 92 | fi 93 | curl -L https://resource.fit2cloud.com/docker/compose/releases/download/v2.16.0/docker-compose-$(uname -s | tr A-Z a-z)-$arch -o /usr/local/bin/docker-compose 2>&1 | tee -a ${CURRENT_DIR}/install.log 94 | if [[ ! -f /usr/local/bin/docker-compose ]];then 95 | log "docker-compose 下载失败,请稍候重试" 96 | exit 1 97 | fi 98 | chmod +x /usr/local/bin/docker-compose 99 | ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose 100 | 101 | docker-compose version >/dev/null 2>&1 102 | if [[ $? -ne 0 ]]; then 103 | log "docker-compose 安装失败" 104 | exit 1 105 | else 106 | log "docker-compose 安装成功" 107 | fi 108 | else 109 | compose_v=`docker-compose -v` 110 | if [[ $compose_v =~ 'docker-compose' ]];then 111 | read -p "检测到已安装 Docker Compose 版本较低(需大于等于 v2.0.0 版本),是否升级 [y/n] : " UPGRADE_DOCKER_COMPOSE 112 | if [[ "$UPGRADE_DOCKER_COMPOSE" == "Y" ]] || [[ "$UPGRADE_DOCKER_COMPOSE" == "y" ]]; then 113 | rm -rf /usr/local/bin/docker-compose /usr/bin/docker-compose 114 | Install_Compose 115 | else 116 | log "Docker Compose 版本为 $compose_v,可能会影响应用商店的正常使用" 117 | fi 118 | else 119 | log "检测到 Docker Compose 已安装,跳过安装步骤" 120 | fi 121 | fi 122 | } 123 | 124 | function Set_Port(){ 125 | PANEL_PORT=${PANEL_PORT:-10086} 126 | log "您设置的端口为:$PANEL_PORT" 127 | } 128 | 129 | function Set_Firewall(){ 130 | if which firewall-cmd >/dev/null 2>&1; then 131 | if systemctl status firewalld | grep -q "Active: active" >/dev/null 2>&1;then 132 | log "防火墙开放 $PANEL_PORT 端口" 133 | firewall-cmd --zone=public --add-port=$PANEL_PORT/tcp --permanent 134 | firewall-cmd --reload 135 | else 136 | log "防火墙未开启,忽略端口开放" 137 | fi 138 | fi 139 | 140 | if which ufw >/dev/null 2>&1; then 141 | if systemctl status ufw | grep -q "Active: active" >/dev/null 2>&1;then 142 | log "防火墙开放 $PANEL_PORT 端口" 143 | ufw allow $PANEL_PORT/tcp 144 | ufw reload 145 | else 146 | log "防火墙未开启,忽略端口开放" 147 | fi 148 | fi 149 | } 150 | 151 | function Set_Username(){ 152 | PANEL_USERNAME=${PANEL_USERNAME:-$DEFAULT_USERNAME} 153 | log "您设置的用户名称为:$PANEL_USERNAME" 154 | } 155 | 156 | function Set_Password(){ 157 | PANEL_PASSWORD=${PANEL_PASSWORD:-$DEFAULT_PASSWORD} 158 | } 159 | 160 | 161 | function Init_Panel(){ 162 | log "配置 1Panel Service" 163 | 164 | RUN_BASE_DIR=$PANEL_BASE_DIR/1panel 165 | mkdir -p $RUN_BASE_DIR 166 | rm -rf $RUN_BASE_DIR/* 167 | 168 | cd ${CURRENT_DIR} 169 | 170 | cp ./1panel /usr/local/bin && chmod +x /usr/local/bin/1panel 171 | if [[ ! -f /usr/bin/1panel ]]; then 172 | ln -s /usr/local/bin/1panel /usr/bin/1panel >/dev/null 2>&1 173 | fi 174 | 175 | cp ./1pctl /usr/local/bin && chmod +x /usr/local/bin/1pctl 176 | sed -i -e "s#BASE_DIR=.*#BASE_DIR=${PANEL_BASE_DIR}#g" /usr/local/bin/1pctl 177 | sed -i -e "s#ORIGINAL_PORT=.*#ORIGINAL_PORT=${PANEL_PORT}#g" /usr/local/bin/1pctl 178 | sed -i -e "s#ORIGINAL_USERNAME=.*#ORIGINAL_USERNAME=${PANEL_USERNAME}#g" /usr/local/bin/1pctl 179 | ESCAPED_PANEL_PASSWORD=$(echo "$PANEL_PASSWORD" | sed 's/[!@#$%*_,.?]/\\&/g') 180 | sed -i -e "s#ORIGINAL_PASSWORD=.*#ORIGINAL_PASSWORD=${ESCAPED_PANEL_PASSWORD}#g" /usr/local/bin/1pctl 181 | PANEL_ENTRANCE=${PANEL_ENTRANCE:-$DEFAULT_ENTRANCE} 182 | sed -i -e "s#ORIGINAL_ENTRANCE=.*#ORIGINAL_ENTRANCE=${PANEL_ENTRANCE}#g" /usr/local/bin/1pctl 183 | if [[ ! -f /usr/bin/1pctl ]]; then 184 | ln -s /usr/local/bin/1pctl /usr/bin/1pctl >/dev/null 2>&1 185 | fi 186 | 187 | # cp ./1panel.service /etc/systemd/system 188 | # 189 | # systemctl enable 1panel; systemctl daemon-reload 2>&1 | tee -a ${CURRENT_DIR}/install.log 190 | # 191 | # log "启动 1Panel 服务" 192 | # systemctl start 1panel | tee -a ${CURRENT_DIR}/install.log 193 | # 194 | # for b in {1..30} 195 | # do 196 | # sleep 3 197 | # service_status=`systemctl status 1panel 2>&1 | grep Active` 198 | # if [[ $service_status == *running* ]];then 199 | # log "1Panel 服务启动成功!" 200 | # break; 201 | # else 202 | # log "1Panel 服务启动出错!" 203 | # exit 1 204 | # fi 205 | # done 206 | } 207 | 208 | function Show_Result(){ 209 | log "" 210 | log "=================感谢您的耐心等待,安装已经完成==================" 211 | log "" 212 | log "请用浏览器访问面板:" 213 | log "面板地址: http://\$LOCAL_IP:$PANEL_PORT/$PANEL_ENTRANCE" 214 | log "用户名称: $PANEL_USERNAME" 215 | log "用户密码: $PANEL_PASSWORD" 216 | log "" 217 | log "项目官网: https://1panel.cn" 218 | log "项目文档: https://1panel.cn/docs" 219 | log "代码仓库: https://github.com/1Panel-dev/1Panel" 220 | log "" 221 | log "如果使用的是云服务器,请至安全组开放 $PANEL_PORT 端口" 222 | log "" 223 | log "================================================================" 224 | } 225 | 226 | function main(){ 227 | Prepare_System 228 | Set_Dir 229 | # Install_Docker 230 | # Install_Compose 231 | Set_Port 232 | Set_Firewall 233 | Set_Username 234 | Set_Password 235 | Init_Panel 236 | Show_Result 237 | } 238 | main 239 | --------------------------------------------------------------------------------