Skip to content

Architecture — Server (server/)

Internals of the Plik HTTP server. For system-wide overview, see the root ARCHITECTURE.md.


Package Structure

server/
├── main.go         ← entry point (calls cmd.Execute())
├── plikd.cfg       ← default configuration file
├── cmd/            ← CLI commands (cobra)
├── common/         ← shared types, config, feature flags, utilities
├── context/        ← custom request context
├── data/           ← data backend interface + implementations
├── handlers/       ← HTTP handler functions
├── metadata/       ← metadata backend (GORM)
├── middleware/     ← middleware chain components
└── server/         ← HTTP server setup + router

cmd/ — CLI Commands (Cobra)

The server binary plikd uses cobra for CLI management.

FileCommandDescription
root.goplikdStart the server (default command)
user.goplikd user create/list/deleteManage local users
token.goplikd token create/list/deleteManage user tokens
file.goplikd file list/deleteManage uploads/files
clean.goplikd cleanRun metadata cleanup
import.goplikd importImport metadata from JSON
export.goplikd exportExport metadata to JSON

Config loading order: --config flag → PLIKD_CONFIG env → ./plikd.cfg/etc/plikd.cfg.


common/ — Shared Types & Config

Core types used throughout the server:

FileContent
upload.goUpload struct — container for files with TTL, options, password
file.goFile struct + status constants (missing/uploading/uploaded/removed/deleted)
user.goUser struct + provider constants (local/google/ovh/oidc)
token.goToken struct — UUID-based upload tokens
config.goConfiguration struct — TOML parsing + env var override
feature_flags.goFeature flag types: disabled/enabled/default/forced
settings.goSetting struct — server-level key/value (e.g., auth signing key)
authentication.goSessionAuthenticator — JWT session cookie management
paging.goPagingQuery — pagination parameters
stats.goServerStats — upload/file/user counts
metrics.goPlikMetrics — Prometheus metric registry
version.goBuild info (version, git commit, build date)
utils.goGenerateRandomID(), StripPrefix(), etc.

context/ — Custom Request Context

Historical note: This package predates Go's stdlib context.Context (added in Go 1.7). It provides a typed, mutex-protected struct that carries request-scoped values through the middleware chain.

The Context struct holds:

FieldTypeSet By
config*ConfigurationServer init
logger*LoggerServer init
metadataBackend*metadata.BackendServer init
dataBackenddata.BackendServer init
streamBackenddata.BackendServer init
authenticator*SessionAuthenticatorServer init
metrics*PlikMetricsServer init
sourceIPnet.IPSourceIP middleware
upload*UploadUpload middleware
file*FileFile middleware
user*UserAuthenticate middleware
token*TokenAuthenticate middleware
pagingQuery*PagingQueryPaginate middleware

All fields are accessed via getter/setter methods protected by a sync.RWMutex. Getters panic if a required field is nil (fail-fast pattern).

The context package also provides Chain — a composable middleware chain builder: NewChain(mw...).Append(mw...).Then(handler).


data/ — Data Backend

The Backend interface is minimal (3 methods):

go
type Backend interface {
    AddFile(file *common.File, reader io.Reader) (err error)
    GetFile(file *common.File) (reader io.ReadCloser, err error)
    RemoveFile(file *common.File) (err error)
}

Implementations

PackageBackendNotes
data/fileLocal filesystemFiles stored in configurable directory
data/s3Amazon S3 / MinIOSupports SSE-C and S3-managed encryption
data/swiftOpenStack Swift
data/gcsGoogle Cloud Storage
data/streamIn-memory pipeBlocks uploader until downloader connects — nothing stored
data/testingIn-memory mapFor tests only

metadata/ — Metadata Backend (GORM)

Uses GORM with gormigrate for schema management across SQLite3, PostgreSQL, and MySQL.

Key behaviors

  • SQLite3: WAL mode + foreign keys enabled on connect
  • Schema init: Auto-migrates Upload, File, User, Token, Setting tables
  • Migrations: Versioned via gormigrate — see migrations.go
  • Cleaning: Clean() removes orphan files and tokens (FK integrity)
  • Metrics: GORM Prometheus plugin for DB stats

Files

FilePurpose
metadata.goBackend init, config, shutdown, clean
migrations.goSchema migration definitions
upload.goUpload CRUD + listing + expiration
file.goFile CRUD + status updates
user.goUser CRUD + listing
token.goToken CRUD + listing
setting.goServer settings key/value store
stats.goAggregate statistics queries
exporter.goJSON export of all data
importer.goJSON import

middleware/ — Middleware Chain

Each middleware is a function that takes a context.Context and optionally calls the next handler.

FileMiddlewarePurpose
context.goContext()Initialize context with server-level values
log.goLogRequest/response logging
recover.goRecoverPanic recovery → HTTP error response
source_ip.goSourceIPExtract client IP (supports X-Forwarded-For header)
authenticate.goAuthenticate(acceptToken)Parse session cookie / X-PlikToken header → set user/token
impersonate.goImpersonateAdmin impersonation support
upload.goUploadResolve {uploadID} → load upload + check auth
file.goFileResolve {fileID} → load file from upload
create_upload.goCreateUploadParse upload creation params for quick upload
paginate.goPaginateParse pagination query params
redirect.goRedirectOnFailureRedirect to webapp on error (for browser requests)
user.goUserResolve {userID} → load user (admin or self)

handlers/ — HTTP Handlers

Each handler file contains one or more http.Handler functions.

FileHandlersDescription
create_upload.goCreateUploadCreate upload with options, validate config/quotas
add_file.goAddFileUpload file to existing upload (multipart)
get_upload.goGetUploadReturn upload metadata
get_file.goGetFileDownload file, handle OneShot, extend TTL
get_archive.goGetArchiveDownload all files as zip
remove_file.goRemoveFileMark file as removed
remove_upload.goRemoveUploadSoft-delete upload
misc.goGetConfiguration, GetVersion, GetQrCode, HealthUtility endpoints
local.goLocalLogin, LogoutLocal auth
google.goGoogleLogin, GoogleCallbackGoogle OAuth
ovh.goOvhLogin, OvhCallbackOVH OAuth
oidc.goOIDCLogin, OIDCCallbackOpenID Connect
me.goUserInfo, DeleteAccount, GetUserStatisticsCurrent user
token.goGetUserTokens, CreateToken, RevokeTokenToken management
user.goGetUsers, CreateUser, UpdateUserUser management
admin.goGetServerStatistics, GetUploads, RemoveUserUploads, GetUserUploadsAdmin endpoints

server/ — HTTP Server Setup

PlikServer is the main server struct. It:

  1. Initializes backends (metadata, data, stream) and authenticator
  2. Builds middleware chains (see root ARCHITECTURE.md for chain table)
  3. Configures gorilla/mux router with all routes
  4. Starts HTTP server (plain or TLS)
  5. Starts cleaning routine (if auto-clean enabled)
  6. Starts metrics HTTP server (if configured)

Shutdown: graceful with configurable timeout, closes HTTP server + metadata backend.

Released under the MIT License.