部署aliyundrive-qr-login记录

准备工作

  • 搭建方案:caddy + falsk + gunicorn

  • 使用到的工具:git,docker

  • 准备一个解析到服务器IP的域名。

工具不齐或是不会使用的自行搜索找方法。本文只记录操作。

docker安装

1
curl -fsSL https://get.docker.com | sh && ln -s /usr/libexec/docker/cli-plugins/docker-compose /usr/local/bin

官方一键脚本并配置好docker-compose

查看:docker -v

返回:Docker version 26.0.0, build 2ae903e

即安装成功,其它docker相关命令,本文最后提供。

git 安装,如果已有则跳过

1
apt-get install git

部署

一些想法:想过很多方案,比如nginx + uwsgi +flask, 这种方案也挺好只是后边配置域名时会麻烦点,caddy和flask在同一个容器里方便,但是其它容器想利用caddy就很不爽,所以最终决定使用caddy和flask两个独立容器部署的方案。

新建自定义网格,如 aixiu-network

1
docker network create aixiu-network

注:aixiu-network名字可以自定义,后边要用到。主要是因为它使得容器间的通信变得更容易,也支持DNS解析,容器可以使用容器名进行互相访问。

# 如果Flask容器已经运行,你需要将其连接到新的网络,比如将Flask容器添加到网络:

docker network connect aixiu-network aliyun-flask

部署caddy

1
docker run -d --name caddy --network aixiu-network -p 80:80 -p 443:443 -p 443:443/udp -v /www/caddy/:/etc/caddy/ -v /www/wwwroot/:/usr/share/caddy/ --restart=always caddy:latest

命令解释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
这条命令是在Docker中启动一个Caddy服务器的示例,下面是每个选项的详细解释:

docker run:Docker的命令,用于创建并启动一个新的容器。

-d:以“detached”模式运行,即容器在后台运行。

--name caddy:为正在创建的容器分配一个名称,这里的名称为“caddy”。

--network aixiu-network:将容器连接到指定的网络。这里,容器将连接到名为“aixiu-network”的网络。若该网络不存在,您需要先创建它。

-p 80:80:端口映射,将容器内的80端口映射到宿主机的80端口。用于HTTP通信。

-p 443:443:端口映射,将容器内的443端口映射到宿主机的443端口。用于HTTPS通信。

-p 443:443/udp:端口映射,将容器内的443端口映射到宿主机的443端口,针对UDP协议。这通常用于某些特定的网络功能,如QUIC。

-v /www/caddy/:/etc/caddy/:卷映射,将宿主机的/www/caddy/目录挂载到容器的/etc/caddy/目录。这允许您将宿主机上的Caddy配置文件(如Caddyfile)映射至容器内。

-v /www/wwwroot/:/usr/share/caddy/:卷映射,将宿主机的/www/wwwroot/目录挂载到容器的/usr/share/caddy/目录。这可以用于存放您的网站文件,Caddy服务器将从这个目录服务静态文件。

--restart=always:告诉Docker在容器退出时总是重启容器。

caddy:latest:指定要使用的镜像,这里使用的是Caddy的最新版镜像。

总结来说,这条命令将启动一个Caddy服务器容器,该容器使用指定的网络和端口映射,同时挂载了配置文件和网站文件目录以便Caddy可以访问。此外,容器被配置为在退出时自动重启。

