commit 54755602e427a0699f4367317e5c1d4f54d0bb48 Author: iCodex Date: Sat Feb 24 23:33:41 2024 +0800 init diff --git a/.env b/.env new file mode 100644 index 0000000..3c6fcac --- /dev/null +++ b/.env @@ -0,0 +1,20 @@ +#!/usr/bin/env sh + +# See https://docs.docker.com/compose/environment-variables/#the-env-file +# edge-admin +VERSION=1.3.3 + +# edge-node +VERSION=1.3.3 +ENDPOINTS=http://xxx.com:8001 +CLUSTERID=xxx +SECRET=xxx + +# MySQL +MYSQL_VERSION=8 +MYSQL_HOST=mysqld +MYSQL_ROOT_USER=root +MYSQL_ROOT_PASSWORD=root +MYSQL_USER=edges +MYSQL_PASSWORD=edges +MYSQL_DATABASE=edges diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b3bec14 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Shing Lau + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..673a94a --- /dev/null +++ b/README.md @@ -0,0 +1,123 @@ +# 使用Docker快速部署GoEdge管理平台(包含API节点)和边缘节点 + +## 部署前的准备工作 + +### 安装Docker + +管理平台和边缘节点都需要先安装Docker,新版本的Docker已包含compose插件,因此我们只需要执行官方推荐的命令安装即可: + +``` +curl -sSL https://get.docker.com | sh +``` + +### 部署管理平台 + +首先编写docker-compose.yaml,因为将管理平台所依赖的mysql加进来,所以这里使用docker compose的方式进行,也是方便后期迁移等管理工作。 + +mysql的版本要求,官方建议使用mysql 8,最低不低于mysql 5.7.8,系统内存建议4GB以上。 + +首先进入你想存放docker-compose.yaml的路径,比如/opt/goedge,然后进入该路径后创建docker-compose.yaml,输入以下内容: + +``` +version: "3" + +networks: + goedge: + external: false + +services: + mysqld: + image: mysql:8 + container_name: mysqld + environment: + - MYSQL_ROOT_PASSWORD=root + - MYSQL_USER=edges + - MYSQL_PASSWORD=edges + - MYSQL_DATABASE=edges + networks: + - goedge + volumes: + - ./data/db/mysql:/var/lib/mysql:rw + restart: always + + edge-admin: + image: icodex/edge-admin:1.3.3 + container_name: edge-admin + ports: + - 7788:7788/tcp + - 8001:8001/tcp + networks: + - goedge + volumes: + - ./data/edge-admin/configs:/usr/local/goedge/edge-admin/configs + - ./data/edge-api/configs:/usr/local/goedge/edge-admin/edge-api/configs + restart: always +``` + +以上使用了mysql 8的镜像,接着edge-admin是管理平台的镜像。确定没有端口冲突之后,执行命令启动: + +``` +docker compose up -d +``` + +运行后,打开浏览器,输入服务器IP地址和7788端口号,进入安装界面: + +![](https://icodex.org/wp-content/uploads/2024/02/WX20240224-231039@2x-1354x800.png) + +注意⚠️!因为这里的网络类型是容器内共享的,因此在数据库信息填写这里,数据库的地址只需要填写mysql的容器名即可,比如这里的:mysqld。数据库名、数据库账号、数据库密码均为edges。一直下一步就好了。 + +![](https://icodex.org/wp-content/uploads/2024/02/WX20240224-231233@2x-953x800.png) + +ps:如果你现在的宿主机系统里面已经有mysql,不想再多运行一个浪费资源,则需要考虑删掉docker-compose.yaml里的mysql服务,并将网络类型更改为Host网络类型,以方便与宿主机上的mysql通信,如下: + +``` +version: "3" + +services: + edge-admin: + image: icodex/edge-admin:1.3.3 + container_name: edge-admin + network_mode: host + volumes: + - ./data/edge-admin/configs:/usr/local/goedge/edge-admin/configs + - ./data/edge-api/configs:/usr/local/goedge/edge-admin/edge-api/configs + restart: always +``` + +docker-compose.yaml编辑好之后,确定端口没有冲突,就可以执行以下命令启动整个系统了! + +### 部署边缘节点 + +在上面的部署中,已经完成了管理平台的部署,这时可以按照官方教程添加边缘节点的方式进行添加。也可以按以下步骤,部署一个Docker容器形态的边缘节点。 + +这里使用GoEdge的自动注册功能,因此需要先在GoEdge管理界面 – 边缘节点 – 找到你所在集群 – 集群节点 – 安装升级 – 自动注册,把endpoints、clusterId、secret三个值记录下来。 + +![](https://icodex.org/wp-content/uploads/2024/02/WX20240224-230019@2x-1353x800.png) + +然后准备一个docker-compose.yaml,输入以下内容,注意替换环境变量里相应的值 + +``` +version: "3" + +services: + edge-node: + image: icodex/edge-node:1.3.3 + container_name: edge-node + environment: + - ENDPOINTS=http://xxx.com:8001 + - CLUSTERID=xxx + - SECRET=xxx + network_mode: host + volumes: + - ./data/edge-node/cache:/opt/cache + - ./data/edge-node/configs:/usr/local/goedge/edge-node/configs + restart: always +``` + +接着使用docker compose命令启动它,很快就可以在管理平台看到这台上线的主机了。 + +以上,是完整部署GoEdge的全部步骤,非常简单吧! + +## 最后 + +这个项目应该不算造轮子,只是我个人习惯使用docker进行服务的管理,docker运行毕竟套了多一层虚拟化,因此在边缘节点的容器的网络选择上,建议使用host类型,与宿主机共享会比较好。 diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..3f0b1a8 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,47 @@ +version: "3" + +networks: + goedge: + external: false + +services: + mysqld: + image: mysql:${MYSQL_VERSION} + container_name: mysqld + env_file: + - .env + networks: + - goedge + volumes: + - ./data/db/mysql:/var/lib/mysql:rw + restart: always + + edge-admin: + image: icodex/edge-admin:${VERSION} + container_name: edge-admin + ports: + - 7788:7788/tcp + - 8001:8001/tcp + env_file: + - .env + networks: + - goedge + volumes: + - ./data/edge-admin/configs:/usr/local/goedge/edge-admin/configs + - ./data/edge-api/configs:/usr/local/goedge/edge-admin/edge-api/configs + restart: always + + edge-node: + image: icodex/edge-node:${VERSION} + container_name: edge-node + ports: + - 80:80/tcp + - 443:443/tcp + env_file: + - .env + networks: + - goedge + volumes: + - ./data/edge-node/cache:/opt/cache + - ./data/edge-node/configs:/usr/local/goedge/edge-node/configs + restart: always diff --git a/docker/Dockerfile.admin b/docker/Dockerfile.admin new file mode 100644 index 0000000..30b27b2 --- /dev/null +++ b/docker/Dockerfile.admin @@ -0,0 +1,17 @@ +FROM alpine:latest +LABEL maintainer="icodex@msn.com" +ENV TZ "Asia/Shanghai" +ENV ROOT_DIR /usr/local/goedge + +ARG VERSION +ENV VERSION=${VERSION} + +COPY build /build/ + +RUN /build/base.sh \ + && /build/install.sh admin + +EXPOSE 7788 8001 + +WORKDIR /usr/local/goedge +ENTRYPOINT [ "/usr/local/goedge/run.sh" ] diff --git a/docker/Dockerfile.node b/docker/Dockerfile.node new file mode 100644 index 0000000..167d547 --- /dev/null +++ b/docker/Dockerfile.node @@ -0,0 +1,17 @@ +FROM alpine:latest +LABEL maintainer="icodex@msn.com" +ENV TZ "Asia/Shanghai" +ENV ROOT_DIR /usr/local/goedge + +ARG VERSION +ENV VERSION=${VERSION} + +COPY build /build/ + +RUN /build/base.sh \ + && /build/install.sh node + +EXPOSE 80 443 + +WORKDIR /usr/local/goedge +ENTRYPOINT [ "/usr/local/goedge/run.sh" ] diff --git a/docker/build.sh b/docker/build.sh new file mode 100755 index 0000000..fbfaf51 --- /dev/null +++ b/docker/build.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +VERSION="1.3.3" +case "$1" in + "admin"|"node") + RUN_TYPE=${1} + ;; + *) + echo "unknown type: ${1}" + exit + ;; +esac + +docker buildx create --use --platform=linux/arm64,linux/amd64 --name multi-platform-builder +docker buildx inspect --bootstrap + +docker buildx build -f Dockerfile.${RUN_TYPE} -t icodex/edge-${RUN_TYPE}:${VERSION} --build-arg VERSION=${VERSION} --platform=linux/arm64,linux/amd64 . --push diff --git a/docker/build/base.sh b/docker/build/base.sh new file mode 100755 index 0000000..1b04a07 --- /dev/null +++ b/docker/build/base.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env sh + +echo "**** Install based packages ****" +apk add --no-cache tzdata wget curl unzip +cp /usr/share/zoneinfo/${TZ} /etc/localtime diff --git a/docker/build/install.sh b/docker/build/install.sh new file mode 100755 index 0000000..a867ca4 --- /dev/null +++ b/docker/build/install.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env sh + +echo "**** Install goedge ****" + +function get_arch() { + ARCH=`uname -m` + case "$ARCH" in + "x86_64") + GOARCH="amd64" + ;; + "aarch64_be"|"aarch64"|"armv8b"|"armv8l"|"armv8"|"arm64") + GOARCH="arm64" + ;; + *) + echo "arch '${ARCH}' is not supported yet" + exit + ;; + esac +} + +function install_edges() { + mkdir -p ${ROOT_DIR} + cd ${ROOT_DIR} + + case "$1" in + "admin") + TAR_URL="https://dl.goedge.cn/edge/v${VERSION}/edge-admin-linux-${GOARCH}-plus-v${VERSION}.zip" + TAR_FILE="edge-admin-linux-${GOARCH}-plus-v${VERSION}.zip" + + mv /build/run_admin.sh ${ROOT_DIR}/run.sh + ;; + "node") + apk add --no-cache nftables + TAR_URL="https://dl.goedge.cn/edge-node/v${VERSION}/edge-node-linux-${GOARCH}-plus-v${VERSION}.zip" + TAR_FILE="edge-node-linux-${GOARCH}-plus-v${VERSION}.zip" + + mv /build/run_node.sh ${ROOT_DIR}/run.sh + ;; + *) + echo "unknown type: ${1}" + exit + ;; + esac + chmod u+x ${ROOT_DIR}/run.sh + + wget ${TAR_URL} -O ${TAR_FILE} + unzip ${TAR_FILE} + rm -f ${TAR_FILE} +} + +function clean_apk() { + apk del wget curl unzip +} + +get_arch +install_edges ${1} +clean_apk diff --git a/docker/build/run_admin.sh b/docker/build/run_admin.sh new file mode 100755 index 0000000..49f0f76 --- /dev/null +++ b/docker/build/run_admin.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env sh + +ROOT_DIR='/usr/local/goedge' +${ROOT_DIR}/edge-admin/bin/edge-admin diff --git a/docker/build/run_node.sh b/docker/build/run_node.sh new file mode 100755 index 0000000..2b05592 --- /dev/null +++ b/docker/build/run_node.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env sh + +ROOT_DIR='/usr/local/goedge' + +function pre_config() { + if [ ! -e ${ROOT_DIR}/edge-node/configs/api_cluster.yaml ]; then + touch ${ROOT_DIR}/edge-node/configs/api_cluster.yaml +cat >> ${ROOT_DIR}/edge-node/configs/api_cluster.yaml << EOF +rpc.endpoints: [ "${ENDPOINTS}" ] +clusterId: "${CLUSTERID}" +secret: "${SECRET}" +EOF + fi +} + +mkdir -p /opt/cache +chmod 777 /opt/cache + +pre_config +${ROOT_DIR}/edge-node/bin/edge-node