如何持久化Docker部署的Graylog流与输入配置?
我来帮你解决Graylog跨环境配置持久化的问题,其实核心在于搞定MongoDB里的配置存储(Graylog的流、输入这类配置都存在Mongo里),还有跨机器的配置迁移,下面给你分场景的具体方案:
如何持久化Graylog的流与输入配置(跨环境复用)
一、同机器/环境下:通过持久化MongoDB数据卷保留配置
你的现有docker-compose没给MongoDB挂载本地卷,所以换机器后Mongo里的配置直接丢失了。先调整docker-compose,给MongoDB(还有ElasticSearch、Graylog)添加本地卷挂载,让数据存在本地磁盘:
修改后的完整docker-compose片段
version: '3' services: mongodb: image: mongo:3.6 volumes: # 把MongoDB的Graylog配置数据映射到本地目录 - ./mongodb_data:/data/db restart: always elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.23 volumes: # 持久化ES的日志数据 - ./es_data:/usr/share/elasticsearch/data environment: - http.host=0.0.0.0 - transport.host=localhost - network.host=0.0.0.0 - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ulimits: memlock: soft: -1 hard: -1 deploy: resources: limits: memory: 1g restart: always graylog: image: graylog/graylog:2.4.0-1 environment: - GRAYLOG_PASSWORD_SECRET=somepasswordpepper - GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918 - GRAYLOG_WEB_ENDPOINT_URI=http://127.0.0.1:9000/api links: - mongodb:mongo - elasticsearch depends_on: - mongodb - elasticsearch volumes: # 持久化Graylog的本地配置与日志 - ./graylog_data:/usr/share/graylog/data ports: - 9000:9000 - 514:514 - 514:514/udp - 12201:12201 - 12201:12201/udp restart: always
注意事项:
- 提前在当前目录创建
mongodb_data、es_data、graylog_data这三个文件夹- 给Graylog的目录设置正确权限:
chown 1100:1100 ./graylog_data(容器内Graylog用户的UID/GID是1100,否则会出现读写权限问题)
这样配置后,MongoDB里的Graylog配置会存在本地mongodb_data目录,就算重新部署容器或者在同机器切换环境,配置都能保留。
二、跨机器/环境:导出导入Graylog配置
如果需要把配置迁移到另一台机器,光靠复制卷可能不方便,这时候可以用Graylog的REST API或者MongoDB备份工具来迁移:
方法1:用Graylog API导出导入配置
先确保原环境的Graylog正常运行,用curl调用API导出配置:
- 导出所有输入:
curl -u admin:admin -X GET http://localhost:9000/api/system/inputs | jq '.[]' > graylog_inputs.json
- 导出所有流:
curl -u admin:admin -X GET http://localhost:9000/api/streams | jq '.streams[]' > graylog_streams.json
注:如果没装
jq工具,可以去掉| jq '.[]'直接导出原始JSON,之后手动处理也可以。
在新环境启动Graylog后,再用curl导入配置:
- 导入输入:
cat graylog_inputs.json | jq -c '.[]' | while read input; do curl -u admin:admin -X POST http://localhost:9000/api/system/inputs -H "Content-Type: application/json" -d "$input" done
- 导入流:
cat graylog_streams.json | jq -c '.[]' | while read stream; do # 导入时要删除id、创建时间这类会冲突的字段 stream_clean=$(echo "$stream" | jq 'del(.id, .created_at, .updated_at)') curl -u admin:admin -X POST http://localhost:9000/api/streams -H "Content-Type: application/json" -d "$stream_clean" done
方法2:直接备份恢复MongoDB数据
这是更省心的方式,直接备份原环境MongoDB里的Graylog数据库,然后在新环境恢复:
- 备份原环境MongoDB数据:
# 先进入MongoDB容器执行备份 docker exec <你的mongodb容器名> mongodump --db graylog --out /backup # 把备份文件复制到本地 docker cp <你的mongodb容器名>:/backup ./graylog_mongo_backup
- 新环境恢复数据:
# 把备份文件复制到新的MongoDB容器里 docker cp ./graylog_mongo_backup <新环境mongodb容器名>:/backup # 恢复数据库 docker exec <新环境mongodb容器名> mongorestore --db graylog /backup/graylog
关键注意点
- 确保新旧环境的Graylog版本完全一致(你用的是2.4.0-1),不同版本的配置结构可能有差异,会导致导入失败。
- 导入配置后,记得检查输入的监听地址(比如新机器IP不同的话,可能需要调整输入的绑定地址)。
- 持久化卷的时候,一定要注意目录权限,避免容器无法读写数据导致启动失败。
内容的提问来源于stack exchange,提问作者Piotr
相关产品推荐
相关产品推荐

