我想要部署Dify,问了千问,似乎安装Dify比吃饭还简单。
开始用sqlite数据库部署,确实很简单,千文没有骗人,但是我后来改成了使用PostgreSQL数据库,事情就变了。
一.env中的密码
Dify 后端配置
SECRET_KEY=your_secret_key_here
ENCRYPTION_KEY=your_encryption_key_here_32_chars # 必须是 32 字符长
这个密码要避免 shell 特殊字符,我的密码设置为:SECRET_KEY=Kj8#mN!pQ2$vLx@wR5&zX9*bE7%yH1
因为我在密码用中了$符号,然后一直报错:
WARN[0000] The "vLx" variable is not set. Defaulting to a blank string.
WARN[0000] The "vLx" variable is not set. Defaulting to a blank string.
二.启动后,Dify无法登录
localhost:/home/dify #docker log Api
app.config.from_object(Config())
File "/app/api/config.py", line 213, in init
self.BROKER_USE_SSL = self.CELERY_BROKER_URL.startswith('rediss://')
AttributeError: 'NoneType' object has no attribute 'startswith'
None of PyTorch, TensorFlow >= 2.0, or Flax have been found. Models won't be available and only tokenizers, configuration and file/data utilities can be used.
Traceback (most recent call last):
CELERY_BROKER_URL 环境变量未被正确设置,值为 None,而 Dify 的配置代码试图对它调用 .startswith() 方法,导致崩溃
一问千问,说要在.env中设置。
.env
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=
构造 Celery Broker URL(注意:无密码时用 redis://,有密码用 :password@)
CELERY_BROKER_URL=redis://:{REDIS_PASSWORD}@{REDIS_HOST}:${REDIS_PORT}/0
但是设置后页面还是过不去,输入用户名和密码没有反应,点初始化,就是图标转圈,没有结果。
docker ps -a查看所有容器都正常启动
docker logs dify-redis-1 也没有发现错误。
再问千问,说改改IP地址
替换成服务器的真实内网或公网 IP
CONSOLE_API_URL=http://192.168.10.5:3001
WEB_API_URL=http://192.168.10.5:3001
改完后重新启动
在 dify 目录下执行
docker-compose down
docker-compose up -d
启动后错误消息是变了,出现新错误:
signin:1 Access to fetch at 'http://192.168.10.5:3001/console/api/login' from origin 'http://192.168.10.5:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource
三.CORS问题
再次修改.env
允许来自 3000 端口的跨域请求(注意:必须带协议和端口)
WEB_API_CORS_ALLOW_ORIGINS=["http://192.168.10.5:3000"]
改为后再重启。重启后发现错误是一样的,修改好像无效。
Access to fetch at 'http://192.168.10.5:3001/console/api/system-features' from origin 'http://192.168.10.5:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
再问千问,给了建议修改docker-compose.yaml .
api:
image: langgenius/dify-api:0.6.10
environment:
... 其他环境变量 ...
WEB_API_CORS_ALLOW_ORIGINS: '["*"]' # ← 临时允许所有来源
...
重启后,错误并没有消失,还是一样的。
Access to fetch at 'http://192.168.10.5:3001/console/api/system-features' from origin 'http://192.168.10.5:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
千问也傻了,但是这不妨碍AI继续编 。
让继续执行:curl http://localhost:3001/console/api/version
{"code": "invalid_param", "message": "Missing required parameter in the query string", "params": "current_version"}
执行:curl -H "Origin: http://192.168.10.5:3000" \
-H "Access-Control-Request-Method: POST" \
-H "Access-Control-Request-Headers: Content-Type" \
-X OPTIONS \
http://localhost:3001/console/api/login -i
HTTP/1.1 200 OK
Server: gunicorn
Date: Thu, 13 Nov 2025 12:35:59 GMT
Connection: keep-alive
Content-Type: text/html; charset=utf-8
Allow: POST, OPTIONS
Set-Cookie: remember_token=; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Path=/
X-Version: 0.6.10
X-Env: PRODUCTION
Content-Length: 0
千问发现:
没有 Access-Control-Allow-Origin
没有 Access-Control-Allow-Methods
没有 Access-Control-Allow-Headers
CORS 中间件未启用,因为 WEB_API_CORS_ALLOW_ORIGINS 没有被正确传入或解析。
继续执行:
docker exec -it dify-api-1 cat /app/api/app.py | grep -i cors
from flask_cors import CORS
CORS(service_api_bp,
CORS(web_bp,
r"/*": {"origins": app.config['WEB_API_CORS_ALLOW_ORIGINS']}},
CORS(console_app_bp,
r"/*": {"origins": app.config['CONSOLE_CORS_ALLOW_ORIGINS']}},
CORS(files_bp,
千问觉得这就是根本原因:Dify 对 /console/api/... 路由(即登录接口)使用的蓝图是 console_app_bp
而它读取的 CORS 配置是:
CONSOLE_CORS_ALLOW_ORIGINS
而不是 WEB_API_CORS_ALLOW_ORIGINS
再继续修改.env
CONSOLE_CORS_ALLOW_ORIGINS: '["*"]'
docker-compose down
docker-compose up -d
重启后,问题确实变了。
Failed to load resource: the server responded with a status of 500 (INTERNAL SERVER ERROR)
四.500错误
CORS问题已解,但是业务逻辑奔溃了,查看日志是在数据库初始化过程中。
File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 924, in do_execute
cursor.execute(statement, parameters)
sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedTable) relation "dify_setups" does not exist
LINE 2: FROM dify_setups
这Dify这么流行,如果搭建这么复杂,怎么可能流行起来??我觉得按千问现在这么个状态搞下去肯定是搞不定,还是回到人工处理。
五.端口冲突
自己去dify网站,打开了https://docs.dify.ai/zh-hans/getting-started/install-self-hosted/docker-compose
这次按着官网的步骤进行部署:
git clone https://github.com/langgenius/dify.git --branch 0.15.3
cd dify/docker
cp .env.example .env
docker-compose up -d
Error response from daemon: driver failed programming external connectivity on endpoint docker-nginx-1 (e42c993228422269deecca5c23d1d2bd4ba486eba0098c2f8b3cdf27a97a12c2): Error starting userland proxy: listen tcp4 0.0.0.0:80: bind: address already in use
原因是我已经安装过了nginx,80端口已经使用掉了。
修改.env中 nginx端口80为8080,再重启,很顺利。
六.配置LLM
正常登录Dify,开始配置Dify调用本地部署的deepseek模型。
1.右上角找到设置
2.在模型供应商中找到添加 OpenAI-API-compatible,选择LLM,特别要注意:不要因为自己的模型使用ollama管理,就选择ollama。模型名称需要和你实际使用的模型名称要完全一致。
3.API key中随便输入。API endpoint URL 中输入deepseek服务器地址https://192.168.10.250/
正常工作。