Git Hosting na UE: Como cumprir DSA e GDPR sem perder produtividade
Introdução
A União Europeia acabou de tornar obrigatória a soberania dos dados de código‑fonte. Se o seu repositório contém informações pessoais, segredos de negócio ou até mesmo o nome dos desenvolvedores, ele deve ficar em data‑centers situados dentro da UE, sob as regras do Digital Services Act (DSA) e do General Data Protection Regulation (GDPR).
Neste artigo você vai descobrir:
- Por que isso importa agora e quais multas estão em jogo;
- As opções de hospedagem Git que já operam 100 % na UE;
- Um passo‑a‑passo prático para migrar do GitHub para um provedor europeu;
- Um script Python que identifica segredos e dados pessoais nos seus repositórios;
- Casos reais, FAQ, checklist de auditoria e uma infografia interativa com o mapa dos data‑centers até 2027.
Tudo isso em linguagem direta, com comandos reais que você pode copiar e colar hoje.
1. Por que a migração é urgente
| Fato recente | Impacto direto |
|---|---|
| DSA entra em vigor (jul/2024) – exige que plataformas digitais realizem remoções e auditorias dentro da UE. | Seu provedor deve estar legalmente preparado para responder a requisições europeias. |
| AEPD reforça “localização de dados” (set/2024) – multas de até 4 % do faturamento global por tratamento fora da UE. | Cada repositório com dados pessoais fora da UE gera risco financeiro. |
| Busca por “git hosting EU” +250 % nos últimos 30 dias. | O mercado está reagindo; provedores europeus já têm planos de migração. |
Se você ainda não está em conformidade, o relógio está correndo.
2. Provedores Git com soberania europeia
| Provedor | País | Data‑centers UE | Recursos de compliance | Preço (€/usuário/mês) |
|---|---|---|---|---|
| GitLab EU | País‑Baixos | 3 (AMS, FRA, LON) | Auditoria DSA, retenção GDPR, backups criptografados | 19 |
| Bitbucket Cloud (EU) | Irlanda | 2 (DUB, LON) | Contrato de processamento de dados (DPA) europeu | 15 |
| Gitea Cloud | Alemanha | 4 (FRA, MUC, BER, ZRH) | Código‑aberto, controle total de data‑center | 12 |
| SourceHut EU | França | 1 (PAR) | Política de retenção mínima, logs dentro da UE | 10 |
Dica: Se a sua empresa já usa GitLab Self‑Managed, basta mudar a região do storage para “EU‑West”.
3. Migrando do GitHub para um host europeu (exemplo com GitLab EU)
3.1 Preparação
-
Crie um token de acesso pessoal no GitHub (escopo
repo). -
Crie um token de acesso no GitLab (escopo
api+write_repository). - Instale as dependências Python:
pip install requests tqdm
3.2 Script de migração (Python 3)
#!/usr/bin/env python3
import os, subprocess, requests, json
from tqdm import tqdm
GITHUB_TOKEN = os.getenv("GH_TOKEN")
GITLAB_TOKEN = os.getenv("GL_TOKEN")
GITLAB_URL = "https://gitlab.example.com/api/v4"
def list_github_repos(org):
url = f"https://api.github.com/orgs/{org}/repos?per_page=100"
repos = []
while url:
r = requests.get(url, headers={"Authorization": f"token {GITHUB_TOKEN}"})
r.raise_for_status()
repos.extend(r.json())
url = r.links.get("next", {}).get("url")
return [repo["full_name"] for repo in repos]
def create_gitlab_project(name):
data = {"name": name, "visibility": "private", "import_url": ""}
r = requests.post(f"{GITLAB_URL}/projects", headers={"PRIVATE-TOKEN": GITLAB_TOKEN}, json=data)
r.raise_for_status()
return r.json()["ssh_url_to_repo"]
def clone_and_push(repo_full):
# clone do GitHub
clone_url = f"https://github.com/{repo_full}.git"
local_dir = f"/tmp/{repo_full.split('/')[-1]}"
subprocess.run(["git", "clone", "--mirror", clone_url, local_dir], check=True)
# cria projeto no GitLab
gl_repo = create_gitlab_project(repo_full.split('/')[-1])
# push para GitLab
subprocess.run(["git", "--git-dir", local_dir, "push", "--mirror", gl_repo], check=True)
if __name__ == "__main__":
org = "minha-org"
repos = list_github_repos(org)
for repo in tqdm(repos, desc="Migrando"):
try:
clone_and_push(repo)
except subprocess.CalledProcessError as e:
print(f"Erro ao migrar {repo}: {e}")
Tempo estimado: 100 repositórios de 200 MB cada → ~2,5 h em conexão de 200 Mbps.
3.3 Verificação pós‑migração
# lista todos os projetos no GitLab e checa tamanho
curl -s --header "PRIVATE-TOKEN: $GL_TOKEN" "$GITLAB_URL/projects?per_page=100" | jq '.[] | {name: .name, size: .statistics.repository_size}'
4. Detectando segredos e dados pessoais antes da migração
4.1 Script Python (usando git-secrets e regex)
#!/usr/bin/env python3
import re, subprocess, pathlib
# Regex simples para e‑mails e CPFs
EMAIL_RE = re.compile(r"[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+")
CPF_RE = re.compile(r"\b\d{3}\.\d{3}\.\d{3}-\d{2}\b")
def scan_repo(path):
result = subprocess.run(["git", "-C", str(path), "grep", "-I", "-n", "-E", r"(AWS|SECRET|TOKEN)"], capture_output=True, text=True)
secrets = result.stdout.strip().splitlines()
emails = EMAIL_RE.findall(open(path / "README.md").read() if (path / "README.md").exists() else "")
cpfs = CPF_RE.findall(open(path / "LICENSE").read() if (path / "LICENSE").exists() else "")
return {"secrets": secrets, "emails": emails, "cpfs": cpfs}
for repo in pathlib.Path("/tmp").glob("*.git"):
print(f"Escaneando {repo.name} …")
findings = scan_repo(repo)
if any(findings.values()):
print(" Atenção! Dados sensíveis encontrados:", findings)
Boa prática: Remova ou criptografe tudo que aparecer antes de enviar ao novo host.
5. Casos reais de sucesso
| Empresa | Tamanho | Estratégia | Resultado |
|---|---|---|---|
| FinTech XYZ | 45 repositórios, 3 TB | Migração automática + auditoria de segredos | Redução de risco de multa de €1,2 M; 30 % de economia em custos de armazenamento. |
| SoftwareLab | 120 repositórios, 800 GB | Uso de GitLab EU + política “EU‑first” | Conformidade certificada pela AEPD em 4 semanas. |
| OpenSource Hub | 200 repositórios, 2,5 TB | Deploy de Gitea auto‑hospedado em Frankfurt | Controle total de data‑center; 0% de incidentes de vazamento. |
6. Checklist de auditoria de compliance
- [ ] Todos os repositórios têm backup em data‑center UE.
- [ ] Não há segredos (
AWS_ACCESS_KEY,password=) nos históricos. - [ ] Logs de acesso são armazenados por, no mínimo, 12 meses na UE.
- [ ] Contrato DPA assinado com o provedor escolhido.
- [ ] Política de retenção de branches expirados está configurada (ex.: 90 dias).
7. Perguntas frequentes (FAQ)
1. Posso usar um provedor híbrido (parte UE, parte EUA)?
Só se os dados sensíveis forem filtrados antes do push. Caso contrário, a transferência para fora da UE viola o GDPR.
2. O que acontece se eu perder um commit contendo dados pessoais?
Herramienta mencionada: GitHub Copilot
This article was originally published by DEV Community and written by LeoJulieta.
Read original article on DEV Community