feat(server): скелет Go-сервера с healthz, readyz и api/v1/meta
- internal/config: конфигурация из env с валидацией и дефолтами (§5.1, §9.1) - internal/httpx: middleware (request id, slog-логи, recover, security-заголовки), единый формат ошибок §8.5 и лимит тела запроса - internal/database: SQLite WAL + busy_timeout + foreign_keys, один writer и пул чтения, goose-миграции embedded, PRAGMA optimize по расписанию - internal/meta: полезная нагрузка /api/v1/meta (версия, фичи, лимиты) - internal/server: маршруты, SPA-раздача собранного клиента, OpenAPI 3.1 - cmd/glchat: точка входа с graceful shutdown и JSON-логами - тесты: конфиг, миграции и идемпотентность, HTTP-эндпоинты, статика, 404/405
This commit is contained in:
+131
@@ -0,0 +1,131 @@
|
||||
version: "2"
|
||||
|
||||
run:
|
||||
timeout: 5m
|
||||
tests: true
|
||||
build-tags:
|
||||
- sqlite_cgo
|
||||
|
||||
linters:
|
||||
default: none
|
||||
enable:
|
||||
- asasalint
|
||||
- bodyclose
|
||||
- copyloopvar
|
||||
- depguard
|
||||
- dogsled
|
||||
- durationcheck
|
||||
- errcheck
|
||||
- errorlint
|
||||
- exhaustive
|
||||
- forbidigo
|
||||
- gocheckcompilerdirectives
|
||||
- gocritic
|
||||
- gosec
|
||||
- govet
|
||||
- ineffassign
|
||||
- loggercheck
|
||||
- misspell
|
||||
- nilerr
|
||||
- noctx
|
||||
- nolintlint
|
||||
- prealloc
|
||||
- predeclared
|
||||
- revive
|
||||
- rowserrcheck
|
||||
- sloglint
|
||||
- sqlclosecheck
|
||||
- staticcheck
|
||||
- unconvert
|
||||
- unparam
|
||||
- unused
|
||||
- usestdlibvars
|
||||
- whitespace
|
||||
settings:
|
||||
depguard:
|
||||
rules:
|
||||
permissions:
|
||||
files:
|
||||
- "**/internal/permissions/**"
|
||||
deny:
|
||||
- pkg: "glchat/internal/(auth|guilds|roles|channels|messages|files|invites|voice|search|gateway|emojis|sounds|webhooks|moderation|audit|friends|dm)/"
|
||||
desc: "permissions must stay a leaf package without domain dependencies"
|
||||
database:
|
||||
files:
|
||||
- "**/internal/database/**"
|
||||
deny:
|
||||
- pkg: "glchat/internal/(server|gateway|auth|guilds|roles|channels|messages)/"
|
||||
desc: "the database package must not import domain packages"
|
||||
forbidigo:
|
||||
forbid:
|
||||
- pattern: 'panic\('
|
||||
msg: "no panics in handlers or services; return errors instead"
|
||||
- pattern: 'fmt\.Print.*'
|
||||
msg: "use log/slog instead of fmt printing"
|
||||
analyze-types: false
|
||||
gocritic:
|
||||
enabled-tags:
|
||||
- diagnostic
|
||||
- performance
|
||||
disabled-checks:
|
||||
- whyNoLint
|
||||
- hugeParam
|
||||
- rangeValCopy
|
||||
gosec:
|
||||
excludes:
|
||||
- G404
|
||||
misspell:
|
||||
locale: US
|
||||
revive:
|
||||
rules:
|
||||
- name: blank-imports
|
||||
- name: context-as-argument
|
||||
- name: context-keys-type
|
||||
- name: error-return
|
||||
- name: error-strings
|
||||
- name: error-naming
|
||||
- name: exported
|
||||
disabled: true
|
||||
- name: indent-error-flow
|
||||
- name: var-naming
|
||||
- name: unreachable-code
|
||||
sloglint:
|
||||
no-mixed-args: true
|
||||
kv-only: true
|
||||
attr-only: true
|
||||
context: "scope"
|
||||
staticcheck:
|
||||
checks:
|
||||
- all
|
||||
- -ST1000
|
||||
- -ST1003
|
||||
exclusions:
|
||||
generated: lax
|
||||
presets:
|
||||
- comments
|
||||
- std-error-handling
|
||||
rules:
|
||||
- path: "_test\\.go"
|
||||
linters:
|
||||
- gosec
|
||||
- errcheck
|
||||
- forbidigo
|
||||
- path: "(^|/)internal/database/sqlc/"
|
||||
linters:
|
||||
- revive
|
||||
- gocritic
|
||||
- unused
|
||||
- staticcheck
|
||||
|
||||
formatters:
|
||||
enable:
|
||||
- gofumpt
|
||||
- goimports
|
||||
settings:
|
||||
gofumpt:
|
||||
extra-rules: true
|
||||
goimports:
|
||||
local-prefixes:
|
||||
- glchat
|
||||
exclusions:
|
||||
generated: lax
|
||||
Reference in New Issue
Block a user