Docker部署Loki+Grafana+Vector实现全服务器日志监控(含N8N/SSH/Fail2ban监控)
一、前言
很多自建服务玩家、服务器运维新手,都想把 Docker容器日志(N8N/Airflow等)、服务器SSH登录日志、Fail2ban攻防拦截日志 统一收集,在Grafana图形界面集中查看、检索、回溯。
本文全程小白向,无复杂命令、无专业术语绕弯,手把手教你用 Docker Compose 一键部署 Loki + Grafana + Vector,实现:
- 所有Docker容器日志自动采集
- 服务器SSH登录/失败日志收集
- Fail2ban拦截黑客暴力破解日志收集
- Grafana可视化检索、按关键词过滤、按时间回溯
二、架构原理
- Vector:日志采集搬运工,负责抓取容器日志、系统日志,转发给Loki
- Loki:日志存储仓库,专门存放所有日志,不占大量磁盘
- Grafana:可视化面板,用来查询、看日志、做监控面板
简单理解:Vector收日志 → Loki存日志 → Grafana看日志
三、前置准备
- 一台Linux云服务器(Ubuntu/Debian均可)
- 已安装
docker和docker-compose - 服务器开放3000(Grafana)、3100(Loki)端口
四、目录准备
新建专属部署目录,后续所有配置都放这里:
bash
mkdir -p ~/apps/log-monitor
cd ~/apps/log-monitor
五、编写docker-compose.yml
在 log-monitor 目录创建 docker-compose.yml,复制以下内容直接使用:
yaml
version: "3.8"
services:
loki:
image: grafana/loki:2.9.0
container_name: loki
restart: always
ports:
- "3100:3100"
volumes:
- ./loki-data:/loki
command: -config.file=/etc/loki/local-config.yaml
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: always
ports:
- "3000:3000"
volumes:
- ./grafana-data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=adminXXXXX
depends_on:
- loki
vector:
image: timberio/vector:0.55.0-alpine
container_name: vector
restart: always
volumes:
- ./vector.toml:/etc/vector/vector.toml
- /var/run/docker.sock:/var/run/docker.sock
- /var/log:/host/var/log:ro
说明:
- 挂载
docker.sock:让Vector能监听所有Docker容器日志 - 挂载
/var/log:ro:只读挂载系统日志目录,用来采集auth.log、fail2ban.log - Grafana默认账号:
admin密码:adminxxx,可自行修改
六、编写Vector核心配置 vector.toml
在同目录创建 vector.toml,最终稳定可用版,无语法报错、无429限流:
toml
data_dir = "/var/lib/vector"
# 1. 采集所有Docker容器日志
[sources.docker_logs]
type = "docker_logs"
docker_host = "unix:///var/run/docker.sock"
# 2. 采集服务器SSH登录日志 auth.log
[sources.host_auth]
type = "file"
include = ["/host/var/log/auth.log"]
read_from = "end"
# 3. 采集Fail2ban拦截日志
[sources.fail2ban]
type = "file"
include = ["/host/var/log/fail2ban.log"]
read_from = "end"
# 输出所有日志到Loki
[sinks.loki]
type = "loki"
inputs = ["docker_logs", "host_auth", "fail2ban"]
endpoint = "http://loki:3100"
encoding.codec = "json"
# 固定标签,保证Loki正常接收
labels.job = "vector"
配置关键点小白解释:
read_from = "end":只采集后续新产生日志,不加载海量历史日志,避免Loki被限流报429错误- 三个数据源:容器日志、SSH日志、Fail2ban日志,统一发给Loki
七、启动整套服务
在 log-monitor 目录执行:
bash
docker compose up -d
等待1分钟,三个容器全部后台启动完成。
查看Vector运行日志,确认无报错:
bash
docker compose logs -f vector
出现 Healthcheck passed 即为正常启动。
八、配置Grafana对接Loki
- 浏览器访问:
服务器IP:3000 - 账号
admin,密码admin123456 - 左侧菜单 → Connections → Data sources
- 点击 Add data source → 选择 Loki
- URL填写:
http://loki:3100 - 拉到最下方 → Save & test,显示成功即可
九、日常日志查询用法(小白直接复制)
进入Grafana左侧 Explore,数据源选Loki,直接用下面语句查询:
1. 查看所有采集的日志
logql
{job="vector"}
2. 只看N8N容器日志
logql
{container="n8n"}
3. 只看SSH登录、登录失败日志
logql
{job="vector"} |= "sshd"
4. 只看Fail2ban黑客拦截、封禁IP日志
logql
{job="vector"} |= "fail2ban"
十、常见问题避坑(全程踩坑总结)
问题1:Grafana打开日志一片空白,明明Vector已采集
原因:Grafana默认只显示前1000行 ,Docker容器日志太多,把系统日志挤没了
解决:
- 右上角Limit默认1000,改成10000
- 不用全量查询,直接用
|= "关键词"过滤
问题2:Vector报 429 Too Many Requests
原因:一次性读取海量历史日志,Loki限流拒绝
解决:配置里统一用 read_from = "end" 只收集新日志,不加载历史
问题3:看不到Fail2ban/SSH日志,Vector能读到文件但不显示
原因1:日志文件权限限制,Vector无读取权限
执行命令开放权限:
bash
sudo chmod 644 /var/log/auth.log /var/log/fail2ban.log
原因2:混用动态标签模板,Loki解析失败
解决:直接用本文极简配置,不搞复杂标签模板 ,只用固定 job="vector"
问题4:Vector配置文件报TOML语法错误
原因:缩进、冒号格式不对
解决:直接复制本文完整 vector.toml,不要手动改格式
十一、使用总结
- 整套架构一条命令启动,无需复杂安装
- 自动全覆盖:Docker容器日志 + SSH安全日志 + Fail2ban攻防日志
- 不用登录服务器看日志,浏览器随时随地检索、回溯
- 只需复制配置,无需懂日志原理即可落地使用
- 避开了429限流、标签解析、行数限制、权限不足等所有坑