{"id":29878357,"url":"https://github.com/apolinario0x21/small-links","last_synced_at":"2026-05-15T21:34:00.002Z","repository":{"id":306406842,"uuid":"1026068177","full_name":"apolinario0x21/small-links","owner":"apolinario0x21","description":"Serviço encurtador de URLs seguro e eficiente construído com Go e Gin. Possui criptografia AES, armazenamento persistente, análise de acessos e deploy otimizado para Railway.","archived":false,"fork":false,"pushed_at":"2025-08-09T09:34:05.000Z","size":22,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-08-09T11:35:25.417Z","etag":null,"topics":["docker","encryption","gin-framework","golang","railway","rest-api","url-shortener","web-service"],"latest_commit_sha":null,"homepage":"https://small-links-apolinario0x21.netlify.app/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/apolinario0x21.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-25T08:57:08.000Z","updated_at":"2025-08-09T09:34:09.000Z","dependencies_parsed_at":"2025-07-27T02:06:46.294Z","dependency_job_id":null,"html_url":"https://github.com/apolinario0x21/small-links","commit_stats":null,"previous_names":["apolinario0x21/go-gin-short-url","apolinario0x21/small-links"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/apolinario0x21/small-links","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/apolinario0x21%2Fsmall-links","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/apolinario0x21%2Fsmall-links/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/apolinario0x21%2Fsmall-links/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/apolinario0x21%2Fsmall-links/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/apolinario0x21","download_url":"https://codeload.github.com/apolinario0x21/small-links/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/apolinario0x21%2Fsmall-links/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33080777,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-15T20:25:35.270Z","status":"ssl_error","status_checked_at":"2026-05-15T20:25:34.732Z","response_time":103,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","encryption","gin-framework","golang","railway","rest-api","url-shortener","web-service"],"created_at":"2025-07-31T07:01:59.123Z","updated_at":"2026-05-15T21:33:59.997Z","avatar_url":"https://github.com/apolinario0x21.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Small Links\n\n![Go](https://img.shields.io/badge/Go-1.22.3-blue.svg)\n![Framework](https://img.shields.io/badge/Framework-Gin--v1.10.1-blueviolet.svg)\n[![Framework](https://img.shields.io/badge/Gin-v1.10.1-blueviolet.svg)](https://gin-gonic.com/)\n[![Docker](https://img.shields.io/badge/Docker-Ready-blue?logo=docker\u0026logoColor=white)](https://www.docker.com/)\n[![railway](https://img.shields.io/badge/Deploy-Railway-purple.svg)](https://railway.app/)\n![License](https://img.shields.io/badge/License-MIT-yellow.svg)\n\nUm serviço de encurtador de URLs seguro e de alta performance, construído com Go e o framework Gin. \nOferecendo funcionalidades essenciais como criptografia robusta, armazenamento persistente e rastreamento de acessos.\n\n## ⚙️ Funcionalidades\n\n- 🔐 Criptografia Segura: URLs são criptografadas usando AES-256 antes do armazenamento\n- 💾 Armazenamento Persistente: Armazenamento baseado em arquivo JSON com backup automático\n- 📊 Análise de Dados: Rastreamento de contagem de acessos e timestamps de criação para cada URL\n- 🚀 Pronto para Produção: Health checks, tratamento de erros e otimizado para deploy no Railway\n- 🌐 Detecção Inteligente de Protocolo: Detecção automática de HTTPS/HTTP baseada no ambiente de deploy\n- ⚡ Alta Performance: Operações thread-safe com estruturas de dados eficientes\n- 🔄 Suporte CORS: Suporte integrado para Cross-Origin Resource Sharing\n\n\n## 🚀 Tecnologias utilizadas\n- Go 1.21+\n- Gin Web Framework\n- Criptografia AES (pacote crypto/aes)\n- .env para variáveis de ambiente\n- Railway para deploy (opcional)\n\n## 📦 Instalação e uso local\n\n1. Clone o repositório\n   ```bash\n   git clone https://github.com/apolinario0x21/go-gin-short-url.git\n   cd seu-repositorio\n   ```\n2. Crie um arquivo .env\n   ```bash\n   ENCRYPTION_KEY=sua_chave_de_criptografia\n   ```\n   Obs: A chave precisa ter 32 caracteres.\n\n\n3. Instale as dependências\n   ```\n   go mod tidy\n   ```\n4. Rode a aplicação\n   ```\n   go run main.go\n   ```\n\n## 📬 Endpoints disponíveis\n\n| Método | Rota      | Descrição                             |\n|--------|-----------|---------------------------------------|\n| GET    | `/shorten?url={url_original}` | Gera uma URL curta |\n| GET    | `/{short_id}` | Redireciona para a URL original (AES) |\n| GET    | `/stats/{short_id}`  | Obter Estatísticas da URL |\n| GET    | `/health`  | Verificação de Saúde  |\n\n\n## 🔧 Configuração\n\n| Variável | Descrição      | Padrão                             | Obrigatório |\n|--------|-----------|---------------------------------------|-------------|\n| ENCRYPTION_KEY    | `Chave de criptografia AES de 32 caracteres` | sua_chave_de_criptografia | Recomendado |\n| PORT    | Porta do servidor | 8080 | Não         |\n| GIN_MODE    | Modo do framework Gin `(debug/release)`  | release | Não |\n\n## Considerações de Segurança\n\n- Sempre defina uma ENCRYPTION_KEY personalizada em produção\n- A chave de criptografia deve ter exatamente 32 caracteres\n- URLs são criptografadas antes do armazenamento para proteger a privacidade do usuário \n- IDs curtos são gerados usando números aleatórios criptograficamente seguros\n\n## 📊 Exemplos de Uso\n### Usando cURL\n\n```bash\n### Criar uma URL encurtada\ncurl \"https://seu-dominio.com/shorten?url=https://www.google.com\"\n\n### Obter estatísticas\ncurl \"https://seu-dominio.com/stats/aB3xY2\"\n\n### Verificação de saúde\ncurl \"https://seu-dominio.com/health\"\n```\n\n## Usando JavaScript (Fetch API)\n\n```javascript\n// Criar URL encurtada\nconst response = await fetch('https://seu-dominio.com/shorten?url=https://www.exemplo.com');\nconst data = await response.json();\nconsole.log('URL encurtada:', data.short_url);\n\n// Obter estatísticas\nconst stats = await fetch(`https://seu-dominio.com/stats/${shortId}`);\nconst statsData = await stats.json();\nconsole.log('Contagem de acessos:', statsData.access_count);\n```\n## Componentes Principais\n\n- Camada de Criptografia: Criptografia AES-256-CTR para proteção de URLs\n- Engine de Armazenamento: Persistência baseada em arquivo JSON com escritas atômicas\n- Geração de ID: Identificadores de 6 caracteres criptograficamente seguros\n- Concorrência: Operações thread-safe usando RWMutex\n- Monitoramento: Health checks integrados e análise de acessos \n\n## 🚢 Deploy\nRailway (Recomendado)\n\n- Faça um fork deste repositório\n- Conecte sua conta do Railway ao GitHub\n- Crie um novo projeto a partir do seu fork\n- Configure a variável de ambiente ENCRYPTION_KEY\n- Deploy automático no push\n\n\n## 🔍 Monitoramento\n### Endpoint de Saúd\n\nO endpoint `/health` fornece:\n- Status do serviço\n- Número total de URLs armazenadas\n- Timestamp atual\n\n## Logs\nA aplicação registra:\n\n- Informações de inicialização\n- Operações de carregamento/salvamento de dados\n- Condições de erro\n- Avisos de segurança\n\n## 🤝 Contribuindo\n\n- Faça um fork do repositório\n- Crie uma branch de feature (`git checkout -b feature/funcionalidade-incrivel`)\n- Faça commit das suas mudanças (`git commit -m 'Adiciona funcionalidade incrível`')\n- Faça push para a branch (`git push origin feature/funcionalidade-incrivel`)\n- Abra um Pull Request\n\n## 📄 Licença\n\nEste projeto está sob a licença MIT. Veja o arquivo [LICENSE](LICENSE) para mais detalhes.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fapolinario0x21%2Fsmall-links","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fapolinario0x21%2Fsmall-links","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fapolinario0x21%2Fsmall-links/lists"}