Documentação completa do ambiente de desenvolvimento fullstack com infraestrutura compartilhada.
Este é um ambiente de desenvolvimento fullstack projetado para:
*.dev.alav.cloud| Componente | Tecnologia |
|---|---|
| Backend | Go (Gin Framework) |
| Frontend | Vue.js (Vite) ou Next.js |
| Banco de Dados | PostgreSQL 16 |
| Object Storage | MinIO (S3-compatible) |
| Cache/Filas | Redis 7 |
| Proxy Reverso | Nginx |
| Containerização | Docker + Docker Compose |
┌─────────────────────────────────────────────────────────────┐
│ INTERNET │
│ *.dev.alav.cloud │
└─────────────────────┬───────────────────────────────────────┘
│ HTTPS (443)
▼
┌─────────────────────────────────────────────────────────────┐
│ NGINX (Docker) │
│ Proxy Reverso + SSL Termination │
│ caixa.dev.alav.cloud → http://localhost:3000 (Frontend)│
│ caixa.dev.alav.cloud/api → http://localhost:8000 (Backend) │
└─────────────────────┬───────────────────────────────────────┘
│
┌────────────┼────────────┐
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌──────────┐ ┌──────────┐
│ FRONTEND │ │ BACKEND │ │ OUTROS │
│ (Vite/ │ │ (Go/ │ │ PROJETOS│
│ Next.js) │ │ Gin) │ │ │
│ Porta 3000 │ │ Porta 800│ │ │
└─────────────┘ └──────────┘ └──────────┘
│ │
└─────┬──────┘
│
▼
┌──────────────────────────────────────────────────────────────┐
│ INFRAESTRUTURA COMPARTILHADA (Docker) │
│ ┌──────────────┐ ┌──────────┐ ┌─────────────────────┐ │
│ │ PostgreSQL │ │ Redis │ │ MinIO │ │
│ │ (5432) │ │ (6379) │ │ (9000 API) │ │
│ │ devdb │ │ Cache │ │ (9001 Console) │ │
│ │ proj_caixa │ │ Filas │ │ Buckets S3 │ │
│ └──────────────┘ └──────────┘ └─────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
# Acessar a VPS
ssh root@<IP-DA-VPS>
# Ou como usuário desenvolvedor
ssh dev@<IP-DA-VPS>| Usuário | Permissões |
|---|---|
root |
Root completo |
dev |
Sudo sem senha + Docker |
dev# Como root
passwd devdev# Do terminal SSH (como root)
su - dev
# Ou direto no login
ssh dev@<IP-DA-VPS>Dados de Conexão:
Host: localhost (ou shared-postgres dentro da rede Docker)
Porta: 5432
Database: devdb
Usuário: dev_app
Senha: dev123456
Acessar PostgreSQL:
# Via Docker
docker exec -it shared-postgres psql -U dev_app -d devdb
# Via linha de comando (se PostgreSQL estiver instalado)
psql -h localhost -U dev_app -d devdb
# Dentro de um projeto (usando variáveis do .env)
export PGPASSWORD=dev123456
psql -h localhost -U dev_app -d devdbCriar Schema para Projeto:
docker exec -it shared-postgres psql -U dev_app -d devdb -c \
"CREATE SCHEMA IF NOT EXISTS proj_meuprojeto;"Listar Schemas:
docker exec -it shared-postgres psql -U dev_app -d devdb -c "\dn"Backup do Banco:
# Criar backup
docker exec shared-postgres pg_dump -U dev_app devdb > backup_$(date +%Y%m%d).sql
# Restaurar backup
docker exec -i shared-postgres psql -U dev_app -d devdb < backup_20260309.sqlDados de Acesso:
Endpoint: http://<IP-DA-VPS>:9000
Console: http://<IP-DA-VPS>:9001
Access Key: minioadmin
Secret Key: minio123456
Acessar Console Web:
http://<IP-DA-VPS>:9001minioadmin / minio123456Usando MinIO Client (mc):
# Adicionar endpoint
docker run --rm --network infra_dev-network \
minio/mc:latest alias set dev http://shared-minio:9000 minioadmin minio123456
# Listar buckets
docker run --rm --network infra_dev-network minio/mc:latest ls dev
# Criar bucket
docker run --rm --network infra_dev-network minio/mc:latest mb dev/meu-bucket
# Upload de arquivo
docker run --rm --network infra_dev-network \
minio/mc:latest cp /caminho/do/arquivo.txt dev/meu-bucket/
# Download de arquivo
docker run --rm --network infra_dev-network \
minio/mc:latest cp dev/meu-bucket/arquivo.txt /caminho/local/
# Deletar bucket
docker run --rm --network infra_dev-network minio/mc:latest rm -r --force dev/meu-bucketDados de Conexão:
Host: localhost (ou shared-redis dentro da rede Docker)
Porta: 6379
Senha: redis123456
Acessar Redis CLI:
# Via Docker
docker exec -it shared-redis redis-cli -a redis123456Comandos Úteis:
# Testar conexão
docker exec -it shared-redis redis-cli -a redis123456 PING
# Listar todas as chaves
docker exec -it shared-redis redis-cli -a redis123456 KEYS "*"
# Ver tipo de chave
docker exec -it shared-redis redis-cli -a redis123456 TYPE minha-chave
# Deletar chave
docker exec -it shared-redis redis-cli -a redis123456 DEL minha-chave/srv/scripts/novo-projeto.shO script fará as seguintes perguntas:
caixa# Projeto com Vite + Vue.js
/srv/scripts/novo-projeto.sh --nome=caixa --frontend=vite
# Projeto com Next.js
/srv/scripts/novo-projeto.sh --nome=financeiro --frontend=next
# Projeto sem frontend (apenas backend/API)
/srv/scripts/novo-projeto.sh --nome=api --frontend=none
# Projeto com infraestrutura própria
/srv/scripts/novo-projeto.sh --nome=estoque --stack-completa/srv/projects/{nome}proj_{nome}proj-{nome}https://{nome}.dev.alav.cloud.env com todas as variáveis de
ambienteproject.conf com configurações do projeto/srv/scripts/listar-projetos.shSaída de exemplo:
========================================
PROJETOS CADASTRADOS
========================================
PROJETO FRONTEND FE_PORT BE_PORT DOMÍNIO
------- -------- ------- ------- -------
caixa vite 3000 8000 caixa.dev.alav.cloud
financeiro next 3001 8001 financeiro.dev.alav.cloud
api none - 8002 -
========================================
PORTAS DISPONÍVEIS
========================================
TIPO FAIXA PRÓXIMA
---- ----- -------
frontend 3000-3099 3002
backend 8000-8099 8003
auxiliary 9000-9099 9000
postgres 5400-5499 5400
redis 6400-6499 6400
minio 9500-9599 9500
# Remover projeto (pede confirmação)
/srv/scripts/remover-projeto.sh caixa
# Remover sem confirmação
/srv/scripts/remover-projeto.sh caixa --force
# Remover mantendo dados (banco e bucket)
/srv/scripts/remover-projeto.sh caixa --keep-dataO que é removido:
--keep-data)--keep-data)/srv/
├── infra/ # Infraestrutura compartilhada
│ ├── docker-compose.yml # PostgreSQL, MinIO, Redis
│ ├── secrets/ # Credenciais dos serviços
│ └── init-scripts/ # Scripts de inicialização do DB
│
├── projects/ # SEUS PROJETOS AQUI
│ └── {nome-do-projeto}/
│ ├── backend/ # Código Go (Gin)
│ ├── frontend/ # Código Frontend
│ ├── .env # Variáveis de ambiente
│ ├── project.conf # Configurações (JSON)
│ └── infra/ # (Opcional) Docker se stack-completa
│
├── nginx/
│ ├── docker-compose.yml # Nginx em Docker
│ ├── nginx.conf # Configuração principal
│ ├── sites/ # Configs por projeto
│ ├── certs/ # Certificados SSL
│ └── logs/ # Logs do Nginx
│
├── scripts/ # Scripts de Automação
│ ├── novo-projeto.sh
│ ├── listar-projetos.sh
│ ├── remover-projeto.sh
│ ├── allocate-port.sh
│ └── setup-ssl.sh
│
├── ports.registry.json # Controle de portas (JSON)
└── README.md # Documentação
/srv/projects/caixa/
├── backend/
│ ├── main.go # Ponto de entrada Go
│ ├── go.mod # Dependências Go
│ ├── handlers/ # Handlers HTTP
│ ├── models/ # Modelos de dados
│ ├── services/ # Lógica de negócio
│ └── repositories/ # Acesso a dados
│
├── frontend/
│ ├── src/
│ │ ├── App.vue
│ │ ├── main.js
│ │ ├── components/
│ │ └── views/
│ ├── package.json
│ ├── vite.config.js
│ └── index.html
│
├── .env # Variáveis de ambiente
├── project.conf # Configurações do projeto
└── README.md # Documentação do projeto
| Tipo | Faixa | Uso | Exemplo |
|---|---|---|---|
| Frontend | 3000-3099 | Dev server Vite/Next.js | 3000, 3001, 3002 |
| Backend | 8000-8099 | Servidor HTTP Go | 8000, 8001, 8002 |
| Auxiliar | 9000-9099 | Workers, WebSockets | 9000, 9001 |
| PostgreSQL | 5400-5499 | DB dedicado (stack completa) | 5400, 5401 |
| Redis | 6400-6499 | Redis dedicado (stack completa) | 6400, 6401 |
| MinIO | 9500-9599 | MinIO dedicado (stack completa) | 9500, 9501 |
# Sintaxe
/srv/scripts/allocate-port.sh <tipo> <nome-projeto>
# Exemplos
/srv/scripts/allocate-port.sh frontend meuapp
# Retorna: 3002
/srv/scripts/allocate-port.sh backend meuapp
# Retorna: 8002Para que os subdomínios funcionem, configure o DNS:
Tipo: A
Nome: *.dev
Valor: <IP-DA-VPS>
Tipo: A
Nome: @
Valor: <IP-DA-VPS>
# Testar configuração
docker exec dev-nginx nginx -t
# Recarregar configuração
docker exec dev-nginx nginx -s reload
# Ver logs
docker logs dev-nginx -f
# Reiniciar Nginx
docker restart dev-nginxObter certificado:
# 1. Verificar se DNS está configurado
dig caixa.dev.alav.cloud
# 2. Executar Certbot
certbot certonly --manual --preferred-challenges dns \
-d dev.alav.cloud -d '*.dev.alav.cloud' \
--email admin@alav.cloud --agree-tos
# 3. Copiar certificados
cp /etc/letsencrypt/live/dev.alav.cloud/*.pem /srv/nginx/certs/
# 4. Recarregar Nginx
docker restart dev-nginxScript de setup:
/srv/scripts/setup-ssl.shPostgreSQL (devdb)
├── schema: public (padrão)
├── schema: proj_caixa
├── schema: proj_financeiro
└── schema: proj_estoque
# Via Docker
docker exec -it shared-postgres psql -U dev_app -d devdb
# Com PGPASSWORD
export PGPASSWORD=dev123456
psql -h localhost -U dev_app -d devdb# PostgreSQL
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_DB=devdb
POSTGRES_USER=dev_app
POSTGRES_PASSWORD=dev123456
POSTGRES_SCHEMA=proj_caixa
http://<IP-DA-VPS>:9001minioadmin / minio123456# Configurar alias
docker run --rm --network infra_dev-network \
minio/mc:latest alias set dev http://shared-minio:9000 minioadmin minio123456
# Listar buckets
docker run --rm --network infra_dev-network minio/mc:latest ls dev
# Criar bucket
docker run --rm --network infra_dev-network minio/mc:latest mb dev/proj-caixa
# Upload
docker run --rm --network infra_dev-network \
minio/mc:latest cp arquivo.txt dev/proj-caixa/
# Listar conteúdo
docker run --rm --network infra_dev-network minio/mc:latest ls dev/proj-caixa# Acessar CLI
docker exec -it shared-redis redis-cli -a redis123456
# Testar conexão
docker exec -it shared-redis redis-cli -a redis123456 PING
# Resposta: PONG
# Set/Get
docker exec -it shared-redis redis-cli -a redis123456 SET minha-chave "valor"
docker exec -it shared-redis redis-cli -a redis123456 GET minha-chave
# Listar chaves
docker exec -it shared-redis redis-cli -a redis123456 KEYS "*"Localização:
/srv/scripts/novo-projeto.sh
# Interativo
/srv/scripts/novo-projeto.sh
# Com argumentos
/srv/scripts/novo-projeto.sh --nome=caixa --frontend=viteOpções: - --nome=NAME - Nome do projeto
- --frontend=TYPE - Tipo: vite,
next, none - --stack-completa -
Usar infraestrutura própria
Localização:
/srv/scripts/listar-projetos.sh
/srv/scripts/listar-projetos.shLocalização:
/srv/scripts/remover-projeto.sh
# Com confirmação
/srv/scripts/remover-projeto.sh caixa
# Sem confirmação
/srv/scripts/remover-projeto.sh caixa --force
# Manter dados
/srv/scripts/remover-projeto.sh caixa --keep-dataStatus:
ufw status verbosePortas liberadas:
| Porta | Serviço | Acesso |
|---|---|---|
| 22 | SSH | Público |
| 80 | HTTP | Público |
| 443 | HTTPS | Público |
| 4096 | Opencode Web | Público |
dev# Criar senha
passwd dev
# Acessar
su - dev
# Permissões:
# - Sudo sem senha
# - Grupo docker
# - Acesso a /srv/projects# Testar configuração
docker exec dev-nginx nginx -t
# Ver logs
docker logs dev-nginx
# Recarregar
docker exec dev-nginx nginx -s reload
# Reiniciar
docker restart dev-nginx# Verificar se PostgreSQL está rodando
docker ps | grep postgres
# Testar conexão
docker exec -it shared-postgres psql -U dev_app -d devdb -c "SELECT 1;"
# Verificar schema existe
docker exec -it shared-postgres psql -U dev_app -d devdb -c "\dn"
# Verificar .env do projeto
cat /srv/projects/{nome}/.env | grep POSTGRES# Verificar o que está usando a porta
netstat -tlnp | grep :8000
# Ver portas alocadas no registry
cat /srv/ports.registry.json | jq '.allocations[] | select(.port == 8000)'# Verificar se certificado existe
ls -la /srv/nginx/certs/
# Renovar certificado
certbot renew
# Recarregar Nginx
docker restart dev-nginx# Verificar se está rodando
docker ps | grep redis
# Testar conexão
docker exec -it shared-redis redis-cli -a redis123456 PING
# Reiniciar
docker restart shared-redis# Listar containers
docker ps
# Ver logs
docker logs <container> -f
# Reiniciar container
docker restart <container>
# Ver uso de recursos
docker stats# Iniciar serviços
cd /srv/infra && docker compose up -d
# Parar serviços
cd /srv/infra && docker compose down
# Ver status
cd /srv/infra && docker compose ps
# Ver logs
cd /srv/infra && docker compose logs -f# Ver uso de CPU/Memória
htop
# Ver uso de disco
df -h
# Ver portas em uso
netstat -tlnp
# Reiniciar VPS
reboot# Nginx
docker logs dev-nginx -f
# PostgreSQL
docker logs shared-postgres -f
# MinIO
docker logs shared-minio -f
# Redis
docker logs shared-redis -fssh dev@<IP-VPS>
/srv/scripts/novo-projeto.sh --nome=meuapp --frontend=vite
cd /srv/projects/meuappcd backend
go mod tidy
BACKEND_PORT=8002 go run main.gocd ../frontend
npm install
npm run dev# Backend
curl http://localhost:8002/health
# Frontend
curl http://localhost:3002
# Via domínio
curl https://meuapp.dev.alav.cloud
curl https://meuapp.dev.alav.cloud/api/healthÚltima atualização: 2026-03-09
Versão: 1.0.0
Manutenção: Equipe de Infraestrutura