mirror of
https://github.com/Sagit-chu/flvx.git
synced 2026-09-28 07:36:38 +08:00
3.8 KiB
3.8 KiB
GO BACKEND KNOWLEDGE BASE
Generated: Fri Mar 20 2026
Commit: f45f960
Branch: main
Tag: 2.1.9-beta6
OVERVIEW
Go-based Admin API for FLVX. Replaced legacy Spring Boot backend. Stack: Go 1.24, net/http (std lib), GORM + SQLite/PostgreSQL (glebarez/sqlite - CGO-free).
STRUCTURE
go-backend/
├── cmd/paneld/main.go # Entry point; starts HTTP server + WebSocket
├── internal/
│ ├── http/ # HTTP layer
│ │ ├── router.go # Routes (NewServeMux) + Middleware chain
│ │ ├── handler/ # API Handlers (User, Tunnel, Node, etc.)
│ │ ├── middleware/ # JWT, CORS, Logging, Recover
│ │ └── response/ # JSON response helpers
│ ├── store/
│ │ ├── model/model.go # GORM model structs (single source of truth)
│ │ └── repo/ # Data Access Layer (Repository pattern, GORM)
│ │ ├── repository.go # Core queries, Open/OpenPostgres, AutoMigrate (83k LOC)
│ │ ├── repository_mutations.go # Mutation helpers (user/node/tunnel/forward CRUD, 43k LOC)
│ │ ├── repository_federation.go # Federation-specific queries
│ │ ├── repository_flow.go # Flow/forward status queries
│ │ ├── repository_control.go # Control plane queries
│ │ └── repository_groups.go # Group management queries
│ └── auth/ # Auth logic
├── tests/contract/ # Integration/contract tests (14 tests)
├── Dockerfile # Multi-stage build (golang:1.24-bookworm → debian:bookworm-slim)
└── Makefile # Build commands
WHERE TO LOOK
| Task | Location | Notes |
|---|---|---|
| API Routes | go-backend/internal/http/router.go |
Registers handlers to http.ServeMux |
| DB Models | go-backend/internal/store/model/model.go |
GORM structs with TableName() methods |
| Repository | go-backend/internal/store/repo/ |
GORM-based queries, all DB ops encapsulated |
| Auth Middleware | go-backend/internal/http/middleware/jwt.go |
Extracts Authorization header |
| WebSocket | go-backend/internal/ws/ |
Real-time updates (traffic, status) |
| Contract Tests | go-backend/tests/contract/ |
Integration tests for auth, federation, tunnels |
CONVENTIONS
- GORM ORM: Uses GORM with
glebarez/sqlite(CGO-free) andgorm.io/driver/postgres. - AutoMigrate: Schema created at startup via
autoMigrateAll()— no hand-written DDL. - TableName(): All models define explicit
TableName()returning singular snake_case names. - Repository Pattern: Handlers never access
*gorm.DBdirectly — all queries go throughrepo.Repositorymethods. - Standard Lib: Uses
net/httpfor routing (Go 1.22+ patterns). - Auth: Expects raw JWT in
Authorizationheader (noBearerprefix). - API Envelope: All responses use
response.R{code, msg, data, ts}structure. - Config: Loaded from environment variables (see
cmd/paneld/main.go). - SQLite Constraints:
MaxOpenConns(1), WAL mode, busy_timeout=5000. - PostgreSQL: Supported via
DB_TYPE=postgresandDATABASE_URLenv vars.
ANTI-PATTERNS
- DO NOT let handlers call
repo.DB()directly — add a Repository method instead. - DO NOT CHANGE handler signatures without updating
router.go. - DO NOT use
type:jsonbortype:serialin GORM tags (SQLite incompatible). - DO NOT omit
TableName()on new models — GORM pluralizes by default.
COMMANDS
cd go-backend
go run ./cmd/paneld # Default: SERVER_ADDR=:6365
go test ./... # Unit tests
go test ./tests/contract/... # Contract tests
make build