# Installation on Digital Ocean Apps This guide will walk you through deploying on the Digital Ocean Apps platform. It's a step-by-step guide that helps you install Baserow from scratch in a scalable way. ## Create managed database The app platform doesn't support volumes, and offers horizontal scalability. That means the application that runs will be stateless. We will therefore need to create a managed PostgreSQL, managed Redis, and a Spaces Object Storage to store all the data. Because the app depends on these resources to exist, we have to create those first. ### Managed PostgreSQL Navigate to the `Databases` page in the left sidebar of your Digital Ocean dashboard. Click on `Create Database` in the top right corner. Choose your region, it's important that all the created servers are in the same region, select PostgreSQL v15, and choose the server specs you would like to have. Baserow is compatible with 1vCPU and 1GB RAM. While the database server is being created, you can already find the `Connection Details` on the database detail page. Click on the dropdown in that top right corner, and switch to `Connection String`. Copy that string because you're going to need it later. ### Managed Redis Navigate to the `Databases` page in the left sidebar of your Digital Ocean dashboard. Click on `Create Database` in the top right corner. Choose your region, it's important that all the created servers are in the same region, select Redis v7, and choose the server specs you would like to have. Baserow is compatible with 1vCPU and 1GB RAM. While the database server is being created, you can already find the `Connection Details` on the database detail page. Click on the dropdown in that top right corner, and switch to `Connection String`. Copy that string because you're going to need it later. ### Spaces Object Storage Navigate to the `Spaces Object Storage` page in the left sidebar of your Digital Ocean dashboard. Click on `Create Spaces Bucket`. Choose your region, it's important that the bucket is created the same region, and create the bucket. Navigate to the `API` page in the left sidebar of the sidebar, click on the `Spaces Keys` tab, click on `Generate New Key`, and create a new key. Copy the `Access Key` and `Secret key` because your going to need that later. ## Application Navigate to the `Apps` page in the left sidebar of your Digital Ocean dashboard. Click on `Create App`, select `Docker Hub`, and fill out the following: Repository: `baserow/baserow` Image tag or digest: `1.32.5` Click on `Next`, then on the `Edit` button of the `baserow-baserow` web service. Here you must change the HTTP Port to 80, and then click on `Back`. Click on the `Next` button, and then on `Edit` next to the `baserow-baserow` environment variables. Add the following environment variables. Everything between brackets must be replaced. Generate a unique secret string for `SECRET_KEY` and `BASEROW_JWT_SIGNING_KEY`. This can for example be done via https://djecrety.ir/. ``` SECRET_KEY=(generate a unique random string) BASEROW_JWT_SIGNING_KEY=(generate a unique random string) BASEROW_PUBLIC_URL=http://localhost BASEROW_AMOUNT_OF_GUNICORN_WORKERS=2 BASEROW_AMOUNT_OF_WORKERS=2 DATABASE_URL=(YOUR_POSTGRESQL_CONNECTION_STRING) REDIS_URL=(YOUR_REDIS_CONNECTION_STRING) DISABLE_VOLUME_CHECK=yes BASEROW_TRIGGER_SYNC_TEMPLATES_AFTER_MIGRATION=false AWS_ACCESS_KEY_ID=(Spaces Access Key) AWS_SECRET_ACCESS_KEY=(Spaces Secret key) AWS_STORAGE_BUCKET_NAME=(Space name) AWS_S3_REGION_NAME=(Spaces region e.g. ams3) AWS_S3_ENDPOINT_URL=https://(region).(digitaloceanspaces.com) AWS_S3_CUSTOM_DOMAIN=(name-of-your-space).(region).(digitaloceanspaces.com) DOWNLOAD_FILE_VIA_XHR=1 ``` Don't forget to click on the `Save` button, and then on `Next` and again on `Next` until you're at the `Review` section. Scroll all the way down, and click on `Edit Plan`. Here you can choose the instance size. You need 1 vCPU and 2 GB RAM 1 container at minimum. You can scale up later. Click on `Back` and then on `Create Resources`. ## Security To make your PostgreSQL and Redis servers secure, navigate to their detail pages, click `Settings`, click on `Edit` at `Trusted Sources`, and add the newly created app. ## Change domain Navigate back to the `Settings` of the newly created App, and wait until the deployment completes. After, it will automatically add a domain/URL for you, and it will become visible in the settings. Copy this URL, click on the baserow-baserow component settings, edit the environment variables and set `BASEROW_PUBLIC_URL` to `(the copied URL)`, then hit the save button. Note that the URL does not have a trailing slask, so it should look like `https://baserow.io` and not `https://baserow.io/`. ## Templates The templates are not installed because it will result in an `out of shared memory` on the cheapest managed database plan. If you wish to enable it, then you must set the environment variable `BASEROW_TRIGGER_SYNC_TEMPLATES_AFTER_MIGRATION` to `true`. ### Spaces In order for the download button to work in Baserow you would need to configure the CORS settings in spaces. Navigate to the created space, go to the `Settings` tab, click on `Add` next to the CORS Configurations, and add the URL of the newly created application without a trailing slash, so it must not end with a `/`. Select the `GET` method, and click `Save CORS Configuration`. ## Finish Wait until the build restarts, and then visit the copied URL to make use of your Baserow environment. ## Update version In order to update the Baserow version, you simply need to replace the image tag. Navigate to the `Settings` tag of your created app, click on the `baserow-baserow` component, then click on the `Edit` button next to source, change the `Image tag` into the desired version (latest is `1.32.5`), and click on save. The app will redeploy with the latest version. ## External email server You can enable email by adding the following environment variables: ``` EMAIL_SMTP=True EMAIL_SMTP_HOST= EMAIL_SMTP_PORT= EMAIL_SMTP_USER= EMAIL_SMTP_PASSWORD= EMAIL_SMTP_USE_TLS= ``` ## Application builder domains Baserow has an application builder that allows to deploy an application to a specific domain. Because Digital Ocean has a reverse proxy that routes a domain to the right app, the deployed application isn't automatically available on the chosen domain. To make this work you must navigate to the App `Settings`, and click on `Edit` next to the domain. Here you can add additional domains that will be routed to your published application builder domain. ## Scaling ### Containers If you're going to use Baserow with more concurrent users, have big database schemas, need more API requests per second, then you're going to run into limitations with the current setup, and you need to scale up. With the existing environment variables, you can easily scale the number of containers if they have 1vCPU and 2GB of ram. If you decide to increase the instance size, then you must also change some environment variables to make the most use of it. - 4GB of RAM: - `BASEROW_AMOUNT_OF_GUNICORN_WORKERS=5` - `BASEROW_AMOUNT_OF_WORKERS=4` - 8GB of RAM: - `BASEROW_AMOUNT_OF_GUNICORN_WORKERS=10` - `BASEROW_AMOUNT_OF_WORKERS=8` - 16GB of RAM: - `BASEROW_AMOUNT_OF_GUNICORN_WORKERS=20` - `BASEROW_AMOUNT_OF_WORKERS=16` Every `gunicorn workers * the number instances` is the number of concurrent API requests your setup can handle. ### PostgreSQL and Redis If you're going to increase the containers or gunicorn workers, you must make sure that your PostgreSQL and Redis servers can handle that many requests. The rule of thumb is roughly: ``` number of connections needed = ( (BASEROW_AMOUNT_OF_GUNICORN_WORKERS * 2) + (BASEROW_AMOUNT_OF_WORKERS * 2) ) * number of containers + service connections ``` So if you have 2 containers of 8GB of ram, you would need at least: `((10 * 2) + (8 * 2)) * 2 + 5 = 77 connections`.