Zum Inhalt springen
Nur bauen, was Sie brauchen

Nur bauen, was Sie brauchen

Die Build-Tags, die Protokolle, Benutzerverzeichnisse, die Admin-API und den Provisioner aus dem Binary weglassen, und was jedes spart.

Jedes Protokoll liegt hinter einem Build-Tag, und ein Tag lässt es ganz weg: kein Listener, kein Parser, keine Abhängigkeit, kein Code.

go install -tags nonfs,nowebdav,nosftp,nos3 github.com/go-fileshare/fileshare@latest   # SMB only
go build   -tags nosmb,nonfs,nosftp,nos3 .                                            # WebDAV only

Woher die Personen kommen, liegt hinter eigenen Tags: nosql lässt die drei Datenbanktreiber weg, noldap den LDAP-Client.

BuildGröße
alles31,2 MB
-tags noldap30,9 MB
-tags nosftp30,6 MB
-tags noopenpubkey (keine opkssh-Anmeldungen über SFTP)etwa 2 MB weniger
-tags nos331,1 MB
-tags nonfs,nowebdav,nosftp,nos3 (nur SMB)28,1 MB
-tags nopartitioned (kein apfs, btrfs, xfs, zfs)29,2 MB
-tags nosql20,2 MB
-tags nosql,noldap19,8 MB
-tags nosql,noldap,nonfs,nowebdav,nosftp,nos316,2 MB

Das sind die Zahlen aus der README von fileshare, gemessen, bevor die Admin-API hinzukam; die Tabelle unten ist die spätere Messung.

Die Admin-API und nogrpc

Die Admin-API hat gRPC und Protobuf mitgebracht, und diese liegen hinter nogrpc (linux/amd64, gemessen am 29.09.2026, als die Zeilen oben für alles auf 34,1 MB angewachsen waren):

BuildGröße
alles, mit der Admin-API46,1 MB
-tags nogrpc34,4 MB
-tags nosql,noldap,nogrpc22,5 MB

gRPC kostet 11,7 MB – die Plugin-Messung unten, erneut vorgenommen, jetzt, da es aus einem eigenen Grund hier ist. Eine Installation, die ihre Freigaben in Dateien verwaltet, muss es nicht mitschleppen.

Ein admin-Block in einem nogrpc-Build wird abgelehnt

Statt ohne ihn bereitgestellt zu werden: Eine Konfiguration, die die API verlangt und ohne sie startet, tut nicht, was sie sagt.

nogrpc lässt die Admin-API weg und mit ihr den Provisioner. Health und Metriken sind reines HTTP und bleiben.

-tags noprovisioner lässt nur den Provisioner weg, die privilegierte Rolle fileshare provisioner, und mit ihr zfs, btrfs und projquota von go-fsctl: Ein Server, der nie Volumes bereitstellt, muss den Code, der sie anlegt, nicht mitschleppen. fileshare provisioner sagt in einem solchen Build genau das, statt „unknown command".

nosql ist mit Abstand der größte Hebel: PostgreSQL, MySQL und SQLite wiegen zusammen 11,7 MB, mehr als alle Protokolle dieses Programms zusammen. Eine Installation, deren Benutzer in der Datei stehen, will es. Die Treiber werden vom Kommando importiert und nicht von der Bibliothek, die sie verwendet; das macht die Wahl zu einem Build-Tag statt zu einem Fork.

Ein Protokoll, ohne das dieses Binary gebaut wurde

Eine Konfiguration, die eines nennt, erfährt genau das, statt „es gibt kein solches Protokoll" – der Unterschied zwischen einem Tippfehler und einem Build-Tag. Dasselbe gilt für opkssh_client_id unter noopenpubkey und einen admin-Block unter nogrpc.

Warum keine Plugins als Unterprozesse

Es wurde gemessen statt argumentiert: hashicorp/go-plugin bringt gRPC und Protobuf mit, die allein 13,2 MB kosten – mehr als dieses gesamte Binary mit allen drei Protokollen und jedem Treiber darin. Ein Plugin-Host wäre doppelt so groß, bevor er irgendetwas lädt, und jedes Plugin-Binary würde gRPC erneut mitbringen.

Was die Angriffsfläche angeht, ist ein Tag auch das stärkere Werkzeug für alles, was Sie nicht ausführen: Code, der nie kompiliert wurde, ist nicht erreichbar, ob in einer Sandbox oder nicht.

Was Tags nicht bieten, ist Isolierung zwischen den Protokollen, die Sie tatsächlich ausführen, noch eine Möglichkeit, ein Protokoll ohne Neukompilieren hinzuzufügen. Beides ist real, und beides sind Argumente für eine Prozessgrenze statt für ein kleineres Binary – und das ist ein Prozess pro Protokoll, mit genau diesem Binary, kein Plugin-Framework.

Erstellt am von tannevaled

Geändert am von tannevaled