# Domain Check API - Anti-Fake News Platform Sistema de verificare domenii pentru detectarea dezinformarii prin analiza vechimii domeniilor si riscurilor asociate. ## 🚀 Quick Start - API Usage ### Endpoints Disponibile **Base URL:** `http://domain-check-api:11000` **Endpoint principal:** `POST /api/v1/check/check` ### Apel Complet - Toate Datele Posibile Pentru a obține **toate datele disponibile** despre un domeniu: ```bash curl -X POST "http://domain-check-api:11000/api/v1/check/check" \ -H "Content-Type: application/json" \ -d '{ "domain": "example.com", "check_options": { "whois": true, "dns": true, "ssl": true, "ip_intelligence": true, "http_analysis": true, "blacklist": true, "port_scan": true, "subdomains": true, "force_refresh": false } }' ``` **Răspuns:** JSON cu: - `whois` - Date WHOIS/RDAP complete (vârstă domeniu, registrar, name servers, DNSSEC) - `dns` - Toate recordurile DNS (A, AAAA, MX, TXT, NS, CNAME, SOA) - `ssl` - Certificate SSL/TLS details (issuer, validity, chain, self-signed status) - `ip_intelligence` - Geolocation, ASN, ISP, reverse DNS pentru toate IP-urile - `http_analysis` - HTTP headers, security headers, redirects, technologies detected - `blacklist` - Verificare în DNSBL (spam, malware, phishing blacklists) - `port_scan` - Port scanning TCP common (22, 80, 443, 8080, etc.) - `subdomains` - Subdomain enumeration (www, mail, ftp, api, etc.) - `risk_score` - Scor de risc calculat (0-100) cu breakdown pe categorii ### Apel Rapid - Date Esențiale Pentru verificări rapide (doar WHOIS + DNS + SSL): ```bash curl -X POST "http://domain-check-api:11000/api/v1/check/check" \ -H "Content-Type: application/json" \ -d '{ "domain": "example.com", "check_options": { "whois": true, "dns": true, "ssl": true } }' ``` ### Health Check ```bash curl http://domain-check-api:11000/health ``` Răspuns: ```json { "status": "healthy", "database": "connected", "redis": "connected", "environment": "production", "version": "v1" } ``` --- ## 🌐 Integrare ca Serviciu (Kong API Gateway / Microservices) ### Configurare ca Backend Service API-ul poate fi folosit ca **backend service** pentru Kong, NGINX, Traefik sau alte API gateways. #### 1. Configurare Kong Gateway ```bash # Adaugă service curl -X POST http://kong-admin:8001/services \ --data name=domain-check-api \ --data url=http://domain-check-api:11000 # Adaugă route curl -X POST http://kong-admin:8001/services/domain-check-api/routes \ --data paths[]=/domain-check \ --data strip_path=false # Activează rate limiting curl -X POST http://kong-admin:8001/services/domain-check-api/plugins \ --data name=rate-limiting \ --data config.minute=100 \ --data config.hour=1000 ``` Acum API-ul e disponibil la: `http://your-kong-gateway/domain-check/api/v1/check/check` #### 2. Configurare NGINX Reverse Proxy ```nginx upstream domain_check_backend { server domain-check-api:11000; } server { listen 80; server_name api.example.com; location /domain-check/ { proxy_pass http://domain_check_backend/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # Timeouts pentru operații lungi (port scan, subdomain enum) proxy_read_timeout 300s; proxy_connect_timeout 10s; } } ``` #### 3. Docker Swarm / Kubernetes Service **Docker Swarm:** ```yaml version: '3.8' services: domain-check: image: didiai-domain-check:latest deploy: replicas: 3 update_config: parallelism: 1 delay: 10s environment: DATABASE_URL: postgresql://user:pass@db-cluster:5432/domain_check REDIS_URL: redis://redis-cluster:6379/0 networks: - backend ``` **Kubernetes Service:** ```yaml apiVersion: v1 kind: Service metadata: name: domain-check-api spec: selector: app: domain-check ports: - protocol: TCP port: 80 targetPort: 51000 type: ClusterIP ``` #### 4. Environment Variables pentru External DB Toate parametrii DB sunt în `.env` și pot fi schimbați pentru a folosi un **cluster PostgreSQL extern**: ```bash # .env - Configurare pentru DB Cluster extern DB_HOST=postgres-cluster.example.com DB_PORT=5432 DB_USER=domain_check_user DB_PASSWORD=secure_password_here DB_NAME=domain_check # Redis Cluster extern REDIS_HOST=redis-cluster.example.com REDIS_PORT=6379 REDIS_PASSWORD=redis_password_here ``` API-ul se va conecta automat la DB-ul extern specificat în variabilele de mediu. --- ## 📊 Database Schema - Structura Tabelelor API-ul folosește PostgreSQL cu următoarele tabele: ### 1. `domains` - Domenii Verificate Tabela principală cu toate domeniile procesate. | Coloană | Tip | Descriere | |---------|-----|-----------| | `id` | UUID | Primary key | | `domain` | VARCHAR(255) | Domeniul principal (ex: `example` din `example.com`) | | `subdomain` | VARCHAR(255) | Subdomenul (ex: `www` din `www.example.com`) | | `tld` | VARCHAR(50) | Top Level Domain (ex: `com`, `org`, `ro`) | | `full_domain` | VARCHAR(255) | Domeniul complet (UNIQUE) | | `first_seen_at` | TIMESTAMP | Prima verificare | | `last_checked_at` | TIMESTAMP | Ultima verificare | | `check_count` | INTEGER | Număr total verificări | | `is_active` | BOOLEAN | Status activ/inactiv | | `created_at` | TIMESTAMP | Data creării înregistrării | | `updated_at` | TIMESTAMP | Data ultimei actualizări | **Indexes:** `full_domain` (UNIQUE), `domain`, `tld`, `last_checked_at`, `is_active` ### 2. `whois_records` - Date WHOIS/RDAP Stochează informații WHOIS pentru fiecare domeniu. | Coloană | Tip | Descriere | |---------|-----|-----------| | `id` | UUID | Primary key | | `domain_id` | UUID | Foreign key → `domains(id)` | | `creation_date` | TIMESTAMP | Data creării domeniului | | `expiration_date` | TIMESTAMP | Data expirării | | `updated_date` | TIMESTAMP | Ultima actualizare WHOIS | | `registrar` | VARCHAR(255) | Registrar (ex: GoDaddy, Namecheap) | | `registrar_url` | VARCHAR(500) | URL registrar | | `registrant_org` | VARCHAR(255) | Organizația proprietarului | | `registrant_country` | VARCHAR(2) | Țara (cod ISO) | | `admin_email` | VARCHAR(255) | Email administrator | | `name_servers` | TEXT[] | Array cu name servers | | `status` | TEXT[] | Array cu statusuri domeniu | | `dnssec` | BOOLEAN | DNSSEC activat/nu | | `raw_whois_data` | JSONB | Date WHOIS raw (JSON) | | `data_source` | VARCHAR(50) | Sursa datelor (`rdap`, `whoxy`, `manual`) | | `fetched_at` | TIMESTAMP | Când au fost preluate datele | **Indexes:** `domain_id`, `creation_date`, `registrar`, `data_source`, `fetched_at` ### 3. `dns_records` - Înregistrări DNS Toate recordurile DNS pentru fiecare domeniu. | Coloană | Tip | Descriere | |---------|-----|-----------| | `id` | UUID | Primary key | | `domain_id` | UUID | Foreign key → `domains(id)` | | `record_type` | VARCHAR(10) | Tip record (`A`, `AAAA`, `MX`, `TXT`, `NS`, `CNAME`, `SOA`) | | `record_value` | TEXT | Valoarea recordului | | `ttl` | INTEGER | Time To Live (secunde) | | `priority` | INTEGER | Prioritate (pentru MX records) | | `fetched_at` | TIMESTAMP | Când a fost preluat recordul | **Indexes:** `domain_id`, `(domain_id, record_type)`, `record_type`, `fetched_at` ### 4. `ssl_certificates` - Certificate SSL/TLS Informații despre certificatele SSL ale domeniilor. | Coloană | Tip | Descriere | |---------|-----|-----------| | `id` | UUID | Primary key | | `domain_id` | UUID | Foreign key → `domains(id)` | | `issuer` | VARCHAR(255) | Emitent certificat (ex: Let's Encrypt) | | `subject` | VARCHAR(255) | Subiect certificat | | `valid_from` | TIMESTAMP | Valabil de la | | `valid_until` | TIMESTAMP | Valabil până la | | `serial_number` | VARCHAR(255) | Număr serial certificat | | `signature_algorithm` | VARCHAR(100) | Algoritm semnătură (ex: SHA256) | | `key_size` | INTEGER | Mărime cheie (2048, 4096 bits) | | `is_wildcard` | BOOLEAN | Certificat wildcard (`*.example.com`) | | `is_self_signed` | BOOLEAN | Self-signed certificate | | `is_valid` | BOOLEAN | Certificat valid | | `certificate_chain` | JSONB | Lanțul complet de certificate (JSON) | | `fetched_at` | TIMESTAMP | Când a fost verificat certificatul | **Indexes:** `domain_id`, `valid_until`, `is_valid`, `fetched_at` ### Relații între Tabele ``` domains (1) ─── (N) whois_records ├─ (N) dns_records └─ (N) ssl_certificates ``` Toate relațiile au `ON DELETE CASCADE` - ștergerea unui domeniu șterge automat toate datele asociate. ### Migrare la DB Cluster Extern Pentru a crea schema în **cluster PostgreSQL nou**: ```bash # 1. Export schema docker exec domain_check_postgres pg_dump -U dns_admin -d domain_check --schema-only > schema.sql # 2. Import în cluster nou psql -h postgres-cluster.example.com -U admin -d domain_check < schema.sql # 3. Actualizează .env cu noile credentials DB_HOST=postgres-cluster.example.com DB_PORT=5432 DB_USER=domain_check_user DB_PASSWORD=new_secure_password DB_NAME=domain_check # 4. Restart API docker compose restart domain_check_api ``` Sau folosește direct script-ul de inițializare: ```bash psql -h postgres-cluster.example.com -U admin -d domain_check < init-scripts/01-init-db.sql ``` --- ## Caracteristici - Verificare WHOIS/RDAP complet - Integrare Whoxy API - DNS records checking (A, AAAA, MX, TXT, NS, CNAME, SOA) - SSL certificate validation - IP Intelligence (geolocation, ASN, reverse DNS) - HTTP Security Analysis - DNSBL Blacklist checking - Port scanning - Subdomain enumeration - Risk scoring engine avansat - PostgreSQL + Redis caching - Swagger UI + ReDoc documentation - Docker Compose setup complet - GitLab CI/CD pipeline cu SAST --- ## Deployment pe Orice Server ### Metoda 1: Script Automat (Recomandat) ```bash # Descarca si ruleaza scriptul de deployment curl -sSL (modul domain_check al platformei DIDI) -o deploy.sh chmod +x deploy.sh ./deploy.sh install ``` Scriptul va: - Verifica prerequisitele (Docker, Docker Compose, Git) - Clona repository-ul - Genera fisierul `.env` cu parole securizate - Construi si porni containerele ### Metoda 2: Manual ```bash # 1. Cloneaza repository-ul git clone /ai_platform/modules/domain_check cd domain-check # 2. Copiaza si editeaza configuratia cp .env.example .env nano .env # sau vim, sau orice editor # 3. Porneste serviciile docker compose up -d --build # 4. Verifica statusul docker compose ps curl http://domain-check-api:11000/health ``` ### Metoda 3: Din GitLab Container Registry ```bash # Login la registry (daca e necesar) docker login # Pull imaginea docker pull didiai-domain-check:latest # Cloneaza doar fisierele de configurare git clone /ai_platform/modules/domain_check cd domain-check # Editeaza .env nano .env # Porneste cu imaginea din registry docker compose up -d ``` --- ## Configurare pentru Serverul Tau ### Fisierul .env Toate setarile sunt in `.env`. Editeaza pentru mediul tau: ```bash # =========================================== # PORTURI - Modifica dupa nevoie # =========================================== # Schema: Dev=5xxxx, Prod=1xxxx # x1xxx = API/Gateway # x20xx = PostgreSQL # x23xx = Redis API_PORT=51000 # Portul API-ului (schimba la 11000 pentru prod) DB_EXTERNAL_PORT=52000 # Port extern PostgreSQL (12000 pentru prod) REDIS_EXTERNAL_PORT=52300 # Port extern Redis (12300 pentru prod) # =========================================== # DATABASE - Genereaza parole noi! # =========================================== DB_PASSWORD=SCHIMBA_ACEASTA_PAROLA DB_USER=dns_admin DB_NAME=domain_check # =========================================== # API KEYS - Adauga cheile tale # =========================================== WHOXY_API_KEY=cheia_ta_whoxy VIRUSTOTAL_API_KEY=cheia_ta_virustotal # =========================================== # SECURITATE - OBLIGATORIU pentru productie! # =========================================== SECRET_KEY=genereaza_un_string_random_de_32_caractere FLASK_ENV=production # development sau production DEBUG=False # True doar pentru development ``` ### Setare Hostname/DNS API-ul va fi accesibil prin: - **IP direct**: `http://:/` - **Hostname**: `http://:/` Pentru a seta un hostname custom: ```bash # 1. Pe DNS server (daca ai control) check-dns.example.com A # 2. Sau in /etc/hosts pe clienti echo " check-dns.example.com" >> /etc/hosts # 3. Sau cu reverse proxy (nginx/traefik) # - Configureaza proxy pass catre domain-check-api: ``` ### Porturi Utilizate | Serviciu | Port Default (Dev) | Port Productie | Variabila | |----------|-------------------|----------------|-----------| | API Flask | 51000 | 11000 | `API_PORT` | | PostgreSQL | 52000 | 12000 | `DB_EXTERNAL_PORT` | | Redis | 52300 | 12300 | `REDIS_EXTERNAL_PORT` | Porturile pot fi schimbate in `.env` - nu este nevoie de modificari in alte fisiere. ### Firewall Deschide doar portul API pentru acces extern: ```bash # UFW (Ubuntu/Debian) sudo ufw allow 51000/tcp # firewalld (CentOS/RHEL) sudo firewall-cmd --add-port=51000/tcp --permanent sudo firewall-cmd --reload # iptables sudo iptables -A INPUT -p tcp --dport 51000 -j ACCEPT ``` PostgreSQL si Redis nu trebuie expuse public (sunt doar pentru comunicatie interna). --- ## Structura Proiectului ``` domain-check/ ├── api/ # Flask API │ ├── app/ │ │ ├── models/ # SQLAlchemy models │ │ ├── routes/ # API endpoints │ │ ├── services/ # Business logic (WHOIS, DNS, SSL, etc.) │ │ ├── utils/ # Helper functions │ │ ├── tasks/ # Celery tasks │ │ ├── static/ # Dashboard HTML/CSS/JS │ │ ├── config.py # Configuration │ │ └── __init__.py # App factory │ ├── Dockerfile │ ├── requirements.txt │ └── run.py # Entry point ├── init-scripts/ # PostgreSQL init scripts │ └── 01-init-db.sql ├── docker-compose.yml # Docker orchestration ├── .gitlab-ci.yml # CI/CD pipeline ├── deploy.sh # Deployment script ├── .env # Environment variables ├── use_api.md # API documentation └── README.md # This file ``` --- ## Servicii Docker | Container | Descriere | Health Check | |-----------|-----------|--------------| | `domain_check_api` | Flask REST API + Dashboard | `/health` | | `domain_check_postgres` | PostgreSQL 15 database | `pg_isready` | | `domain_check_redis` | Redis cache | `redis-cli ping` | | `domain_check_worker` | Celery background worker | `celery inspect ping` | --- ## Utilizare API ### Interfata Web (Dashboard) Deschide in browser: `http://:/` ### Verificare Domain (curl) ```bash # Check complet curl -X POST "http://domain-check-api:11000/api/v1/check/check" \ -H "Content-Type: application/json" \ -d '{ "domain": "example.com", "check_options": { "whois": true, "dns": true, "ssl": true, "ip_intelligence": true, "http_analysis": true, "blacklist": true, "port_scan": true, "subdomains": true } }' ``` ### Health Check ```bash curl http://domain-check-api:11000/health ``` ### Documentatie Swagger - Swagger UI: `http://:/docs` - ReDoc: `http://:/redoc` Pentru documentatie API completa, vezi [use_api.md](use_api.md). --- ## CI/CD Pipeline Pipeline-ul GitLab include: ### Stages 1. **lint** - Code quality (flake8, black, isort, hadolint) 2. **security** - SAST scanning (bandit, safety, trivy) 3. **test** - Unit tests 4. **build** - Docker build & push to registry 5. **release** - Create deployment bundle 6. **deploy** - Deploy to server via SSH ### Container Registry Imaginile sunt publicate la: ``` didiai-domain-check:latest didiai-domain-check: ``` ### Configurare Deploy Automat Adauga in GitLab CI/CD Variables: | Variable | Descriere | |----------|-----------| | `DEPLOY_HOST` | IP sau hostname server | | `DEPLOY_USER` | User SSH (ex: admin365) | | `SSH_PRIVATE_KEY` | Cheia privata SSH | | `SSH_KNOWN_HOSTS` | Output din `ssh-keyscan ` | --- ## Comenzi Utile ### Deploy Script ```bash ./deploy.sh install # Instalare fresh ./deploy.sh update # Update la ultima versiune ./deploy.sh status # Verifica statusul ./deploy.sh logs # Vezi toate logs ./deploy.sh logs domain_check_api # Logs doar pentru API ./deploy.sh start # Porneste serviciile ./deploy.sh stop # Opreste serviciile ./deploy.sh restart # Restart servicii ``` ### Docker Direct ```bash # Start/Stop docker compose up -d docker compose down # Rebuild docker compose up -d --build # Logs docker compose logs -f domain_check_api # Shell in container docker exec -it domain_check_api bash # Database access docker exec -it domain_check_postgres psql -U dns_admin -d domain_check ``` --- ## Troubleshooting ### Container nu porneste ```bash # Verifica logs docker compose logs domain_check_api # Verifica network docker network ls | grep dns-network # Recreate containers docker compose down && docker compose up -d --build ``` ### Database connection error ```bash # Verifica ca PostgreSQL e healthy docker compose ps domain_check_postgres # Verifica health docker exec -it domain_check_postgres pg_isready -U dns_admin # Restart database docker compose restart domain_check_postgres ``` ### API returns 500 error ```bash # Check logs docker compose logs -f domain_check_api # Verify database schema docker exec -it domain_check_postgres psql -U dns_admin -d domain_check -c "\dt" ``` ### Port deja in uz ```bash # Gaseste ce foloseste portul sudo lsof -i :51000 # Schimba portul in .env API_PORT=51001 # sau alt port liber ``` --- ## Securitate - Checklist Productie - [ ] Schimba toate parolele default in `.env` - [ ] Seteaza `FLASK_ENV=production` - [ ] Seteaza `DEBUG=False` - [ ] Genereaza `SECRET_KEY` random (32+ caractere) - [ ] Configureaza firewall (doar port API public) - [ ] Setup HTTPS cu reverse proxy (nginx/traefik) - [ ] Backup automat PostgreSQL - [ ] Monitorizare logs --- ## Variabile de Mediu Complete | Variabila | Default | Descriere | |-----------|---------|-----------| | `API_PORT` | 51000 | Port pentru Flask API | | `API_HOST` | 0.0.0.0 | Bind address | | `API_VERSION` | v1 | API version prefix | | `DB_HOST` | domain_check_postgres | PostgreSQL hostname (container) | | `DB_PORT` | 5432 | PostgreSQL port intern | | `DB_EXTERNAL_PORT` | 52000 | PostgreSQL port extern | | `DB_USER` | dns_admin | Database user | | `DB_PASSWORD` | - | Database password | | `DB_NAME` | domain_check | Database name | | `REDIS_HOST` | domain_check_redis | Redis hostname (container) | | `REDIS_PORT` | 6379 | Redis port intern | | `REDIS_EXTERNAL_PORT` | 52300 | Redis port extern | | `REDIS_DB` | 0 | Redis database number | | `WHOXY_API_KEY` | - | Whoxy API key | | `VIRUSTOTAL_API_KEY` | - | VirusTotal API key | | `FLASK_ENV` | development | Flask environment | | `DEBUG` | True | Debug mode | | `SECRET_KEY` | - | Flask secret key | | `LOG_LEVEL` | INFO | Logging level | | `REDIS_TTL_HOT` | 21600 | Cache TTL hot (6h) | | `REDIS_TTL_WARM` | 86400 | Cache TTL warm (24h) | | `REDIS_TTL_COLD` | 604800 | Cache TTL cold (7d) | --- ## License MIT License - Free for use in anti-fake news projects --- **Built for fighting disinformation** **Last Updated:** 2026-02-04