Contained

Deploy using Docker Swarm via SSH across multiple and environments.

Installation

gem install contained

Commands

Init

The contained init command copies / pastes the following into your project:

contained init

config/deploy.yml

stack: example

environments:
  production:
    hosts:
      - 1.2.3.4
      - 5.6.7.8
  test:
    hosts:
      - 4.3.2.1
      - 8.7.6.5

config/deploy/compose.yml

config:
  services:
    caddy:
      image: demo/caddy
      ports:
        - "80:80"
      volumes:
        - caddy_data:/data
        - caddy_config:/config
      healthcheck:
        test: ["CMD", "curl", "-f", "http://localhost:80/up"]
        interval: 30s
        timeout: 10s
        retries: 3
    backend:
      build: demo/backend
      healthcheck:
        test: ["CMD", "curl", "-f", "http://localhost:3000/up"]
        interval: 30s
        timeout: 10s
        retries: 3
    frontend:
      build: demo/frontend
      healthcheck:
        test: ["CMD", "curl", "-f", "http://localhost:3000/up"]
        interval: 30s
        timeout: 10s
        retries: 3
  volumes:
    caddy_data:
    caddy_config:

Setup

The contained setup command connects to all the hosts within an environment via SSH and configures docker swarm using a stack defined in the config/deploy/compose.yml file.

contained setup --environment production

Examples

w/ Caddy

Dockerfile

# syntax = docker/dockerfile:1

ARG CADDY_VERSION=2.9.1

FROM docker.io/library/caddy:${CADDY_VERSION}-alpine

COPY Caddyfile /etc/caddy/Caddyfile

Caddyfile

demo.com {
  encode

  handle /up {
    respond "OK" 200 {
      close
    }
  }

  handle /backend/up {
    uri replace /backend/ /
    reverse_proxy backend:3000
  }

  handle /frontend/up {
    uri replace /frontend/ /
    reverse_proxy frontend:3000
  }

  handle /api/* {
    reverse_proxy backend:3000
  }

  handle /* {
    reverse_proxy frontend:3000
  }
}