初始化
Build docker and publish / prepare (push) Has been cancelled
Build docker and publish / build (map[dockerfile:deploy/Dockerfile.admin image_name:ppanel-admin name:admin]) (push) Has been cancelled
Build docker and publish / build (map[dockerfile:deploy/Dockerfile.api image_name:ppanel-api name:api]) (push) Has been cancelled
Build docker and publish / build (map[dockerfile:deploy/Dockerfile.node image_name:ppanel-node name:node]) (push) Has been cancelled
Build docker and publish / build (map[dockerfile:deploy/Dockerfile.queue image_name:ppanel-queue name:queue]) (push) Has been cancelled
Build docker and publish / build (map[dockerfile:deploy/Dockerfile.scheduler image_name:ppanel-scheduler name:scheduler]) (push) Has been cancelled
Build docker and publish / deploy (push) Has been cancelled
Build docker and publish / notify (push) Has been cancelled

This commit is contained in:
2026-02-26 04:12:43 -08:00
commit 9dacd85a89
210 changed files with 8261 additions and 0 deletions
+23
View File
@@ -0,0 +1,23 @@
Name: zero-ppanel-scheduler
Mode: dev
Log:
Mode: console
Encoding: plain
Level: debug
Telemetry:
Name: zero-ppanel-scheduler
Endpoint: 127.0.0.1:4318
Sampler: 1.0
Batcher: otlphttp
MySQL:
DataSource: "root:password@tcp(127.0.0.1:3306)/ppanel?charset=utf8mb4&parseTime=true"
Redis:
Host: 127.0.0.1:6379
Type: node
Asynq:
Addr: 127.0.0.1:6379
+28
View File
@@ -0,0 +1,28 @@
Name: zero-ppanel-scheduler
Mode: pro
Log:
Mode: file
Encoding: json
Level: info
Path: /var/log/zero-ppanel/scheduler
KeepDays: 15
Rotation: daily
Telemetry:
Name: zero-ppanel-scheduler
Endpoint: http://jaeger:4318/v1/traces
Sampler: 0.1
Batcher: otlphttp
MySQL:
DataSource: "${MYSQL_DSN}"
Redis:
Host: "${REDIS_HOST}"
Type: node
Pass: "${REDIS_PASS}"
Asynq:
Addr: "${REDIS_HOST}"
Pass: "${REDIS_PASS}"
+25
View File
@@ -0,0 +1,25 @@
Name: zero-ppanel-scheduler
Mode: test
Log:
Mode: file
Encoding: json
Level: info
Path: logs/scheduler
KeepDays: 7
Telemetry:
Name: zero-ppanel-scheduler
Endpoint: http://jaeger:4318/v1/traces
Sampler: 0.5
Batcher: otlphttp
MySQL:
DataSource: "root:password@tcp(mysql:3306)/ppanel?charset=utf8mb4&parseTime=true"
Redis:
Host: redis:6379
Type: node
Asynq:
Addr: redis:6379
+30
View File
@@ -0,0 +1,30 @@
package config
import (
"github.com/zeromicro/go-zero/core/logx"
"github.com/zeromicro/go-zero/core/trace"
)
type Config struct {
Name string
Mode string `json:",default=pro"`
Log logx.LogConf
Telemetry trace.Config `json:",optional"`
MySQL struct {
DataSource string
}
Redis struct {
Host string
Type string
Pass string `json:",optional"`
}
Asynq struct {
Addr string
Pass string `json:",optional"`
}
}
@@ -0,0 +1,15 @@
package svc
import (
"github.com/zero-ppanel/zero-ppanel/apps/scheduler/internal/config"
)
type ServiceContext struct {
Config config.Config
}
func NewServiceContext(c config.Config) *ServiceContext {
return &ServiceContext{
Config: c,
}
}
+8
View File
@@ -0,0 +1,8 @@
package types
const (
SchedulerTrafficStats = "scheduler:traffic_stats"
SchedulerExpireCheck = "scheduler:expire_check"
SchedulerExchangeRate = "scheduler:exchange_rate"
SchedulerCleanupLogs = "scheduler:cleanup_logs"
)
+51
View File
@@ -0,0 +1,51 @@
package main
import (
"flag"
"fmt"
"time"
"github.com/hibiken/asynq"
"github.com/zero-ppanel/zero-ppanel/apps/scheduler/internal/config"
"github.com/zero-ppanel/zero-ppanel/apps/scheduler/internal/types"
"github.com/zeromicro/go-zero/core/conf"
"github.com/zeromicro/go-zero/core/logx"
"github.com/zeromicro/go-zero/core/trace"
)
var configFile = flag.String("f", "etc/scheduler-dev.yaml", "the config file")
func main() {
flag.Parse()
var c config.Config
conf.MustLoad(*configFile, &c)
logx.MustSetup(c.Log)
if c.Telemetry.Name != "" {
trace.StartAgent(c.Telemetry)
}
location, _ := time.LoadLocation("Asia/Shanghai")
scheduler := asynq.NewScheduler(
asynq.RedisClientOpt{Addr: c.Asynq.Addr, Password: c.Asynq.Pass},
&asynq.SchedulerOpts{Location: location},
)
// Traffic stats: every 5 minutes
scheduler.Register("*/5 * * * *", asynq.NewTask(types.SchedulerTrafficStats, nil))
// Expire check: every hour
scheduler.Register("0 * * * *", asynq.NewTask(types.SchedulerExpireCheck, nil))
// Exchange rate: every day at 01:00
scheduler.Register("0 1 * * *", asynq.NewTask(types.SchedulerExchangeRate, nil), asynq.MaxRetry(3))
// Cleanup logs: every day at 03:00
scheduler.Register("0 3 * * *", asynq.NewTask(types.SchedulerCleanupLogs, nil))
fmt.Println("Starting zero-ppanel-scheduler...")
if err := scheduler.Run(); err != nil {
logx.Must(err)
}
}