---
title: "Mikro ERP SQL Server'a Web'den Güvenli Bağlantı: Cloudflare Tunnel Rehberi"
description: "SQL Server 1433 portunu internete açmadan Cloudflare Zero Trust (Tunnel) ile güvenli web API bağlantısı nasıl kurulur? Ransomware riskine son veren..."
date: 2026-04-10
category: mikro-erp
tags: ["mikro-erp", "cloudflare-tunnel", "sql-server", "güvenlik", "nodejs", "astaflow"]
url: https://mikroerp.dev/blog/mikro-erp-web-baglanti-cloudflare-tunnel/
---

## İş Problemi: "Dışarıdan Ofisteki Mikro'ya Nasıl Bağlanacağız?"

Şirketinizin Mikro ERP sunucusu ofisteki fiziksel bir makinede (On-Premise) çalışıyor. Satış ekibiniz için Vercel veya Supabase üzerinde modern bir web uygulaması yazdınız. Peki buluttaki bu web uygulaması, masanızın altındaki SQL Server'dan anlık stok bakiyesini nasıl alacak?

Geleneksel yöntemlerin hepsi felaketle sonuçlanır:
1. **Statik IP ve Port Yönlendirme:** Modeme girip 1433 (SQL) portunu dışarı açmak. (Ortalama 24 saat içinde sunucunuza Rusya veya Çin'den Ransomware girer ve tüm veritabanınız şifrelenir (Fidye virüsü)).
2. **Kişisel VPN:** Web sunucusuna VPN client kurmaya çalışmak (Yavaş ve hantaldır, bulut fonksiyonlarıyla uyumsuzdur).
3. **Zamanlanmış Görevle Veri Transferi:** Her gece Excel veya XML olarak FTP'ye dosya atmak. (Veriler güncel olmaz, anlık bakiye gösterilemez).

## Çözüm Mimarisi: Zero Trust & Cloudflare Tunnel

Bağlantıyı **dışarıdan içeri** (Port açarak) değil, **içeriden dışarı** (Tünel kurarak) başlatmalıyız. Cloudflare Tunnel, ofisteki sunucunuza kurulan küçük bir servis aracıdır. Dışarıya şifreli bir bağ kurar ve HTTP isteklerini güvenle içeri taşır.

Bunun yanı sıra **asla** SQL Server ile Cloudflare'i direkt konuşturmamalısınız. Araya sorgu denetçisi olarak hafif bir Node.js API katmanı koymak zorundasınız.

```mermaid
graph LR
A[Web Sunucusu] -- Şifreli İstek --> B((Cloudflare Edge))
B -- Cloudflare Tunnel --> C[Ofis Sunucusu (Node.js API)]
C -- Local 1433 Portu --> D[(MSSQL - Mikro DB)]
```

## Güvenli Node.js Proxy Kurulumu (Güvenlik Katmanı)

Sadece `SELECT` sorgularına izin veren ve statik API-KEY doğrulayan Node API:

```javascript
// server.js
const express = require('express');
const sql = require('mssql');
const app = express();
app.use(express.json());

// GÜVENLİK 1: Hard-Coded API Key (Sadece bizim web sunucumuz bilebilir)
const AstaFlow_API_KEY = "SUPER_SECRET_COMPLEX_KEY_987654321";

const pool = new sql.ConnectionPool({
  server: '127.0.0.1',
  database: 'MikroDB_V16',
  user: 'sa', // Veya sadece DataReader yetkisine sahip bir SQL kullanıcısı
  password: 'very_secure_password',
  options: { encrypt: false, trustServerCertificate: true },
  pool: { max: 10, min: 2 },
});
pool.connect();

app.post('/api/mikro-query', async (req, res) => {
  // Authorization Kontrolü
  if (req.headers['x-api-key'] !== AstaFlow_API_KEY) {
    return res.status(401).json({ error: 'Unauthorized Access' });
  }

  const { query, params } = req.body;

  // GÜVENLİK 2: INSERT, UPDATE, DROP gibi komutları Regex ile Reddet!
  if (!/^\s*SELECT/i.test(query)) {
    return res.status(403).json({ error: 'DB Firewall: Only SELECT statements are allowed on this tunnel.' });
  }

  try {
    const request = pool.request();
    // Parametreleri (SQL Injection Koruması) güvenle bind et
    if (params) {
      Object.entries(params).forEach(([key, value]) => {
        request.input(key, value);
      });
    }
    const result = await request.query(query);
    res.json({ success: true, data: result.recordset });
  } catch (err) {
    res.status(500).json({ error: 'Query Execution Failed' });
  }
});

app.listen(3000, () => console.log('AstaFlow Proxy is listening on port 3000'));
```

## Adım Adım Tünel (Tunnel) Konfigürasyonu

1. Ofis sunucunuza `cloudflared.exe` indirin.
2. CMD'yi yönetici açıp: `cloudflared tunnel login` yapın. (Tarayıcı açılır ve Cloudflare hesabınızı bağlar).
3. Tünel yaratın: `cloudflared tunnel create mikrotunnel`
4. DNS bağlantısı yapın: `cloudflared tunnel route dns mikrotunnel api.sirketiniz.com`
5. Tüneli Node.js portuna yönlendirin:
   `cloudflared tunnel run --url http://localhost:3000 mikrotunnel`

*Bitti. Artık `api.sirketiniz.com` adresi ofis sunucunuza HTTPS sertifikalı ve DDOS korumalı olarak bağlanıyor.*

## Edge Cases (Ölümcül Riskler) ve Optimizasyon

1. **Daemon Çökmesi (Windows Service):** `cloudflared run` komutunu siyah CMD ekranında açık bırakırsanız, biri ekranı kapattığında veya sunucu yeniden başladığında dış dünya kopar. Bunu mutlaka bir Windows Servisi olarak kaydetmelisiniz: `cloudflared service install`.
2. **Karakter Seti Çöplüğü:** Node.js, Mssql ile konuşurken Türkçe karakterler (Örn: `Ş`, `İ`, `Ğ`) soru işaretine dönebilir. Node sunucusunun çalıştığı Windows Region Settings'in Turkish olduğundan emin olun ve response'a `charset=utf-8` Header'ı basmayı unutmayın.
3. **HTTP Timeout:** Cloudflare'in ücretsiz sürümünde bir HTTP isteği 100 saniye içinde cevap alamazsa zorla koparılır (524 Error). Mikro'dan devasa bir yaşlandırma veya maliyet raporu çekerken sorgu 100 saniyeyi geçerse tünel patlar. Çözüm: AstaFlow'da kullandığımız Webhook tabanlı veya Pagination (Sayfalama - TOP 500) kurgularıdır.

## Bu Bilgiyi Nereden Biliyoruz? (Kaynaklar)

*   **AstaFlow Case Study:** [AstaFlow ERP Web Entegrasyon Mimarisi](/case-study/)
*   **İlgili Çözüm:** [Mikro'da Veritabanları Arası Güvenli Veri Aktarımı](/blog/sql-server-cross-database-update-senkronizasyon/)