Linux服务器部署完整教程(PostgreSQL + Docker + Dify)

适用系统:Ubuntu/Debian系列Linux发行版
部署内容:PostgreSQL数据库、Docker容器引擎、Dify AI应用平台


第一部分:PostgreSQL数据库安装与配置

步骤1:更新系统包管理器并安装PostgreSQL

sudo apt update

说明:更新系统的软件包列表,确保能获取到最新的软件版本信息。这是安装任何软件前的标准操作。

sudo apt install postgresql vim -y

说明

  • postgresql:安装PostgreSQL数据库服务端
  • vim:安装Vim文本编辑器(用于后续编辑配置文件)
  • -y:自动确认安装,无需手动输入"yes"

步骤2:配置PostgreSQL允许远程连接

2.1 修改主配置文件 postgresql.conf
sudo vim /etc/postgresql/18/main/postgresql.conf

说明:使用Vim编辑器打开PostgreSQL的主配置文件。路径中的18表示PostgreSQL版本号。

操作步骤

  1. 在文件末尾添加以下内容(按i键进入插入模式):
listen_addresses = '*'

参数说明

  • listen_addresses = '*':设置PostgreSQL监听所有网络接口的连接请求,而不仅仅是localhost。这是允许远程访问的关键配置。
  1. 保存退出:按Esc键 → 输入:wq → 按Enter

2.2 修改客户端认证配置 pg_hba.conf
sudo vim /etc/postgresql/18/main/pg_hba.conf

说明:打开PostgreSQL的客户端认证控制文件,该文件定义了哪些用户可以从哪些IP地址以何种方式连接数据库。

操作步骤
在文件末尾添加以下内容:

host    all             all             0.0.0.0/0               scram-sha-256

字段说明(从左到右):

字段 含义
host - 表示TCP/IP连接类型
第一个all - 允许连接的数据库名称(all表示所有数据库)
第二个all - 允许连接的用户名(all表示所有用户)
0.0.0.0/0 - 允许连接的客户端IP地址范围(0.0.0.0/0表示所有IP)
scram-sha-256 - 加密认证方式(PostgreSQL推荐的密码加密方法)

步骤3:设置PostgreSQL超级用户密码

sudo -u postgres psql

说明:切换到postgres系统用户并进入PostgreSQL命令行交互界面(psql)。postgres是PostgreSQL默认的超级用户账户。

在PostgreSQL命令行中执行以下SQL语句:

ALTER USER postgres WITH ENCRYPTED PASSWORD '******';

说明

  • ALTER USER postgres:修改postgres用户的属性
  • WITH ENCRYPTED PASSWORD '******':设置加密密码(请将******替换为您想要的强密码)
  • 该命令会使用scram-sha-256算法对密码进行加密存储

退出psql

\q

说明:输入\q退出PostgreSQL命令行界面,返回到Linux shell。


步骤4:重启并启用PostgreSQL服务

sudo systemctl restart postgresql

说明:重启PostgreSQL服务,使刚才修改的配置文件生效。类似于Windows中的"重启服务"操作。

sudo systemctl status postgresql

说明:查看PostgreSQL服务的运行状态,可以确认服务是否正常启动。如果看到active (running)字样,表示服务运行正常。

sudo systemctl enable postgresql

说明:设置PostgreSQL开机自启动。这样即使服务器重启,PostgreSQL也会自动运行,无需手动启动。


步骤5:配置防火墙开放数据库端口

sudo ufw allow 5432/tcp -- 允许 TCP 5432 端口

说明

  • ufw:Ubuntu防火墙管理工具(Uncomplicated Firewall)
  • allow:允许规则
  • 5432/tcp:PostgreSQL默认使用的TCP端口号
  • 此命令允许外部主机通过5432端口连接到本机的PostgreSQL数据库
sudo ufw reload -- 重载防火墙规则

说明:重新加载防火墙规则,使刚才添加的端口放行规则立即生效。


第二部分:Docker容器引擎安装与配置

步骤6:更新包索引并安装Docker依赖组件

# 1. 更新apt包索引并安装依赖,以允许apt通过HTTPS使用仓库
sudo apt-get update

说明:再次更新软件包列表,确保后续安装的软件版本是最新的。

sudo apt-get install -y ca-certificates curl

说明

  • ca-certificates:CA证书包,用于验证HTTPS连接的安全性
  • curl:命令行HTTP客户端工具,用于下载文件和与API交互
  • 这两个是安装Docker所必需的前置依赖

步骤7:添加Docker官方GPG密钥

