You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose部署mosquitto-go-auth插件加载失败求助

问题分析与解决方案

问题根源

你遇到的插件加载错误并非缺少Golang环境,而是C库不兼容:

  • 官方eclipse-mosquitto:2.0.18镜像基于Alpine Linux,使用轻量的musl C库
  • 你在Ubuntu(使用glibc)编译的go-auth.so依赖glibc的特定符号(如__fprintf_chk),musl库没有实现该符号,导致插件加载失败

完整部署配置

1. 项目结构

./
├── docker-compose.yml
├── .env
├── postgres-data/
├── mosquitto/
│   ├── Dockerfile       # 自定义mosquitto镜像构建文件
│   ├── config/
│   │   └── mosquitto.conf
│   ├── log/             # 手动创建,确保权限为mosquitto用户可写
│   └── init-mqtt-auth-db.sh
└── pgadmin-data/

2. 自定义Mosquitto镜像Dockerfile

创建./mosquitto/Dockerfile,使用Debian基础镜像(与Ubuntu的glibc兼容),并在容器内编译mosquitto-go-auth:

# 使用Debian版mosquitto镜像,保证glibc兼容
FROM eclipse-mosquitto:2.0.18-debian

# 安装编译依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
    golang gcc libc-dev git \
    && rm -rf /var/lib/apt/lists/*

# 克隆并编译mosquitto-go-auth
WORKDIR /tmp
RUN git clone https://github.com/iegomez/mosquitto-go-auth.git \
    && cd mosquitto-go-auth \
    && make

# 将编译好的插件复制到mosquitto配置目录
RUN cp /tmp/mosquitto-go-auth/go-auth.so /mosquitto/config/

# 切换回mosquitto用户,保证权限安全
USER mosquitto

3. 修改docker-compose.yml

调整mqtt服务配置,使用自定义镜像、修复网络连通性、添加健康检查依赖:

version: "3.9"
services:
  postgres:
    container_name: postgres_container
    image: postgres:14.8-alpine3.18
    command:
      - "postgres"
      - "-c"
      - "max_connections=50"
      - "-c"
      - "shared_buffers=1GB"
      - "-c"
      - "effective_cache_size=4GB"
      - "-c"
      - "work_mem=16MB"
      - "-c"
      - "maintenance_work_mem=512MB"
      - "-c"
      - "random_page_cost=1.1"
      - "-c"
      - "temp_file_limit=10GB"
      - "-c"
      - "log_min_duration_statement=200ms"
      - "-c"
      - "idle_in_transaction_session_timeout=10s"
      - "-c"
      - "lock_timeout=1s"
      - "-c"
      - "statement_timeout=60s"
      - "-c"
      - "shared_preload_libraries=pg_stat_statements"
      - "-c"
      - "pg_stat_statements.max=10000"
      - "-c"
      - "pg_stat_statements.track=all"
    environment:
      POSTGRES_DB: ${DATABASE_NAME}
      POSTGRES_USER: ${DATABASE_USER}
      POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
      PGDATA: "/var/lib/postgresql/data/pgdata"
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
      - ../2. Init Database:/docker-entrypoint-initdb.d
      - ./mosquitto/init-mqtt-auth-db.sh:/docker-entrypoint-initdb.d/init-mqtt-auth-db.sh
    ports:
      - "5432:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${DATABASE_USER} -d ${DATABASE_NAME}"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 10s
    restart: unless-stopped
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 4G
    networks:
      - postgres

  pgadmin:
    container_name: pgadmin_container
    image: dpage/pgadmin4:7.2
    environment:
      PGADMIN_DEFAULT_EMAIL: ${PG_DEFAULT_EMAIL}
      PGADMIN_DEFAULT_PASSWORD: ${PG_DEFAULT_ADMIN_PASSWORD}
      PGADMIN_CONFIG_SERVER_MODE: "False"
    volumes:
      - pgadmin-data:/var/lib/pgadmin
    ports:
      - "5050:80"
    restart: unless-stopped
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 1G
    networks:
      - postgres

  mqtt-broker:
    # 使用自定义构建的镜像
    build: ./mosquitto
    user: mosquitto
    volumes:
      - ./mosquitto/config/mosquitto.conf:/mosquitto/config/mosquitto.conf
      # 挂载日志目录而非文件,避免权限冲突
      - ./mosquitto/log:/mosquitto/log
      - data:/mosquitto/data
    ports:
      - target: 1883
        published: 1883
        protocol: tcp
        mode: host
      - target: 9001
        published: 9001
        protocol: tcp
        mode: host
    networks:
      - postgres  # 加入postgres网络,确保能连接数据库
      - mqtt-net
    # 等待postgres健康检查通过后再启动
    depends_on:
      postgres:
        condition: service_healthy

volumes:
  postgres-data:
  pgadmin-data:
  data:
    name: "mqtt-broker-data"

networks:
  postgres:
    driver: bridge

  mqtt-net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.100.10.0/24

4. 调整mosquitto.conf

修正容器内路径配置,确保与挂载目录匹配:

persistence true
# 改为容器内的data目录,与volume挂载对应
persistence_location /mosquitto/data/

# log info:
log_dest file /mosquitto/log/mosquitto.log

# auth:
allow_anonymous false
listener 1883
# 使用容器内编译好的插件路径
auth_plugin /mosquitto/config/go-auth.so
auth_opt_log_level debug
require_certificate false

# postgress options:
auth_opt_backends postgres
auth_opt_pg_host postgres
auth_opt_pg_port 5432
auth_opt_pg_dbname API
auth_opt_pg_user mqtt_user
auth_opt_pg_password mqtt_pass

# hash options:
auth_opt_pg_hasher bcrypt
auth_opt_pg_hasher_salt_size 16           # salt bytes length

# ssl
auth_opt_pg_sslmode disable

# auth options
auth_opt_pg_connect_tries 5
auth_opt_pg_userquery select password from MqttUser where login = $1 limit 1
auth_opt_pg_superquery select count(*) from test_user where username = $1 and is_admin = true

部署步骤

  1. 确保./mosquitto/log目录存在,执行chown 1883:1883 ./mosquitto/log(mosquitto容器用户UID为1883)
  2. 配置.env文件,确保DATABASE_NAME=API、DATABASE_USER=mqtt_user、DATABASE_PASSWORD=mqtt_pass与mosquitto.conf一致
  3. 执行docker-compose build构建自定义mosquitto镜像
  4. 执行docker-compose up -d启动服务

内容的提问来源于stack exchange,提问作者FroggerProgger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 15:00:01