Sobre nós Guias Projetos Contactos
Админка
please wait

O Heroku é uma Platform-as-a-Service (PaaS) que simplifica a implementação ao tratar da infraestrutura, do escalamento e das operações. Embora seja mais caro do que infraestrutura «crua», o Heroku reduz drasticamente a sobrecarga de DevOps para equipas pequenas. Este guia aborda a implementação de aplicações de produção no Heroku na perspetiva de um programador sénior.

Porquê o Heroku

O Heroku destaca-se em cenários específicos:

  1. Implementação Rápida: Git push para implementar
  2. Infraestrutura Gerida: Sem administração de servidores
  3. Ecossistema de Add-ons: Bases de dados, caching e monitorização com um clique
  4. Auto-Scaling: Lida automaticamente com picos de tráfego
  5. Integração CI/CD: Pipelines integrados

Mais indicado para: MVPs, equipas pequenas, aplicações que privilegiam a velocidade de desenvolvimento em detrimento da otimização de custos.

Primeiros Passos

Instalar a CLI

# macOS
brew tap heroku/brew && brew install heroku
# Ubuntu/Debian
curl https://cli-assets.heroku.com/install.sh | sh
# npm (qualquer plataforma)
npm install -g heroku

Autenticar

heroku login
# Abre o browser para autenticação
# Ou não interativo
heroku login -i

Criar Aplicação

# Criar app com nome aleatório
heroku create
# Criar com nome específico
heroku create my-awesome-app
# Criar numa região específica
heroku create my-app --region eu

Implementação Node.js

Estrutura do Projeto

my-app/
├── package.json
├── package-lock.json
├── Procfile
├── app.js
└── .gitignore

package.json

{
"name": "my-heroku-app",
"version": "1.0.0",
"engines": {
"node": "18.x"
},
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js"
},
"dependencies": {
"express": "^4.18.2"
}
}

Procfile

Define tipos de processos:

web: node app.js
worker: node worker.js

app.js

const express = require('express');
const app = express();
// O Heroku fornece a variável de ambiente PORT
const PORT = process.env.PORT || 3000;
app.get('/', (req, res) => {
res.json({ message: 'Hello from Heroku!' });
});
app.get('/health', (req, res) => {
res.json({ status: 'ok' });
});
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});

Implementar

# Inicializar o git, se necessário
git init
git add .
git commit -m "Initial commit"
# Adicionar remote do Heroku
heroku git:remote -a my-awesome-app
# Implementar
git push heroku main
# Abrir no browser
heroku open

Implementação Python/Django

Estrutura do Projeto

my-django-app/
├── requirements.txt
├── runtime.txt
├── Procfile
├── manage.py
├── myproject/
│ ├── settings.py
│ └── wsgi.py
└── staticfiles/

requirements.txt

Django==4.2
gunicorn==21.2.0
whitenoise==6.6.0
dj-database-url==2.1.0
psycopg2-binary==2.9.9

runtime.txt

python-3.11.4

Procfile

web: gunicorn myproject.wsgi --log-file -
release: python manage.py migrate

Atualizações em settings.py

import os
import dj_database_url
# Segurança
SECRET_KEY = os.environ.get('SECRET_KEY', 'dev-secret-key')
DEBUG = os.environ.get('DEBUG', 'False') == 'True'
ALLOWED_HOSTS = ['*'] # Configurar corretamente para produção
# Base de dados
DATABASES = {
'default': dj_database_url.config(
default='sqlite:///db.sqlite3',
conn_max_age=600
)
}
# Ficheiros estáticos
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
# Whitenoise para ficheiros estáticos
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
# ... outro middleware
]
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

Implementação PHP/Laravel

Procfile

web: vendor/bin/heroku-php-apache2 public/

Comandos de Implementação

# Definir buildpack
heroku buildpacks:set heroku/php
# Definir variáveis de ambiente
heroku config:set APP_KEY=$(php artisan key:generate --show)
heroku config:set APP_ENV=production
heroku config:set APP_DEBUG=false
# Implementar
git push heroku main
# Executar migrações
heroku run php artisan migrate --force

Variáveis de Ambiente

Definir Config Vars

# Definir uma única variável
heroku config:set DATABASE_URL=postgres://...
heroku config:set SECRET_KEY=your-secret-key
# Definir várias
heroku config:set NODE_ENV=production DEBUG=false
# Ver todas as config vars
heroku config
# Remover variável
heroku config:unset DEBUG

Utilizar na Aplicação