# 2. 添加 Docker 的官方 GPG 密钥(使用阿里云镜像加速)
sudo install -m 0755 -d /etc/apt/keyrings

说明

  • install:创建目录或复制文件的命令
  • -m 0755:设置目录权限为755(所有者可读写执行,组和其他用户可读执行)
  • -d:创建目录
  • 此命令创建/etc/apt/keyrings目录,用于存放GPG密钥
sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc

说明

  • curl -fsSL:静默模式下载文件(f=失败不输出,s=静默模式,S=显示错误,L=跟随重定向)
  • 从阿里云镜像站下载Docker官方的GPG公钥
  • -o:指定保存路径为/etc/apt/keyrings/docker.asc
  • GPG密钥用于验证Docker软件包的真实性和完整性
sudo chmod a+r /etc/apt/keyrings/docker.asc

说明

  • chmod:修改文件权限
  • a+r:给所有用户(all)添加读取(read)权限
  • 确保所有用户都能读取这个GPG密钥文件

步骤8:配置Docker APT软件源

# 3. 设置 Docker 的 APT 软件源(同样使用阿里云镜像)
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

说明(逐段解析):

  1. 架构检测$(dpkg --print-architecture) 自动获取系统CPU架构(如amd64、arm64)
  2. 版本检测$(. /etc/os-release && echo "$VERSION_CODENAME") 获取Ubuntu版本代号(如jammy、focal)
  3. 软件源地址:使用阿里云镜像加速的Docker CE仓库地址
  4. 稳定版通道stable 表示安装稳定版本的Docker
  5. 写入配置:通过管道|tee命令将配置写入/etc/apt/sources.list.d/docker.list文件
  6. 静默输出> /dev/null 将输出重定向到空设备,不在终端显示

效果:将Docker官方软件源添加到APT的软件源列表中,且使用国内阿里云镜像加速下载速度。


步骤9:清空旧的Docker软件源配置(可选但推荐)

sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

说明

  • 使用tee命令清空docker.list文件内容(如果之前有旧配置的话)
  • 确保软件源配置干净,避免冲突

步骤10:更新包索引并建立缓存

# 4. 更新 apt 包索引,建立缓存
sudo apt-get update

说明:再次更新APT包索引,这次会从刚添加的Docker软件源获取Docker相关的包信息。这一步必须执行,否则系统不知道有Docker可以安装。


步骤11:安装Docker CE及其组件

# 执行命令,安装 Docker CE(社区版)相关组件
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

说明(各组件功能):

组件名称 功能说明
docker-ce Docker Community Edition(社区版)核心引擎
docker-ce-cli Docker命令行客户端工具
containerd.io 容器运行时(负责管理容器的生命周期)
docker-buildx-plugin Docker Buildx构建插件(支持多架构镜像构建)
docker-compose-plugin Docker Compose插件(用于编排多容器应用)
  • -y:自动确认安装所有组件

步骤12:验证Docker安装是否成功

docker -v

说明:查看已安装的Docker版本号。如果输出版本信息(如Docker version 24.x.x),则表示安装成功。


步骤13:启动Docker服务

# 启动 Docker
sudo systemctl start docker

说明:启动Docker守护进程(daemon)。Docker采用客户端-服务器架构,此命令启动的是后台的服务端进程。


步骤14:设置Docker开机自启动

# 设置开机自启
sudo systemctl enable docker

说明:将Docker服务设置为系统启动时自动运行,无需每次重启服务器后手动启动Docker。


步骤15:验证Docker服务运行状态

# 校验安装启动是否成功(不报错即可)
sudo docker ps

说明

  • docker ps:列出当前正在运行的Docker容器
  • 如果Docker服务正常运行,即使没有容器在运行,也不会报错(会显示空列表)
  • 如果看到类似"Cannot connect to the Docker daemon"的错误,说明Docker服务未正常启动

步骤16:配置Docker镜像加速器(重要!国内必配)

sudo tee /etc/docker/daemon.json <<'EOF'
{
  "registry-mirrors": [
    "https://dockerercfjsdelivrfy.fy",
    "https://docker.jsdelivr.fy",
    "https://dockertest.jsdelivr.fy",
    "https://docker.m.daocloud.io",
    "https://mirror.iscas.ac.cn",
    "https://docker.nju.edu.cn",
    "https://gst6r6j9.mirror.aliyuncs.com",
    "https://mirror.tuna.tsinghua.edu.cn",
    "http://mirrors.ustc.edu.cn",
    "http://mirrors.sohu.com"
  ]
}
EOF

