[pt-BR] Dokku (Nginx + uWSGI + PostegreSQL ) – Deploy com um comando

O que é dokku ?

Dokku é um Plataform as a service, estilo o Heroku, e tem o objetivo de facilitar o deploy de aplicações. Ele deixa a sua aplicação dentro de um container utilizando o docker, mas sem ter a dor de cabeça de configurar o docker. Para fazer o deploy de um projeto é necessário rodar simplesmente git push dokku master.

Mas como fazer essa magica funcionar ?

Vamos por partes, este tutorial tem o objetivo de apresentar o dokku e suas funcionalidades básicas, visando mostrar como um deploy pode ser feito somente com um comando, mas para isso precisamos fazer a instalação do dokku em um VPS que hospedará o projeto. Primeiro é necessário ter um servidor VPS ( Digital Ocean, Linode, etc..), com no mínimo 1GB de memoria, uma instalação do Ubuntu 14.04 e acesso via ssh. Alguns servidores necessitam uma pré configuração, como o Linode, para isso basta seguir as instruções: Linode + dokku . Este tutorial foi testado com o Linode mas serve para qualquer VPS. A Digital Ocean oferece uma imagem com Ubuntu + dokku ready to go.

Instalando o dokku

O dokku deve ser instalado via apt-get através do comando:

wget https://raw.githubusercontent.com/dokku/dokku/v0.7.2/bootstrap.sh
sudo DOKKU_TAG=v0.7.2 bash bootstrap.sh

A instalação pode levar de 5 – 10 minutos, caso aconteça algum erro, verifique se o seu VPS tem suporte a docker, o Linode por padrão não tem, por isso devemos seguir aquelas instruções especiais para o Linode.

Caso encontre alguma duvida, vá em Guia de instalação.

Configurando SSH key e Virtualhost

Agora é necessario configurar uma SSH Key para fazer o deploy e um Virtualhost, para isso basta acessar o ip do seu servidor no seu browser de preferencia. Geralmente a sua ssh-key irá aparecer pré configurada no setup e será necessário somente configurar o virtualhost, caso a sua SSH key não esteja pré configurada, vá em ~/.ssh/id_rsa.pub e copie sua ssh para o setup do dokku.

Criando um app dentro do dokku

Agora com o servidor configurado com o dokku podemos fazer o primeiro deploy, só é necessário ter um projeto com o GIT configurado, primeiro conecte em seu servidor via ssh e crie um app dentro do dokku:

# no servidor
dokku apps:create app name

Criando um Banco de dados (PostegreSQL)

Agora iremos criar um Banco de Dados para nossa aplicação, neste caso utilizaremos o PostegreSQL

# no servidor
# instalando o plugin do Postegres
sudo dokku plugin:install https://github.com/dokku/dokku-postgres.git

# criando a database
dokku postegres:create database-name

Para linkar a database com sua aplicação

# no servidor
dokku postgres:link database-name app-name

O dokku irá criar uma variável de ambiente chamada DATABASE_URL que apontará para o Banco de dados, e para utilizar esta variável automaticamente utilizaremos o pacote python-decouple Python Decouple – Como configurar suas variáveis sensíveis ). Com o decouple instalado em seu projeto basta configurar em settings.py o link para a database:

# em settings.py
default_dburl = 'sqlite:///' + os.path.join(BASE_DIR, 'db.sqlite3')
DATABASES = {
   'default': config('DATABASE_URL', default=default_dburl, cast=dburl),
}

Com esta configuração, o seu projeto utilizará o sqlite localmente e o PostegreS no servidor de produção.

Configurando uWSGI

Em seu projeto, na pasta root (mesma do manage.py), crie um arquivo Procfile:

web: uwsgi uwsgi.ini

Agora crie o arquivo uwsgi.ini na mesma pasta com as seguintes configurações:

[uwsgi]
http-socket = :$(PORT)
master = true
processes = 5
die-on-term = true
module = src.wsgi:application
memory-report = true

Nota: Em module é necessário colocar o nome do seu projeto correto, neste caso o projeto foi criado com django-admin.py createproject src, bastante atenção aqui pois qualquer erro de caminho pode dar uma boa dor de cabeça. (Internal server error)

Criando requirements.txt

Crie um arquivo chamado requirements.txt e nele coloque todos os aplicativos utilizados no projeto, para quem utiliza um virtualenv (acredito que todos), com o virtualenv ativo basta digitar:

pip freeze > requirements.txt

Agora com o requirements.txt criado vá ao final do arquivo e digite:

uWSGI

Agora o dokku irá instalar todas dependências do seu projeto dentro do container do aplicativo.

Utilizando python 3.5.2

Crie um arquivo runtime.txt:

python-3.5.2

Adicionando git remote para o deploy

Para fazermos o deploy é necessário adicionar um git remote que aponte para seu servidor:

# na sua maquina
git remote add dokku dokku@ip do servidor aqui:app-name

Não se esqueça de mudar o ip do servidor e o app-name para valores reais

Deploy

Agora com o uwsgi configurado e o git remote adicionado corretamente precisamos colocar o virtualhost em ALLOWED_HOSTS dentro de settings.py

# settings.py
ALLOWED_HOSTS = [ip do servidor ou virtualhost]

E para fazer o deploy:

# na sua maquina
git push dokku master

Pronto ! Sua aplicação está rodando e toda vez que precisar fazer um deploy basta executar o comando acima.

Rodando migrations no servidor

Para rodar as migrações do seu Banco de Dados entre no servidor via ssh e digite:

dokku run app-name python manage.py migrate

 

Caso tenha encontrado algum erro verifique todos os passos e de uma olhada:

Tutorial Deploy Dokku OFICIAL

Advertisements

Author: Tiago Almeida

I am a Python / Django developer with passion about Data Science and Machine Learning.

2 thoughts on “[pt-BR] Dokku (Nginx + uWSGI + PostegreSQL ) – Deploy com um comando”

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s