虚拟机部署dify

虚拟机部署dify

_

镜像拉取到私有镜像仓库

由于docker.io无法再访问了,所以需要将需要的镜像拉取下来还比较麻烦。

配置镜像源

第一个想法是通过一些镜像代理来实现;

尝试如下镜像源:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": [
        "https://dockerproxy.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://docker.nju.edu.cn"
    ]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

发现依旧不可用。

搜索了下,尝试了轩辕镜像免费版:

bash <(wget -qO- https://xuanyuan.cloud/docker.sh)

发现也不靠谱,限制太多:

  • 一会超时
  • 一会不可访问
  • ....

直接放弃算球,无奈还是考虑把一离开镜像拉到本地处理

拉取镜像到私有haobor

  1. 先把当前dify 对应的dockerCompose.yaml文件中依赖的镜像有哪些列举出来
    // dify 1.11.2
    langgenius/dify-api:1.11.2
    langgenius/dify-web:1.11.2
    busybox:latest
    postgres:15-alpine
    redis:6-alpine
    langgenius/dify-sandbox:0.2.12
    langgenius/dify-plugin-daemon:0.5.2-local
    ubuntu/squid:latest
    certbot/certbot
    nginx:latest
    semitechnologies/weaviate:1.27.0
    oceanbase/oceanbase-ce:4.3.5-lts
    oceanbase/seekdb:latest
    langgenius/qdrant:v1.8.3
    pgvector/pgvector:pg16
    vastdata/vastbase-vector
    tensorchord/pgvecto-rs:pg16-v0.3.0
    ghcr.io/chroma-core/chroma:0.5.20
    milvusdb/milvus:v2.6.3
    
  2. 配置到个人的github imgpull 的项目,把这些镜像同步到私有harbor。

github action

镜像同步完后,算是走完第一步了。

修改dockerCompose.yaml

由于dify 的 dockerCompose.yaml依旧引用的docker.io的镜像,需要把镜像地址增加上私有harbor的域名+项目路径。

部署dify服务

进入到docker 目录下,执行如下命令

cp .env.example .env,根据样例生成环境变量文件。

docker compose up -d,启动服务


服务启动后,就能访问dify了。

但是虚拟机上部署dify还不是很安全,dify 最近也暴露了一些漏洞问题。所以决定限定ip 访问 80 端口。

限定部分IP访问

firewalld 限定ip(没成功)

我的虚拟机是Anolis OS 8.x 的版本。

准备 firewalld去限定ip不能访问80端口,尝试路径如下:

# 检查 firewalld 状态
systemctl status firewalld

# 启动 firewalld 服务
systemctl start firewalld

# 设置开机自动启动,避免重启后服务关闭
systemctl enable firewalld

# 允许 192.168.1.100 访问80端口
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.100" port port="80" protocol="tcp" accept"

# 拒绝所有其他 IP 访问80端口
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" port port="80" protocol="tcp" reject"

# 重载防火墙配置
firewall-cmd --reload

# 查看已配置的规则,确认生效
firewall-cmd --list-rich-rules

不出意外,不能访问了,删除了rule也不能访问了。只能重启,查查资料,发现然我执行上述操作之外,还要

# 永久添加 http 服务规则
sudo firewall-cmd --permanent --add-service=http

# 重载配置
sudo firewall-cmd --reload

# 查看已放行的端口
sudo firewall-cmd --list-ports

# 或查看已放行的服务
sudo firewall-cmd --list-services

好吧,依旧不行,直接放弃了。

nftables 限定IP(成功了)

既然 firewall不可以,我准备尝试一下 iptables

但是查资料才知道:

部分新系统(如 CentOS 8、Ubuntu 20.04+)默认用 nftables 替代 iptables,此时执行 iptables 命令其实是 nftables 的兼容模式。

尝试路径如下:

# 启动服务
sudo systemctl start nftables

# 开机自启
sudo systemctl enable nftables

# 检查状态(正常会显示 active (running))
sudo systemctl status nftables

# 查询 DOCKER-USER 的ip filter
sudo nft -a list chain ip filter DOCKER-USER

# 拒绝所有其他IP访问80端口
sudo nft insert rule ip filter DOCKER-USER tcp dport 80 drop

# 放行指定IP访问80端口(先拒绝再放行,顺序很重要)
sudo nft insert rule ip filter DOCKER-USER ip saddr 172.18.213.180 tcp dport 80 accept

# 查询 DOCKER-USER 的ip filter
sudo nft -a list chain ip filter DOCKER-USER

# 加错了,可以删除
sudo nft delete rule ip filter DOCKER-USER handle xxx

过程中遇到的坑:

  1. 容器映射的 80 端口流量不走 INPUT 链,而是走 FORWARD
  2. Docker 官方推荐在 DOCKER-USER 链添加自定义转发规则(它是 FORWARD 链的第一个跳转目标,优先级最高),这是限制容器端口的最佳方式
  3. 80端口,先拒绝再放行,顺序很重要;不然被覆盖不生效。

想持久化,按照下述操作:

# Ubuntu/Debian/CentOS 通用(配置文件路径:/etc/nftables.conf)
sudo nft list ruleset > /etc/nftables.conf

# 重启 nftables 服务
sudo systemctl restart nftables

# 重新查看规则,确认还在
sudo nft list ruleset

如果有一批IP可以通过如下操作执行:

  1. 准备 IP 列表文件
    先创建一个文本文件(比如 allow_ips.txt),每行写一个需要放行的 IP(支持单个 IP 或 CIDR 网段,如 192.168.1.100192.168.2.0/24):

    # 创建并编辑 IP 列表文件
    sudo vim /root/allow_ips.txt
    

    文件内容示例(按需修改):

    192.168.1.100
    192.168.1.101
    192.168.2.0/24
    10.0.0.5
    10.0.0.6/32
    
  2. 循环添加放行规则
    执行以下脚本,批量读取 IP 列表并添加规则(规则会插入到 DOCKER-USER 链最前面,保证优先级):

    # 循环读取 IP 列表,逐个添加放行规则
    while read -r ip; do
      # 跳过空行和注释行(以 # 开头)
      if [[ -z "$ip" || "$ip" =~ ^# ]]; then
        continue
      fi
      # 添加放行规则(insert 确保规则在最前面)
      sudo nft insert rule ip filter DOCKER-USER ip saddr "$ip" tcp dport 80 accept
      echo "已添加放行规则:$ip"
    done < /root/allow_ips.txt
    
    # 最后添加拒绝所有其他 IP 的规则(如果还没加)
    sudo nft insert rule ip filter DOCKER-USER tcp dport 80 drop
    
  3. 验证批量添加的规则

sudo nft list chain ip filter DOCKER-USER
每日科技新闻速览(2026-01-08) 2026-01-08
nftables入门 2026-01-08

评论区