# Document storage

You can store a document in two different ways:

- on disk
- in the cloud, using object storage: currently only [openstack swift ](https://docs.openstack.org/api-ref/object-store/index.html) is supported.

## Comparison

Storing documents within the cloud is particularly suitable for "portable" deployments, like in kubernetes, or within a container
without having to manage volumes to store documents. But you'll have to subscribe to a commercial offer.

Storing documents on disk is easier to configure but more challenging to manage: if you use container, you will have to
manager volumes to attach documents on disk. You'll have to do some backup of the directory. If chill is load-balanced (and
multiple instances of chill are run), you will have to find a way to share the directories in read-write mode for every instance.

## On Disk

Configure Chill like this:

```yaml
   # file config/packages/chill_doc_store.yaml
   chill_doc_store:
       use_driver: local_storage
       local_storage:
           storage_path: '%kernel.project_dir%/var/storage'
```

In this configuration, documents will be stored in [var/storage` within your app directory. But this path can be
elsewhere on the disk. Be aware that the directory must be writable by the user executing the chill app (php-fpm or www-data).

Documents will be stored in subpathes within that directory. The files will be encrypted, the key is stored in the database.

# In the cloud, using openstack object store

You must subscribe to a commercial offer for an object store.

Chill uses some features to allow documents to be stored in the cloud without being uploaded first to the chill server:

- `Form POST Middelware ](https://docs.openstack.org/swift/latest/api/form_post_middleware.html);
- [Temporary URL Middelware ](https://docs.openstack.org/swift/latest/api/temporary_url_middleware.html).

A secret key must be generated and configured, and CORS must be configured depending on the domain you will use to serve Chill.

At first, create a container and get the base path to the container. For instance, on OVH, if you create a container named "mychill",
you will be able to retrieve the base path of the container within the OVH interface, like this:

- base_path: [https://storage.gra.cloud.ovh.net/v1/AUTH_123456789/mychill/` => will be variable `ASYNC_UPLOAD_TEMP_URL_BASE_PATH`
- container: `mychill` => will be variable `ASYNC_UPLOAD_TEMP_URL_CONTAINER`

You can also generate a key, which should have at least 20 characters. This key will go in the variable `ASYNC_UPLOAD_TEMP_URL_KEY`.

   See the `documentation of symfony ](https://symfony.com/doc/current/configuration.html#config-env-vars) on how to store variables, and how to encrypt them if needed.

Configure the storage like this:

```yaml
   # file config/packages/chill_doc_store.yaml
   chill_doc_store:
       use_driver: openstack
       openstack:
           temp_url:
               temp_url_key:         '%env(resolve:ASYNC_UPLOAD_TEMP_URL_KEY)%'       # Required
               container:            '%env(resolve:ASYNC_UPLOAD_TEMP_URL_CONTAINER)%' # Required
               temp_url_base_path:   '%env(resolve:ASYNC_UPLOAD_TEMP_URL_BASE_PATH)%' # Required
```

Chill is able to configure the container to store a document. Grab an Openstack Token (for instance, using `openstack token issue` or
the web interface of your openstack provider), and run this command:

   `symfony console async-upload:configure --os_token=OPENSTACK_TOKEN -d https://mychill.mydomain.example`

   # or, without symfony-cli
   `bin/console async-upload:configure --os_token=OPENSTACK_TOKEN -d https://mychill.mydomain.example`
