From 4a931670364da1640876cb239b4433b0def7a45b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=AD=E7=BF=BC=E7=BE=8A=E7=8E=8B?= <1993333339@qq.com> Date: Tue, 11 Apr 2023 17:42:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E9=95=9C=E5=83=8F=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit rename 增加docker-compose部署方式 提交docker-compose.yml 完整镜像构建文件 环境镜像构建文件 服务镜像构建文件 docker-compose方式使用的config.py MySQL初始化数据 MySQL配置文件 rename 服务镜像启动脚本 --- Dockerfile | 25 -------- Dockerfile.server | 18 ++++++ README.md | 25 ++++++-- docker-compose.yml | 43 ++++++++++--- dockerdata/Dockerfile.all | 29 +++++++++ dockerdata/Dockerfile.flask | 17 +++++ dockerdata/Dockerfile.server | 16 +++++ dockerdata/config.py | 105 +++++++++++++++++++++++++++++++ dockerdata/mysql/initdb/init.sql | 1 + dockerdata/mysql/my.cnf | 31 +++++++++ dockerdata/requirements.txt | 14 +++++ dockerdata/start.sh | 8 +++ start.sh | 1 - 13 files changed, 294 insertions(+), 39 deletions(-) delete mode 100644 Dockerfile create mode 100644 Dockerfile.server create mode 100644 dockerdata/Dockerfile.all create mode 100644 dockerdata/Dockerfile.flask create mode 100644 dockerdata/Dockerfile.server create mode 100644 dockerdata/config.py create mode 100644 dockerdata/mysql/initdb/init.sql create mode 100644 dockerdata/mysql/my.cnf create mode 100644 dockerdata/requirements.txt create mode 100644 dockerdata/start.sh delete mode 100644 start.sh diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index aa5eb41..0000000 --- a/Dockerfile +++ /dev/null @@ -1,25 +0,0 @@ -FROM python:3.7-alpine - - -RUN apk update \ - && apk --update add --no-cache gcc \ - && apk --update add --no-cache g++ \ - && apk --update add --no-cache tzdata \ - && apk --update add --no-cache libffi-dev \ - && apk --update add --no-cache libxslt-dev \ - && apk --update add --no-cache jpeg-dev - -ENV TIME_ZONE Asia/Shanghai -ENV PIPURL "https://pypi.tuna.tsinghua.edu.cn/simple" - -RUN echo "${TIME_ZONE}" > /etc/timezone \ - && ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime - -COPY . /app -WORKDIR /app - -RUN pip --no-cache-dir install -i ${PIPURL} --upgrade pip \ - && pip --no-cache-dir install -i ${PIPURL} -r requirement/dev.txt \ - && pip --no-cache-dir install -i ${PIPURL} gunicorn \ - && chmod +x start.sh -CMD ./start.sh \ No newline at end of file diff --git a/Dockerfile.server b/Dockerfile.server new file mode 100644 index 0000000..510c6d5 --- /dev/null +++ b/Dockerfile.server @@ -0,0 +1,18 @@ +FROM 1004947301/python3.7-flask:pillow + +LABEL "author"="liuyiyangwang" +LABEL "blog"="https://gitee.com/liuyiyangwang" + +COPY . /app/ +COPY dockerdata/config.py /app/applications/ +COPY dockerdata/start.sh /app + +WORKDIR /app/ + +ENV TIME_ZONE Asia/Shanghai + +RUN echo "${TIME_ZONE}" > /etc/timezone \ + && ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime \ + && chmod +x /app/start.sh + +CMD ./start.sh diff --git a/README.md b/README.md index 24aff79..ec8c69c 100644 --- a/README.md +++ b/README.md @@ -57,10 +57,7 @@ Pear Admin Flask 基于 Flask 的后台管理系统,拥抱应用广泛的pytho git clone https://gitee.com/pear-admin/pear-admin-flask # 安 装 -pip install -r requirement\dev.txt - -# 配 置 -.env +pip install -r requirements.txt ``` @@ -115,6 +112,24 @@ flask new --type view --name test/a # 自动注册蓝图 # 访问http://127.0.0.1:5000/test/a/ ``` + +#### 使用docker-compose运行项目 +```bash +#安装docker-compose +curl -L https://github.com/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose +chmod +x /usr/local/bin/docker-compose +ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose + +docker-compose --version +docker-compose up -d # -d后台运行 +docker-compose stop # 停止启动 +docker-compose down # 清除容器 + +dockerdata/config.py # 配置文件 +dockerdata/mysql/initdb/ # MySQL初始化数据在 +rm -rf dockerdata/mysql/{log,data}/* # down掉容器后启动需要清除删除log,dat +``` + Pear Admin Flask 还有以下几个版本: **[mini 分支版本](https://gitee.com/pear-admin/pear-admin-flask/tree/mini/)** @@ -136,4 +151,4 @@ main 分支是对 mini 分支的后续,目前还在开发中。 |---------------------|---------------------| | ![](docs/assets/1.jpg) | ![](docs/assets/2.jpg) | | ![](docs/assets/3.jpg)| ![](docs/assets/4.jpg) | -| ![](docs/assets/5.jpg) | ![](docs/assets/6.jpg) | \ No newline at end of file +| ![](docs/assets/5.jpg) | ![](docs/assets/6.jpg) | diff --git a/docker-compose.yml b/docker-compose.yml index e283ed9..73aa0fb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,14 +1,41 @@ version: '3' services: - flask: - build: . - ports: - - "8000:8000" - restart: always - links: - - mysql:dbserver mysql: image: "mysql:5.7" + container_name: mysql + restart: always + ports: + - "3306:3306" + volumes: + - "./dockerdata/mysql/log:/usr/local/mysql/log" + - "./dockerdata/mysql/data:/var/lib/mysql" + - "./dockerdata/mysql/my.cnf:/etc/my.cnf" + - "./dockerdata/mysql/initdb:/docker-entrypoint-initdb.d" environment: - - MYSQL_ROOT_PASSWORD=root + LANG: C.UTF-8 + TZ: Asia/Shanghai + MYSQL_ROOT_PASSWORD: 123456 + networks: + flask-network: + ipv4_address: 172.10.1.31 + + flask: + build: + context: . + dockerfile: Dockerfile.server + container_name: flask restart: always + ports: + - "8000:8000" + depends_on: + - mysql + networks: + flask-network: + ipv4_address: 172.10.1.11 + +networks: + flask-network: + driver: bridge + ipam: + config: + - subnet: 172.10.0.0/16 diff --git a/dockerdata/Dockerfile.all b/dockerdata/Dockerfile.all new file mode 100644 index 0000000..2d574f6 --- /dev/null +++ b/dockerdata/Dockerfile.all @@ -0,0 +1,29 @@ +FROM python:3.7-alpine + +LABEL "author"="liuyiyangwang" +LABEL "blog"="https://gitee.com/liuyiyangwang" + +COPY . /app/ +COPY dockerdata/config.py /app/applications/ +COPY dockerdata/start.sh /app/ + +WORKDIR /app/ + +ENV TIME_ZONE Asia/Shanghai +ENV PIPURL "https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.douban.com" + +RUN apk update \ + && apk add --virtual mysqlclient-build gcc python3-dev musl-dev \ + && apk add --no-cache mariadb-dev \ + && apk add --virtual system-build linux-headers libffi-dev \ + && apk add --no-cache jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev \ + && apk add --no-cache bash bash-doc bash-completion \ + && apk add --no-cache libxslt-dev tzdata g++ +RUN echo "${TIME_ZONE}" > /etc/timezone \ + && ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime +RUN pip --no-cache-dir install -i ${PIPURL} --upgrade pip \ + && pip --no-cache-dir install -i ${PIPURL} -r requirements.txt \ + && pip --no-cache-dir install -i ${PIPURL} gunicorn \ + && chmod +x /app/start.sh + +CMD ./start.sh diff --git a/dockerdata/Dockerfile.flask b/dockerdata/Dockerfile.flask new file mode 100644 index 0000000..889fcd0 --- /dev/null +++ b/dockerdata/Dockerfile.flask @@ -0,0 +1,17 @@ +FROM python:3.7-alpine + +LABEL "author"="liuyiyangwang" +LABEL "blog"="https://gitee.com/liuyiyangwang" + +ENV PIPURL "https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.douban.com" +RUN apk update \ + && apk add --virtual mysqlclient-build gcc python3-dev musl-dev \ + && apk add --no-cache mariadb-dev \ + && apk add --virtual system-build linux-headers libffi-dev \ + && apk add --no-cache jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev \ + && apk add --no-cache bash bash-doc bash-completion \ + && apk add --no-cache libxslt-dev tzdata g++ +COPY requirements.txt /requirements.txt +RUN pip --no-cache-dir install -i ${PIPURL} --upgrade pip \ + && pip --no-cache-dir install -i ${PIPURL} -r /requirements.txt \ + && pip --no-cache-dir install -i ${PIPURL} gunicorn diff --git a/dockerdata/Dockerfile.server b/dockerdata/Dockerfile.server new file mode 100644 index 0000000..8211226 --- /dev/null +++ b/dockerdata/Dockerfile.server @@ -0,0 +1,16 @@ +FROM 1004947301/python3.7-flask:pillow + +LABEL "author"="liuyiyangwang" +LABEL "blog"="https://gitee.com/liuyiyangwang" + +COPY . /app/ +COPY dockerdata/config.py /app/applications/ +COPY dockerdata/start.sh /app + +WORKDIR /app/ + +ENV TIME_ZONE Asia/Shanghai + +RUN chmod +x /app/start.sh + +CMD ./start.sh diff --git a/dockerdata/config.py b/dockerdata/config.py new file mode 100644 index 0000000..81714ae --- /dev/null +++ b/dockerdata/config.py @@ -0,0 +1,105 @@ +import logging +from urllib.parse import quote_plus as urlquote + +from apscheduler.executors.pool import ThreadPoolExecutor +from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore + + +class BaseConfig: + DEBUG = True + HOST = '127.0.0.1' + PORT = 5000 + + SUPERADMIN = 'admin' + + SYSTEM_NAME = 'Pear Admin' + # 主题面板的链接列表配置 + SYSTEM_PANEL_LINKS = [ + { + "icon": "layui-icon layui-icon-auz", + "title": "官方网站", + "href": "http://www.pearadmin.com" + }, + { + "icon": "layui-icon layui-icon-auz", + "title": "开发文档", + "href": "http://www.pearadmin.com" + }, + { + "icon": "layui-icon layui-icon-auz", + "title": "开源地址", + "href": "https://gitee.com/Jmysy/Pear-Admin-Layui" + } + ] + + UPLOADED_PHOTOS_DEST = 'static/upload' + UPLOADED_FILES_ALLOW = ['gif', 'jpg'] + UPLOADS_AUTOSERVE = True + + # JSON配置 + JSON_AS_ASCII = False + + SECRET_KEY = "pear-admin-flask" + + # redis配置 + REDIS_HOST = "127.0.0.1" + REDIS_PORT = 6379 + + # mysql 配置 + MYSQL_USERNAME = "root" + MYSQL_PASSWORD = "123456" + MYSQL_HOST = "172.10.1.31" + MYSQL_PORT = 3306 + MYSQL_DATABASE = "PearAdminFlask" + + # mysql 数据库的配置信息 + SQLALCHEMY_DATABASE_URI = f"mysql+pymysql://{MYSQL_USERNAME}:{urlquote(MYSQL_PASSWORD)}@{MYSQL_HOST}:{MYSQL_PORT}/{MYSQL_DATABASE}?charset=utf8mb4" + + # 默认日志等级 + LOG_LEVEL = logging.WARN + # + MAIL_SERVER = 'smtp.qq.com' + MAIL_USE_TLS = False + MAIL_USE_SSL = True + MAIL_PORT = 465 + MAIL_USERNAME = '123@qq.com' + MAIL_PASSWORD = 'XXXXX' # 生成的授权码 + MAIL_DEFAULT_SENDER = MAIL_USERNAME + + # 設置 APSCHEDULER 參數 + SCHEDULER_API_ENABLED = False + SCHEDULER_JOBSTORES: dict = { + 'default': SQLAlchemyJobStore( + url=f'mysql+pymysql://{MYSQL_USERNAME}:{MYSQL_PASSWORD}@{MYSQL_HOST}:{MYSQL_PORT}/{MYSQL_DATABASE}') + } + SCHEDULER_EXECUTORS: dict = { + 'default': ThreadPoolExecutor(20) + } + SCHEDULER_JOB_DEFAULTS: dict = { + 'coalesce': False, + 'max_instances': 3 + } + + # 插件配置 + PLUGIN_ENABLE_FOLDERS = ["helloworld"] + + # 配置多个数据库连接的连接串写法示例 + # HOSTNAME: 指数据库的IP地址、USERNAME:指数据库登录的用户名、PASSWORD:指数据库登录密码、PORT:指数据库开放的端口、DATABASE:指需要连接的数据库名称 + # MSSQL: f"mssql+pymssql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=cp936" + # MySQL: f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8" + # Oracle: f"oracle+cx_oracle://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}" + # SQLite "sqlite:/// database.db" + # Postgres f"postgresql+psycopg2://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}" + # Oracle的第二种连接方式 + # dsnStr = cx_Oracle.makedsn({HOSTNAME}, 1521, service_name='orcl') + # connect_str = "oracle://%s:%s@%s" % ('{USERNAME}', ' {PASSWORD}', dsnStr) + + # 在SQLALCHEMY_BINDS 中设置:'{数据库连接别名}': '{连接串}' + # 最后在models的数据模型class中,在__tablename__前设置 __bind_key__ = '{数据库连接别名}' 即可,表示该数据模型不使用默认的数据库连接,改用“SQLALCHEMY_BINDS”中设置的其他数据库连接 + # SQLALCHEMY_BINDS = { + # 'testMySQL': 'mysql+pymysql://test:123456@192.168.1.1:3306/test?charset=utf8', + # 'testMsSQL': 'mssql+pymssql://test:123456@192.168.1.1:1433/test?charset=cp936', + # 'testOracle': 'oracle+cx_oracle://test:123456@192.168.1.1:1521/test', + # 'testSQLite': 'sqlite:///database.db + # } + diff --git a/dockerdata/mysql/initdb/init.sql b/dockerdata/mysql/initdb/init.sql new file mode 100644 index 0000000..d14679a --- /dev/null +++ b/dockerdata/mysql/initdb/init.sql @@ -0,0 +1 @@ +CREATE DATABASE PearAdminFlask; diff --git a/dockerdata/mysql/my.cnf b/dockerdata/mysql/my.cnf new file mode 100644 index 0000000..c998cb0 --- /dev/null +++ b/dockerdata/mysql/my.cnf @@ -0,0 +1,31 @@ +[mysql] + +default-character-set=utf8 + +[client] + +default-character-set = utf8 + +[mysqld] +server_id = 1 +# 开启二进制日志 +log-bin = mysql-bin +# 只保留7天的二进制日志,以防磁盘被日志占满 +expire-logs-days = 7 +# 二进制日志自动删除的天数,默认值为0,表示“没有自动删除”,启动时和二进制日志循环时可能删除 +expire_logs_days = 7 +# 设置编码与字符集 +init_connect='SET collation_connection = utf8_unicode_ci' +init_connect='SET NAMES utf8' +character-set-server=utf8 +collation-server=utf8_unicode_ci +# 设置错误日志路径 +log-error = /usr/local/mysql/log/error.log +# 设置查询日志路径 +general_log = on +general_log_file = /usr/local/mysql/log/mysql.log +#开启慢查询日志路径 +slow_query_log = on +long_query_time = 3 +log-queries-not-using-indexes = on +slow-query-log-file = /usr/local/mysql/log/slowquery.log diff --git a/dockerdata/requirements.txt b/dockerdata/requirements.txt new file mode 100644 index 0000000..34a80f2 --- /dev/null +++ b/dockerdata/requirements.txt @@ -0,0 +1,14 @@ +Flask +Flask-APScheduler +Flask-Migrate +Flask-Login +Flask_Reuploaded +Flask-SQLAlchemy +flask-marshmallow +marshmallow-sqlalchemy +PyMySQL +psutil +Flask-Mail +Pillow +validators +cryptography \ No newline at end of file diff --git a/dockerdata/start.sh b/dockerdata/start.sh new file mode 100644 index 0000000..f507e55 --- /dev/null +++ b/dockerdata/start.sh @@ -0,0 +1,8 @@ +#!/bin/sh +sleep 5 #等MySQL启动 +flask db init && flask db migrate && flask db upgrade && flask admin init +exec gunicorn -c gunicorn.conf.py "applications:create_app()" +while true; do + echo '发生错误' + sleep 100 +done diff --git a/start.sh b/start.sh deleted file mode 100644 index 2e58313..0000000 --- a/start.sh +++ /dev/null @@ -1 +0,0 @@ -exec gunicorn -c gunicorn.conf.py "applications:create_app()" \ No newline at end of file -- Gitee