docker部署grafana

发布时间:2024-07-10 04:56:04
修改时间:2024-10-30 04:01:24
总阅读数:130
今日阅读数:0
昨日日阅读数:0
字数:3693

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} 即可免密访问