This is a file storage server for the MAXIT project.
- S3-like API: Bucket and object management
- Signed URLs: Time-limited, secure access to files via HMAC-SHA256 signatures
- Simple deployment: Single binary with filesystem storage
- Two-server topology: public (signed GET/HEAD only) + internal (writes, private)
The service runs two HTTP servers:
- Public (
PUBLIC_SERVER_PORT, default8888): signed GET/HEAD of objects only. All else → 403/405. - Internal (
INTERNAL_SERVER_PORT, default8081): all writes, bucket management, metadata,/sign. No auth — network isolation only, never host-publish this port.
See SIGNED_URLS.md for the full signed-URL contract and deployment guidance.
The file storage service supports signed, time-limited URLs for secure file access. See SIGNED_URLS.md for detailed documentation.
Quick example:
storage, _ := filestorage.NewFileStorage(filestorage.FileStorageConfig{
URL: "http://file-storage:8081", // internal server, server-side only
})
// Signed path relative to the public server (caller prepends its public base URL)
signedPath, _ := storage.GetSignedFilePath("bucket", "file.pdf", 1*time.Hour)Prerequisites:
- Docker
To build docker image for local usage run the following command:
docker build -t maxit/file-storage .- Go: Ensure you have Go installed on your machine (version 1.23.2).
To set up and run the File Storage API, follow these steps:
-
Clone the Repository:
git clone https://github.com/mini-maxit/file-storage.git cd file-storage -
Install Go Packages: Ensure all necessary Go packages are installed by running:
go mod tidy
-
Environment Configuration: Copy the .env.dist file to .env:
cp .env.dist .env
Update the
.envfile with the necessary environment variables.Important: Set
SIGNING_SECRETfor signed URL support:SIGNING_SECRET=your-secret-key-here
Available variables (see SIGNED_URLS.md for details):
PUBLIC_SERVER_PORT— public server port (default8888)INTERNAL_SERVER_PORT— internal server port (default8081; never host-publish)ROOT_DIRECTORY— data directory (defaultfile-storage-media)SIGNING_SECRET— HMAC key, requiredMAX_SIGN_TTL_SECONDS— max/signTTL (default3600)
-
Run the Application: To run the application, you can use the prepared
Makefile. just run:make
Both servers start: public on
PUBLIC_SERVER_PORT, internal onINTERNAL_SERVER_PORT.
OpenAPI 3.0 specification: api.raml
When an error occurs, the response is returned in JSON format with the following structure:
{
"reason": "A brief explanation of the error",
"details": "A more detailed description of the error",
"context": {
"key": "value",
"key2": "value2"
}
}Field Descriptions:
- reason: A high-level message describing the cause of the error, such as "Failed to process task" or "Submission not found."
- details: A more specific message or description of the error, often based on the underlying issue (e.g., "Invalid task parameters").
- context: An optional field containing additional context information about the error. This might include values like taskID, userID, submissionNumber, or other key-value pairs that provide insight into the specific conditions under which the error occurred. This field is included when relevant context is available.