部署aliyun-flask

  1. xshell连接到服务器,先创建两个文件夹

    1
    mkdir -p /www/{caddy,wwwroot}

    caddy文件夹用来存放Caddyfile,wwwroot用来存放网站源码。

  2. 进入wwwroot目录

    cd /www/wwwroot

    使用git clone https://github.com/ImYrS/aliyundrive-qr-login.git下载源码,

    并使用命令进入aliyundrive-qr-login目录:cd aliyundrive-qr-login

  3. 配置文件复制一份并改名为config.ini:mv example.config.ini config.ini

  4. 创建Dockerfile

    nano Dockerfile

    自用配置,可按需更改:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    # 使用官方 Python Docker 镜像
    FROM python:3.9-slim-buster

    # LABEL 维护者信息
    LABEL 888888@qq.com

    # 设置工作目录
    WORKDIR /www/wwwroot/aliyundrive-qr-login

    # 安装系统依赖
    # RUN apt-get update && apt-get install -y gcc libffi-dev

    # 拷贝项目文件到容器内
    COPY . /www/wwwroot/aliyundrive-qr-login

    # 安装项目依赖
    RUN pip install --no-cache-dir -r requirements.txt gunicorn

    # 配置环境变量
    ENV GUNICORN_CMD="gunicorn -w 2 -b 0.0.0.0:5500 app:app"

    # 暴露需要的端口
    EXPOSE 5500

    # 运行 Gunicorn 服务器
    CMD [ "sh", "-c", "$GUNICORN_CMD" ]

    以下是每一行代码的解释:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    FROM python:3.9-slim-buster
    使用官方 Python 3.9 轻量级镜像作为基础镜像。

    LABEL 4815563@qq.com
    使用LABEL指令添加维护者信息。这个指令用于添加镜像的元数据。

    WORKDIR /www/wwwroot/aliyundrive-qr-login
    设置工作目录为 /www/wwwroot/aliyundrive-qr-login,以便接下来的命令在这个目录中执行。

    COPY . /www/wwwroot/aliyundrive-qr-login
    将当前目录中的所有文件和子目录复制到Docker镜像内的/www/wwwroot/aliyundrive-qr-login目录中。

    RUN pip install --no-cache-dir -r requirements.txt gunicorn
    在镜像中运行命令,安装指定的Python依赖包(通过requirements.txt文件指定),同时安装了gunicorn作为WSGI HTTP服务器。

    ENV GUNICORN_CMD="gunicorn -w 2 -b 0.0.0.0:5500 app:app"
    设置环境变量GUNICORN_CMD为gunicorn -w 2 -b 0.0.0.0:5500 app:app,这在容器启动时执行。

    EXPOSE 5500
    声明容器运行时将要监听的端口号,这里是5500。

    CMD [ "sh", "-c", "$GUNICORN_CMD" ]
    在容器启动时执行sh -c "$GUNICORN_CMD"命令。这会启动一个新的shell并在其中执行$GUNICORN_CMD中设置的命令,这里是启动gunicorn服务器。

    注意:

    1
    2
    3
    4
    5
    6
    7
    注释掉的命令:RUN apt-get update && apt-get install -y gcc libffi-dev。这行命令用于更新apt软件包列表并安装gcc和libffi-dev这两个软件包。

    是否需要运行这个命令取决于你的项目的具体需求。如果你的Python依赖或应用程序需要这些软件包来编译或安装特定的依赖,那么运行这个命令是必要的。

    例如,如果你的Python依赖包中包含需要编译的C扩展,那么你可能需要安装gcc。如果你的应用需要使用libffi库,那么你可能需要安装libffi-dev

    建议检查你的应用程序是否有这些依赖,并根据需要决定是否运行这个命令。
  5. 构建flask Docker镜像镜像
    docker build -t aliyun-flask:latest . -f Dockerfile

    命令解释:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    这是一个用于构建Docker镜像的命令,其含义如下:

    docker build:这部分命令告诉Docker命令行工具我们要构建一个新的镜像。

    -t aliyun-flask:latest:这个部分用于给镜像指定一个标签(tag),其中aliyun-flask是镜像的名称,latest是标签,表示这是最新的版本。这样做的好处是可以更方便地识别镜像的版本。

    .:这表示Dockerfile所在的目录,也就是当前目录。Docker将查找该目录下的Dockerfile来进行构建。

    -f Dockerfile:这是用来指定Dockerfile的文件名。默认情况下,Docker会在当前目录查找名为Dockerfile的文件来进行构建,但是如果你的Dockerfile文件命名不是Dockerfile,你可以使用-f选项来指定文件名。

    所以,这条命令的含义是告诉Docker命令行工具使用当前目录中的Dockerfile来构建一个带有aliyun-flask:latest标签的镜像。
  6. 部署flask docker

    docker run -d --name aliyun-flask --network aixiu-network -p 5500:5500 --restart=always aliyun-flask:latest

    其含义如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    docker run:这部分命令告诉Docker命令行工具我们要运行一个新的容器。

    -d:这个选项表示在“后台”模式下运行容器,也就是分离模式。

    --name aliyun-flask:这表示给容器指定一个名称,这里是aliyun-flask。

    --network aixiu-network:这部分指定了容器所连接的网络,这里是aixiu-network。

    -p 5500:5500:这个部分用于映射容器的端口到宿主机的端口,这里是将容器的5500端口映射到宿主机的5500端口。

    --restart=always:这个选项表示容器将始终自动重启,即使Docker守护进程被重启。

    aliyun-flask:latest:这是要运行的镜像的名称和标签。在这种情况下,它运行了名为aliyun-flask的镜像的最新版本。

    综合起来,这条命令的含义是在后台模式下运行一个名为aliyun-flask的Docker容器,连接到aixiu-network网络,并将容器的5500端口映射到宿主机的5500端口。容器将受到Docker守护进程的监管,并在必要时自动重启。

查看现在的状态

docker images

1
2
3
REPOSITORY     TAG       IMAGE ID       CREATED       SIZE
aliyun-flask latest 87a8f1250fa5 3 hours ago 144MB
caddy latest 439af64db489 2 years ago 40.1MB

有两个镜像。

docker ps -a查看所有容器

1
2
3
CONTAINER ID   IMAGE                 COMMAND                   CREATED        NAMES
597f48baf6aa aliyun-flask:latest "sh -c $GUNICORN_CMD" 2 hours ago aliyun-flask
426a73fae06d caddy:latest "caddy run --config …" 2 hours ago caddy

docker ps查看启动运行中的容器

1
2
3
CONTAINER ID   IMAGE                 COMMAND                   CREATED        NAMES
597f48baf6aa aliyun-flask:latest "sh -c $GUNICORN_CMD" 2 hours ago aliyun-flask
426a73fae06d caddy:latest "caddy run --config …" 2 hours ago caddy

如果发现运行中的容器不是两个,请自行解决。

配置Caddyfile

cd /www/caddy

nano Caddyfile

写入

1
2
3
4
5
jihu.pp.ua {
reverse_proxy aliyun-flask:5500 # aliyun-flask即docker run -d --name aliyun-flask名字一至
encode gzip
tls 88888@qq.com # 请填写自己的可用邮箱来申请tsl证书
}

重启caddy

docker restart caddy

即可用域名访问

其它相关Docker命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
systemctl enable docker # 设置开机启动

systemctl start docker # 启动docker
systemctl restart docker # 重启docker

systemctl stop docker # 停止docker

docker images # 查看镜像

docker stop container # 停止container容器
docker rm container1 container2 container3 # 删除多个容器
docker rmi <镜像ID1> <镜像ID2> <镜像ID3> # 删除多个镜像
docker image prune -a # 删除所有悬空镜像(即没有标签且没有被容器引用的镜像)
docker rmi $(docker images -q) -f # 删除所有镜像

其它
查看docker信息
docker version

docker info