Portabase Logo
Advanced ConfigurationStorage

Object Storage (S3)

Configure external storage for your backups (MinIO, AWS, Scaleway...).

By default, Portabase stores backups on the Dashboard server's local disk. For production, we strongly recommend using S3-compatible object storage to:

  1. Separate compute (Dashboard) from storage.
  2. Benefit from virtually unlimited capacity.
  3. Protect data if the Dashboard server is lost.

This adds a MinIO service to your Docker Compose stack, typically behind Traefik.

Docker Compose changes

MinIO exposes two ports:

  • 9000: S3 API (used by Portabase).
  • 9001: Web Console (admin UI).
docker-compose.yml
name: portabase-stack

services:
  portabase:
    image: solucetechnologies/portabase:latest
    container_name: portabase-app
    env_file: .env
    volumes:
      - portabase-private:/app/private
    depends_on:
      db:
        condition: service_healthy
    networks:
      - traefik_network
      - default
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.portabase.rule=Host(`dashboard.example.com`)"
      - "traefik.http.routers.portabase.entrypoints=websecure"
      - "traefik.http.routers.portabase.tls.certresolver=myresolver"

  # ... standard DB service ...

  s3:
    image: docker.io/bitnami/minio:latest
    container_name: portabase-minio
    expose:
      - 9000
      - 9001
    volumes:
      - minio-data:/data
    environment:
      - MINIO_ROOT_USER=${S3_ACCESS_KEY}
      - MINIO_ROOT_PASSWORD=${S3_SECRET_KEY}
      - MINIO_DEFAULT_BUCKETS=${S3_BUCKET_NAME}
    networks:
      - traefik_network
      - default
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.api-s3.rule=Host(`api.s3.example.com`)"
      - "traefik.http.routers.api-s3.entrypoints=websecure"
      - "traefik.http.routers.api-s3.tls.certresolver=myresolver"
      - "traefik.http.services.api-s3.loadbalancer.server.port=9000"
      - "traefik.http.routers.webui-s3.rule=Host(`console.s3.example.com`)"
      - "traefik.http.routers.webui-s3.entrypoints=websecure"
      - "traefik.http.services.webui-s3.loadbalancer.server.port=9001"

volumes:
  portabase-private:
  postgres-data:
  minio-data:

networks:
  traefik_network:
    external: true

.env configuration

Update .env to connect Portabase to MinIO.

.env
# ... other configs ...

# Enable S3 mode
STORAGE_TYPE=s3

# MinIO credentials (change these!)
S3_ACCESS_KEY=admin_user
S3_SECRET_KEY=change_me_super_secret_password
S3_BUCKET_NAME=portabase-backups

# Connection settings
S3_ENDPOINT=api.s3.example.com
S3_PORT=443
S3_USE_SSL=true

If you use a cloud provider (Scaleway Object Storage, AWS S3, DigitalOcean Spaces), you usually only need to set environment variables — no Docker changes.

.env example for Scaleway (Paris):

.env
STORAGE_TYPE=s3
S3_ENDPOINT=s3.fr-par.scw.cloud
S3_PORT=443
S3_USE_SSL=true
S3_ACCESS_KEY=SCW_ACCESS_KEY_ID
S3_SECRET_KEY=SCW_SECRET_ACCESS_KEY
S3_BUCKET_NAME=my-backup-bucket

For AWS:

S3_ENDPOINT=s3.eu-west-3.amazonaws.com
# rest is identical

Verification

  1. Restart the dashboard:
portabase restart . 
docker-compose down && docker-compose up -d 
  1. Log into the web UI.
  2. Trigger a manual backup on an agent.
  3. Check your bucket (or MinIO console) to confirm the backup file exists.

On this page