// Node.js
const dbUrl = process.env.DATABASE_URL;
const secret = process.env.SECRET_KEY;
# Python
import os
db_url = os.environ.get('DATABASE_URL')
secret = os.environ.get('SECRET_KEY')

Add-ons

Base de Dados (Heroku Postgres)

# Adicionar tier gratuito
heroku addons:create heroku-postgresql:mini
# Adicionar tier de produção
heroku addons:create heroku-postgresql:standard-0
# Obter informação de ligação
heroku pg:info
heroku config:get DATABASE_URL
# Aceder ao psql
heroku pg:psql

Redis

# Adicionar Redis
heroku addons:create heroku-redis:mini
# Obter URL de ligação
heroku config:get REDIS_URL

Outros Add-ons Úteis

# Logging
heroku addons:create papertrail:choklad
# Monitorização
heroku addons:create newrelic:wayne
# E-mail
heroku addons:create sendgrid:starter
# Scheduler (tarefas cron)
heroku addons:create scheduler:standard

Escalamento

Escalamento Manual

# Escalar dynos web
heroku ps:scale web=2
# Escalar workers
heroku ps:scale worker=1
# Ver escalamento atual
heroku ps
# Desligar
heroku ps:scale web=0 worker=0

Tipos de Dyno

# Atualizar tipo de dyno
heroku ps:type web=standard-1x
heroku ps:type worker=standard-2x

Logs e Monitorização

Ver Logs

# Transmitir logs
heroku logs --tail
# Filtrar por processo
heroku logs --tail --ps web
# Últimas N linhas
heroku logs -n 500
# Filtrar por origem
heroku logs --source app
heroku logs --source heroku

Comandos One-off

# Executar comando
heroku run node scripts/seed.js
heroku run python manage.py shell
# Executar bash
heroku run bash

Pipelines e Review Apps

Criar Pipeline

# Criar pipeline
heroku pipelines:create my-pipeline -a my-app-production
# Adicionar app de staging
heroku pipelines:add my-pipeline -a my-app-staging -s staging
# Promover staging para produção
heroku pipelines:promote -a my-app-staging

app.json para Review Apps

{
"name": "My App",
"scripts": {
"postdeploy": "npm run db:seed"
},
"env": {
"NODE_ENV": "development",
"SECRET_KEY": {
"generator": "secret"
}
},
"addons": [
"heroku-postgresql:mini",
"heroku-redis:mini"
],
"buildpacks": [
{ "url": "heroku/nodejs" }
]
}

Integração CI/CD

GitHub Actions

name: Deploy to Heroku
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Deploy to Heroku
uses: akhileshns/[email protected]
with:
heroku_api_key: ${{ secrets.HEROKU_API_KEY }}
heroku_app_name: my-app
heroku_email: [email protected]

Heroku CI

app.json:

{
"environments": {
"test": {
"scripts": {
"test": "npm test"
},
"addons": [
"heroku-postgresql:mini"
]
}
}
}

Domínios Personalizados e SSL

Adicionar Domínio Personalizado

# Adicionar domínio
heroku domains:add www.example.com
heroku domains:add example.com
# Ver destinos DNS
heroku domains
# Configurar DNS
# Apontar www para <app>.herokudns.com (CNAME)
# Apontar apex para <app>.herokudns.com (ALIAS/ANAME)

SSL

# SSL automático (apenas dynos pagos)
heroku certs:auto:enable
# SSL manual
heroku certs:add server.crt server.key

Resolução de Problemas

Problemas Comuns

# Verificar estado da app
heroku ps
# Reiniciar todos os dynos
heroku restart
# Verificar erros
heroku logs --tail
# Verificar releases
heroku releases
# Reverter para a release anterior
heroku rollback v10

Problemas de Build

# Ver logs de build
heroku builds:output
# Limpar cache de build
heroku builds:cache:purge -a my-app

Principais Conclusões

  1. O Procfile é essencial: Define como executar a sua app
  2. Variáveis de ambiente: Nunca codifique segredos diretamente
  3. Use add-ons: Serviços geridos poupam tempo
  4. Escale de forma adequada: Comece pequeno, escale quando necessário
  5. Monitorize os logs: Essencial para depurar problemas em produção
  6. Use pipelines: Fluxo Staging → Production

O Heroku troca custo por simplicidade — perfeito para equipas que precisam de entregar rapidamente sem recursos dedicados de DevOps.

 
 
 
Языки
Темы
Copyright © 1999 — 2026
ZK Interactive