Oracle Cloud: Configuração Inicial do Servidor
Com o servidor criado e devidamente preparado no post anterior, damos continuidade ao processo entrando na fase de configuração.
Neste segundo post, detalho as configurações, ajustes e boas práticas necessárias para colocar o servidor em funcionamento de acordo com o objetivo proposto.
Aqui, o ambiente deixa de ser apenas uma estrutura básica e passa a operar de forma prática e funcional.
Passo 1: Instalação e Configuração do Servidor
Para melhor compreensão do processo como um todo, é recomendado iniciar pelo primeiro post.
Passo 1.1: Atualizando o Sistema
Primeiro, sempre atualize o sistema:
sudo apt update && sudo apt upgrade -y
Este comando faz duas coisas:
apt update: Atualiza a lista de pacotes disponíveisapt upgrade -y: Instala as atualizações disponíveis (o-yconfirma automaticamente)
Isso pode levar alguns minutos.
Passo 1.2: Configurando o Timezone
Configure o fuso horário correto:
sudo timedatectl set-timezone America/Sao_Paulo
Para ver outros timezones disponíveis:
timedatectl list-timezones
Verifique a configuração:
timedatectl
Passo 1.3: Configurando o Firewall do Ubuntu (UFW)
Ubuntu vem com UFW (Uncomplicated Firewall), mas não ativado por padrão. Vamos configurá-lo:
ATENÇÃO: É CRUCIAL fazer isso na ordem correta para não bloquear seu próprio acesso SSH!
# Permitir SSH primeiro (MUITO IMPORTANTE!)
sudo ufw allow 22/tcp
# Permitir HTTP
sudo ufw allow 80/tcp
# Permitir HTTPS
sudo ufw allow 443/tcp
# Se você vai usar outras portas, adicione aqui
# Exemplo: sudo ufw allow 3000/tcp
# Agora podemos habilitar o firewall
sudo ufw enable
Quando perguntado "Command may disrupt existing ssh connections. Proceed with operation (y|n)?", digite y.
Verifique o status:
sudo ufw status verbose
Você deve ver algo assim:
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
Passo 1.4: Configurando o Firewall do Oracle Linux (iptables)
A Oracle configura automaticamente iptables no Ubuntu para bloquear tráfego. Precisamos ajustar:
# Ver regras atuais
sudo iptables -L -n -v
# Permitir tráfego HTTP
sudo iptables -I INPUT 6 -m state --state NEW -p tcp --dport 80 -j ACCEPT
# Permitir tráfego HTTPS
sudo iptables -I INPUT 6 -m state --state NEW -p tcp --dport 443 -j ACCEPT
# Salvar as regras permanentemente
sudo netfilter-persistent save
Se o comando netfilter-persistent não funcionar, instale:
sudo apt install iptables-persistent -y
Durante a instalação, quando perguntado sobre salvar as regras atuais, selecione Yes.
Passo 1.5: Criando um Usuário Não-Root (Opcional mas Recomendado)
Por segurança, é bom criar um usuário separado para tarefas do dia a dia:
# Criar usuário
sudo adduser seunomedeusuario
# Adicionar ao grupo sudo (permissões administrativas)
sudo usermod -aG sudo seunomedeusuario
# Copiar chaves SSH para o novo usuário
sudo mkdir -p /home/seunomedeusuario/.ssh
sudo cp ~/.ssh/authorized_keys /home/seunomedeusuario/.ssh/
sudo chown -R seunomedeusuario:seunomedeusuario /home/seunomedeusuario/.ssh
sudo chmod 700 /home/seunomedeusuario/.ssh
sudo chmod 600 /home/seunomedeusuario/.ssh/authorized_keys
Teste a conexão com o novo usuário antes de sair:
# Em outro terminal
ssh -i sua-chave.key seunomedeusuario@SEU_IP
Passo 1.6: Instalando Ferramentas Essenciais
sudo apt install -y \
curl \
wget \
git \
vim \
htop \
net-tools \
build-essential \
software-properties-common \
ufw \
fail2ban
Explicação:
- curl/wget: Ferramentas para download
- git: Controle de versão
- vim: Editor de texto
- htop: Monitor de recursos do sistema
- net-tools: Ferramentas de rede
- build-essential: Compiladores C/C++
- fail2ban: Proteção contra ataques de força bruta
Passo 1.7: Configurando Fail2Ban
Fail2ban protege contra ataques de força bruta:
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
Criar configuração personalizada:
sudo nano /etc/fail2ban/jail.local
Adicione:
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
[sshd]
enabled = true
port = 22
logpath = /var/log/auth.log
Salve (Ctrl+O, Enter, Ctrl+X) e reinicie:
sudo systemctl restart fail2ban
Passo 1.8: Configurando SWAP (Memória Virtual)
Mesmo com 12 GB de RAM, ter swap é uma boa prática:
# Criar arquivo de swap de 2GB
sudo fallocate -l 2G /swapfile
# Definir permissões corretas
sudo chmod 600 /swapfile
# Marcar como swap
sudo mkswap /swapfile
# Ativar
sudo swapon /swapfile
# Verificar
sudo swapon --show
free -h
# Tornar permanente
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
# Ajustar swappiness (quanto menor, menos usa swap)
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
Parte 2: Instalando e Configurando o Servidor Web (Nginx)
Nginx é um servidor web poderoso, leve e muito usado em produção.
Passo 6.1: Instalando o Nginx
sudo apt update
sudo apt install nginx -y
Passo 2.2: Iniciando e Habilitando o Nginx
# Iniciar o serviço
sudo systemctl start nginx
# Habilitar para iniciar automaticamente no boot
sudo systemctl enable nginx
# Verificar status
sudo systemctl status nginx
Passo 2.3: Testando o Nginx
Abra seu navegador e acesse: http://SEU_IP_PUBLICO
Você deve ver a página padrão do Nginx com a mensagem "Welcome to nginx!".
Se não funcionar, verifique:
- Firewall UFW está permitindo porta 80
- Security List da Oracle está permitindo porta 80
- iptables está configurado corretamente
Passo 2.4: Estrutura de Diretórios do Nginx
/etc/nginx/ # Diretório principal de configuração
├── nginx.conf # Configuração principal
├── sites-available/ # Sites disponíveis
├── sites-enabled/ # Sites habilitados (symlinks)
├── conf.d/ # Configurações adicionais
└── snippets/ # Snippets reutilizáveis
/var/www/html/ # Diretório padrão dos arquivos web
/var/log/nginx/ # Logs do Nginx
├── access.log # Log de acesso
└── error.log # Log de erros
Passo 2.5: Configuração Básica de Segurança do Nginx
Edite a configuração principal:
sudo nano /etc/nginx/nginx.conf
Encontre a seção http { e adicione/modifique:
http {
##
# Configurações básicas
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
server_tokens off; # Oculta versão do Nginx
##
# Limites de tamanho
##
client_max_body_size 20M;
client_body_buffer_size 128k;
##
# Gzip
##
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml text/javascript
application/json application/javascript application/xml+rss
application/rss+xml font/truetype font/opentype
application/vnd.ms-fontobject image/svg+xml;
# Resto da configuração...
}
Teste a configuração:
sudo nginx -t
Se estiver tudo OK, recarregue:
sudo systemctl reload nginx
Parte 3: Registrando e Configurando um Domínio
Passo 3.1: Adquirindo um Domínio
Você pode adquirir domínios em diversos registradores:
Opções Internacionais:
- Namecheap: Preços competitivos, boa interface
- Google Domains (atualmente gerenciado pelo Squarespace): Simples e integrado com Google Cloud
- Cloudflare: Preços no custo, DNS rápido incluído
- GoDaddy: Conhecido, mas mais caro
Opções Brasileiras:
- Registro.br: Para domínios .br (mais barato, R$ 40/ano)
- UOL Host: Revenda de .br e internacionais
- HostGator Brasil: Domínios e hospedagem
Para este tutorial, vou usar um exemplo genérico. Vamos supor que você registrou: meublog.tech
Passo 3.2: Configurando os DNS Records
Após registrar o domínio, você precisa configurar os DNS records para apontar para seu servidor Oracle Cloud.
Acesse o painel de controle DNS do seu registrador e adicione os seguintes registros:
Registro A (IPv4)
Tipo: A
Nome: @ (ou deixe vazio, representa o domínio raiz)
Valor: SEU_IP_PUBLICO_ORACLE
TTL: 3600 (ou Auto)
Este registro faz meublog.tech apontar para seu servidor.
Registro A para www
Tipo: A
Nome: www
Valor: SEU_IP_PUBLICO_ORACLE
TTL: 3600
Este registro faz www.meublog.tech apontar para seu servidor.
Alternativa: Usando CNAME para www
Tipo: CNAME
Nome: www
Valor: meublog.tech (ou @)
TTL: 3600
Exemplo Prático (no Cloudflare):
| Tipo | Nome | Conteúdo | Proxy | TTL |
|---|---|---|---|---|
| A | @ | 140.238.123.45 | DNS only | Auto |
| A | www | 140.238.123.45 | DNS only | Auto |
Importante:
- Desative o proxy (nuvem laranja) inicialmente no Cloudflare até configurar SSL
- A propagação DNS pode levar de minutos a 48 horas (geralmente 15-30 minutos)
Passo 3.3: Verificando a Propagação DNS
Você pode verificar se o DNS já está propagado:
No Linux/Mac:
dig meublog.tech
nslookup meublog.tech
No Windows:
nslookup meublog.tech
Online:
Procure por seu IP público nos resultados.
Passo 3.4: Configurando Virtual Host no Nginx
Agora que o domínio aponta para o servidor, vamos configurar o Nginx para servir o site.
Crie um arquivo de configuração para seu site:
sudo nano /etc/nginx/sites-available/meublog.tech
Adicione a seguinte configuração básica:
server {
listen 80;
listen [::]:80;
server_name meublog.tech www.meublog.tech;
root /var/www/meublog.tech/html;
index index.html index.htm index.nginx-debian.html;
# Logs específicos do site
access_log /var/log/nginx/meublog.tech.access.log;
error_log /var/log/nginx/meublog.tech.error.log;
location / {
try_files $uri $uri/ =404;
}
# Segurança adicional
location ~ /\.ht {
deny all;
}
}
Passo 3.5: Criando a Estrutura de Diretórios
# Criar diretório para o site
sudo mkdir -p /var/www/meublog.tech/html
# Definir permissões corretas
sudo chown -R $USER:$USER /var/www/meublog.tech/html
sudo chmod -R 755 /var/www/meublog.tech
Passo 3.6: Criando uma Página de Teste
nano /var/www/meublog.tech/html/index.html
Adicione um HTML simples:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Meu Blog de Tecnologia</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
display: flex;
justify-content: center;
align-items: center;
color: white;
}
.container {
text-align: center;
padding: 40px;
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
border-radius: 20px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
}
h1 {
font-size: 3em;
margin-bottom: 20px;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
}
p {
font-size: 1.2em;
line-height: 1.6;
margin-bottom: 30px;
}
.badge {
display: inline-block;
padding: 10px 20px;
background: rgba(255, 255, 255, 0.2);
border-radius: 50px;
margin: 10px;
font-size: 0.9em;
}
</style>
</head>
<body>
<div class="container">
<h1>🚀 Servidor no Ar!</h1>
<p>Bem-vindo ao meu servidor hospedado na Oracle Cloud Free Tier</p>
<div>
<span class="badge">Ubuntu 24.04</span>
<span class="badge">Nginx</span>
<span class="badge">Ampere ARM</span>
<span class="badge">Always Free</span>
</div>
<p style="margin-top: 30px; font-size: 0.9em; opacity: 0.8;">
Domínio configurado: <strong>meublog.tech</strong>
</p>
</div>
</body>
</html>
Salve o arquivo.
Passo 3.7: Ativando o Site
# Criar symlink para sites-enabled
sudo ln -s /etc/nginx/sites-available/meublog.tech /etc/nginx/sites-enabled/
# Opcional: Desabilitar o site padrão
sudo rm /etc/nginx/sites-enabled/default
# Testar configuração
sudo nginx -t
# Se tudo OK, recarregar Nginx
sudo systemctl reload nginx
Passo 3.8: Testando o Domínio
Abra seu navegador e acesse:
http://meublog.techhttp://www.meublog.tech
Você deve ver sua página de teste.
Se não funcionar, verifique:
# Ver logs de erro
sudo tail -f /var/log/nginx/error.log
# Ver logs do sistema
sudo journalctl -u nginx -n 50
Parte 4: Configurando SSL/TLS com Let's Encrypt (HTTPS)
Ter HTTPS é essencial hoje em dia. Vamos usar Let's Encrypt, que fornece certificados SSL gratuitos.
Passo 4.1: Instalando o Certbot
# Instalar Certbot e plugin do Nginx
sudo apt install certbot python3-certbot-nginx -y
Passo 4.2: Obtendo o Certificado SSL
sudo certbot --nginx -d meublog.tech -d www.meublog.tech
Durante o processo, você será questionado:
- Email: Digite um email válido (para avisos de expiração)
- Termos de Serviço: Digite
Ypara aceitar - Compartilhar email com EFF: Digite
NouYconforme preferir - Redirect HTTP para HTTPS: Digite
2para redirecionar todo tráfego para HTTPS
O Certbot irá:
- Validar que você controla o domínio
- Obter o certificado SSL
- Modificar automaticamente sua configuração do Nginx
- Configurar redirecionamento HTTP → HTTPS
Passo 4.3: Verificando a Instalação
Acesse seu site via HTTPS:
https://meublog.techhttps://www.meublog.tech
Você deve ver o cadeado verde no navegador indicando conexão segura.
Teste a qualidade do SSL em:
Seu site deve receber nota A ou A+.
Passo 4.4: Renovação Automática
Let's Encrypt emite certificados válidos por 90 dias. O Certbot configura renovação automática:
# Testar renovação
sudo certbot renew --dry-run
# Ver timer de renovação
sudo systemctl status certbot.timer
A renovação automática está configurada para executar duas vezes por dia. Certificados são renovados quando faltam 30 dias para expirar.
Passo 4.5: Configuração Nginx Após SSL
Após o Certbot modificar sua configuração, ela ficará assim:
sudo nano /etc/nginx/sites-available/meublog.tech
server {
server_name meublog.tech www.meublog.tech;
root /var/www/meublog.tech/html;
index index.html index.htm index.nginx-debian.html;
access_log /var/log/nginx/meublog.tech.access.log;
error_log /var/log/nginx/meublog.tech.error.log;
location / {
try_files $uri $uri/ =404;
}
location ~ /\.ht {
deny all;
}
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/meublog.tech/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/meublog.tech/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = www.meublog.tech) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = meublog.tech) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name meublog.tech www.meublog.tech;
return 404; # managed by Certbot
}
Passo 4.6: Melhorando a Configuração SSL (Opcional)
Para segurança adicional, você pode fortalecer a configuração SSL:
sudo nano /etc/nginx/sites-available/meublog.tech
Adicione dentro do bloco server que escuta na porta 443:
# Segurança adicional SSL
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
# Headers de segurança
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
Teste e recarregue:
sudo nginx -t
sudo systemctl reload nginx
Parte 5: Configurações Avançadas e Otimizações
Passo 9.1: Configurando Compressão Gzip Avançada
Já configuramos o básico, mas vamos otimizar:
sudo nano /etc/nginx/nginx.conf
Na seção http {, melhore as configurações gzip:
##
# Gzip Settings
##
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types
application/atom+xml
application/geo+json
application/javascript
application/x-javascript
application/json
application/ld+json
application/manifest+json
application/rdf+xml
application/rss+xml
application/xhtml+xml
application/xml
font/eot
font/otf
font/ttf
image/svg+xml
text/css
text/javascript
text/plain
text/xml;
Passo 5.2: Configurando Cache de Arquivos Estáticos
No arquivo do seu site:
sudo nano /etc/nginx/sites-available/meublog.tech
Adicione locations para cache:
# Cache de imagens
location ~* \.(jpg|jpeg|png|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off;
}
# Cache de CSS e JavaScript
location ~* \.(css|js)$ {
expires 1y;
add_header Cache-Control "public";
access_log off;
}
# Cache de fontes
location ~* \.(woff|woff2|ttf|otf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off;
}
Passo 5.3: Configurando Logs Rotacionados
O logrotate já está instalado, mas vamos verificar a configuração:
sudo nano /etc/logrotate.d/nginx
Deve conter algo assim:
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi
endscript
postrotate
invoke-rc.d nginx rotate >/dev/null 2>&1
endscript
}
Passo 5.4: Monitoramento com Netdata (Opcional)
Netdata é uma ferramenta excelente de monitoramento em tempo real:
# Instalar Netdata
bash <(curl -Ss https://my-netdata.io/kickstart.sh)
Durante a instalação, aceite as opções padrão.
Após a instalação, Netdata estará rodando na porta 19999. Para acessar:
Opção 1: Configurar proxy reverso no Nginx:
sudo nano /etc/nginx/sites-available/meublog.tech
Adicione um novo location:
location /netdata {
return 301 /netdata/;
}
location ~ /netdata/(?<ndpath>.*) {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_pass_request_headers on;
proxy_set_header Connection "keep-alive";
proxy_store off;
proxy_pass http://localhost:19999/$ndpath$is_args$args;
gzip on;
gzip_proxied any;
gzip_types *;
}
Agora você pode acessar em https://meublog.tech/netdata/
Opção 2: Abrir a porta 19999 temporariamente quando precisar:
sudo ufw allow 19999/tcp
Acesse via http://SEU_IP:19999 e depois feche:
sudo ufw delete allow 19999/tcp
Passo 5.5: Configurando Backups Automáticos
Criar script de backup:
sudo nano /usr/local/bin/backup-website.sh
Conteúdo:
#!/bin/bash
# Configurações
BACKUP_DIR="/home/ubuntu/backups"
WEBSITE_DIR="/var/www/meublog.tech"
NGINX_CONF="/etc/nginx/sites-available/meublog.tech"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="website_backup_$DATE.tar.gz"
# Criar diretório de backup se não existir
mkdir -p $BACKUP_DIR
# Criar backup
tar -czf $BACKUP_DIR/$BACKUP_NAME \
$WEBSITE_DIR \
$NGINX_CONF \
/etc/letsencrypt
# Manter apenas últimos 7 backups
cd $BACKUP_DIR
ls -t | tail -n +8 | xargs -r rm
echo "Backup criado: $BACKUP_NAME"
Tornar executável:
sudo chmod +x /usr/local/bin/backup-website.sh
Agendar com cron:
crontab -e
Adicione (backup diário às 3h da manhã):
0 3 * * * /usr/local/bin/backup-website.sh >> /home/ubuntu/backups/backup.log 2>&1
Testar:
/usr/local/bin/backup-website.sh
ls -lh ~/backups/
Parte 6: Implantando uma Aplicação Real
Vamos implantar exemplos de aplicações comuns.
Exemplo 1: Site Estático (Hugo, Jekyll, Next.js static)
Se você tem um site estático gerado:
# Fazer upload via SCP (do seu computador)
scp -r -i sua-chave.key ./public ubuntu@SEU_IP:/tmp/
# No servidor
sudo rm -rf /var/www/meublog.tech/html/*
sudo cp -r /tmp/public/* /var/www/meublog.tech/html/
sudo chown -R www-data:www-data /var/www/meublog.tech/html
Obs.: Em um próximo post, vou trazer um tutorial de como instalar e configurar o Runtipi para instalar o Ghost (a plataforma a qual estou utilizando em meu site).
Exemplo 2: Aplicação Node.js com PM2
Instalar Node.js:
# Instalar NVM (Node Version Manager)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash
# Recarregar shell
source ~/.bashrc
# Instalar Node.js LTS
nvm install --lts
nvm use --lts
# Verificar
node --version
npm --version
Instalar PM2 (gerenciador de processos):
npm install -g pm2
Clonar ou fazer upload da sua aplicação:
cd /var/www
sudo mkdir -p meublog-app
sudo chown $USER:$USER meublog-app
cd meublog-app
# Exemplo: clonar repositório
git clone https://github.com/seu-usuario/seu-app.git .
# Instalar dependências
npm install
Configurar variáveis de ambiente:
nano .env
Adicione suas variáveis:
PORT=3000
NODE_ENV=production
DATABASE_URL=sua_connection_string
Iniciar com PM2:
pm2 start npm --name "meublog-app" -- start
# ou
pm2 start app.js --name "meublog-app"
# Configurar para iniciar no boot
pm2 startup systemd
# Execute o comando que o PM2 mostrar
pm2 save
Configurar Nginx como proxy reverso:
sudo nano /etc/nginx/sites-available/meublog.tech
Modificar o location /:
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
Recarregar Nginx:
sudo nginx -t
sudo systemctl reload nginx
Comandos úteis do PM2:
pm2 list # Listar processos
pm2 logs meublog-app # Ver logs
pm2 restart meublog-app # Reiniciar
pm2 stop meublog-app # Parar
pm2 delete meublog-app # Remover
pm2 monit # Monitor em tempo real
Exemplo 3: WordPress com MySQL
Instalar MySQL:
sudo apt install mysql-server -y
# Configurar segurança
sudo mysql_secure_installation
Responda às perguntas:
- VALIDATE PASSWORD COMPONENT: Y
- Password validation policy: 2 (STRONG)
- New password: [crie uma senha forte]
- Remove anonymous users: Y
- Disallow root login remotely: Y
- Remove test database: Y
- Reload privilege tables: Y
Criar banco de dados para WordPress:
sudo mysql
No prompt MySQL:
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wordpressuser'@'localhost' IDENTIFIED BY 'senha_forte_aqui';
GRANT ALL ON wordpress.* TO 'wordpressuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Instalar PHP:
sudo apt install php-fpm php-mysql php-curl php-gd php-intl \
php-mbstring php-soap php-xml php-xmlrpc php-zip -y
Configurar PHP:
sudo nano /etc/php/8.1/fpm/php.ini
Modificar:
upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 256M
max_execution_time = 300
Reiniciar PHP-FPM:
sudo systemctl restart php8.1-fpm
Baixar WordPress:
cd /tmp
curl -O https://wordpress.org/latest.tar.gz
tar xzvf latest.tar.gz
sudo cp -a /tmp/wordpress/. /var/www/meublog.tech/html/
sudo chown -R www-data:www-data /var/www/meublog.tech/html
Configurar Nginx para PHP:
sudo nano /etc/nginx/sites-available/meublog.tech
Modificar a configuração:
server {
server_name meublog.tech www.meublog.tech;
root /var/www/meublog.tech/html;
index index.php index.html index.htm;
access_log /var/log/nginx/meublog.tech.access.log;
error_log /var/log/nginx/meublog.tech.error.log;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
log_not_found off;
access_log off;
allow all;
}
location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
expires max;
log_not_found off;
}
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/meublog.tech/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/meublog.tech/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
server {
if ($host = www.meublog.tech) {
return 301 https://$host$request_uri;
}
if ($host = meublog.tech) {
return 301 https://$host$request_uri;
}
listen 80;
server_name meublog.tech www.meublog.tech;
return 404;
}
Testar e recarregar:
sudo nginx -t
sudo systemctl reload nginx
Acessar WordPress:
- Vá para
https://meublog.tech - Siga o instalador do WordPress
- Use as credenciais do banco de dados criadas anteriormente
Parte 7: Manutenção e Monitoramento
Passo 7.1: Comandos de Monitoramento Essenciais
# Ver uso de CPU e memória
htop
# Ver uso de disco
df -h
# Ver uso de rede
sudo iftop
# Ver processos do Nginx
ps aux | grep nginx
# Ver processos do PHP
ps aux | grep php
# Ver conexões ativas
sudo netstat -tupln
# Ver logs em tempo real
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log
Passo 7.2: Atualizações de Segurança
Configure atualizações automáticas de segurança:
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure --priority=low unattended-upgrades
Selecione "Yes" para habilitar.
Verificar atualizações manualmente:
sudo apt update
sudo apt list --upgradable
sudo apt upgrade -y
Passo 7.3: Verificação de Integridade Regular
Criar script de verificação:
nano ~/check-health.sh
Conteúdo:
#!/bin/bash
echo "========== System Health Check =========="
echo "Date: $(date)"
echo ""
echo "=== Disk Usage ==="
df -h | grep -E '^/dev'
echo ""
echo "=== Memory Usage ==="
free -h
echo ""
echo "=== Top Processes by CPU ==="
ps aux --sort=-%cpu | head -6
echo ""
echo "=== Top Processes by Memory ==="
ps aux --sort=-%mem | head -6
echo ""
echo "=== Nginx Status ==="
sudo systemctl status nginx --no-pager | head -5
echo ""
echo "=== SSL Certificate Expiry ==="
sudo certbot certificates
echo ""
echo "=== Failed Login Attempts (last 10) ==="
sudo grep "Failed password" /var/log/auth.log | tail -10
echo ""
Tornar executável:
chmod +x ~/check-health.sh
Executar:
./check-health.sh
Passo 7.4: Backup para Object Storage da Oracle (Opcional)
A Oracle Cloud oferece 10 GB de Object Storage gratuito. Você pode usá-lo para backups:
Instalar OCI CLI:
bash -c "$(curl -L https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh)"
# Adicionar ao PATH
echo 'export PATH=$PATH:/home/ubuntu/bin' >> ~/.bashrc
source ~/.bashrc
Configurar:
oci setup config
Você precisará das informações do seu tenancy da Oracle Cloud (veja na página de perfil).
Criar bucket:
oci os bucket create --name backups --compartment-id ocid1.compartment.oc1..xxx
Script de backup para Object Storage:
nano ~/backup-to-oci.sh
#!/bin/bash
BACKUP_DIR="/home/ubuntu/backups"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="website_backup_$DATE.tar.gz"
# Criar backup
/usr/local/bin/backup-website.sh
# Upload para OCI
oci os object put \
--bucket-name backups \
--file $BACKUP_DIR/$BACKUP_NAME \
--name $BACKUP_NAME
echo "Backup uploaded to OCI: $BACKUP_NAME"
Conclusão
Parabéns! Você agora tem um servidor completo rodando na Oracle Cloud Free Tier com:
✅ Ubuntu 24.04 LTS otimizado
✅ Nginx configurado e seguro
✅ SSL/TLS com Let's Encrypt
✅ Domínio personalizado configurado
✅ Firewall configurado (UFW + iptables + Oracle Security Lists)
✅ Proteção contra força bruta (Fail2Ban)
✅ Monitoramento básico
✅ Backups automáticos
✅ Pronto para hospedar aplicações web
Este servidor pode rodar:
- Sites estáticos
- WordPress
- Aplicações Node.js, Python, Ruby, Go
- APIs REST
- Bancos de dados
- Containers Docker
- E muito mais!
Próximos Passos Sugeridos
- CDN: Configurar Cloudflare na frente para cache e proteção DDoS
- CI/CD: Automatizar deploys com GitHub Actions
- Docker: Containerizar suas aplicações
- Kubernetes: Para projetos maiores, usar K3s
- Observabilidade: Integrar com ferramentas como Prometheus + Grafana
- WAF: Configurar Web Application Firewall
- Database: Usar o Autonomous Database gratuito da Oracle
- Email: Configurar servidor de email ou usar serviços como SendGrid
Recursos Adicionais
- Documentação Oracle Cloud: https://docs.oracle.com/en-us/iaas/
- Nginx Documentation: https://nginx.org/en/docs/
- Let's Encrypt: https://letsencrypt.org/docs/
- Ubuntu Server Guide: https://ubuntu.com/server/docs
Custos
Tudo descrito neste guia está dentro do Always Free Tier da Oracle Cloud, ou seja:
- Custo mensal: R$ 0,00
- Único custo: Domínio (cerca de R$ 40-80/ano dependendo do registrador)
Importante Lembrar
- Mantenha seu sistema sempre atualizado
- Monitore recursos para não ultrapassar limites do Free Tier
- Faça backups regulares
- Use senhas fortes
- Mantenha apenas as portas necessárias abertas
- Revise logs regularmente
- Configure alertas para uso de recursos
Este servidor pode atender facilmente sites com milhares de visitantes por dia, sendo uma excelente opção para blogs pessoais, portfólios, APIs, ambientes de desenvolvimento e muito mais.
Se este guia foi útil, compartilhe com outros desenvolvedores! 🚀