# ASGI

While uMap has been historically deployed using the WSGI specification,
there is now an **experimental** ASGI endpoint. This will be the way to
deploy uMap to use the live collaborative editing feature, which needs
websockets.

## Nginx

When using ASGI, the [nginx](nginx.md), the `/` entrypoint should be:

```
location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_redirect off;
    proxy_buffering off;
    proxy_pass http://umap/;
}
```

Also add this mapping for the `$connection_upgrade` variable:

```
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}
```

## Uvicorn

Uvicorn must be installed in the umap virtualenv:

    /path/to/umap/venv/bin/pip install uvicorn

And could then be run like this:

    /path/to/umap/venv/bin/uvicorn \
    --proxy-headers \
    --uds /srv/umap/umap.sock \
    --no-access-log \
    umap.asgi:application

## Systemd

Here is an example service to manage uvicorn with systemd:

```
[Unit]
Description=umap
After=network.target
Requires=postgresql.service

[Service]
Type=simple
User=umap

WorkingDirectory=/srv/umap/
PrivateTmp=true

EnvironmentFile=/srv/umap/env

ExecStart=/srv/umap/venv/bin/uvicorn \
    --proxy-headers \
    --uds /srv/umap/uvicorn.sock \
    --no-access-log \
    umap.asgi:application
ExecReload=/bin/kill -HUP ${MAINPID}
RestartSec=1
Restart=always

[Install]
WantedBy=multi-user.target
```

Then to install it and enable it, copy it to `/etc/systemd/system/umap.service`
and run:

    sudo systemctl enable umap.service

## Env

Uvicorn can be [configured](https://www.uvicorn.org/deployment/) from env vars,
for example to define the number of workers:

```env title="/srv/umap/env"
UVICORN_WORKERS=4
```
