dify填坑

  在内网的ARM服务器上用docker部署dify1.1.2版本,照手册和网上文档出现问题。包括环境变量配置、无法安装插件、主机时区等

1、变量设置,根据手册或网上介绍,复制.env.example(环境变量文件)为.env,然后修改.env 和 docker-compose-template.yaml,再执行generate_docker_compose来生成新的docker-compose.yaml文件,最后用docker up -d来启动。后来翻了源码才发现,generate_docker_compose的逻辑其实是:.env.example + docker-compose-template.yaml = docker-compose.yaml。其中.env.example定义环境变量,docker-compose-template.yaml定义服务配置(引用了.env.example中的变量)。这里的环境变量定义不对,就会引发后面的问题

2、由于是内网服务器,本来以为插件可以离线安装,结果安装插件时还要下载相关依赖,plugin_daemon容器总是报网络错误,只好配置代理服务器,并将pip源改为清华。直接在docker-compose-template.yaml中容器plugin_daemon的环境变量中新增,不能随便在.env.example中新增环境变量HTTP_PROXY,那样可能导致其他使用容器出现问题。

      HTTP_PROXY: http://proxy-ip:3128
      HTTPS_PROXY: http://proxy-ip:3128
      NO_PROXY: inter_ip/8,localhost,127.0.0.1,10.0.0./8,192.0.0.0/8,172.0.0.0/8

3、日志显示的时间是UTC,差了8个小时。以为在.env.example中设置LOG_TZ=Asia/Shanghai就行,结果发现部分容器不用这个变量。这里使用大模型帮我生成了一个脚本批量快速查看容器日志:

docker ps --format '{{.Names}}' | while read -r container_name; do
  echo "查看容器 $container_name 的最后 3 行日志:"
  docker logs --tail 3 "$container_name"
  echo "-----------------------------"
done

  同时为了让主机的时区正常,对不使用全局环境变量的容器需要在docker-compose-template.yaml单独指定LOG_TZ和TZ

4、使用docker build . -t dify-api方式自己打包镜像需要注意网络和源的问题:

  • Dockerfile中备注的国内需要设置的debian源(https://mirrors.tuna.tsinghua.edu.cn)其中debian源替换最好使用https,否则可能apt-get install过程报错:RUN sed -i 's@http://deb.debian.org@https://mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list.d/debian.sources。pip源也需要换
    # base image
    FROM python:3.12-slim-bookworm AS base
    
    ENV http_proxy=http://ip:port
    ENV https_proxy=http://ip:port
    ENV no_proxy=localhost,127.0.0.1,.srdcloud.cn,172.0.0.1/8,10.0.0.1/8,192.168.0.0/16
    
    WORKDIR /app/api
    
    # Install Poetry
    ENV POETRY_VERSION=2.0.1
    
    # if you located in China, you can use aliyun mirror to speed up
    RUN pip install --no-cache-dir poetry==${POETRY_VERSION} -i https://mirrors.aliyun.com/pypi/simple/
    
    # RUN pip install --no-cache-dir poetry==${POETRY_VERSION}
    
    # Configure Poetry
    ENV POETRY_CACHE_DIR=/tmp/poetry_cache
    ENV POETRY_NO_INTERACTION=1
    ENV POETRY_VIRTUALENVS_IN_PROJECT=true
    ENV POETRY_VIRTUALENVS_CREATE=true
    ENV POETRY_REQUESTS_TIMEOUT=15
    
    FROM base AS packages
    
    # if you located in China, you can use aliyun mirror to speed up
    RUN sed -i 's@http://deb.debian.org@https://mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list.d/debian.sources
    
    RUN apt-get update && apt-get install -y --no-install-recommends gcc g++ libc-dev libffi-dev libgmp-dev libmpfr-dev libmpc-dev
    
    # Install Python dependencies
    #COPY pyproject.toml poetry.lock ./
    COPY pyproject.toml ./
    RUN poetry lock
    RUN poetry install --sync --no-cache --no-root
    
    # production stage
    FROM base AS production
    
    ENV FLASK_APP=app.py
    ENV EDITION=SELF_HOSTED
    ENV DEPLOY_ENV=PRODUCTION
    ENV CONSOLE_API_URL=http://127.0.0.1:5001
    ENV CONSOLE_WEB_URL=http://127.0.0.1:3000
    ENV SERVICE_API_URL=http://127.0.0.1:5001
    ENV APP_WEB_URL=http://127.0.0.1:3000
    
    EXPOSE 5001
    
    # set timezone
    ENV TZ=Asia/Shanghai
    
    WORKDIR /app/api
    
    RUN sed -i 's@http://deb.debian.org@https://mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list.d/debian.sources
    
    RUN apt-get update && apt-get install -y --no-install-recommends \
            # basic environment
            curl nodejs libgmp-dev libmpfr-dev libmpc-dev \
            # For Security
            expat libldap-2.5-0 perl libsqlite3-0 zlib1g \
            # install a package to improve the accuracy of guessing mime type and file extension
            media-types \
            # install libmagic to support the use of python-magic guess MIMETYPE
            libmagic1 \
        && apt-get autoremove -y \
        && rm -rf /var/lib/apt/lists/*
    
    # Copy Python environment and packages
    ENV VIRTUAL_ENV=/app/api/.venv
    COPY --from=packages ${VIRTUAL_ENV} ${VIRTUAL_ENV}
    ENV PATH="${VIRTUAL_ENV}/bin:${PATH}"
    
    # Download nltk data
    RUN python -c "import nltk; nltk.download('punkt'); nltk.download('averaged_perceptron_tagger')"
    
    ENV TIKTOKEN_CACHE_DIR=/app/api/.tiktoken_cache
    
    RUN python -c "import tiktoken; tiktoken.encoding_for_model('gpt2')"
    
    # Copy source code
    COPY . /app/api/
    
    # Copy entrypoint
    COPY docker/entrypoint.sh /entrypoint.sh
    RUN chmod +x /entrypoint.sh
    
    ARG COMMIT_SHA
    ENV COMMIT_SHA=${COMMIT_SHA}
    
    ENV http_proxy=
    ENV https_proxy=
    ENV no_proxy=
    
    ENTRYPOINT ["/bin/bash", "/entrypoint.sh"]

     

  • 如果要通过代理执行apt-get命令,得注意环境变量的大小写问题:ENV http_proxy=http://ip:port。如果用了HTTP_PROXY,apt-get不识别。
  • pyproject.toml中要设置poetry的源,然后用peotry lock重新生成poetry.lock文件。也可以把命令放到Dockerfile中,在build过程中RUN peotry lock。
    [[tool.poetry.source]]
    name = "tuna"
    url = "https://pypi.tuna.tsinghua.edu.cn/simple/"
    priority = "primary"

     

附:

1、1.1.2需要下载的docker:

docker pull langgenius/dify-web:1.1.2
docker pull langgenius/dify-api:1.1.2
docker pull langgenius/dify-plugin-daemon:0.0.6-local
docker pull postgres:15-alpine
docker pull nginx:latest
docker pull redis:6-alpine
docker pull ubuntu/squid:latest docker pull langgenius
/dify-sandbox:0.2.10 docker pull semitechnologies/weaviate:1.19.0

 

mirrors.tuna.tsinghua.edu.cn
posted @ 2025-03-22 23:57  badwood  阅读(591)  评论(0)    收藏  举报
Badwood's Blog