Files
dudu/server/cmd/server/main.go
T
wangjia 40760aa884
ci / server (push) Failing after 14s
ci / design-tokens (push) Failing after 11s
dudu MVP:五端语音输入法初始提交
- server:Go 网关(WS 流式识别中继/计费配额/微信登录支付 mock/反馈/埋点),gummy provider 已真实联调
- desktop:Tauri 2(全局快捷键 push-to-talk/浮层/托盘/设置/登录购买/反馈/首启引导)
- android:Compose 主 App + IME(键盘内录音直传)
- ios:App + 键盘扩展(1A spike 实证键盘内不可录音,走 deep link 听写)
- design/design-pipeline:设计系统 + token 导出 iOS/Android 主题
- doc:前后端设计文档(HTML);web:官网宣传页;todo:任务看板

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 00:38:37 +08:00

43 lines
963 B
Go

package main
import (
"log/slog"
"os"
"time"
"github.com/gin-gonic/gin"
"dudu/server/internal/auth"
"dudu/server/internal/config"
"dudu/server/internal/httpapi"
"dudu/server/internal/quota"
"dudu/server/internal/store"
)
func main() {
slog.SetDefault(slog.New(slog.NewJSONHandler(os.Stdout, nil)))
cfg := config.Load()
db, err := store.Open(cfg.PostgresDSN)
if err != nil {
slog.Error("postgres open failed", "err", err)
os.Exit(1)
}
rdb := store.OpenRedis(cfg.RedisAddr, cfg.RedisDB)
jwt := auth.NewJWT(cfg.JWTSecret, time.Duration(cfg.JWTTTLHours)*time.Hour, rdb)
qm := quota.New(rdb, db)
gin.SetMode(gin.ReleaseMode)
r := gin.New()
r.Use(gin.Recovery())
httpapi.Register(r, &httpapi.Deps{Cfg: cfg, DB: db, RDB: rdb, JWT: jwt, Quota: qm})
slog.Info("dudu server listening", "addr", cfg.Addr, "asr_provider", cfg.ASRProvider)
if err := r.Run(cfg.Addr); err != nil {
slog.Error("server exited", "err", err)
os.Exit(1)
}
}