Grafana 安装与部署:容器化与配置即代码
安装与部署:容器化与配置即代码
Grafana 本体是一个无状态服务,唯一的持久化需求是它的 SQLite 数据库与插件目录。生产部署的关键不是把它跑起来,而是把它变成「配置即代码」——大盘和数据源都从文件加载,手工在界面上改的东西不作为事实来源。
- 确认依赖:一个可用的容器运行时、一块持久化卷、一个可从 Grafana 访问到的数据源地址。Grafana 只发查询不存数据,所以网络连通性是前提。
- 设置管理员口令:用环境变量
GF_SECURITY_ADMIN_PASSWORD指定初始密码,不要用默认的 admin/admin。 - 挂载持久化卷到
/var/lib/grafana,否则容器重建后所有大盘、用户、密钥都会丢。 - 准备 provisioning 目录:
provisioning/datasources/*.yaml声明数据源,provisioning/dashboards/*.yaml声明大盘从哪个目录加载。 - 写
grafana.ini,至少配好[server]的root_url、[database]、[auth.anonymous]与[smtp]。 - 启动后用
docker compose logs -f grafana确认无报错,再打开 Web 界面验证数据源「Save & Test」通过。
services:
grafana:
image: grafana/grafana:latest
environment:
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD}
# 反向代理下必须与实际访问地址一致,否则登录跳转会出错
- GF_SERVER_ROOT_URL=https://grafana.example.com/
- GF_USERS_ALLOW_SIGN_UP=false
- GF_INSTALL_PLUGINS=grafana-clock-panel
volumes:
- ./grafana-data:/var/lib/grafana
- ./provisioning:/etc/grafana/provisioning
- ./grafana.ini:/etc/grafana/grafana.ini
ports:
- "3000:3000"
# grafana.ini 常用段落
[server]
domain = grafana.example.com
root_url = https://grafana.example.com/
# 反向代理在 Grafana 前面时,务必让代理透传这些头
# proxy_set_header Host $host;
# proxy_set_header X-Forwarded-Proto $scheme;
[database]
type = sqlite3
path = grafana.db
# 并发写入较多时建议换成 PostgreSQL,避免 SQLite 锁竞争
# type = postgres
# host = postgres.internal:5432
# name = grafana
# user = grafana
# password = ${DB_PASSWORD}
[auth.anonymous]
enabled = false
# 若要做大屏免登录展示,可设为 true 并配合 org_role = Viewer
[smtp]
enabled = true
host = smtp.example.com:587
user = alert@example.com
password = ${SMTP_PASSWORD}
from_address = alert@example.com
from_name = Grafana Alert
[alerting]
# 关闭旧的 dashboard 告警面板入口,统一走 Alert Rule
enabled = true
配置即代码:数据源与大盘
# provisioning/datasources/prometheus.yaml
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus.internal:9090
isDefault: true
jsonData:
# 与 Prometheus 的 scrape_interval 保持一致,避免查询步长过密
timeInterval: 15s
httpMethod: POST
# provisioning/dashboards/default.yaml
apiVersion: 1
providers:
- name: 'business-dashboards'
orgId: 1
folder: '业务大盘'
type: file
disableDeletion: false
# 每 30 秒扫描一次目录,文件改动后自动生效
updateIntervalSeconds: 30
allowUiUpdates: true
options:
path: /etc/grafana/provisioning/dashboards/json
常见报错与处理
| 报错 | 原因 | 处理 |
|---|---|---|
database is locked | SQLite 并发写入冲突,多用户同时保存大盘时容易触发 | 切换 [database] type = postgres,或减少并发写操作 |
Too many open files | 进程文件描述符上限太低,连接池或插件打开文件过多 | 提高容器 ulimits.nofile,并检查是否有连接泄漏 |
plugin not found | 插件未安装,或容器无外网导致下载失败 | 用 GF_INSTALL_PLUGINS 预装,或离线把插件放进 plugins 目录 |
401 Unauthorized | 数据源凭据错误、API Token 过期、或数据源侧关闭了匿名访问 | 在数据源设置里重新 Save & Test,检查 Token 有效期 |
| 反向代理下登录后跳回登录页 / 重定向异常 | root_url 与实际访问地址不一致,或代理未透传 Host 头 | 把 root_url 改成对外地址,代理补 X-Forwarded-Proto 与 Host |
面板显示 No data | 查询时间范围与数据源时区不一致,或标签选错 | 用 Explore 单独验证查询,再核对大盘时间范围与面板变量默认值 |

