April 29, 2018 · Docker LetsEncrypt

Docker + Nginx + LetsEncrypt + Rails + Ghost

Migrei meus projetos todos configurados no modo bruto (entrar no servidor, atualizar pacotes, instalar pacotes, configurar projeto por projeto etc) para Docker.

Como queria colocar todos eles com SSL, usei obviamente a melhor opção do mundo: LetsEncrypt. Procurando na internet achei esse excelente tutorial com docker-compose v3: https://github.com/evertramos/docker-compose-letsencrypt-nginx-proxy-companion

Para o meu caso, tive que adaptar para funcionar com multiplas aplicações: 2 apps rails e 1 ghost blog.

Usei um droplet na DigitalOcean com Ubuntu 16.04.4 LTS (GNU/Linux 4.4.0-121-generic x86_64), 1GB memoria, 25HD (instância de 5 trumps). O docker build às vezes peida, mas segura bem.

Docker version:

Client:
 Version:	17.12.0-ce
 API version:	1.35
 Go version:	go1.9.2
 Git commit:	c97c6d6
 Built:	Wed Dec 27 20:11:19 2017
 OS/Arch:	linux/amd64

Server:
 Engine:
  Version:	17.12.0-ce
  API version:	1.35 (minimum version 1.12)
  Go version:	go1.9.2
  Git commit:	c97c6d6
  Built:	Wed Dec 27 20:09:53 2017
  OS/Arch:	linux/amd64
  Experimental:	false

Docker-compose version:

docker-compose version 1.18.0, build 8dd22a9
docker-py version: 2.6.1
CPython version: 2.7.13
OpenSSL version: OpenSSL 1.0.1t  3 May 2016

Segui exatamente tudo que esta no tutorial citado, customizando apenas os caminhos, que você configura no arquivo .env e aproveitei os docker-compose.yml junto com os .env's de cada projeto em vez de usar docker run do tutorial.

Deixei nessa estrutura para controlar separadamente:

/apps
 /app1
  - docker-compose.yml
 /app2
  - docker-compose.yml
/proxy
- docker-compose.yml

Sendo a pasta proxy o repositorio do tutorial renomeado:

git clone git@github.com:evertramos/docker-compose-letsencrypt-nginx-proxy-companion.git proxy

Para o app1 meu docker-compose.yml customizado ficou:

version: '3'

services:
  app:
    build: .
    ports:
      - 82:3000
    depends_on:
      - db
    volumes:
      - /etc/localtime:/etc/localtime:ro
    environment:
      - RAILS_MAX_THREADS=1
      - VIRTUAL_ROOT=/app/public
      - VIRTUAL_HOST=dominio_app_1.com, www.dominio_app_1.com
      - LETSENCRYPT_HOST=dominio_app_1.com, www.dominio_app_1.com
      - LETSENCRYPT_EMAIL=meu_email@email.com
      - VIRTUAL_PORT=82
    restart: unless-stopped

  db:
    image: postgres
    ports:
      - 5432:5432
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /storage/postgres/data:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    restart: unless-stopped

networks:
  default:
    external:
      name: webproxy

Não preciso falar para usar os seus dados em vez dos fictícios nos parametros do host e email, correto?

Diferente do tutorial, acrescentei os parâmetros:
VIRTUAL_PORT=81 (porta para o NGINX ler e redirecionar para a 3000 da minha aplicação)
VIRTUAL_ROOT=/app/public (caminho root da minha aplicação)

E declarei a rede padrão da qual eles pertencem externamente: webproxy. É aí que a macumba acontece com os containers do tutorial.

Para o app2 é EXATAMENTE mesma config, exceto que a porta de entrada em vez de 81 eu botei 82. É só isso. Para cada aplicação instalada uma porta diferente de entrada pro NGINX ler.

Para o ghost blog usei o Portainer(gerenciador UI simples de Docker, depois posto algo sobre) para instalar, e na configuração dele, acrescentei:
Screen-Shot-2018-05-04-at-17.21.02

E mudei, obviamente, a rede da qual ele pertence agora:
Screen-Shot-2018-05-04-at-17.31.21

Pronto. Entre na pasta de cada aplicação, dê um docker-compose up -d e aguarde alguns segundos até o LetsEncrypt criar o certificado e configurar todos os caminhos.

O ghost eu usei a interface do Portainer para subir a aplicação. O resultado pode ser visto nesse blog da qual está lendo. Também aqui e aqui.

Cheers,

Comments powered by Disqus