本教程适用于Compose搭建的Dify,完成后期的一些进阶操作,例如修改知识库上传文件大小限制、自定义前端界面样式、增加工作空间等操作
常见问题
本地部署初始化后,密码错误如何重置?
- 使用 docker compose 方式部署,可执行以下命令进行重置
docker exec -it docker-api-1 flask reset-password
- 输入账户 email 以及两次新密码即可。
部署后如何升级版本?
- 如果是通过镜像启动,请重新拉取最新镜像完成升级。
本地部署版,如何更改空间的名称?
- 在数据库 tenants 表里修改。具体方式参考下面的创建工作空间
如果发生数据库迁移,需要备份哪些东西?
- 需要备份数据库、配置的存储以及向量数据库数据,若为 docker compose 方式部署,可直接备份 dify/docker/volumes 目录下所有数据内容。
root@huhy:~# ls dify/docker/volumes/
app certbot db myscale oceanbase opensearch plugin_daemon redis sandbox weaviate
本地部署版如何解决知识库文档上传的大小限制和数量限制。
- 可参考官网环境变量说明文档去配置。
/root/dify-main/docker/.env
# 修改为100M,默认15M
NGINX_CLIENT_MAX_BODY_SIZE=100M
# 上传文件大小限制,默认15M,调整为100
UPLOAD_FILE_SIZE_LIMIT=100
# 每次上传文件数上限,默认5个,调整50
UPLOAD_FILE_BATCH_LIMIT=50
部署客户端聊天界面
用于创建一个对话的客户端应用,调用服务端的应用地址
- 下载文件后上传
unzip webapp-conversation-main
cd webapp-conversation-main/
- 在当前目录下创建一个名为的文件.env.local,并从中复制内容.env.example
cp .env.example .env.local
- 在管理端获取所需的三个地址
- 创建APP_KEY
root@huhy:~/webapp-conversation-main# cat .env.local
NEXT_PUBLIC_APP_ID='fbdfee97-7ed3-4c99-9387-55b36b366e67'
NEXT_PUBLIC_APP_KEY='app-9CVGKyFtFIbNNVxpoMbH5QUh'
NEXT_PUBLIC_API_URL='http://192.168.200.160/v1'
- 修改index文件
root@huhy:~/webapp-conversation-main# cat config/index.ts
import type { AppInfo } from '@/types/app'
export const APP_ID = `${process.env.NEXT_PUBLIC_APP_ID}`
export const API_KEY = `${process.env.NEXT_PUBLIC_APP_KEY}`
export const API_URL = `${process.env.NEXT_PUBLIC_API_URL}`
export const APP_INFO: AppInfo = {
title: 'huhy',
description: 'description',
copyright: 'copyright',
privacy_policy: '',
default_language: 'zh-Hans'
}
export const isShowPrompt = true
export const promptTemplate = 'I want you to act as a javascript console.' #描述对话前的提示词
export const API_PREFIX = '/api'
export const LOCALE_COOKIE_NAME = 'locale'
export const DEFAULT_VALUE_MAX_LEN = 48
- 有两种方式构建使用,这里使用docker
docker build . -t difyv1/webapp-conversation:latest
docker run -itd -p 3000:3000 difyv1/webapp-conversation:latest
- 使用浏览器打开http://localhost:3000
自定义前端界面
进入容器docker-web-1
docker exec -it docker-web-1 sh
- 左上角logo图片替换: logo-site.png
/app/web/public/logo $ ls
logo-embedded-chat-avatar.png logo-embedded-chat-header.png logo-site-dark.png logo-site.png
/app/web/public/logo $
- 站点图标替换:favicon.ico
/app/web/public $ ls
embed.js embed.min.js favicon.ico logo pdf.worker.min.mjs screenshots vs
/app/web/public $
- 首页登录的背景图片替换:background.d3434daa.png
/app/web/.next/static/media $ ls background.d3434daa.png
background.d3434daa.png
/app/web/.next/static/media $ pwd
替换后重启容器即可生效
docker restart docker-web-1
定制化前端镜像
上面对容器的镜像都只是临时性的,删除容器就会丢失配置,如果需要长期进行使用的话可以自定义构建前端镜像
- 进入web目录下
/root/dify-main/web
- 该目录与上述容器的前端目录/app/web一致,本地修改后重新构建镜像
docker build . -t dify-web-huhy
root@huhy:~/dify-main/web# docker images | grep huhy
dify-web-huhy latest 59659c1b5b4c 4 minutes ago 436MB
- 启动该镜像:如果后端应用不在本地则修改URL地址
docker run -it -p 3000:3000 -e CONSOLE_URL=http://127.0.0.1:5001 -e APP_URL=http://127.0.0.1:5001 dify-web-huhy
root@huhy:~/dify-main/web# docker run -it -p 3000:3000 -e CONSOLE_URL=http://127.0.0.1:5001 -e APP_URL=http://127.0.0.1:5001 dify-web-huhy
-------------
__/\\\\\\\\\\\\\____/\\\\____________/\\\\____/\\\\\\\\\_____
_\/\\\/\\\_\/\\\\\\________/\\\\\\__/\\\///\\\___
_\/\\\_______\/\\\_\/\\\//\\\____/\\\//\\\_\///______\//\\\__
_\/\\\\\\\\\\\\\/__\/\\\\///\\\/\\\/_\/\\\___________/\\\/___
_\/\\\/____\/\\\__\///\\\/___\/\\\________/\\\//_____
_\/\\\_____________\/\\\____\///_____\/\\\_____/\\\//________
_\/\\\_____________\/\\\_____________\/\\\___/\\\/___________
_\/\\\_____________\/\\\_____________\/\\\__/\\\\\\\\\\\\\\\_
_\///______________\///______________\///__\///__
Runtime Edition
PM2 is a Production Process Manager for Node.js applications
with a built-in Load Balancer.
Start and Daemonize any application:
$ pm2 start app.js
Load Balance 4 instances of api.js:
$ pm2 start api.js -i 4
Monitor in production:
$ pm2 monitor
Make pm2 auto-boot at server restart:
$ pm2 startup
To go further checkout:
http://pm2.io/
-------------
pm2 launched in no-daemon mode (you can add DEBUG="*" env variable to get more messages)
2025-03-10T07:14:20: PM2 log: Launching in no daemon mode
2025-03-10T07:14:20: PM2 log: [PM2][WARN] Applications dify-web not running, starting...
2025-03-10T07:14:20: PM2 log: App [dify-web:0] starting in -cluster mode-
2025-03-10T07:14:20: PM2 log: App [dify-web:0] online
2025-03-10T07:14:20: PM2 log: App [dify-web:1] starting in -cluster mode-
2025-03-10T07:14:20: PM2 log: App [dify-web:1] online
2025-03-10T07:14:20: PM2 log: [PM2] App [dify-web] launched (2 instances)
2025-03-10T07:14:20: PM2 log: ┌────┬─────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │
├────┼─────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0 │ dify-web │ default │ 0.15.3 │ cluster │ 18 │ 0s │ 0 │ online │ 0% │ 48.9mb │ und… │ disabled │
│ 1 │ dify-web │ default │ 0.15.3 │ cluster │ 25 │ 0s │ 0 │ online │ 0% │ 46.0mb │ und… │ disabled │
└────┴─────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
2025-03-10T07:14:20: PM2 log: [--no-daemon] Continue to stream logs
2025-03-10T07:14:20: PM2 log: [--no-daemon] Exit on target PM2 exit pid=7
07:14:21 0|dify-web | ▲ Next.js 14.2.17
07:14:21 0|dify-web | - Local: http://4616bfe78e8d:3000
07:14:21 0|dify-web | - Network: http://172.17.0.2:3000
07:14:21 0|dify-web | ✓ Starting...
07:14:21 1|dify-web | ▲ Next.js 14.2.17
07:14:21 1|dify-web | - Local: http://4616bfe78e8d:3000
07:14:21 1|dify-web | - Network: http://172.17.0.2:3000
07:14:21 1|dify-web | ✓ Starting...
07:14:21 0|dify-web | ✓ Ready in 113ms
07:14:21 1|dify-web | ✓ Ready in 112ms
创建工作空间
Dify的开源社区版本默认是只有一个工作空间的,不能界面进行添加,可以手动从数据库中进行添加
- 在api容器中生成公钥和私钥
docker exec -it docker-api-1 sh
cd /tmp/
openssl genrsa -out private.pem 2048
openssl rsa -pubout -in private.pem -out public.pem
# cat public.pem
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA26RDlHBfhdO99hSFcGx8
fYVTwQSIpfTxGEUT7SCrFHh8AHgjkj2xvMnxU1ZsuBiPrL3XNEH1ZwTc++blJ9OK
2ONOTyaUN93CTceJ6FAfONjCQ7CNaJiB7pZzMa9CXLIQgCo2goAuNM12bV0qcqW/
cU4zwObOjutNtbLQj9bvaCRrzsux5Fnxhsv5IutpZlaCG7idw8I1okoiHprAb6L0
kQHchiBvISkDdevrrga81fULK0blJ109srOOWU3fD2UWF3/G0nbPoR84Sk8rurxP
h670y+g0S2TZ9DNtBZkYEiMdlLx3gb6MxKPXMDmokG8sZBHzoHyjkilG60ddCljm
LwIDAQAB
-----END PUBLIC KEY-----
- 进入数据库容器(dify使用postgre数据库)
docker exec -it docker-db-1 sh
psql -U postgres -d dify
- 插入工作空间记录,名称为dify-huhy,注意替换公钥
INSERT INTO "public"."tenants" ("name", "encrypt_public_key", "plan", "status") VALUES ('dify-huhy', '-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA26RDlHBfhdO99hSFcGx8
fYVTwQSIpfTxGEUT7SCrFHh8AHgjkj2xvMnxU1ZsuBiPrL3XNEH1ZwTc++blJ9OK
2ONOTyaUN93CTceJ6FAfONjCQ7CNaJiB7pZzMa9CXLIQgCo2goAuNM12bV0qcqW/
cU4zwObOjutNtbLQj9bvaCRrzsux5Fnxhsv5IutpZlaCG7idw8I1okoiHprAb6L0
kQHchiBvISkDdevrrga81fULK0blJ109srOOWU3fD2UWF3/G0nbPoR84Sk8rurxP
h670y+g0S2TZ9DNtBZkYEiMdlLx3gb6MxKPXMDmokG8sZBHzoHyjkilG60ddCljm
LwIDAQAB
-----END PUBLIC KEY-----', 'basic', 'normal');
- 查询dify-huhy工作空间的id
SELECT id FROM tenants WHERE name = 'dify-huhy';
dify=# SELECT id FROM tenants WHERE name = 'dify-huhy';
id
--------------------------------------
b05d104f-85d7-41f7-b779-b724d0215455
(1 row)
- 查询dify用户的id,注意在界面提前创建好
SELECT "id" FROM "accounts" where name ='huhy';
dify=# SELECT "id" FROM "accounts" where name ='huhy';
id
--------------------------------------
b12265a9-6191-42c3-8588-e6768f833276
(1 row)
- 将该用户和工作空间绑定,注意tenant_id为工作空间id,account_id为用户id
INSERT INTO "public"."tenant_account_joins" ("tenant_id", "account_id", "role", "invited_by", "current") VALUES ('b05d104f-85d7-41f7-b779-b724d0215455','b12265a9-6191-42c3-8588-e6768f833276', 'admin', NULL, 't');
dify=# INSERT INTO "public"."tenant_account_joins" ("tenant_id", "account_id", "role", "invited_by", "current") VALUES ('b05d104f-85d7-41f7-b779-b724d0215455','b12265a9-6191-42c3-8588-e6768f833276', 'admin', NULL, 't');
INSERT 0 1
- 再次进入api容器,在/app/api/storage/privkeys目录下面创建工作空间,名称为该空间的数据库id,将私钥拷贝到目录下
docker exec -it docker-api-1 sh
cd /app/api/storage/privkeys
mkdir -p b05d104f-85d7-41f7-b779-b724d0215455
cp /tmp/private.pem b05d104f-85d7-41f7-b779-b724d0215455/private.pem
- 浏览器界面刷新即可查看到手动添加的工作空间