Birden fazla DNS sunucusundan log dosyalarını toplayan, haftalık bazda birleştiren, istek sayısına göre sıralayan ve FTP sunucusuna yükleyen bir Go uygulamasıdır.
- ✅ Haftalık tek dosya - Son 7 günün verilerini tek dosyada birleştirir
- ✅ FTP ile gönderim - Standart FTP protokolü ile upload
- ✅ Pazartesi çalıştırma - Her hafta Pazartesi günü önceki 7 günün verilerini gönderir
- ✅ Ayda 4 dosya - Her ay 4 haftalık rapor dosyası oluşturur
- ✅ Command-line flag desteği - Binary olarak flag'lerle çalışır
- ✅ Backward compatible - Eski config dosyası formatını destekler
- ✅ TLS güvenliği - Sertifika doğrulama desteği
- ✅ Structured logging - Debug/Info/Error seviyeleri ile detaylı loglama
- ✅ Çalışma dizini yönetimi - Geçici dosyalar için özel dizin
- ✅ Hata yönetimi - Partial success desteği, exit code'lar
- ✅ Modüler yapı - Paketlere ayrılmış temiz kod
-
Release paketini indirin:
- GitHub Releases sayfasından platformunuza uygun
.tar.gzdosyasını indirin - Örnek:
gihftp-v2.0.0-linux-amd64.tar.gz
- GitHub Releases sayfasından platformunuza uygun
-
Paketi açın:
tar -xzf gihftp-v2.0.0-linux-amd64.tar.gz cd gihftp-v2.0.0-linux-amd64/ -
Kurulum scripti ile yükleyin:
sudo ./install.sh
-
Yapılandırın:
sudo nano /etc/gihftp.conf
-
Test edin:
gihftp --help
Not: Production ortamlarında kaynak koddan derleme yerine pre-built binary kullanın.
# Basit build
go build -o gihftp
# Release build (optimized)
go build -ldflags="-s -w" -o gihftpTüm platformlar için release paketi oluşturmak:
./make-release.sh v2.0.0Uygulama her Pazartesi çalıştırılmak üzere tasarlanmıştır ve şu adımları takip eder:
- Tarih aralığı belirleme: Son 7 günün tarih aralığını hesaplar (dünden 7 gün geriye)
- Log toplama: Tüm GIH DNS sunucularından haftalık log dosyalarını çeker
- Birleştirme (Merge):
- Tüm sunuculardan gelen verileri tek bir veri setinde birleştirir
- Aynı domainlerin istek sayılarını toplar
- İstek sayısına göre azalan sırada sıralar
- Dosya oluşturma:
NETINTERNET-GIH-DNS_250k-YYYYMMDD.txtformatında tek dosya oluşturur- Dosya adındaki tarih: Upload tarihi (bugünün tarihi)
- FTP ile gönderim: Dosyayı belirtilen FTP sunucusuna yükler
- Temizlik: Geçici dosyayı siler (cleanup aktifse)
| Gün | Açıklama |
|---|---|
| Pazartesi | Uygulama çalışır, önceki 7 günün (Pzt-Paz) verilerini gönderir |
| Ayda ~4 kez | Her ay yaklaşık 4 haftalık rapor dosyası oluşturulur |
Giriş ve çıkış dosyaları domain|count formatındadır:
google.com|45231
facebook.com|32156
youtube.com|28943
...
Bu komut şunları oluşturur:
- Linux (amd64, arm64)
- macOS (amd64, arm64)
- Checksum dosyaları
- Kurulum scriptleri
- Dokümantasyon
Önemli: Release paketleri sadece binary içerir, kaynak kod içermez!
./gihftp \
--gih-servers=dns1.example.com,dns2.example.com \
--gih-api-port=2035 \
--ftp-host=127.0.0.1 \
--ftp-user=upload_user \
--ftp-log-dir=/var/log/uploads/ \
--ssh-key=/root/.ssh/id_rsa \
--work-dir=/tmp/logmerger \
--log-level=info \
--cleanupPassword'ü environment variable ile geçirin (güvenlik için):
export FTP_PASSWORD="your_secure_password"
./gihftp --gih-servers=dns1.example.com,dns2.example.com --ftp-host=127.0.0.1# /etc/gihftp.conf veya ./gihftp.conf kullanarak
./gihftp
# veya custom config dosyası ile
./gihftp --config=/path/to/custom.confConfig dosyası formatı (gihftp.conf.example dosyasına bakın):
# DNS Server 1
gihdns1 = dns1.example.com
# DNS Server 2
gihdns2 = dns2.example.com
# API Port
gihapiport = 2035
# SFTP Server
ftpserver = 127.0.0.1
# SFTP Server log files directory
ftplogdir = /var/log/uploads/| Flag | Açıklama | Default | Zorunlu |
|---|---|---|---|
--gih-servers |
Virgülle ayrılmış DNS sunucu adresleri | - | ✅ |
--gih-api-port |
API port numarası | 2035 | ❌ |
--ftp-host |
SFTP sunucu adresi | - | ✅ |
--ftp-user |
SFTP kullanıcı adı | root | ❌ |
--ftp-password |
SFTP şifresi (env var tercih edilir) | - | ❌ |
--ftp-log-dir |
Uzak sunucuda log dizini | /var/log/uploads/ | ❌ |
--ssh-key |
SSH private key path | $HOME/.ssh/id_rsa | ❌ |
--work-dir |
Geçici dosyalar için çalışma dizini | . (mevcut dizin) | ❌ |
--log-level |
Log seviyesi (debug/info/error) | info | ❌ |
--cleanup |
Upload sonrası geçici dosyaları sil | true | ❌ |
--insecure-skip-verify |
TLS/SSH doğrulamayı atla (ÖNERİLMEZ!) | false | ❌ |
--config |
Config dosyası path | - | ❌ |
| Variable | Açıklama |
|---|---|
FTP_PASSWORD |
SFTP şifresi (flag'den daha güvenli) |
SSH_KEY_PASSPHRASE |
SSH key şifresi (eğer key şifreliyse) |
# 1. SSH key authentication kullanın
./gihftp \
--gih-servers=dns1.example.com \
--ftp-host=127.0.0.1 \
--ssh-key=/root/.ssh/id_rsa
# 2. Password'ü environment variable ile geçirin
export FTP_PASSWORD="secure_password"
./gihftp --gih-servers=dns1.example.com --ftp-host=127.0.0.1
# 3. TLS/SSH doğrulamasını aktif bırakın (default)
# known_hosts dosyanızı güncel tutun# Bu sadece test ortamları için! Production'da kullanmayın!
./gihftp \
--gih-servers=test-dns.local \
--ftp-host=test-ftp.local \
--insecure-skip-verifyUygulama aşağıdaki exit code'ları döner:
| Kod | Anlamı |
|---|---|
| 0 | Başarılı |
| 1 | Konfigürasyon hatası |
| 2 | Log fetch hatası (hiçbir sunucudan veri alınamadı) |
| 3 | Merge hatası |
| 4 | Upload hatası |
| 5 | Kısmi başarı (bazı sunuculardan veri alınamadı ama işlem tamamlandı) |
# Debug - Her detayı göster
./gihftp --log-level=debug ...
# Info - Normal işlem logları (default)
./gihftp --log-level=info ...
# Error - Sadece hataları göster
./gihftp --log-level=error ...time=2025-01-20T10:30:00.000Z level=INFO msg="GIH-FTP Service Starting" version=2.0.0 gih_servers="[dns1.example.com dns2.example.com]" ftp_host=x.x.x.x work_dir=/tmp/gihftp
time=2025-01-20T10:30:00.100Z level=INFO msg="Fetching logs for last week" start_date=20250113 end_date=20250119
time=2025-01-20T10:30:01.250Z level=INFO msg="Fetching weekly logs from server" host=dns1.example.com start_date=20250113 end_date=20250119
time=2025-01-20T10:30:02.500Z level=INFO msg="Found log files for week" host=dns1.example.com file_count=7
time=2025-01-20T10:30:05.000Z level=INFO msg="Weekly merge statistics" week_start=20250113 week_end=20250119 unique_domains=87654 total_requests=10523442 top_domain=google.com top_domain_hits=315231
time=2025-01-20T10:30:05.100Z level=INFO msg="Weekly merged file created" file=/tmp/gihftp/NETINTERNET-GIH-DNS_250k-20250120.txt week_start=20250113 week_end=20250119
time=2025-01-20T10:30:06.500Z level=INFO msg="FTP upload successful" local_path=/tmp/gihftp/NETINTERNET-GIH-DNS_250k-20250120.txt remote_path=/var/log/uploads/NETINTERNET-GIH-DNS_250k-20250120.txt
time=2025-01-20T10:30:06.600Z level=INFO msg="Weekly processing completed" duration_seconds=6.6 servers_success=2 servers_failed=0
time=2025-01-20T10:30:06.600Z level=INFO msg="GIH-FTP Service completed successfully"
gih-ftp/
├── main.go # Ana program
├── internal/
│ ├── config/ # Konfigürasyon yönetimi
│ │ └── config.go
│ ├── gihapi/ # GIH API client
│ │ └── client.go
│ ├── ftp/ # FTP upload işlemleri
│ │ └── client.go
│ ├── sftp/ # SFTP upload işlemleri
│ │ └── client.go
│ ├── merger/ # Log merge işlemleri
│ │ └── merger.go
│ └── logger/ # Loglama
│ └── logger.go
├── gihftp.conf.example # Örnek konfig dosyası
├── make-release.sh # Release builder
├── install.sh # Kurulum scripti
├── uninstall.sh # Kaldırma scripti
├── deploy.sh # Development deployment
├── .gitignore # Git ignore kuralları
├── go.mod
├── go.sum
└── README.md
gihftp-v2.0.0-linux-amd64/
├── gihftp # Binary (SADECE)
├── gihftp.sha256 # Checksum
├── README.md # Dokümantasyon
├── INSTALL.txt # Kurulum rehberi
├── CHANGELOG.md # Değişiklik listesi
├── LICENSE # Lisans
├── gihftp.conf.example # Örnek konfig
├── install.sh # Otomatik kurulum
└── uninstall.sh # Otomatik kaldırma
Önemli: Release paketlerinde kaynak kod yoktur!
# 1. Release paketi oluştur (maintainer)
./make-release.sh v2.0.0
# 2. Release paketini sunucuya kopyala
scp releases/v2.0.0/gihftp-v2.0.0-linux-amd64.tar.gz root@server:/tmp/
# 3. Sunucuda paketi aç ve kur
ssh root@server
cd /tmp
tar -xzf gihftp-v2.0.0-linux-amd64.tar.gz
cd gihftp-v2.0.0-linux-amd64/
sudo ./install.sh# Build
GOOS=linux GOARCH=amd64 go build -o gihftp
# Server'a kopyala
scp gihftp root@your-server.example.com:/usr/bin/
scp gihftp.conf root@your-server.example.com:/etc/gihftp.conf
# Çalıştırılabilir yap
ssh root@your-server.example.com "chmod +x /usr/bin/gihftp"Not: Bu script sadece geliştirme amaçlıdır. Production için make-release.sh kullanın.
./deploy.sh # Kaynak koddan derleyip deploy ederHer Pazartesi otomatik çalıştırma için crontab'e ekleyin:
# Her Pazartesi sabah 03:00'da çalıştır (önceki haftanın verilerini gönderir)
0 3 * * 1 /usr/bin/gihftp --config=/etc/gihftp.conf >> /var/log/gihftp.log 2>&1
# veya flag ile
0 3 * * 1 FTP_PASSWORD="xxx" /usr/bin/gihftp --gih-servers=dns1,dns2 --ftp-host=x.x.x.x >> /var/log/gihftp.log 2>&1Not: Uygulama çalıştırıldığında, son 7 günün (dünden geriye) verilerini toplar ve gönderir. Dosya adında upload tarihi kullanılır. Crontab ile her Pazartesi çalıştırıldığında önceki haftanın tamamını kapsar.
/etc/systemd/system/gihftp.service:
[Unit]
Description=GIH FTP Log Upload Service
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/bin/gihftp --config=/etc/gihftp.conf
Environment="FTP_PASSWORD=your_password"
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.targetKullanım:
# Manuel çalıştırma
sudo systemctl start gihftp
# Status kontrolü
sudo systemctl status gihftp
# Otomatik başlatma
sudo systemctl enable gihftpÇözüm: --gih-servers flag'ini veya config dosyasında gihdns1, gihdns2 değerlerini belirtin.
Çözüm:
- SSH key path'ini kontrol edin (
--ssh-key) - Key'in passphrase'i varsa
SSH_KEY_PASSPHRASEenv var'ını set edin - Veya password authentication kullanın (
FTP_PASSWORDenv var)
Çözüm:
~/.ssh/known_hostsdosyasını güncelleyin- Veya test için
--insecure-skip-verifykullanın (güvensiz!)
Çözüm:
- GIH sunucularının sertifikalarının geçerli olduğundan emin olun
- Self-signed sertifika kullanıyorsanız test için
--insecure-skip-verifykullanabilirsiniz
Detaylı log için:
./gihftp --log-level=debug --gih-servers=... --ftp-host=...-
Kodu test edin:
go test ./... go build -o gihftp ./gihftp --help -
Release oluşturun:
./make-release.sh v2.0.0
-
Checksum'ları doğrulayın:
cd releases/v2.0.0/ sha256sum -c *.sha256
-
Paketi test edin:
tar -xzf gihftp-v2.0.0-linux-amd64.tar.gz cd gihftp-v2.0.0-linux-amd64/ ./gihftp --help -
Dağıtın:
- Release paketlerini GitHub Releases'e yükleyin
- Checksum dosyalarını da ekleyin
- Release notes'u CHANGELOG.md'den alın
ASLA kaynak kod dağıtmayın! Sadece derlenmiş binary'leri dağıtın:
✅ İzin verilen:
- Binary dosyalar (gihftp, gihftp.exe)
- Dokümantasyon (README, INSTALL.txt, CHANGELOG)
- Kurulum scriptleri (install.sh, uninstall.sh)
- Örnek konfig dosyası (gihftp.conf.example)
- Checksum dosyaları (*.sha256)
❌ İzin verilmeyen:
- Kaynak kod dosyaları (*.go)
- go.mod, go.sum
- internal/ dizini
- .git dizini
- Geliştirme scriptleri (make-release.sh, deploy.sh)
Binary'nin bütünlüğünü doğrulayın:
# SHA256 checksum kontrolü
sha256sum gihftp
cat gihftp.sha256
# Eşleşmeli!- Fork edin
- Feature branch oluşturun (
git checkout -b feature/amazing-feature) - Commit edin (
git commit -m 'feat: Add amazing feature') - Test edin (
go test ./...) - Push edin (
git push origin feature/amazing-feature) - Pull Request açın
Not: Pull request'ler için:
- Kod stil standartlarına uyun
- Test ekleyin
- README'yi güncelleyin
- Breaking change'leri belirtin
Bu proje NI (Netinternet) için geliştirilmiştir.
- ✅ Command-line flag desteği
- ✅ Environment variable desteği (FTP_PASSWORD)
- ✅ Çalışma dizini yönetimi (--work-dir)
- ✅ Structured logging (debug/info/error)
- ✅ SSH host key verification
- ✅ TLS certificate verification
- ✅ Exit code standardizasyonu
- ✅ Modüler paket yapısı
- ✅ Release builder (make-release.sh)
- ✅ Otomatik installer/uninstaller scriptleri
- ✅ Binary-only dağıtım (kaynak kod koruması)
- ✅ FTP client desteği - Standart FTP protokolü ile upload
- ✅ Haftalık tek dosya - Son 7 günün tüm verilerini tek dosyada birleştirir
- ✅ Dosya adlandırma -
NETINTERNET-GIH-DNS_250k-YYYYMMDD.txtformatında (upload tarihi ile)
- ✅ TLS sertifika doğrulama (default: aktif)
- ✅ SSH known_hosts desteği
- ✅ Trust-on-first-use (TOFU) fallback
- ✅ Environment variable'dan password okuma
- ✅ SSH key passphrase desteği
- Config dosyası artık opsiyonel (flag'ler tercih edilir)
- Eski
main.gomain.go.backupolarak saklandı
Sorular ve öneriler için: Netinternet Development Team