# Baserow's Docker API

Baserow uses docker and docker-compose when running the local or development
environments. Below you will find details on how this is structured, how to configure
baserow running this way and usage references.

## Baserow's Docker Files

Below are the files used by our docker setup and what they are responsible for:

### The Local Env

- `docker-compose.yml`: A compose file which starts Baserow in local mode with no
  development features enabled.
- `./backend/Dockerfile`: The backend's Dockerfile for local mode. See below for
  supported command line arguments. Also used to run the celery worker.
- `./web-frontend/Dockerfile`: The web-frontend's Dockerfile for local mode. See below
  for supported command line arguments.
- `./media/Dockerfile`: A simple nginx image used to serve uploaded user files only.

### The Dev Env

- `docker-compose.dev.yml`: A compose file which overrides parts of `docker-compose.yml`
  to enable development features, do not use this in production.
- `./backend/docker/Dockerfile.dev`: The backends's Dockerfile for dev mode.
- `./web-frontend/docker/Dockerfile.dev`: The web-frontend's Dockerfile for dev mode.

### For Both Envs

- `./backend/docker/docker-entrypoint.sh`: The entrypoint script used for both of the
  backend images.
- `./web-frontend/docker/docker-entrypoint.sh`: The entrypoint script used for both of
  the web-frontend images.

## Backend Image CLI

The `baserow_backend` and `baserow_backend_dev` images provide various commands used to
change what process is started inside the container.

```bash
Usage: docker run <imagename> COMMAND
Commands
local     : Start django using a prod ready gunicorn server
dev       : Start a normal Django development server
bash      : Start a bash shell
manage    : Start manage.py
python    : Run a python command
shell     : Start a Django Python shell
celery    : Run celery
celery-dev: Run a hot-reloading dev version of celery
lint:     : Run the linting
help      : Show this message
```

You can run one of these as a one off command like so:

```bash
# In the local environment
$ docker-compose run backend COMMAND
# In the dev environment
$ ./dev.sh run backend COMMAND
```

## Web Frontend CLI

The `baserow_web-frontend` and `baserow_web-frontend_dev` images provide various commands
used to change what process is started inside the container.

```bash
Usage: docker run <imagename> COMMAND
Commands
dev      : Start a normal nuxt development server
local    : Start a non-dev prod ready nuxt server
lint     : Run the linting
lint-fix : Run eslint fix
bash     : Start a bash shell
help     : Show this message
```

You can run one of these as a one off command like so:

```bash
# In the local environment
$ docker-compose run web-frontend COMMAND
# In the dev environment
$ ./dev.sh run web-frontend COMMAND
```

## Environment Variables

See [the introduction](../getting-started/introduction.md) for the environment variables
supported specifically by the backend and web-frontend processes. Below are the
variables available for configuring baserow's docker setup.

All of these variables can be set like so:

```bash
$ POSTGRES_PORT=5555 REDIS_PORT=6666 MJML_PORT=7777 docker-compose up 
$ # or using dev.sh
$ POSTGRES_PORT=5555 MIGRATE_ON_STARTUP=false ./dev.sh
```

### Local and Dev Variables

Port configuration (these only work when used with the docker-compose files):

- `POSTGRES_PORT` (default `5432`) : The port the `db` container will bind to on your
  local network.
- `REDIS_PORT` (default `6379`) : The port the `redis` container will bind to on your
  local network.
- `MJML_PORT` (default `28101`) : The port the `mjml` container will bind to on your
  local network.
- `BACKEND_PORT` (default `8000`) : The port the `backend` container will bind to on
  your local network.
- `WEB_FRONTEND_PORT` (default `3000`) : The port the `web-frontend` container will bind
  to on your local network.
- `MEDIA_PORT` (default `4000`) : The port the `media` nginx container will bind to on 
  your local network.

Backend configuration:

- `MIGRATE_ON_STARTUP` (default `true`) : When `true` on backend server startup it will
  perform a django migration before launching the backend server.
- `SYNC_TEMPLATES_ON_STARTUP` (default `true`) : When `true` on backend server startup
  it will run the baserow management command `sync_templates` which loads any templates
  found in `./backend/templates` into Baserow.
  
Pass through variables:

These environment variables when provided to the docker-compose files are passed through
to the correct containers. See [the introduction](../getting-started/introduction.md) 
for what these variables do.

- `PUBLIC_BACKEND_URL`
- `PUBLIC_WEB_FRONTEND_URL`
- `MEDIA_URL`
- `EMAIL_SMTP`
- `EMAIL_SMTP_HOST`
- `EMAIL_SMTP_PORT`
- `EMAIL_SMPT_USE_TLS`
- `EMAIL_SMTP_USER`
- `EMAIL_SMTP_PASSWORD`
- `FROM_EMAIL`


### Dev Only Variables

- `UID` (default `1000` or your user id when using `./dev.sh`) : Sets which user id will
  be used to build Baserow's images with and the user id which will be used to run the
  processes inside Baserow containers.
- `GID` (default `1000` or your group id when using `./dev.sh`) : Sets which group id
  will be used to build Baserow's images with and the group id which will be used to run
  the processes inside Baserow containers.