datasette-files S3 backend
Project description
datasette-files-s3
S3 storage backend for datasette-files.
Installation
Install this plugin in the same environment as Datasette.
datasette install datasette-files-s3
Usage
Configure a datasette-files source to use S3 storage by setting "storage": "s3" and providing the required configuration options:
plugins:
datasette-files:
sources:
my-s3-files:
storage: s3
config:
bucket: my-bucket-name
region: us-east-1
access_key_id: AKIAIOSFODNN7EXAMPLE
secret_access_key: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Or using Datasette's -s flag:
datasette data.db \
-s plugins.datasette-files.sources.my-s3-files.storage s3 \
-s plugins.datasette-files.sources.my-s3-files.config.bucket my-bucket-name \
-s plugins.datasette-files.sources.my-s3-files.config.region us-east-1
You can also use a credentials broker that returns temporary AWS credentials plus the S3 folder to use:
plugins:
datasette-files:
sources:
my-s3-files:
storage: s3
config:
credentials_url: https://example.com/api/s3-credentials
credentials_url_secret: shared-secret
region: us-east-1
Credentials Broker Response
When credentials_url is configured, the plugin sends a POST request with
secret=... as form-encoded data and expects a JSON response shaped like this:
{
"AccessKeyId": "ASIAWXFXAIOZGGVU5O6Y",
"SecretAccessKey": "...",
"SessionToken": "...",
"Expiration": "2026-03-20T11:56:23Z",
"S3Folder": "s3://datasettecloud-dev-files/team-1/"
}
Configuration options
- bucket (required unless
credentials_urlis used): The name of the S3 bucket. - region (optional, default
us-east-1): The AWS region. - prefix (optional): A prefix to add to all S3 object keys. This allows you to store files under a specific path within the bucket. A trailing slash will be added automatically if not provided -
"uploads"and"uploads/"are equivalent. - endpoint_url (optional): A custom S3 endpoint URL, for use with S3-compatible services.
- access_key_id (optional): AWS access key ID.
- secret_access_key (optional): AWS secret access key.
- session_token (optional): AWS session token, for temporary credentials supplied directly in config.
- credentials_url (optional): URL to
POSTto for temporary credentials. The plugin sendssecret=...as form-encoded data and expects a JSON response containingAccessKeyId,SecretAccessKey,SessionToken,Expiration, andS3Folder. - credentials_url_secret (required with
credentials_url): Shared secret sent to the credentials endpoint as the form fieldsecret.
Authentication
The plugin resolves AWS credentials using the following priority:
- Credentials broker: If
credentials_urlis configured, the plugin fetches temporary credentials byPOSTingsecret=...to that URL. It stores the returnedAccessKeyId,SecretAccessKey,SessionToken,Expiration, andS3Folder, and automatically fetches a fresh set after the expiration time passes. The returnedS3Folderalso sets the active bucket and prefix for the source. - Direct configuration:
access_key_id,secret_access_key, and optionalsession_tokenin the config block. - Default AWS credential chain: If no credentials are provided through the above methods, the plugin falls back to the default AWS credential chain (environment variables, IAM roles, etc.).
Prefix
The prefix option lets you scope all files to a specific path within the bucket. For example, with prefix: "uploads/", a file uploaded as photo.jpg will be stored at the S3 key uploads/photo.jpg.
It does not matter whether you include a trailing slash or not - "uploads" and "uploads/" will both result in files stored under uploads/.
When using credentials_url, the returned S3Folder behaves like a dynamically supplied bucket + prefix. For example, s3://datasettecloud-dev-files/team-1/ means the plugin will use bucket datasettecloud-dev-files and prefix team-1/.
Development
To set up this plugin locally, first checkout the code.
cd datasette-files-s3
Run tests like this:
uv run pytest
You can use SeaweedFS to run a local development server against a local imitation of the S3 API:
brew install seaweedfs
./dev-server.sh
To run a local development server against a real S3 bucket, create a dev-s3.sh script (this file is in .gitignore):
#!/bin/bash
set -e
BUCKET="your-bucket-name"
REGION="us-east-1"
ACCESS_KEY="your-access-key-id"
SECRET_KEY="your-secret-access-key"
uv run datasette data.db --create --internal internal.db --root --secret 1 --reload \
-s plugins.datasette-files.sources.s3-live.storage s3 \
-s plugins.datasette-files.sources.s3-live.config.bucket "$BUCKET" \
-s plugins.datasette-files.sources.s3-live.config.region "$REGION" \
-s plugins.datasette-files.sources.s3-live.config.access_key_id "$ACCESS_KEY" \
-s plugins.datasette-files.sources.s3-live.config.secret_access_key "$SECRET_KEY" \
-s plugins.datasette-files.sources.s3-live.config.prefix "demo-prefix/" \
-s permissions.files-browse true \
-s permissions.files-upload true \
-s permissions.files-edit true
Then run it with bash dev-s3.sh and follow the login token URL printed to the console.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file datasette_files_s3-0.1a2.tar.gz.
File metadata
- Download URL: datasette_files_s3-0.1a2.tar.gz
- Upload date:
- Size: 13.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
433b9f1f70a0fe2bb576323d6a3cb7e10a883d0cb4507a3f3f81a12a22cd7166
|
|
| MD5 |
506e2b7684694dd4d62a0435f0e0bb99
|
|
| BLAKE2b-256 |
d5c7c4d232980208dc9e1652aff461f17d0d6cace72859e1fe3f0c30c7d0d4dd
|
Provenance
The following attestation bundles were made for datasette_files_s3-0.1a2.tar.gz:
Publisher:
publish.yml on datasette/datasette-files-s3
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
datasette_files_s3-0.1a2.tar.gz -
Subject digest:
433b9f1f70a0fe2bb576323d6a3cb7e10a883d0cb4507a3f3f81a12a22cd7166 - Sigstore transparency entry: 1182436871
- Sigstore integration time:
-
Permalink:
datasette/datasette-files-s3@d1ee860a7f8224e051954a2f710026ed1bc53846 -
Branch / Tag:
refs/tags/0.1a2 - Owner: https://github.com/datasette
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d1ee860a7f8224e051954a2f710026ed1bc53846 -
Trigger Event:
release
-
Statement type:
File details
Details for the file datasette_files_s3-0.1a2-py3-none-any.whl.
File metadata
- Download URL: datasette_files_s3-0.1a2-py3-none-any.whl
- Upload date:
- Size: 10.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d4638aea535aa890ca4ce2914e8fd4e4f864800b57edcd3110f64f7f4ff02ac1
|
|
| MD5 |
6c23a87ed7835dc900c3db7235a434f2
|
|
| BLAKE2b-256 |
d5dab8d20df621d0e5446b52b5303acf04335d939042d744243e8347a97726a6
|
Provenance
The following attestation bundles were made for datasette_files_s3-0.1a2-py3-none-any.whl:
Publisher:
publish.yml on datasette/datasette-files-s3
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
datasette_files_s3-0.1a2-py3-none-any.whl -
Subject digest:
d4638aea535aa890ca4ce2914e8fd4e4f864800b57edcd3110f64f7f4ff02ac1 - Sigstore transparency entry: 1182436913
- Sigstore integration time:
-
Permalink:
datasette/datasette-files-s3@d1ee860a7f8224e051954a2f710026ed1bc53846 -
Branch / Tag:
refs/tags/0.1a2 - Owner: https://github.com/datasette
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d1ee860a7f8224e051954a2f710026ed1bc53846 -
Trigger Event:
release
-
Statement type: