Linux服务器部署完整教程(PostgreSQL + Docker + Dify)
本文提供了在Ubuntu/Debian系统上部署PostgreSQL数据库和Docker引擎的完整教程。主要内容包括:PostgreSQL的安装配置(修改监听地址、设置远程访问、修改认证配置、设置密码);Docker引擎的安装(添加GPG密钥、配置阿里云镜像源、安装核心组件)。教程详细说明了每个命令的作用和参数含义,并包含服务重启、防火墙配置等后续操作,适合需要搭建AI应用平台基础环境的用户参考。
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版本号。
操作步骤:
- 在文件末尾添加以下内容(按
i键进入插入模式):
listen_addresses = '*'
参数说明:
listen_addresses = '*':设置PostgreSQL监听所有网络接口的连接请求,而不仅仅是localhost。这是允许远程访问的关键配置。
- 保存退出:按
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
说明(逐段解析):
- 架构检测:
$(dpkg --print-architecture)自动获取系统CPU架构(如amd64、arm64) - 版本检测:
$(. /etc/os-release && echo "$VERSION_CODENAME")获取Ubuntu版本代号(如jammy、focal) - 软件源地址:使用阿里云镜像加速的Docker CE仓库地址
- 稳定版通道:
stable表示安装稳定版本的Docker - 写入配置:通过管道
|和tee命令将配置写入/etc/apt/sources.list.d/docker.list文件 - 静默输出:
> /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的编排配置文件进行编辑。
操作步骤:
- 搜索
EXPOSE_NGINX_PORT=80这一行 - 按
i键进入插入模式 - 将
80修改为8080(避免与系统其他服务占用80端口冲突) - 按
Esc键退出插入模式 - 输入
:wq保存并退出
为什么要改端口?
- 默认的80端口是HTTP标准端口,可能被Nginx、Apache等Web服务器占用
- 改为8080可以避免端口冲突
- 也可以根据需要改为其他未被占用的端口号
步骤27:修改环境变量配置文件中的端口
vim .env
说明:打开环境变量配置文件进行编辑。
操作步骤:
- 搜索
EXPOSE_NGINX_PORT=80这一行 - 按
i键进入插入模式 - 同样将
80修改为8080(必须与docker-compose.yaml中保持一致) - 按
Esc键退出插入模式 - 输入
: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:8080或http://您的服务器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无法远程连接
检查项:
- 确认
postgresql.conf中listen_addresses = '*'已正确配置 - 确认
pg_hba.conf中已添加正确的访问规则 - 确认防火墙已开放5432端口:
sudo ufw status - 确认PostgreSQL服务正在运行:
sudo systemctl status postgresql
问题2:Docker拉取镜像失败或速度慢
解决方案:
- 检查镜像加速器配置:
cat /etc/docker/daemon.json - 尝试更换其他镜像地址
- 重启Docker服务:
sudo systemctl restart docker - 如果仍失败,尝试使用代理或VPN
问题3:Dify容器启动失败
排查步骤:
- 查看容器状态:
docker compose ps(查看哪个容器状态异常) - 查看错误日志:
docker compose logs 服务名 - 常见原因:
- 端口被占用(修改
.env和docker-compose.yaml中的端口号) - 内存不足(至少需要4GB可用内存)
- 磁盘空间不足(
df -h检查磁盘使用情况)
- 端口被占用(修改
问题4:浏览器无法访问 localhost:8080
检查清单:
- 确认Docker容器全部正常运行:
docker compose ps - 确认端口映射正确:
docker compose config | grep 8080 - 如果是远程服务器,确认云服务器安全组已开放8080端口
- 确认本地防火墙未阻止:
sudo ufw status
安全建议
- 修改默认密码:务必将PostgreSQL的postgres用户密码和Dify的管理员密码修改为强密码
- 限制访问来源:在生产环境中,
pg_hba.conf中的0.0.0.0/0应改为具体的可信IP地址段 - 启用HTTPS:生产环境建议配置SSL证书,启用HTTPS访问
- 定期备份:定期备份PostgreSQL数据库和Dify的配置文件
- 更新维护:定期执行
sudo apt update && sudo apt upgrade更新系统和软件包 - 监控日志:定期检查Docker和PostgreSQL的日志,及时发现异常
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)