GitHub

Examples

Dockerfile based app

This example shows how to deploy the popular open-source CMS Strapi. It utilizes these areas of infrastructure:

  • hosting an app built from Dockerfile
  • database (PostgreSQL)
  • storage (dedicated bucket for Strapi to keep media files)

Configuration principles:

  • build an app from a Docker file
  • automatically create SSL certificates
  • configure dependencies (database and storage)
  • use Gatsby-friendly routing

The whole configuration is in three files in the root folder of your project:

  • dev.outblocks.yaml - environment configuration (environment-specific variables)
  • project.outblocks.yaml - project configuration (global project configuration)
  • app.outblocks.yaml - application configuration (app-specific configuration)

Setting up secrets

Strapi requires two variables that should stay secret, and you should not keep them in your code:

  • ADMIN_JWT_SECRET
  • API_TOKEN_SALT
  • APP_KEYS

To set them use CLI secrets command:

ok secret set admin_jwt_secret <string>
ok secret set api_token_salt <string>
ok secret set app_keys <string>

Now you can reference them using the adequate string in a config file. You can use them in app configuration (app.outblocks.yaml), y setting up variables that are going to be visible during the image-building process:

env:
  ADMIN_JWT_SECRET: ${secret.jwt_secret}
  API_TOKEN_SALT: ${secret.api_token_salt}
  APP_KEYS: ${secret.strapi_app_keys}
  ...

Environment variables

dev.outblocks.yaml:

base_url: my-strapi-project.com
gcp_project: my_strapi_project
gcp_region: europe-west3
strapi_database: postgres

Project config

project.outblocks.yaml:

# Project config.


# You can use ${var.*} expansion to source it from values.yaml per environment,
# e.g. domain: ${var.base_url}


# Name of the project.
name: my_strapi_project


# State - where project state will be stored.
state:
  type: gcp


# Main base domain for apps - loaded from values.yaml for easy override per environment.
dns:
  - domains:
      - '*.${var.base_url}'
      - ${var.base_url}


# Project dependencies.
dependencies:
  database:
    type: postgresql
    name: strapi
    database: strapi


  media:
    type: storage
    name: strapi-media-bucket-${env}
    location: eu


# Plugins that will be used for running, deployment etc.
plugins:
  - name: gcp
    version: ^0.1.62
    project: ${var.gcp_project}
    region: ${var.gcp_region}
  - name: docker
    version: ^0.1.16


# Default settings and plugins used for applications.
defaults:
  run:
    plugin: docker
  deploy:
    plugin: gcp

Static app config

app.outblocks.yaml:

name: strapi
type: service
url: ${var.base_url}


deploy:
  memory_limit: 512
  min_scale: 1


container:
  port: 3333


env:
  DATABASE_HOST: '%{dep.database.host}'
  DATABASE_USERNAME: '%{dep.database.user}'
  DATABASE_PASSWORD: '%{dep.database.password}'
  DATABASE_NAME: '%{dep.database.database}'
  DATABASE_CLIENT: postgres
  DATABASE_PORT: '5432'
  WEB_HOST: https://www.${var.base_url}
  GOOGLE_MEDIA_BUCKET_NAME: '%{dep.media.name}'
  GOOGLE_MEDIA_BUCKET_URL: '%{dep.media.url}'


  # Secrets
  ADMIN_JWT_SECRET: ${secret.jwt_secret}
  API_TOKEN_SALT: ${secret.api_token_salt}
  APP_KEYS: ${secret.strapi_app_keys}


needs:
  database:
    user: my_strapi-${env}
    database: strapi


  media: {}


build:
  dockerfile: Dockerfile


run:
  command: yarn develop

Dockerfile

FROM strapi/strapi


WORKDIR /strapi


COPY ./package.json ./
COPY ./yarn.lock ./


RUN yarn config set network-timeout 300000
RUN yarn install


COPY . .


ENV NODE_ENV production


RUN yarn build


EXPOSE 1337


CMD ["sh", "-c", "./start.sh"]
Previous
Static webpage