Upload settings
Configure where the edge controller uploads recordings when you import them to your Primary Site. Set the upload mode explicitly to match your Primary Site.
Choose an upload destination
- Foxglove-hosted
- Self-hosted
- Bring your own storage
For a Foxglove-hosted Primary Site, set:
PRIMARY_SITE_MODE=hosted
For Kubernetes, set this in values.yaml:
globals:
upload:
primarySiteMode: hosted
No cloud credentials are needed. Foxglove provides the upload destination.
For a self-hosted Primary Site, set PRIMARY_SITE_MODE=self-managed and upload to the Primary Site's inbox bucket. Configure your provider and credentials below.
For a bring-your-own-storage (BYOS) Primary Site on AWS, Google Cloud Storage, or Azure, set PRIMARY_SITE_MODE=self-managed and upload to the bucket the site indexes. Configure your provider and credentials below.
Complete the Primary Site's bucket access and notification setup first.
If your BYOS site has custom index rules, open it from Sites settings, then click "Edit rules" under "Configure index rules". For the first rule matching the uploaded files, set "Action" to "Index" and "Device" to "From metadata". If the "Project" field is shown, leave it unset ("From metadata") to use the recording's metadata. If no rule matches the uploaded files, click "Add rule", enter a "Pattern" that matches them, and set the same values. Click "Save rules". If these controls aren't available, contact support before importing Edge Site recordings.
Self-hosted and BYOS credentials
Use the following provider settings for either upload destination. Set INBOX_BUCKET_NAME (or globals.upload.bucketName for Kubernetes) to the self-hosted inbox bucket or the BYOS indexed bucket, excluding any scheme such as s3:// or gs://.
- Debian package, executable, or Docker image: add the variables where you configure the edge controller, such as
/etc/foxglove/edge-controller/envfileor the file passed todocker run --env-file. - Kubernetes: create the provider's Secret in the
foxglovenamespace and add its provider and bucket values tovalues.yaml. The chart loadscloud-credentialsand any Secrets listed inglobals.secretsas environment variables, and mountsgcp-cloud-credentialas a file. Values set by the chart take precedence over Secret environment variables.
Google Cloud Storage
The credentials need storage.objects.create and storage.multipartUploads.create on the upload bucket. Failed-upload cleanup also needs storage.multipartUploads.abort. Uploads at or above MULTIPART_PART_SIZE (8 MiB by default) use XML multipart uploads; an existing custom role that allows ordinary object creation may need updating. See Cloud Storage multipart upload permissions.
Credential files with "type": "external_account" aren't supported. When upgrading an existing site, check the credential file's type as well as its permissions.
- Debian package, executable, or Docker
- Kubernetes
Install a service account key file (credentials.json) that authorizes writes to your upload bucket, and configure the following environment variables:
PRIMARY_SITE_MODE=self-managed
INBOX_STORAGE_PROVIDER=google_cloud
# Must be set to a valid bucket name, excluding any `gs://` scheme
INBOX_BUCKET_NAME=...
# Set this to the absolute path of the credentials.json file
# If using Docker, use the path inside the container, not the host filesystem path
GOOGLE_APPLICATION_CREDENTIALS=...
When using the .deb package, the foxglove user must be able to read the file. When using the Docker image, mount the file into the container, and set GOOGLE_APPLICATION_CREDENTIALS to its path inside the container.
Install a Secret named gcp-cloud-credential into the foxglove namespace. This secret should contain a single key credentials.json with the contents of the service account key file.
You can use the kubectl command to set the secret from an existing credentials.json file:
kubectl create secret generic gcp-cloud-credential \
-n foxglove \
--from-file=./credentials.json
The chart mounts this secret at /secrets and sets GOOGLE_APPLICATION_CREDENTIALS=/secrets/credentials.json.
In values.yaml, set:
globals:
upload:
primarySiteMode: self-managed
provider: google_cloud
bucketName: your-upload-bucket
AWS
- Debian package, executable, or Docker
- Kubernetes
Configure the following environment variables:
PRIMARY_SITE_MODE=self-managed
INBOX_STORAGE_PROVIDER=aws
# Must be set to a valid bucket name
INBOX_BUCKET_NAME=...
# Set these according to your AWS deployment
AWS_ACCESS_KEY_ID=...
AWS_SECRET_ACCESS_KEY=...
# AWS_REGION also works, and takes precedence when set.
AWS_DEFAULT_REGION=...
# Optional: Only required when using temporary credentials (for example, from AWS STS or IAM Identity Center).
#AWS_SESSION_TOKEN=...
# Optional: Enable SHA-256 checksum-on-upload.
#AWS_UPLOAD_CHECKSUM=sha256
Install a Secret named cloud-credentials into the foxglove namespace. This secret should contain the credentials for your AWS key. Check out the following example secret configuration file:
apiVersion: v1
kind: Secret
metadata:
name: cloud-credentials
type: Opaque
stringData:
AWS_ACCESS_KEY_ID: AKIAIOSFODNN7EXAMPLE
AWS_SECRET_ACCESS_KEY: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
AWS_DEFAULT_REGION: us-west-2
Apply the secrets file:
kubectl apply -f ./cloud-credentials-secret.yaml -n foxglove
To rotate these keys, reapply this file with new values, then restart the edge controller so it reads them:
kubectl rollout restart statefulset/site-controller -n foxglove
In values.yaml, set the provider and bucket. globals.aws.region sets AWS_REGION, which takes precedence over AWS_DEFAULT_REGION:
globals:
aws:
region: us-west-2
upload:
primarySiteMode: self-managed
provider: aws
bucketName: your-upload-bucket
Instead of static keys, you can set AWS_CREDENTIAL_PROCESS to a command that prints temporary credentials in the AWS credential_process format, such as the AWS Identity and Access Management (IAM) Roles Anywhere credential helper. AWS_CREDENTIAL_PROCESS takes precedence over static keys. The edge controller Docker image includes the helper at /usr/local/bin/aws_signing_helper. The edge controller handles this variable the same way Foxlet does; see Foxlet upload settings for a full example, under the "Self-hosted" and "AWS" tabs.
If you set neither static keys nor AWS_CREDENTIAL_PROCESS, the edge controller uses default credential discovery, such as EC2 instance roles or IAM roles for Kubernetes service accounts.
At startup, the edge controller logs which kind of AWS credentials it's configured with: Using static credentials for AWS, Using credential_process for AWS credentials, or Using default credential chain for AWS. This line doesn't mean the credentials work. The edge controller first uses them when it uploads a recording, so a wrong key, secret, region, or permission shows up only then.
Azure
- Debian package, executable, or Docker
- Kubernetes
Configure the following environment variables:
PRIMARY_SITE_MODE=self-managed
INBOX_STORAGE_PROVIDER=azure
# Must be set to a valid bucket name
INBOX_BUCKET_NAME=...
# The storage account that holds the container
STORAGE_AZURE_STORAGE_ACCOUNT_NAME=...
# Set these according to your Azure deployment
AZURE_TENANT_ID=...
AZURE_CLIENT_ID=...
AZURE_CLIENT_SECRET=...
# Optional: Override for storage endpoint.
#AZURE_STORAGE_ENDPOINT=https://{account}.blob.core.windows.net
Install a Secret named cloud-credentials into the foxglove namespace. This secret should contain the credentials for your Azure account. Check out the following example secret configuration file:
apiVersion: v1
kind: Secret
metadata:
name: cloud-credentials
type: Opaque
stringData:
AZURE_TENANT_ID: tenant-id
AZURE_CLIENT_ID: client-id
AZURE_CLIENT_SECRET: client-secret
STORAGE_AZURE_STORAGE_ACCOUNT_NAME: storage-account-name
Apply the secrets file:
kubectl apply -f ./cloud-credentials-secret.yaml -n foxglove
In values.yaml, set the container name as the bucket:
globals:
upload:
primarySiteMode: self-managed
provider: azure
bucketName: your-container
Instead of setting STORAGE_AZURE_STORAGE_ACCOUNT_NAME, you can set the bucket name to <account>/<container>.
S3-compatible
For a self-hosted Primary Site whose inbox bucket uses an S3-compatible service like MinIO, configure the edge controller as follows.
- Debian package, executable, or Docker
- Kubernetes
Configure the following environment variables:
PRIMARY_SITE_MODE=self-managed
INBOX_STORAGE_PROVIDER=s3_compatible
# Must be set to a valid bucket name
INBOX_BUCKET_NAME=...
# Set these according to your S3-compatible service deployment
S3_COMPATIBLE_ACCESS_KEY_ID=...
S3_COMPATIBLE_SECRET_ACCESS_KEY=...
S3_COMPATIBLE_SERVICE_REGION=...
S3_COMPATIBLE_SERVICE_URL=...
Install a Secret named cloud-credentials into the foxglove namespace. This secret should contain the credentials and endpoint for your S3-compatible service. Check out the following example secret configuration file:
apiVersion: v1
kind: Secret
metadata:
name: cloud-credentials
type: Opaque
stringData:
S3_COMPATIBLE_ACCESS_KEY_ID: access-key-id
S3_COMPATIBLE_SECRET_ACCESS_KEY: secret-access-key
S3_COMPATIBLE_SERVICE_REGION: us-east-1
S3_COMPATIBLE_SERVICE_URL: https://minio.example.com
Apply the secrets file:
kubectl apply -f ./cloud-credentials-secret.yaml -n foxglove
In values.yaml, set the provider and bucket:
globals:
upload:
primarySiteMode: self-managed
provider: s3_compatible
bucketName: your-upload-bucket
Object storage upload options
For self-hosted and BYOS uploads, MULTIPART_PART_SIZE controls the size of multipart upload parts, in bytes. Files smaller than this size use a single upload request; files at or above it use multipart uploads.
MULTIPART_PART_SIZE=8388608
On Kubernetes, add this variable to edgeController.env, using the quoting shown in the installation guide.
Upload connection options
These settings control keepalive pings when an upload connection uses HTTP/2:
UPLOAD_HTTP2_KEEP_ALIVE_INTERVAL=10s
UPLOAD_HTTP2_KEEP_ALIVE_TIMEOUT=30s