说明

  • 为什么需要镜像加速器?:Docker Hub(Docker官方镜像仓库)服务器在国外,直接拉取镜像速度极慢甚至超时失败。配置国内镜像加速器可以将下载请求转发到国内的镜像节点,大幅提升下载速度。
  • daemon.json:Docker守护进程的配置文件
  • registry-mirrors:镜像仓库地址列表(已配置多个备用节点)
  • 工作原理:Docker拉取镜像时,会依次尝试这些镜像地址,直到成功下载
  • 注意:不同时间某些镜像地址可能失效,建议保留多个备选地址

步骤17:重新加载配置并重启Docker

sudo systemctl daemon-reload

说明:通知systemd重新加载配置文件,使其识别到新的Docker配置变更。

sudo systemctl restart docker

说明:重启Docker服务,使镜像加速器配置生效。


步骤18:验证镜像加速器配置是否生效

sudo docker info | grep -A 15 "Registry Mirrors"

说明

  • docker info:显示Docker系统的详细信息(包括存储驱动、网络配置等)
  • grep -A 15 "Registry Mirrors":从输出中筛选"Registry Mirrors"关键字及其后15行内容
  • 如果能看到刚才配置的镜像地址列表,说明配置成功

步骤19:将当前用户加入Docker用户组(避免每次都用sudo)

sudo usermod -aG docker $USER

说明

  • usermod:修改用户属性的命令
  • -aG docker:将用户追加(append)到docker用户组(Group)
  • $USER:当前登录的用户名(系统自动变量)
  • 作用:加入docker组后,执行docker命令时不需要再加sudo前缀
  • 注意:执行此命令后,需要注销并重新登录(或执行newgrp docker)才能生效

第三部分:Dify AI应用平台部署

步骤20:安装额外工具包

sudo apt update
sudo apt install util-linux-extra

说明

  • util-linux-extra:包含一些额外的Linux实用工具
  • Dify部署可能需要其中的某些工具(如newgrp等)

步骤21:创建Docker用户组(如不存在)

newgrp docker

说明

  • newgrp:切换到指定的用户组
  • 此命令用于激活刚加入的docker组权限(无需注销登录即可临时生效)
  • 或者用于确保docker组存在

步骤22:克隆Dify项目代码仓库

git clone https://gh-proxy.org/https://github.com/langgenius/dify.git

说明

  • git clone:从远程Git仓库克隆代码到本地
  • https://gh-proxy.org/...:使用了GitHub代理加速(因为GitHub在国内访问可能较慢或不稳定)
  • langgenius/dify:Dify项目的GitHub仓库地址(langgenius是组织名,dify是项目名)
  • Dify是什么?:一款开源的LLM应用开发平台,可以帮助您快速构建AI应用

步骤23:进入Dify项目目录

cd dify

说明:切换当前工作目录到刚克隆的dify文件夹中。


步骤24:进入Docker子目录

cd docker

说明:进入dify项目下的docker目录,这里包含了Docker Compose编排文件和环境配置模板。


步骤25:复制并编辑环境变量配置文件

cp .env.example .env

说明

  • cp:复制文件命令
  • .env.example:环境变量的示例模板文件
  • .env:实际使用的环境变量配置文件(Docker Compose会读取此文件)
  • 此命令将示例配置复制为正式配置文件

步骤26:修改Docker Compose配置文件中的端口映射

vim docker-compose.yaml

说明:打开Docker Compose的编排配置文件进行编辑。

操作步骤

  1. 搜索EXPOSE_NGINX_PORT=80这一行
  2. i键进入插入模式
  3. 80修改为8080(避免与系统其他服务占用80端口冲突)
  4. Esc键退出插入模式
  5. 输入:wq保存并退出

为什么要改端口?

  • 默认的80端口是HTTP标准端口,可能被Nginx、Apache等Web服务器占用
  • 改为8080可以避免端口冲突
  • 也可以根据需要改为其他未被占用的端口号

步骤27:修改环境变量配置文件中的端口

vim .env

说明:打开环境变量配置文件进行编辑。

操作步骤

  1. 搜索EXPOSE_NGINX_PORT=80这一行
  2. i键进入插入模式
  3. 同样将80修改为8080(必须与docker-compose.yaml中保持一致)
  4. Esc键退出插入模式
  5. 输入:wq保存并退出

注意:两个文件中的端口号必须一致,否则会导致服务无法正常访问。


步骤28:启动Dify所有服务容器

docker compose up -d

