首页 公告 项目 RSS

利用 Wakapi 监控你的编程活动

December 8, 2023 本文有 1479 个字 需要花费 3 分钟阅读

简介

Wakapi 是一个开源的、自我托管的 WakaTime 兼容后端服务,它可以统计和展示开发者的编程活动。

项目地址

你可以在以下地址找到 Wakapi 的源代码:

https://github.com/muety/wakapi

我的 yaml 地址

你可以在以下地址找到我使用的 yaml 文件:

https://github.com/bboysoulcn/kubernetes-sample/tree/master/wakapi

安装服务端

安装 Wakapi 服务端相对较简单。首先,你需要选择一个数据库,Wakapi 支持以下数据库:

  • SQLite(默认,易于设置)
  • MySQL(推荐,因为经过最广泛的测试)
  • MariaDB(开源 MySQL 替代品)
  • Postgres(也是开源的)
  • CockroachDB(云原生、分布式、Postgres 兼容 API)

我在这里选择的是 MySQL。如果你也选择 MySQL,你需要在启动 Wakapi 之前创建一个新的数据库,供 Wakapi 使用:

CREATE DATABASE wakapi CHARACTER SET utf8mb4;

接下来,我们将在 Kubernetes 中安装 Wakapi,这需要一些常规的操作。首先,我们需要创建一个证书。你可以使用以下的 certificate.yaml 文件:

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: wakapi.example.cn
  namespace: app
spec:
  dnsNames:
  - wakapi.example.cn # 要签发证书的域名
  issuerRef:
    kind: ClusterIssuer
    name: letsencrypt-dns01 # 引用 ClusterIssuer,指示采用 dns01 方式进行校验
  secretName: wakapi-example-cn-tls # 最终签发出来的证书会保存在这个 Secret 里面

接下来,我们需要创建一个 Ingress。你可以使用以下的 ingress.yaml 文件:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: wakapi-ingress
  namespace: app
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/proxy-body-size: "4096m"
spec:
  rules:
  - host: "wakapi.example.cn"
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: wakapi-svc
            port:
              number: 3000
  tls:
  - hosts:
    - wakapi.example.cn
    secretName: wakapi-example-cn-tls

然后,我们需要创建一个 service 。请注意,服务的名称不能是 “wakapi”,因为这会和 Wakapi 的环境变量产生冲突。你可以在以下地址找到更多的信息:

https://github.com/muety/wakapi/issues/567

你可以使用以下的 svc.yaml 文件创建服务:

apiVersion: v1
kind: Service
metadata:
  name: wakapi-svc
  namespace: app
spec:
  type: ClusterIP
  selector:
    app: wakapi
  ports:
  - port: 3000
    targetPort: 3000
    name: web

最后,我们需要创建一个 Deployment 。你可以使用以下的 deploy.yaml 文件创建 Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wakapi
  namespace: app
spec:
  selector:
    matchLabels:
      app: wakapi
  template:
    metadata:
      labels:
        app: wakapi
    spec:
      containers:
      - name: wakapi
        image: ghcr.io/muety/wakapi:2.10.0
        ports:
        - containerPort: 3000
          name: web
        env:
        - name: WAKAPI_DB_TYPE
          value: "mysql"
        - name: WAKAPI_DB_NAME
          value: "wakapi"
        - name: WAKAPI_DB_USER
          value: "root"
        - name: WAKAPI_DB_PASSWORD
          value: "password"
        - name: WAKAPI_DB_HOST
          value: "mysql.example.com"
        - name: WAKAPI_DB_PORT
          value: "3306"
        - name: ENVIRONMENT
          value: "prod"
        - name: WAKAPI_PASSWORD_SALT
          value: "salt"
        - name: WAKAPI_LEADERBOARD_ENABLED # 是否启用公共排行榜
          value: "false"
        - name: WAKAPI_REPORT_TIME_WEEKLY	# 发送电子邮件报告的工作日和时间
          value: "0 0 8 * * *"
        - name: WAKAPI_SUPPORT_CONTACT # 在页面上显示为支持联系人的电子邮件地址
          value: "[email protected]"
        - name: WAKAPI_ALLOW_SIGNUP # 是否启用用户注册
          value: "false"
        - name: WAKAPI_DISABLE_FRONTPAGE # 是否禁用登陆页面(对于个人实例有用)
          value: "true"
        - name: WAKAPI_EXPOSE_METRICS # 是否公开 Prometheus 指标/api/metrics
          value: "true"
        - name: WAKAPI_DB_MAX_CONNECTIONS # 最大数据库连接数
          value: "10"
        - name: WAKAPI_MAIL_ENABLED	# 是否允许Wakapi发送电子邮件(例如密码重置)
          value: "true"
        - name: WAKAPI_MAIL_SENDER # 外发邮件的默认发件人地址(MailWhale 忽略)
          value: "Wakapi <[email protected]>"
        - name: WAKAPI_MAIL_PROVIDER # smtp用于发送邮件的实现
          value: "smtp"
        - name: WAKAPI_MAIL_SMTP_HOST # 用于发送邮件的 SMTP 服务器地址
          value: "smtp.example.com"
        - name: WAKAPI_MAIL_SMTP_PORT # SMTP 服务器端口
          value: "25"
        - name: WAKAPI_MAIL_SMTP_USER # SMTP服务器验证用户名
          value: "[email protected]"
        - name: WAKAPI_MAIL_SMTP_PASS # SMTP服务器验证密码
          value: "password"
        - name: WAKAPI_MAIL_SMTP_TLS # SMTP 服务器是否需要 TLS 加密
          value: "false"
        - name: WAKAPI_PUBLIC_URL # 可以公开找到您的 Wakapi 实例的 URL
          value: "https://wakapi.example.cn"

如果你使用 Docker Compose,只需要确保你设置了正确的环境变量即可。

客户端配置

Wakapi 支持所有 WakaTime 支持的客户端。你可以在以下地址找到所有支持的客户端:

https://wakatime.com/plugins

配置客户端也很简单。在你的机器上,打开 ~/.wakatime.cfg 文件,并添加以下内容:

[settings]

# Your Wakapi server URL or 'https://wakapi.dev/api' when using the cloud server
api_url = http://localhost:3000/api

# Your Wakapi API key (get it from the web interface after having created an account)
api_key = 406fe41f-6d69-4183-a4cc-121e0c524c2b

请注意,如果你像我一样使用 VS Code 的 Remote Development 功能,你需要在你的远程机器上也添加这个配置,并确保 Wakapi 可以被远程机器访问。

Prometheus 和 Grafana 配置

首先,你需要将你的 API 密钥转换为 base64 格式:

echo "<YOUR_API_KEY>" | base64

然后,你需要添加一个新的 job 配置。你可以使用以下的配置:

      - job_name: 'wakapi' 
        scrape_interval: 1m
        scheme: https
        metrics_path: '/api/metrics'
        bearer_token: 'token'
        static_configs:
          - targets: ['wakapi.example.com']

请注意,在最新的 2.10.0 版本的 Wakapi 中,你需要将 WAKAPI_LEADERBOARD_ENABLED 设置为 “false”,否则会出现 bug。你可以在以下地址找到更多的信息:

https://github.com/muety/wakapi/issues/576

最后,你需要在 Grafana 中添加一个新的 dashboard。你可以在以下地址找到一个预先配置的 dashboard:

https://grafana.com/grafana/dashboards/12790-wakatime-coding-stats/

只需要导入这个 dashboard,你就可以开始使用了。

欢迎关注我的博客www.bboy.app

Have Fun