Aplicação Fullstack TypeScript para agendamento de consultas médicas, com suporte a PWA (Progressive Web App) para uso mobile.
- Backend: Node.js + Express + TypeScript + MongoDB
- Frontend: React + TypeScript + Vite + TailwindCSS
- Admin: React + TypeScript + Vite + TailwindCSS
- Banco de Dados: MongoDB
- Containerização: Docker + Docker Compose
- Proxy Reverso: Nginx
- Docker (versão 20.10 ou superior)
- Docker Compose (versão 2.0 ou superior)
- Git
git clone <url-do-repositorio>
cd MechFullStackCopie o arquivo .env.example para .env na raiz do projeto:
cp .env.example .envEdite o arquivo .env e configure as variáveis conforme necessário:
# MongoDB
MONGO_PORT=27017
# Backend
BACKEND_PORT=4000
MONGODB_URI=mongodb://mongo:27017
MONGODB_DB_NAME=mech
JWT_SECRET=seu-jwt-secret-super-seguro
ADMIN_EMAIL=admin@admin.com
ADMIN_PASSWORD=admin
CLOUDINARY_NAME=seu-cloudinary-name
CLOUDINARY_API_KEY=sua-api-key
CLOUDINARY_SECRET_KEY=seu-secret-key
STRIPE_SECRET_KEY=sua-stripe-key
RAZORPAY_KEY_ID=sua-razorpay-key-id
RAZORPAY_KEY_SECRET=sua-razorpay-secret
CURRENCY=USD
NODE_ENV=production
# Frontend
FRONTEND_BACKEND_URL=/api
# Admin
ADMIN_BACKEND_URL=/api
# Nginx
NGINX_PORT=8080
NGINX_ADMIN_PORT=8081Importante:
- Gere um
JWT_SECRETseguro em produção (use uma string aleatória longa) - Configure as credenciais do Cloudinary se desejar upload de imagens
- Configure as chaves de pagamento (Stripe/Razorpay) se desejar processar pagamentos
docker compose up -d --buildEste comando irá:
- Construir as imagens Docker de todos os serviços
- Iniciar MongoDB, Backend, Frontend, Admin e Nginx
- Criar a rede interna do Docker para comunicação entre serviços
Após alguns segundos (aguarde os healthchecks), acesse:
- Frontend (PWA): http://localhost:8080
- Admin Panel: http://localhost:8080/admin ou http://localhost:8081
- API Backend: http://localhost:8080/api
- Documentação API (Swagger): http://localhost:8080/api/docs
Para criar dados de exemplo (admin, usuário teste e médicos):
docker compose exec backend npm run seedOu usando o Makefile:
make seedA aplicação está configurada como PWA e pode ser instalada no celular:
- Acesse http://localhost:8080 no navegador mobile
- O navegador oferecerá a opção de "Adicionar à tela inicial"
- Funciona offline após o primeiro carregamento (cache de assets)
- Acesse http://localhost:8080/admin ou http://localhost:8081
- Também pode ser instalado como PWA
docker compose logs -fdocker compose logs -f backend
docker compose logs -f frontend
docker compose logs -f admindocker compose downdocker compose down -vdocker compose up -d --builddocker compose psMechFullStack/
├── backend/ # API Node.js + Express + TypeScript
│ ├── src/
│ │ ├── config/ # Configurações (MongoDB, Cloudinary)
│ │ ├── controllers/ # Controllers da API
│ │ ├── middleware/ # Middlewares (auth, multer)
│ │ ├── models/ # Modelos Mongoose
│ │ ├── routes/ # Rotas da API
│ │ └── server.ts # Servidor Express
│ ├── .env.example # Exemplo de variáveis de ambiente
│ └── package.json
├── frontend/ # Frontend React + TypeScript
│ ├── src/
│ │ ├── components/ # Componentes React
│ │ ├── context/ # Context API
│ │ ├── pages/ # Páginas da aplicação
│ │ └── main.tsx # Entry point
│ ├── public/ # Assets públicos (incluindo ícones PWA)
│ ├── .env.example
│ └── vite.config.js # Configuração Vite + PWA
├── admin/ # Painel Admin React + TypeScript
│ ├── src/
│ │ ├── components/
│ │ ├── context/
│ │ ├── pages/
│ │ └── main.tsx
│ ├── .env.example
│ └── vite.config.js
├── docker/ # Dockerfiles centralizados
│ ├── backend.Dockerfile
│ ├── frontend.Dockerfile
│ └── admin.Dockerfile
├── docker-compose.yml # Orquestração dos serviços
├── nginx.conf # Configuração do Nginx
├── .env.example # Variáveis de ambiente do Docker Compose
└── README.md
- JWT_SECRET: Use uma chave longa e aleatória (mínimo 32 caracteres)
- ADMIN_PASSWORD: Altere a senha padrão do admin
- MongoDB: Configure autenticação no MongoDB
- HTTPS: Use HTTPS em produção (configure certificado SSL no Nginx)
- CORS: Ajuste as configurações de CORS no backend conforme necessário
- Variáveis de Ambiente: Nunca commite o arquivo
.envno Git
Verifique os logs:
docker compose logsVerifique se o serviço está saudável:
docker compose psAguarde alguns segundos após o início para os healthchecks completarem.
Se as portas 8080, 8081, 4000 ou 27017 estiverem em uso, altere no .env:
NGINX_PORT=8082
BACKEND_PORT=4001
MONGO_PORT=27018Limpe os containers e volumes:
docker compose down -v
docker compose up -d --buildMONGODB_URI: URI de conexão do MongoDBMONGODB_DB_NAME: Nome do banco de dadosPORT: Porta do servidor backendJWT_SECRET: Chave secreta para JWTADMIN_EMAIL: Email do administradorADMIN_PASSWORD: Senha do administradorCLOUDINARY_NAME: Nome da conta CloudinaryCLOUDINARY_API_KEY: API Key do CloudinaryCLOUDINARY_SECRET_KEY: Secret Key do CloudinarySTRIPE_SECRET_KEY: Chave secreta do StripeRAZORPAY_KEY_ID: Key ID do RazorpayRAZORPAY_KEY_SECRET: Secret Key do RazorpayCURRENCY: Moeda para pagamentos (USD, BRL, etc)
VITE_BACKEND_URL: URL base da API (ex:/api)
- Configure um servidor com Docker instalado
- Clone o repositório
- Configure o arquivo
.envcom valores de produção - Execute
docker compose up -d --build - Configure um domínio e apontamento DNS
- Configure SSL/TLS (Let's Encrypt recomendado)
- Configure backup automático do MongoDB
ISC
Contribuições são bem-vindas! Por favor, abra uma issue ou pull request.
Desenvolvido com ❤️ para facilitar agendamentos médicos