# Storage

uMap stores metadata (such as owner, permissions…) in PostgreSQL, and the data itself (the content of a layer)
in geojson format, by default on the local file system, but optionally in a S3 like server.

This can be configured through the `STORAGES` settings. uMap will use three keys:

- `default`, used only for the pictogram files, it can use whatever storage suits your needs
- `staticfiles`, used to store the static files, it can use whatever storage suits your needs,
  but by default uses a custom storage that will add hash to the filenames, to be sure they
  are not kept in any cache after a release
- `data`, used to store the layers data. This one should follow the uMap needs, and currently
  uMap provides only two options: `umap.storage.fs.FSDataStorage` and `umap.storage.s3.S3DataStorage`

## Default settings:

This will use the file system for everything, including the data.

```
STORAGES = {
    "default": {
        "BACKEND": "django.core.files.storage.FileSystemStorage",
    },
    "data": {
        "BACKEND": "umap.storage.fs.FSDataStorage",
    },
    "staticfiles": {
        "BACKEND": "umap.storage.staticfiles.UmapManifestStaticFilesStorage",
    },
}
```

## Using S3

To use an S3 like server for the layers data, the first thing is to install
the needed dependencies: `pip install umap-project[s3]`.

Then, change the `STORAGES` settings with something like this:

```
STORAGES = {
    "default": {
        "BACKEND": "storages.backends.s3.S3Storage",
        "OPTIONS": {
            "access_key": "xxx",
            "secret_key": "yyy",
            "bucket_name": "umap-pictograms",
            "endpoint_url": "http://127.0.0.1:9000",
            "default_acl": "public-read",
        },
    },
    "data": {
        # Whatch out, this is a dedicated uMap class!
        "BACKEND": "umap.storage.s3.S3DataStorage",
        "OPTIONS": {
            "access_key": "xxx",
            "secret_key": "yyy",
            "bucket_name": "umap-data",
            "endpoint_url": "http://127.0.0.1:9000",
        },
    },
    "staticfiles": {
        "BACKEND": "storages.backends.s3.S3Storage",
        "OPTIONS": {
            "access_key": "xxx",
            "secret_key": "yyy",
            "bucket_name": "umapstatics",
            "endpoint_url": "http://127.0.0.1:9000",
            "default_acl": "public-read",
        },
    },
}
```

As you can see in this example, both `staticfiles` and `default` use the storage class provided
by `django-storages` (`storages.backends.s3.S3Storage`), but the `data` one uses a specific class
(`umap.storage.s3.S3DataStorage`).

In order to store old versions of a layer, the versioning should be activated in the bucket.

See more about the configuration on the [django-storages documentation](https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html).
