cabinet
cabinet is an HTTP server to keep and serve your static files.
It stores the files in a key-value database, and supports a simple replication
scheme.
Usage
Build and install normally using go install
.
Start with cabinet -pass=$PASSWORD -frontend=http://publicaddress:port
. The
password is necessary for the upload API. The default username is admin
, but
can be configured differently.
The cup
subdirectory contains an example how to use the upload API. The
frontend address is required for generating complete URLs in the upload API.
To delete files, the same URL as was returned by the upload API needs to be
called with the HTTP DELETE
method and authentication like the upload API.
To store files from external URLs, use GET /api/store?url=$URL&drawer=$DRAWER
. The resulting URL is returned in the HTTP
response body. The original URL is preserved and returned on subsequent
requests on the new URL in the Content-Location
response header.
Replication
cabinet implements a replication scheme. By default, a cabinet instance acts as
a parent
, which means it allows uploads and deletions.
A cabinet child
can be started by providing the commandline option
-parent=http://parentserver:port
. A child
will not allow uploads or
deletions, but will instead replicate all uploads and deletions as they happen
from the parent
instance. child
instances can be cascaded, i.e. one child
can replicate from another child
.
Whenever a child
gets disconnected from its parent
, it attempts to
automatically reconnect and catch up with any uploads or deletions that
happened during the disconnect time.
To enable multi-master replication, you need to start 2 or more instances that
point to each other as parent in the form of a ring, and also set the
-forceparent
option. This option enables uploads and deletions in instances
that would otherwise act as child instances. In such a setup, when uploading a
file, it is replicated through the whole ring, until the event reaches the
server where the original upload event was triggered. Since the event is
already locally available, it is ignored and not distributed any further.