Sistema de rastreamento e gerenciamento de motocicletas desenvolvido em .NET 9.0 com Azure SQL Database. A aplicação permite o controle completo do ciclo de vida das motos, desde o cadastro até a movimentação entre setores, utilizando tags RFID para rastreamento em tempo real.
- Gestão de Motos: CRUD completo com controle de chassi, placa, modelo e localização
- Sistema de Tags: Gerenciamento de tags RFID com vinculação/desvinculação de motos
- Controle de Setores: Organização das motos por departamentos (Manutenção, Prontas para Aluguel, etc.)
- Rastreamento: Histórico de localizações e movimentações
- API RESTful: Endpoints completos
- Redução de Perdas: Rastreamento em tempo real minimiza extravios e furtos
- Otimização Operacional: Visibilidade clara da localização de cada moto reduz tempo de busca
- Manutenção Preventiva: Controle de setores permite identificar motos que necessitam manutenção
- Auditoria Completa: Histórico de movimentações para compliance e análise
- Escalabilidade: Infraestrutura em nuvem permite crescimento sob demanda
- Disponibilidade: Aplicação hospedada no Azure com alta disponibilidade
- .NET 9.0 - Framework de desenvolvimento
- Azure SQL Database - Banco de dados relacional em nuvem
- Azure App Service - Hospedagem PaaS
- Entity Framework Core - ORM para acesso a dados
- Azure CLI - Automação de infraestrutura
A arquitetura proposta utiliza Azure App Service para hospedar a API em .NET 8,
e um Azure SQL Database (motodb) para persistência dos dados.
As requisições HTTP do usuário passam pelo App Service, que realiza consultas SQL ao banco.
O fluxo de deploy é feito via GitHub → Azure.
- O usuário envia requisições HTTP → App Service.
- O App Service processa a API e consulta o banco.
- O Dev faz deploy a partir do GitHub (manual ou futuro CI/CD).
- Tudo está dentro do Resource Group rg-fiap-tracking-api.
- .NET 9.0 SDK
- Azure CLI
- Conta Azure ativa
- Git
git clone https://github.com/Lugia-Code/devops-tracking-code-api.git
cd devops-tracking-code-api
az login
Execute os scripts na ordem:
# Passo 1: Criar Resource Group
chmod +x 01-create-resource-group.sh
./01-create-resource-group.sh
# Passo 2: Criar SQL Server
chmod +x 02-create-sql-server.sh
./02-create-sql-server.sh
# ATENÇÃO: Anote o nome do SQL Server gerado
# Passo 3: Criar Database
chmod +x 03-create-database.sh
# Edite o arquivo e substitua SQL_SERVER_NAME pelo nome anotado
./03-create-database.sh
# Passo 4: Configurar Firewall
chmod +x 04-configure-firewall.sh
# Edite o arquivo e substitua SQL_SERVER_NAME
./04-configure-firewall.sh
# Passo 5: Criar App Service
chmod +x 05-create-app-service.sh
./05-create-app-service.sh
# ATENÇÃO: Anote o nome do App Service gerado
# Passo 6: Configurar Connection String
chmod +x 06-configure-connection-string.sh
# Edite o arquivo e substitua SQL_SERVER_NAME e APP_SERVICE_NAME
./06-configure-connection-string.sh
# Passo 7: Configurar App Settings
chmod +x 07-configure-app-settings.sh
# Edite o arquivo e substitua APP_SERVICE_NAME
./07-configure-app-settings.sh
Edite appsettings.json
com a connection string do seu banco:
{
"ConnectionStrings": {
"FiapAzureDb": "Server=tcp:SEU_SQL_SERVER.database.windows.net,1433;Initial Catalog=motosdb;User ID=fiapAdmin;Password=FiapTracking2025!;Encrypt=True;Connection Timeout=30;"
}
}
# Criar migrations
dotnet ef migrations add InitialCreate --context MotosDbContext
# Aplicar no banco Azure
dotnet ef database update --context MotosDbContext
dotnet run
Acesse: https://localhost:5001/scalar/v1
para ver a documentação da API
# Publicar aplicação
dotnet publish -c Release -o ./publish
# Criar pacote zip
cd publish
zip -r ../publish.zip .
cd ..
# Deploy
chmod +x 08-deploy-application.sh
# Edite o arquivo e substitua APP_SERVICE_NAME
./08-deploy-application.sh
Acesse a URL do seu App Service:
https://SEU_APP_SERVICE.azurewebsites.net/health
O arquivo script_bd.sql
contém o DDL completo das tabelas. Principais entidades:
- MOTO: Informações das motocicletas (chassi, placa, modelo)
- TAG: Tags RFID para rastreamento
- SETOR: Departamentos/localizações
- USUARIO: Usuários do sistema
- LOCALIZACAO: Histórico de posições
- AUDITORIA_MOVIMENTACAO: Log de alterações
- Criando setores
INSERT INTO "SETOR" (nome, descricao, coordenadas_limite)
VALUES
('Prontas para aluguel', 'Setor para motos disponiveis para locacao', 1.0),
('Minha Mottu', 'Minha Mottu', 2.0),
('Pendente', 'Setor para motos com pendencias', 3.0),
('Sem placa', 'Setor para motos que estao sem placa', 4.0),
('Reparo Simples', 'Setor para motos com reparos simples', 5.0),
('Danos estruturais graves', 'Setor para motos com danos graves', 6.0),
('Motor defeituoso', 'Setor para motos com problemas no motor', 7.0),
('Agendada para manutenção', 'Setor para motos com manutencao agendada', 8.0);
- Criando TAGs
INSERT INTO TAG (codigo_tag, status, data_vinculo, chassi)
VALUES
('RFID001', 'inativo', '2024-01-15T08:00:00', NULL),
('RFID002', 'inativo', '2024-01-20T09:30:00', NULL),
('RFID003', 'inativo', '2024-01-25T10:15:00', NULL);
- Inserindo Motos
INSERT INTO MOTO (chassi, placa, modelo, data_cadastro, codigo_tag, id_setor)
VALUES
('9C2JC30007R123456', 'ABC-1234', 'Mottu Sport ESD', '2024-01-15T10:00:00', 'RFID001', 1),
('9C2KC40008R789123', 'DEF-5678', 'Honda Pop 110I', '2024-01-20T11:00:00', 'RFID002', 2);
- Atualizando setor da moto
UPDATE MOTO SET id_setor = 4 WHERE chassi = '9C2KC40008R789123'; --era setor 2 e vai para setor 4
UPDATE MOTO SET id_setor = 5 WHERE chassi = '9C2JC30007R123456'; --era setor 1 e vai para o 5
- Verificar motos, suas tags e setores
-- Motos com suas tags e setores
SELECT
M.chassi,
M.placa,
M.modelo,
S.nome as setor,
T.codigo_tag,
T.status as status_tag
FROM MOTO M
LEFT JOIN SETOR S ON M.id_setor = S.id_setor
LEFT JOIN TAG T ON M.codigo_tag = T.codigo_tag;
curl https://SEU_APP_SERVICE.azurewebsites.net/api/v1/motos
curl -X PUT https://SEU_APP_SERVICE.azurewebsites.net/api/v1/motos/9C2JC30007R123456 -H "Content-Type: application/json" -d '{"idSetor": 5}'
curl https://SEU_APP_SERVICE.azurewebsites.net/api/v1/motos
curl -X DELETE https://SEU_APP_SERVICE.azurewebsites.net/api/v1/motos/9C6KE040009R456789
curl -X POST https://SEU_APP_SERVICE.azurewebsites.net/api/v1/tags -H "Content-Type: application/json" -d '{"codigoTag": "RFID009"}'
GET /api/v1/motos
- Listar todas as motos (com paginação)GET /api/v1/motos/{chassi}
- Buscar moto por chassiGET /api/v1/motos/buscar/placa/{placa}
- Buscar por placaPOST /api/v1/motos
- Criar nova motoPUT /api/v1/motos/{chassi}
- Atualizar motoDELETE /api/v1/motos/{chassi}
- Deletar motoPATCH /api/v1/motos/{chassi}/desvincular-tag
- Desvincular tag
GET /api/v1/tags
- Listar todas as tagsGET /api/v1/tags/{codigo}
- Buscar tag por códigoGET /api/v1/motos/tags-disponiveis
- Tags disponíveisPOST /api/v1/tags
- Criar nova tagPUT /api/v1/tags/{codigo}
- Atualizar tagDELETE /api/v1/tags/{codigo}
- Deletar tag
GET /setores
- Listar setoresPOST /setores
- Criar setorPUT /setores/{id}
- Atualizar setorDELETE /setores/{id}
- Deletar setor
GET /health
- Status da aplicação e banco de dados
Para deletar todos os recursos Azure criados:
chmod +x 99-cleanup.sh
./99-cleanup.sh
ATENÇÃO: Esta operação é irreversível e deletará todos os dados.
-
- Nathália Gomes da Silva - RM: [554945]
-
- Nathan Magno Gustavo Cônsolo - RM: [558987]
-
- Júlio César Nunes Oliveira - RM: [557774]
Este projeto foi desenvolvido para fins acadêmicos como parte do curso de DevOps da FIAP.