docker部署grafana
创建docker-compose.yaml
version: '3'
volumes:
volume-grafana-lib:
name: grafana-lib-test
driver_opts:
type: none
o: bind
device: ${PWD}/data/grafana/lib
services:
grafana:
restart: always
image: grafana/grafana:10.1.9
container_name: grafana_test
environment:
- GF_DEFAULT_LOCALE=zh-CN
ports:
- 13000:3000
volumes:
- volume-grafana-lib:/var/lib/grafana
对外暴露的端口可以自行修改,这边使用的是将13000映射到容器内的3000端口,可以将13000修改为其他需要的端口
创建挂载目录
mkdir -p ./data/grafana/lib
启动容器
docker compose up
访问web控制台
地址:http://host:13000
用户名/密码:admin/admin
可以将语言修改为中文
如果暴露在外网建议修改默认密码
配置token访问
修改docker-compose.yaml配置
version: '3'
volumes:
volume-grafana-lib:
name: grafana-lib-test
driver_opts:
type: none
o: bind
device: ${PWD}/data/grafana/lib
services:
grafana:
restart: always
image: grafana/grafana:10.1.9
container_name: grafana_test
environment:
- GF_DEFAULT_LOCALE=zh-CN
- GF_SECURITY_ALLOW_EMBEDDING=true
# 配置nginx代理访问
- GF_SERVER_ROOT_URL=https:host/gf
- GF_AUTH_JWT_ENABLED=true
- GF_AUTH_JWT_ENABLE_LOGIN_TOKEN=true
- GF_AUTH_JWT_KEY_ID=123123
- GF_AUTH_JWT_HEADER_NAME=X-Jwt-Assertion
- GF_AUTH_JWT_EMAIL_CLAIM=sub
- GF_AUTH_JWT_NAME_CLAIM=name
- GF_AUTH_JWT_USERNAME_CLAIM=sub
- GF_AUTH_JWT_JWK_SET_FILE=/var/lib/grafana/my_config/jwks.json
- GF_AUTH_JWT_AUTO_SIGN_UP=true
- GF_AUTH_JWT_EXPECT_CLAIMS={}
- GF_AUTH_JWT_URL_LOGIN=true
Ports:
- 13000:3000
Volumes:
- volume-grafana-lib:/var/lib/grafana
生成jwks
示例中使用的是golang进行生成,也可以使用其他开发语言或者网站在线生成
package main
import (
"encoding/json"
"fmt"
"gopkg.in/square/go-jose.v2"
)
func main() {
//需要与grafana配置中一致
keyID := "123123"
//与token中的key一致
key := "abcd123456"
symKey := jose.JSONWebKey{
Key: []byte(key),
KeyID: keyID,
Algorithm: string(jose.HS512),
Use: "sig",
}
jwkJSON, err := json.MarshalIndent(jose.JSONWebKeySet{Keys: []jose.JSONWebKey{symKey}}, "", " ")
if err != nil {
fmt.Printf("Failed to marshal JWK: %s\n", err)
return
}
fmt.Println("jwks: \n", string(jwkJSON))
}
新建文件 ./data/grafana/lib/my_config/jwks.json
将生成的内容复制到文件中
重新创建docker容器
docker-compose up -d
生成token
package main
import (
"fmt"
"github.com/golang-jwt/jwt/v4"
"time"
)
func main() {
//需要与grafana配置中一致
keyID := "123123"
//与生成jwks中的key一致
key := "abcd123456"
token := jwt.NewWithClaims(jwt.SigningMethodHS512, jwt.MapClaims{
"name": "qc",
"sub": "qc@qc.com",
"role": "Viewer",
"exp": time.Now().Add(time.Hour * 24 * 365).Unix(),
})
token.Header["kid"] = keyID
tokenString, err := token.SignedString([]byte(key))
if err != nil {
panic(err)
}
fmt.Println("token:\n", tokenString)
}
通过token的方式访问仪表盘
在url参数中增加 auth_token={token} 即可免密访问