说明

  • docker compose:Docker Compose V2版本的命令(新版Docker内置)
  • up:创建并启动容器
  • -d:detached mode(分离/后台模式),让容器在后台运行而不占用当前终端
  • 执行过程:Docker Compose会根据docker-compose.yaml文件的定义,依次拉取所需的Docker镜像、创建网络、启动多个相互协作的容器(包括Nginx、Redis、PostgreSQL、Weaviate等)
  • 首次执行耗时较长:因为需要从网络下载多个Docker镜像(取决于网速,可能需要10-30分钟)

等待提示:当这条命令执行完毕(回到命令行提示符),表示所有容器已成功启动。


第四部分:访问与验证

步骤29:在浏览器中访问Dify平台

在浏览器输入 localhost:8080

说明

  • 打开您喜欢的浏览器(Chrome、Firefox、Edge等)
  • 在地址栏输入http://localhost:8080http://您的服务器IP:8080
  • 如果是在本地机器上部署,使用localhost:8080
  • 如果是在远程服务器上部署,使用http://服务器公网IP:8080

预期结果

  • 应该能看到Dify的欢迎页面或注册/登录界面
  • 首次访问需要进行管理员账号注册和初始化设置
进入 dify

说明:完成上述所有步骤后,您就成功进入了Dify AI应用开发平台!


附录:常用运维命令速查

PostgreSQL常用命令

# 连接数据库
sudo -u postgres psql

# 查看所有数据库
\l

# 切换数据库
\c 数据库名

# 查看所有表
\dt

# 退出psql
\q

# 查看PostgreSQL状态
sudo systemctl status postgresql

# 停止PostgreSQL
sudo systemctl stop postgresql

Docker常用命令

# 查看运行中的容器
docker ps

# 查看所有容器(包括停止的)
docker ps -a

# 查看容器日志
docker logs 容器名或ID

# 进入容器内部
docker exec -it 容器名或ID /bin/bash

# 停止容器
docker stop 容器名或ID

# 启动容器
docker start 容器名或ID

# 删除容器
docker rm 容器名或ID

# 查看Docker镜像
docker images

# 删除镜像
docker rmi 镜像名或ID

# 查看Docker磁盘占用
docker system df

# 清理无用数据(谨慎使用)
docker system prune -a

Dify运维命令

# 进入docker目录
cd dify/docker

# 停止所有服务
docker compose down

# 重启所有服务
docker compose restart

# 查看所有服务状态
docker compose ps

# 查看某个服务的实时日志
docker compose logs -f 服务名

# 更新Dify到最新版本
git pull origin main
docker compose up -d

故障排查指南

问题1:PostgreSQL无法远程连接

检查项

  1. 确认postgresql.conflisten_addresses = '*'已正确配置
  2. 确认pg_hba.conf中已添加正确的访问规则
  3. 确认防火墙已开放5432端口:sudo ufw status
  4. 确认PostgreSQL服务正在运行:sudo systemctl status postgresql

问题2:Docker拉取镜像失败或速度慢

解决方案

  1. 检查镜像加速器配置:cat /etc/docker/daemon.json
  2. 尝试更换其他镜像地址
  3. 重启Docker服务:sudo systemctl restart docker
  4. 如果仍失败,尝试使用代理或VPN

问题3:Dify容器启动失败

排查步骤

  1. 查看容器状态:docker compose ps(查看哪个容器状态异常)
  2. 查看错误日志:docker compose logs 服务名
  3. 常见原因:
    • 端口被占用(修改.envdocker-compose.yaml中的端口号)
    • 内存不足(至少需要4GB可用内存)
    • 磁盘空间不足(df -h检查磁盘使用情况)

问题4:浏览器无法访问 localhost:8080

检查清单

  1. 确认Docker容器全部正常运行:docker compose ps
  2. 确认端口映射正确:docker compose config | grep 8080
  3. 如果是远程服务器,确认云服务器安全组已开放8080端口
  4. 确认本地防火墙未阻止:sudo ufw status

安全建议

  1. 修改默认密码:务必将PostgreSQL的postgres用户密码和Dify的管理员密码修改为强密码
  2. 限制访问来源:在生产环境中,pg_hba.conf中的0.0.0.0/0应改为具体的可信IP地址段
  3. 启用HTTPS:生产环境建议配置SSL证书,启用HTTPS访问
  4. 定期备份:定期备份PostgreSQL数据库和Dify的配置文件
  5. 更新维护:定期执行sudo apt update && sudo apt upgrade更新系统和软件包
  6. 监控日志:定期检查Docker和PostgreSQL的日志,及时发现异常
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