Depois de muito tempo parado resolvi voltar a estudar um pouco de Django e desta vez preferi utilizar o Heroku como suporte. Até para entender melhor seu funcionamento! Então segue as anotações!!
Minha aplicação já estava desenvolvida e no GitHub, logo, segui a ideia de fazer o deploy a partir do GitHub mesmo sem usar o git do próprio Heroku.
Inicialmente eu criei no heroku a aplicação e já configurei o add-on do Postgresql. Não configurei ainda o GitHub, deixei para fazer isso bem no final.
Depois eu baixei e instalei o CLI do Heroku aqui.
Com essas etapas superadas fui realizar as adequações no projeto para subir ele para o Heroku.
Primeiro eu instalei as dependências do Heroku para Django, bem simples:
pip install gunicorn
pip install django-heroku
pip install psycopg2-binary==2.8.6
pip install dj_database_url
Também aproveitei e gerei o requirements.txt, é importante fazer isso somente depois de ter adicionado as dependência acima, pois ao fazer o deploy o Heroku irá ler o arquivo e fazer as atualizações. Note que o psycopg2 é bem específico pois na época que escrevi esse texto estava apresentando um erro de “unsupported locale setting”.
Depois criei alguns arquivos na raiz da aplicação que detalho abaixo o que tem neles:
.locales
Procfile
runtime.txt
Esses arquivos servem para informar o Heroku o que será rodado na aplicação. O .locales é em razão da configuração de localidade e formatação de data e hora. Dentro do arquivo coloque o texto:
pt_BR.UTF-8
O Procfile é para rodar a aplicação propriamente dita. Lembre que “myproject” é o nome do seu projeto. Coloque:
web: gunicorn myproject.wsgi
No runtime.txt coloque qual a versão do python deve rodar. Note que isso pode mudar com o tempo, no meu caso consultei antes o link AQUI para ver a versão compatível.
python-3.6.15
Agora vamos modificar o arquivo settings.py do projeto. As alterações foram:
ALLOWED_HOSTS = [‘0.0.0.0’, ‘localhost’, ‘127.0.0.1’, ‘nameofapp.herokuapp.com’] – nameofapp é o nome do seu APP.
SECRET_KEY = os.environ.get(‘SECRET_KEY’) – Depois vamos gerar o SECRET KEY pelo CLI do Heroku
DEBUG = False – Consulte os erros pelo Log. Até pode habilitar se não conseguir entender direito os erros. Mas cuidado!
import django_heroku – Para importar a dependência
django_heroku.settings(locals()) – Para que ele configure o restante para você.
import dj_database_url - Para fazer a conexão com o banco de dados db_from_env = dj_database_url.config() DATABASES = {'default': dj_database_url.config()}
Depois dessas alterações partimos para o CLI Heroku. Digite:
heroku login
Faça o login e depois e rode para já resolver as questões de locale:
heroku buildpacks:add --index 1 https://github.com/heroku/heroku-buildpack-locale
Vamos cadastrar a chave secreta. Para isso abra um terminal python e rode os comandos:
import secrets
secrets.token_hex(24)
O valor gerado vamos inserir no Heroku como variável de ambiente e você também deve fazer o mesmo de acordo com seu ambiente de produção:
heroku config:set SECRET_KEY=SUACHAVEAQUI
Da mesma forma vamos criar uma forma de sempre que ele subir para produção já ficar como DEBUG=False. Para isso, altere o setting.py para:
DEBUG = os.environ.get('DEBUG') == True
E criamos as váriaveis de ambiente no Heroku e na maquina local. Uma sempre False e a outra sempre True. Assim ele já faz a comparação:
heroku config:set DEBUG="False"
Agora faça o push das alterações para o GitHub e depois faça a conexão com o GitHub no Heroku:
Agora volte para o CLI Heroku e digite:
heroku run -a nomedaaplicacao python manage.py makemigrations
heroku run -a nomedaaplicacao python manage.py migrate
heroku run -a nomedaaplicacao python manage.py createsuperuser
Neste caso (meu caso) eu não subo os arquivos de migrations, eles estão no .ignore, mas se você quiser subir os arquivos migrations e fazer com que ele já rode sempre os migrations, altere o arquivo Procfile para:
web: gunicorn myapp.wsgi
release: python manage.py migrate
Dessa forma você não precisa rodar o makemigrations e o migrate.
Após isso você deve estar com a aplicação rodando. Veja os logs para confirmar:
Para que seja possível inserir as imagens no static faça o seguinte:
pip install whitenoise
Depois faça as configurações no settings.py
MIDDLEWARE = [
...
'whitenoise.middleware.WhiteNoiseMiddleware',
]
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
# Extra places for collectstatic to find static files.
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
Bom, é isso. Espero ter ajudado de alguma forma!
No responses yet