Metin2 bilişim Türkiye'de yıllardır hem yayıncıların hem de oyuncuların en yoğun ilgi gösterdiği niş hosting alanlarından biri. 2004 yılında yayınlanan oyunun resmi serverları hâlâ ayakta olmasına karşın, asıl ekosistem private (özel) sunuculardan oluşuyor: MMORPG mantığını birebir koruyan, ancak EXP/yang oranlarını, item havuzunu, level cap'ini ve PvP dengesini özelleştirebilen yüzlerce server her ay açılıp kapanıyor. Bu rehber, bir Metin2 sunucusunun teknik altyapısını uçtan uca planlamak isteyenler için yazıldı: donanım seçimi, işletim sistemi sertleştirme, MySQL tuning, game core derleme, source code yönetimi, DDoS savunması, oyuncu kapasitesi hesaplama ve gerçek fiyat aralıkları dahil tüm katmanları işliyoruz.
İlgili rehberler: VPS ve VDS farkı · Çok katmanlı DDoS koruması · Linux sunucu yönetimi temelleri · VPS güvenlik sertleştirme · Fail2ban ile SSH koruması · Veritabanı performans tuning
Metin2 Bilişim Nedir, Neden Ayrı Bir Disiplindir?
Bir blog veya WordPress sitesinin barındırılmasıyla bir Metin2 sunucusunun barındırılması, ilk bakışta benzer iki Linux sunucu işiymiş gibi görünür. Pratikte aralarında uçurum vardır. Metin2 bir persistent state oyunudur: oyuncular karakterlerini geliştirir, item kazanır, lonca yapar, veritabanına yüzlerce binlerce yazma işlemi başına bir oyun günü düşer. Sunucu çökerse 30 dakikalık bir kayıp bile oyuncuların yanıp giden saatlerce emeği demektir; bu da reputasyonel hasar olarak doğrudan aktif oyuncu sayısına yansır.
Bu nedenle Metin2 bilişim ayrı bir disiplin olarak değerlendirilir. Web tarafında 200ms'lik gecikme tölere edilebilirken, oyun tarafında 80ms üstü ping PvP'de avantaj/dezavantaj farkına dönüşür. Bir e-ticaret sitesinde MySQL'in saniyede 50 INSERT yapması yetebilirken, kalabalık bir Metin2 sunucusunda peak saatlerde saniyede 2.000+ yazma işlemi normaldir. Donanım, ağ, işletim sistemi ve uygulama katmanlarının her birinde oyun yüküne özel kararlar alınır.
Sunucu Mimarisinin Genel Şeması
Tipik bir Metin2 sunucusu, dış dünyaya tek bir IP üzerinden hizmet veriyor gibi görünür ama kabuğun altında birden fazla bileşen vardır. Auth server oyuncu giriş doğrulamasını yapar, db cache sürekli okunan kalıcı verileri tutar, game core'lar her bir harita için ayrı süreçler olarak çalışır, MySQL kalıcı veritabanını yönetir, opsiyonel web panel oyuncu kayıt ve item satışı arayüzünü sunar.
┌──────────────────────────────────────────────┐
│ Internet (oyuncular) │
└──────────────────────────────────────────────┘
│
┌────────▼────────┐
│ DDoS scrubber │ (upstream filter)
└────────┬────────┘
│
┌────────▼────────┐
│ auth server │ TCP 11002
└────────┬────────┘
│
┌─────────────────┼─────────────────┐
│ │ │
┌────▼────┐ ┌────▼────┐ ┌────▼────┐
│ ch1 core│ │ ch2 core│ │ ch3 core│ TCP 13001+
└────┬────┘ └────┬────┘ └────┬────┘
│ │ │
└─────────┬───────┴─────────┬───────┘
│ │
┌─────▼─────┐ ┌─────▼─────┐
│ db_cache │◄────► MySQL │ (3306)
└───────────┘ └───────────┘
Bu mimaride en kritik sürtünme noktası db_cache'tir. Game core'lar veritabanı okuma/yazma isteklerini doğrudan MySQL'e değil, db_cache'e gönderir. db_cache, sıkça erişilen kayıtları belleğinde tutar ve MySQL'e batch yazma yapar. Bu katman olmadan kalabalık bir sunucuda MySQL diz çöker; tunable parametrelerini doğru ayarlamak Metin2 bilişimin temel becerilerinden biridir.
Donanım Seçimi: CPU, RAM, Disk, Ağ
Donanım seçiminde tek bir altın kural var: tek çekirdek performansı önceliklidir. Metin2 game core'u büyük ölçüde tek thread üzerinde çalışır; harita başına ayrı süreç olsa da bir haritadaki kalabalık yine tek bir CPU çekirdeğine yüklenir. 32 çekirdekli ama düşük frekanslı bir Xeon E5, 8 çekirdekli ama 5GHz boost yapan bir Ryzen 9'a göre büyük PvP eventlerinde daha çok donar.
- Tek çekirdek hız önceliği: Ryzen 9 7950X, 7900X3D, Intel Core i9 14900K gibi 5GHz+ tek çekirdek performansı sunan işlemciler PvP-yoğun oyunlar için ideal.
- ECC RAM: Veritabanı işlemleri için bit corruption korunması önemli. DDR5 ECC tercih edin.
- NVMe SSD: MySQL için Samsung PM983/PM9A3 veya benzer datacenter NVMe. Tüketici SSD'leri (örn. 970 EVO) sürekli yazma yükünde 6-12 ayda yıpranır.
- RAID 1 veya RAID 10: Hardware RAID controller veya Linux mdadm. Oyun verisi için tek disk asla yeterli değildir.
- 1Gbps simetrik bağlantı: Üst limit 10Gbps olabilir ama sürekli kullanım nadiren 100Mbps'i aşar; önemli olan paket gecikmesidir.
- Türkiye lokasyonu: Türkiye oyuncu kitlesi için yurt içi datacenter (İstanbul, Ankara, İzmir) tercih edin; Avrupa lokasyonu 30-60ms ek ping demektir.
Oyuncu Sayısı - Donanım Karşılaştırma Tablosu
Aşağıdaki tablo SERP'teki Türk Metin2 hosting sağlayıcılarının kapasite önerilerinin ortalamasıdır; gerçek değerler içerik bazlı (bot AI sayısı, item drop hesaplama yoğunluğu, PvP oranı) %30'a kadar değişebilir.
Eşzamanlı oyuncu | CPU | RAM | Disk | Aylık ücret*
------------------+--------------------+--------+--------------+-------------
100-300 | 2 vCore @4GHz+ | 4 GB | 50 GB NVMe | 200-500₺
300-800 | 4 vCore @4GHz+ | 8 GB | 80 GB NVMe | 500-1.000₺
800-1500 | 6 vCore @4.5GHz+ | 16 GB | 120 GB NVMe | 1.000-2.000₺
1500-3000 | 8 vCore @4.5GHz+ | 32 GB | 200 GB NVMe | 2.000-4.000₺
3000-6000 | 12-16 vCore Ryzen 9| 64 GB | 500 GB NVMe | 4.000-8.000₺
6000+ | Dedicated, 2x CPU | 128 GB+| 1 TB NVMe RAID | 10.000-20.000₺
* yaklaşık, sağlayıcıya göre değişir, 2026 verisi
Kiralık Sunucu mu, Dedicated mı, Co-location mı?
Yeni başlayan bir Metin2 yayıncısı için neredeyse her zaman kiralık sunucu (VDS/managed VPS) en mantıklı seçimdir. Donanım yatırımı, datacenter rack, IP transit, soğutma ve elektrik gibi sabit maliyetler aylık 30-100₺'lik kira farkıyla satıcıya devredilmiş olur. 1.500 oyuncuyu geçtikten sonra dedicated (fiziksel, paylaşılmamış) sunucuya geçmek mantıklıdır. 5.000 oyuncu üstünde, eğer trafik 5+ yıl boyunca sürdürülecekse, co-location (kendi sunucunuzu datacenter'a yerleştirme) marjinal kazanç sağlar.
- VPS (paylaşılmış): Aynı fiziksel sunucuda başka müşteriler de var. Ucuz ama 'noisy neighbor' riski. Yeni açılan, 100-300 oyunculu sunucular için yeterli.
- VDS (dedicated cores): vCore'lar sizin için ayrılmış. Performans öngörülebilir. 300-2000 oyunculu sunucular için sweet spot.
- Dedicated server (kiralık): Tüm fiziksel makine sizin. Ay sonu faturası, donanım sağlayıcıda. Büyük sunucular için standart.
- Bare metal cloud: Saatlik dedicated, deneme ve test sunucusu için ideal. Hetzner/OVHcloud bu modeli sunar.
- Co-location: Kendi donanımınız datacenter rack'inde. CapEx yüksek ama TCO düşük. Sadece çok büyük ölçek için.
VPS ve VDS arasındaki farkı detaylı incelemek için ayrı bir rehberimiz var: VPS Nedir? VPS ile VDS Farkı ve VPS Kiralama Rehberi. Bulut sunucu mantığı için Bulut Sunucu Nedir yazımız temel kavramları kapsıyor.
İşletim Sistemi: Linux Hangi Dağıtım?
Metin2 game core'unun resmi olmayan derlemeleri büyük ölçüde FreeBSD 9.x ve CentOS 6/7 üzerine inşa edilmişti. Bu nedenle birçok 'hazır pack' hâlâ eski kütüphane uyumluluğu için CentOS 7 isteyebilir. Yeni başlayanlar için tavsiyemiz AlmaLinux 9 veya Rocky Linux 9 (CentOS'un downstream halefleri) ya da Ubuntu Server 22.04 LTS. FreeBSD bilen yöneticiler için FreeBSD 13.2+ hâlâ çok performanslı bir tercihtir.
# AlmaLinux 9 üzerinde temel paket kurulumu
sudo dnf -y update
sudo dnf -y install epel-release
sudo dnf -y install \
gcc gcc-c++ make cmake \
mysql-server mysql-devel \
openssl-devel zlib-devel \
cronie wget vim htop \
net-tools tcpdump bind-utils \
firewalld fail2ban
# 32-bit uyumluluk (eski Metin2 binarileri için)
sudo dnf -y install glibc.i686 libstdc++.i686 zlib.i686
# Servisler
sudo systemctl enable --now mysqld firewalld fail2ban
Linux sunucu yönetimi konusunda derin bir başvuru için Linux Sunucu Yönetimi Temelleri yazımızı okuyun. Sertleştirme adımları için VPS Güvenlik Sertleştirme rehberimizde adım adım kontrol listesi var.
Sistem Sertleştirme: SSH, Firewall, Kullanıcılar
Bir Metin2 sunucusu açar açmaz internetin en sevdiği hedeflerden biri olur: hem yarışan rakip yayıncılar hem de generic brute-force taraması yapan bot ağları SSH portunu yumruklamaya başlar. Default ayarlarda root SSH ile 22 portunda bekleyen bir sunucu, ilk gece 10.000+ login denemesine maruz kalır.
# 1. Yeni sysadmin kullanıcısı oluştur
sudo adduser metin2admin
sudo passwd metin2admin
sudo usermod -aG wheel metin2admin # AlmaLinux/Rocky
# Ubuntu için: sudo usermod -aG sudo metin2admin
# 2. SSH key tabanlı giriş kur (lokal makineden)
ssh-keygen -t ed25519 -C "metin2admin@laptop"
ssh-copy-id metin2admin@SUNUCU_IP
# 3. /etc/ssh/sshd_config sertleştir
sudo sed -i \
-e 's/^#\?PermitRootLogin.*/PermitRootLogin no/' \
-e 's/^#\?PasswordAuthentication.*/PasswordAuthentication no/' \
-e 's/^#\?Port 22/Port 2289/' \
/etc/ssh/sshd_config
sudo systemctl restart sshd
Brute-force korumasını ek bir katmanla güçlendirmek için Fail2ban kurun. SSH yanı sıra MySQL ve panel HTTP portu için de jail tanımlayın. Detaylı yapılandırma için Fail2ban ile SSH Brute Force Koruması rehberimizi takip edin.
# /etc/fail2ban/jail.local
[DEFAULT]
bantime = 24h
findtime = 10m
maxretry = 3
backend = systemd
[sshd]
enabled = true
port = 2289
[mysqld-auth]
enabled = true
port = 3306
filter = mysqld-auth
logpath = /var/log/mysql/error.log
maxretry = 5
Firewall: Sadece Gereken Portlar
Metin2 sunucusu varsayılan olarak şu portları açar: 11002 (auth), 13001-13099 (channel/game core'lar), 15000 (db_cache), 3306 (MySQL — sadece localhost!), 80/443 (web panel). Diğer her şey kapalı olmalı.
# firewalld ile kural seti
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --permanent --add-port=2289/tcp # custom SSH
sudo firewall-cmd --permanent --add-port=11002/tcp # auth
sudo firewall-cmd --permanent --add-port=13001-13099/tcp # game cores
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
# MySQL ve db_cache sadece localhost - dış dünyaya KAPALI
# Bu portlar firewall'a eklenmiyor (default deny)
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
MySQL Kurulumu ve Tuning
Veritabanı, Metin2 sunucusunun kalbidir. Her item drop, level up, lonca chat satırı, item market alışverişi MySQL'e yazılır. Default ayarlarla MySQL 8.0 veya MariaDB 10.11 kurulduğunda 'çalışıyor' olur ama 200 oyuncuya kadar idare eder; sonrası lag fırtınasıdır. Aşağıdaki my.cnf bloğu, kalabalık bir sunucu için tutarlı bir başlangıçtır.
# /etc/my.cnf.d/metin2.cnf (MariaDB / MySQL 8.0)
[mysqld]
bind-address = 127.0.0.1
port = 3306
max_connections = 500
max_user_connections = 450
thread_cache_size = 64
table_open_cache = 4000
open_files_limit = 65535
# InnoDB - Metin2'nin ana storage engine'i
innodb_buffer_pool_size = 8G # toplam RAM'in ~50%
innodb_buffer_pool_instances= 8
innodb_log_file_size = 1G
innodb_log_buffer_size = 64M
innodb_flush_log_at_trx_commit = 2 # 1=ACID, 2=performans
innodb_flush_method = O_DIRECT
innodb_io_capacity = 2000 # NVMe için yüksek
innodb_io_capacity_max = 4000
innodb_read_io_threads = 8
innodb_write_io_threads = 8
innodb_thread_concurrency = 0
# Slow query log - sürekli izlemek şart
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 0.5
log_queries_not_using_indexes = 1
# Karakter seti - Türkçe karakterler için
character-set-server = utf8mb4
collation-server = utf8mb4_turkish_ci
# Binary log - replication ve PITR için
log_bin = /var/lib/mysql/binlog
binlog_expire_logs_seconds = 604800 # 7 gün
sync_binlog = 0 # performans odaklı
innodb_flush_log_at_trx_commit = 2 ayarı disk I/O yükünü %30-50 azaltır ama elektrik kesintisi gibi ani çökmelerde son 1 saniyenin verisi kaybolabilir. Oyun sunucularında bu trade-off kabul edilebilirdir; banka uygulamasında olmazdı. Veritabanı tuning detayları için PostgreSQL Performans Optimizasyonu ve SQL Sorgu Optimizasyonu yazılarımız uygulanabilir prensipleri kapsıyor (PostgreSQL özelinde olsa da prensipler MySQL için de geçerli).
Veritabanı Şeması: Metin2'nin Tipik Tabloları
Bir Metin2 sunucusunda dört ana veritabanı bulunur: account (oyuncu hesapları, parolalar), player (karakter verisi, level, stat'lar), common (item proto, mob proto, lonca, market), log (denetim ve sosyal log'lar). Toplam tablo sayısı sürüme göre 80-150 arasındadır.
-- Metin2'nin en yoğun yazılan tablolarından örnek
-- player tablosu, her karakter için bir satır
DESCRIBE player.player;
-- id, account_id, name, job, level, exp, gold, hp, sp,...
-- En sık yapılan join: oyuncu giriş anında
SELECT p.id, p.name, p.level, p.job, q.dt, q.value
FROM player.player p
LEFT JOIN player.quest q ON q.dt = p.id
WHERE p.account_id = 12345
LIMIT 4;
-- Performans kritik index önerileri
ALTER TABLE player.item
ADD INDEX idx_owner_window (owner_id, window),
ADD INDEX idx_pos (pos);
ALTER TABLE log.item_log
ADD INDEX idx_time_who (time DESC, who),
ADD INDEX idx_vnum (vnum);
ALTER TABLE common.item_award
ADD INDEX idx_login_taken (login, taken_time);
Game Core'un Kurulumu ve Servis Olarak Çalıştırma
Game core, derlenmiş bir C++ binary'sidir. Yayıncılar genellikle hazır bir 'pack' (game.tar.gz tarzı) kullanır. Kurulum sıralaması şu şekilde işler: dosyaları /usr/games/metin2/ altına aç, configleri düzenle (auth/db/game/channel için ayrı conf dosyaları), MySQL şemasını içe aktar, db_cache başlat, auth başlat, channel core'larını başlat. Tüm bunları tek seferlik bir start script'inde değil, systemd unit olarak yönetmek doğru pratiktir.
# /etc/systemd/system/metin2-db.service
[Unit]
Description=Metin2 db_cache server
After=network.target mysqld.service
Requires=mysqld.service
[Service]
Type=simple
User=metin2
WorkingDirectory=/usr/games/metin2/db
ExecStart=/usr/games/metin2/db/db
Restart=on-failure
RestartSec=10s
LimitNOFILE=65535
MemoryMax=4G
[Install]
WantedBy=multi-user.target
# /etc/systemd/system/metin2-auth.service
[Unit]
Description=Metin2 auth server
After=metin2-db.service
Requires=metin2-db.service
[Service]
Type=simple
User=metin2
WorkingDirectory=/usr/games/metin2/auth
ExecStart=/usr/games/metin2/auth/game CONFIG
Restart=on-failure
RestartSec=10s
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
# /etc/systemd/system/metin2-ch1@.service (template)
[Unit]
Description=Metin2 channel %i game core
After=metin2-auth.service
Requires=metin2-auth.service
[Service]
Type=simple
User=metin2
WorkingDirectory=/usr/games/metin2/channel%i
ExecStart=/usr/games/metin2/channel%i/game CONFIG
Restart=on-failure
RestartSec=10s
LimitNOFILE=65535
MemoryMax=2G
[Install]
WantedBy=multi-user.target
Bu yapı sayesinde tek bir systemctl restart metin2-ch1@2 komutu ile yalnızca 2. channel'i yeniden başlatabilirsiniz. Crash olursa Restart=on-failure ile otomatik dirilir. journalctl -u metin2-ch1@2 -f komutuyla canlı log akıtırsınız.
Source Code: Açık ve Kapalı Olmak Üzere İki Dünya
Resmi Metin2 source code'u (özellikle 2014 sonrası 'M2_NET' dökülmesi) yıllar içinde toplulukta paylaşılmış olsa da telif açısından gri alandadır. Yayıncılar dört yol seçer: (1) hazır kapalı binary 'pack' kullanmak, (2) bir 'public source' fork'undan kendi binary'lerini derlemek, (3) ücretli kapalı kaynak çözüm satın almak, (4) sıfırdan custom yazmak (nadir). Çoğunluk ilk iki seçeneği kullanır.
- Hazır pack: Hızlı kurulum, ama özellik kilidi var, custom değişiklik zor.
- Public source derleme: Tam kontrol, ama C++ bilgisi şart. GCC 4.8 veya FreeBSD clang ile uyumluluk gerekir.
- Ücretli kapalı çözüm: Aylık 1.500-5.000₺ aralığında lisanslar yaygın. Destek dahil.
- Sıfırdan yazma: 12-24 ay geliştirme süresi. Sadece çok özelleşmiş projeler tercih eder.
Source derlemeyi seçtiyseniz, bir git repository'de değişikliklerinizi versiyonlamak hayati önemde. Tek satır config farkı yüzünden geri sarılamayan bir bug, üretim sunucunuzu saatlerce dondurabilir. Git İleri Seviye Komutlar rehberimiz branch stratejisi ve cherry-pick için pratik önerilerle dolu.
# Public source örnek derleme akışı
cd /usr/src
git clone https://github.com/your-fork/metin2-source.git
cd metin2-source
# 32-bit derleme (eski Metin2 client uyumluluğu)
export CFLAGS="-m32 -O2 -fno-strict-aliasing"
export CXXFLAGS="$CFLAGS"
export LDFLAGS="-m32"
# Common ve game'i sırasıyla derle
cd common && make -j$(nproc) clean all
cd../db && make -j$(nproc) clean all
cd../game && make -j$(nproc) clean all
# Çıktıları deploy et
sudo cp db/db /usr/games/metin2/db/db
sudo cp game/game /usr/games/metin2/channel1/game
sudo systemctl restart metin2-db metin2-ch1@1
Patcher, Auto-Update ve İndirme Sunucusu
Oyuncu client'ı bağlandığında ilk iş patcher'ın güncel dosyaları indirmesidir. Patcher tipik olarak küçük bir HTTP sunucusunda barındırılan, version manifest dosyasını okur ve eksik/değişen dosyaları çeker. Patcher dosya boyutu büyük (200-500MB epi tipik); CDN kullanmazsanız her oyuncuya bu trafiği kendi sunucunuzdan çekersiniz.
# /etc/nginx/conf.d/patch.conf
server {
listen 80;
server_name patch.ornek-mt2.com;
root /var/www/patch;
autoindex off;
# Patcher dosyaları için aggressive cache
location ~* \.(epk|eix|tga|dds|jpg|png)$ {
expires 30d;
add_header Cache-Control "public, immutable";
add_header X-Content-Type-Options "nosniff";
}
# Manifest sürekli değişebilir
location ~* /(version\.txt|patch_list\.txt)$ {
expires 30s;
add_header Cache-Control "public, must-revalidate";
}
# Bandwidth limit per IP (DDoS hafifletme)
limit_rate_after 10m;
limit_rate 5m;
access_log /var/log/nginx/patch_access.log;
error_log /var/log/nginx/patch_error.log;
}
Trafiğin büyük kısmı patcher'a gidiyorsa, Cloudflare R2/Bunny CDN/AWS CloudFront gibi bir CDN'e patcher'ı taşımak hem origin yükünü %90+ azaltır hem oyuncu indirme süresini ciddi düşürür. Nginx detayları için Nginx Yapılandırma Rehberi yazımız kapsamlı bir başvuru sunuyor.
DDoS Saldırıları: Metin2'nin Kronik Sorunu
Metin2 sunucuları, sektörün en yoğun DDoS saldırılarına maruz kalan kategorilerden biridir. Sebebi basit: rakip yayıncılar, kaybolan oyuncular ya da ego savaşları. Bir saldırı, açılış akşamı 3.000 oyuncusu olan bir sunucuyu 30 dakika içinde tamamen kapatabilir; itibar zararı 1-2 hafta sonrasında %50+ oyuncu kaybı olarak görülür.
- Volumetric attack: 100 Gbps+ UDP flood, 1.4M PPS SYN flood. Tek başına firewall ile durdurulamaz; upstream scrubbing şart.
- Application layer (L7): Patcher HTTP'sine binlerce GET/sn. Fastly/Cloudflare WAF ile filtrelenmeli.
- Game protocol attack: Login portuna geçersiz packet barajı. Game core'un parsing katmanı tıkanır.
- Slow loris ve connection exhaust: Az sayıda yavaş bağlantıyla soket havuzu doldurma.
- Reflection/amplification: DNS, NTP, memcached üzerinden büyütülmüş trafik.
Çok katmanlı savunma stratejisinin detaylı işlenmiş hali için DDoS Saldırılarına Karşı Çok Katmanlı Koruma: Cloudflare + Nginx rehberimiz birinci sırada. Metin2'ye özel olarak şu üç tabaka birlikte çalışmalı:
┌──────────────────────────────────────────────┐
│ TABAKA 1: Upstream scrubbing │
│ Path.net, Voxility, OVH Game, NFOrce │
│ Anycast - 1+ Tbps mitigation │
└──────────────────────────────────────────────┘
│
┌──────────────────────────────────────────────┐
│ TABAKA 2: Datacenter network firewall │
│ Mikrotik CCR / Juniper / FortiGate │
│ Hardware-accelerated SYN cookie, GeoIP filter│
└──────────────────────────────────────────────┘
│
┌──────────────────────────────────────────────┐
│ TABAKA 3: Sunucu üzerinde iptables/nftables │
│ Rate limit, connection tracking, fail2ban │
└──────────────────────────────────────────────┘
nftables ile Sunucu Tarafı Rate Limit
# /etc/nftables.d/metin2.nft
table inet metin2 {
set ddos_blacklist {
type ipv4_addr
flags timeout
timeout 1h
size 65535
}
chain input {
type filter hook input priority 0; policy drop;
# Conntrack established
ct state established,related accept
ct state invalid drop
# Loopback
iif lo accept
# ICMP rate limit
ip protocol icmp limit rate 10/second accept
# SSH (custom port) - sadece beyaz liste IP'leri
tcp dport 2289 ip saddr { 1.2.3.4, 5.6.7.8 } accept
# Auth - rate limited
tcp dport 11002 limit rate 50/second accept
tcp dport 11002 add @ddos_blacklist { ip saddr } drop
# Game cores
tcp dport 13001-13099 accept
# HTTP/HTTPS
tcp dport { 80, 443 } accept
# Blacklist drop (her şeyin başında olabilir, esneklik için sonda)
ip saddr @ddos_blacklist drop
}
}
Metin2 Pvp Sunucu Türleri ve Beklentileri
Metin2 pvp sunucu dendiğinde Türkiye'de aslında çok geniş bir spektrum kastedilir. Forum reklamlarında en çok dolaşan kategoriler: 1-99 level (klasik), 1-105 (orta zorluk), 1-120 (farm odaklı), 55-120 (yüksek seviye PvP), 65-250 (lonca savaş odaklı), WSLİK (1v1 düello, 98-99 level kilit), VSLİK (perpetual ekonomi).
- Klasik (1-99): Nostaljik yapı, eski item havuzu, kostüm/kemer yok. Açıkları kapatma süresi 2-4 hafta.
- Orta zorluk (1-105): Dengeli ilerleme, autohunt opsiyonel, kostüm var. Open beta 7-10 gün sonra wipe + canlı.
- Farm (1-120): Yang ekonomisi merkezde, item market aktif, daily quest yoğun.
- WSLİK: Levelleme deneyimi yok denecek kadar düşük; oyuncu açılıştan 1 saat sonra 99 olur, gerisi düello. Lonca savaşı yerine bireysel turnuvalar.
- Hard emek: Item drop oranı çok düşük, levelleme 50-100 saat. Hardcore oyuncu kitlesine hitap eder.
- VSLİK / VS: Sürekli ekonomi, wipe yok, oyuncu sayısı aylar boyunca eşit dağılır.
PvP sunucusu açacaksanız, oyuncu sayısı yoğunluğu açılış anında patlar — 'launch night peak' tipik olarak normal günün 5-10 katıdır. Bu pikler için 1500 ortalama oyuncu beklediğiniz bir sunucuda en az 8.000 simultane bağlantıyı kaldırabilecek altyapı planlamalısınız. Aksi halde açılış akşamı kapanma riskli yüksek olur.
Metin2 Sunucu Fiyatları: Gerçek Türk Pazarı 2026
Aşağıdaki fiyat aralıkları Türkiye'deki yerel sağlayıcıların (siberdizayn, buyukhosting, mezuhost, anksoft, poyrazbilisim, ilinerteknoloji, awmbilisim, servertescil ve benzerleri) 2026 başı verilerinden derlenmiş yaklaşık değerlerdir. Sağlayıcı, kampanya, sözleşme süresi ve özel ihtiyaçlara göre %30-50 sapma görülebilir.
Paket | Tipik kapasite | Aylık fiyat aralığı (₺) | Notlar
---------------+-----------------+-------------------------+--------------------------
Başlangıç | 100-300 oyuncu | 200 - 500 | 4GB RAM, 2 vCore, 50GB SSD
Orta segment | 500-1500 oyuncu | 600 - 1.500 | 8-16GB RAM, NVMe, DDoS dahil
Üst orta | 1500-3000 | 1.500 - 3.500 | Ryzen 9, 32GB RAM, 200GB NVMe
Profesyonel | 3000-6000 | 3.500 - 8.000 | Dedicated, 64GB+, Voxility/Path scrubber
Kurumsal | 6000+ | 8.000 - 20.000+ | Co-location, redundant network, SLA
* yaklaşık, sağlayıcıya göre değişir, 2026 verisi
Fiyatın yanı sıra şu kalemleri de bütçeleyin: Domain (200-500₺/yıl,.com.tr için 600-1.000₺/yıl), SSL sertifikası (Let's Encrypt ücretsiz, EV cert'ler için 1.500-5.000₺/yıl), oyun pack lisansı (kapalı kaynak ise 1.500-5.000₺/ay), panel & ödeme entegrasyonu (iyzico, Paytr komisyon %2-3), destek ekibi (GM/moderatör maaşları), reklam (forum bumpları, Google Ads, YouTube içerik üreticileri).
Aylık Toplam İşletme Maliyeti Modeli
Orta ölçekli bir sunucu (1500 oyuncu peak), aylık tipik gider:
Kalem | Aylık (₺)
-----------------------------+----------
VDS / kiralık sunucu | 1.500
DDoS upstream protection | 600
Domain + SSL | 50
Pack/source lisansı | 2.500
Ödeme entegrasyonu komisyonu | 800
GM ekibi (2-3 kişi part-time)| 6.000
Reklam & pazarlama | 3.000
Yedekleme depolama (off-site)| 200
-----------------------------+----------
TOPLAM | 14.650
Gelir tarafı (item market %5 dönüşüm @1500 oyuncu):
Ortalama oyuncu başı 30₺/ay = 45.000₺/ay potansiyel
Net kâr: ~30.000₺ (sağlıklı ölçek için)
Metin2 Pvp Hosting: Ne Sorulmalı?
Bir metin2 pvp hosting sağlayıcısıyla anlaşmadan önce sözleşme öncesi sorularınızı net listeleyin. SERP'teki Türk sağlayıcıların pazarlama sayfaları çoğu zaman 'DDoS dahil', '%99 uptime' gibi belirsiz ifadeler kullanır; teknik detayı kontrat aşamasında sorgulayın.
- DDoS mitigation kapasitesi: Kaç Gbps'e kadar koruma? Hangi scrubbing sağlayıcısı (Path.net, Voxility, OVH, in-house)?
- Gerçek CPU modeli: 'E5' yetersiz; 'Xeon E5-2696 v4' veya 'Ryzen 9 7950X' gibi tam model.
- Sanallaştırma: KVM mı VMware mı OpenVZ mi? OpenVZ I/O performansı zayıftır, kaçının.
- Uplink kapasitesi: 1Gbps port mu, 10Gbps mu? Datacenter'in toplam transit kapasitesi?
- SLA penalty: %99.9 SLA verilmiş ama kesinti durumunda kompansasyon nasıl?
- Yedek alma politikası: Otomatik mı manuel mi? Yedek nereye gidiyor (aynı datacenter = kötü)?
- Migration ve upgrade: RAM yükseltme kaç dakika downtime gerektiriyor?
- Destek SLA: Kritik ticket'a ne kadar sürede yanıt? 7/24 erişilebilir kişi var mı?
- IP değişikliği: DDoS sonrası null-route yenilemesi nasıl?
- Test sunucusu: 7-14 günlük deneme/test ortamı var mı?
Metin2 Kiralık Sunucu Seçim Kriterleri
Metin2 kiralık sunucu seçerken çoğu yayıncının yaptığı en yaygın iki hata: (1) sadece RAM/CPU çekirdek sayısına bakmak, single-thread frekansını ihmal etmek; (2) Türkiye lokasyonu yerine 'daha ucuz' Avrupa lokasyonu seçip 30-60ms ek ping ile oyuncu kaybetmek. Üçüncü hata kapasite planlamasındaki cimrilik: peak'ler için %50 baş alanı bırakmamak.
- Single-thread skoru kontrolü: PassMark üzerinden CPU model adının skorunu sorgulayın. 3500+ skor sweet spot.
- Ping testi: Sağlayıcının test IP'sine en az 3 farklı operatörden (Türk Telekom, Vodafone, Turknet) ping atın.
- Disk benchmark:
fioile 4K random write IOPS ölçün; 50.000+ IOPS NVMe işareti. - Network test:
iperf3ile sürekli 800Mbps+ throughput beklenir. - Uptime kanıtı: Sağlayıcının statuspage.io veya benzeri public uptime sayfası olmalı.
- Referans: Aynı sağlayıcıyı kullanan en az 2-3 başka yayıncıyla konuşun.
# Sunucu performansını kanıtlamak için temel benchmark seti
# CPU - sysbench
sudo dnf -y install sysbench
sysbench cpu --cpu-max-prime=20000 --threads=$(nproc) run
# Disk - fio (random write test)
sudo dnf -y install fio
fio --name=random-write --ioengine=libaio --rw=randwrite \
--bs=4k --numjobs=4 --size=4g --runtime=60 \
--time_based --group_reporting --direct=1
# Network - iperf3
iperf3 -c speedtest.serverius.net -t 60 -P 4
# MySQL - tek başına yük testi
sysbench oltp_read_write \
--mysql-host=127.0.0.1 \
--mysql-user=test \
--mysql-password=test \
--mysql-db=sbtest \
--tables=10 --table-size=100000 \
--threads=64 --time=120 run
Yedekleme Stratejisi: 3-2-1 Kuralı
Veritabanı veya dosya kaybı, sağlıklı bir oyuncu kitlesini bir gecede dağıtır. 3-2-1 kuralı: 3 kopya, 2 farklı medya/teknoloji, 1 off-site. Detaylı yaklaşım için Veritabanı Yedekleme Stratejileri rehberimiz tüm modeli — full, incremental, PITR — kapsıyor.
#!/bin/bash
# /usr/local/bin/metin2-backup.sh
# Her gece 04:00'te cron ile çalışır
set -euo pipefail
DATE=$(date +%Y%m%d-%H%M)
BACKUP_DIR="/var/backups/metin2"
REMOTE_HOST="backup@offsite.ornek.com"
REMOTE_DIR="/srv/backups/metin2"
mkdir -p "$BACKUP_DIR/$DATE"
# 1. MySQL dump (her veritabanı ayrı dosya)
for DB in account player common log; do
mysqldump --single-transaction --quick --routines --triggers \
--hex-blob --master-data=2 \
"$DB" | zstd -19 -T0 \
> "$BACKUP_DIR/$DATE/${DB}.sql.zst"
done
# 2. Game files (oyun binary + config + map data)
tar --use-compress-program="zstd -19 -T0" \
-cf "$BACKUP_DIR/$DATE/game-files.tar.zst" \
-C /usr/games/metin2.
# 3. Off-site rsync (encrypted SSH)
rsync -az --delete \
--bwlimit=50000 \
"$BACKUP_DIR/$DATE/" \
"$REMOTE_HOST:$REMOTE_DIR/$DATE/"
# 4. 14 günden eski lokal yedekleri sil
find "$BACKUP_DIR" -maxdepth 1 -type d -mtime +14 -exec rm -rf {} +
# 5. Slack/Discord webhook ile bilgilendir
curl -X POST -H 'Content-Type: application/json' \
-d "{\"text\":\"Yedek başarılı: $DATE\"}" \
"$WEBHOOK_URL"
echo "Backup tamamlandı: $DATE"
Bu script cron'a şu satırla eklenir: 0 4 * * * /usr/local/bin/metin2-backup.sh >> /var/log/metin2-backup.log 2>&1. Restorasyon testini ayda en az bir kez yapın — sadece yedek alıp test etmemek, 'phantom backup' tuzağıdır.
Web Panel ve Ödeme Entegrasyonu
Modern Metin2 sunucularında bir web panel standarttır: oyuncu kaydı, parola sıfırlama, item market, koin yükleme, ban listesi, top 100 sıralama, lonca sayfaları. Çoğu yayıncı PHP tabanlı hazır panel kullanır (örn. WMCPv3, MTPanel ve türevleri). Yeni yazılım yazıyorsanız Node.js REST API Geliştirme rehberimizdeki örüntüler birebir uygulanabilir.
<?php
// account/register.php — basit güvenli kayıt akışı
require 'db.php';
if ($_SERVER['REQUEST_METHOD'] !== 'POST') exit;
$user = trim($_POST['username'] ?? '');
$pass = $_POST['password'] ?? '';
$email = filter_var($_POST['email'] ?? '', FILTER_VALIDATE_EMAIL);
// Validasyon
if (!preg_match('/^[a-z0-9_]{4,16}$/i', $user)) die('Geçersiz kullanıcı adı.');
if (strlen($pass) < 8) die('Parola en az 8 karakter.');
if (!$email) die('Geçerli e-posta gerekli.');
// Çift kayıt engelle
$stmt = $pdo->prepare('SELECT id FROM account.account WHERE login = ?');
$stmt->execute([$user]);
if ($stmt->fetch()) die('Kullanıcı adı zaten kayıtlı.');
// MySQL'in OLD_PASSWORD'ı veya BCrypt — yeni sürümler için BCrypt önerilir
$hash = password_hash($pass, PASSWORD_BCRYPT, ['cost' => 12]);
$stmt = $pdo->prepare(
'INSERT INTO account.account (login, password, email, status, create_time)
VALUES (?, ?, ?, "OK", NOW())'
);
$stmt->execute([$user, $hash, $email]);
echo 'Kayıt başarılı, oyuna giriş yapabilirsiniz.';
Parola hashing konusunda eski Metin2 source'larındaki OLD_PASSWORD() kullanımı 2026 standartlarına göre kırılmış sayılır. Yeni sunucularda mutlaka bcrypt veya argon2id kullanın; detaylı karşılaştırma için Password Hashing: bcrypt, argon2id ve scrypt Karşılaştırması rehberimizi okuyun.
Ödeme Entegrasyonu: iyzico, Paytr, Sipay
İtem market satışı için Türkiye'de yaygın üç entegrasyon: iyzico, Paytr, Sipay. Her birinin webhook tabanlı 'callback' modeli vardır: kullanıcı kart bilgisi sağlayıcının tarafında girer, başarılı olduğunda sağlayıcı sizin sunucunuza POST atar, siz de oyun içi koin/yang ekleme işlemini tetiklersiniz. Webhook endpoint'inde mutlaka HMAC imzasını doğrulayın.
<?php
// payment/webhook.php — iyzico callback örneği (basitleştirilmiş)
require 'db.php';
$secret = getenv('IYZ_SECRET');
$body = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_IYZ_SIGNATURE'] ?? '';
// HMAC doğrula
$expected = hash_hmac('sha256', $body, $secret);
if (!hash_equals($expected, $signature)) {
http_response_code(401);
error_log("Webhook signature mismatch from ". $_SERVER['REMOTE_ADDR']);
exit;
}
$data = json_decode($body, true);
if ($data['status'] !== 'success') exit;
$user_id = (int) $data['conversationId'];
$amount_tl = (float) $data['paidPrice'];
$coins = (int) ($amount_tl * 10); // 1₺ = 10 koin örneği
// Idempotent tasarım - aynı transactionId iki kez işlenmesin
$stmt = $pdo->prepare('SELECT id FROM payment.tx WHERE provider_tx = ?');
$stmt->execute([$data['paymentId']]);
if ($stmt->fetch()) exit; // zaten işlendi
$pdo->beginTransaction();
try {
$pdo->prepare('UPDATE account.account SET coins = coins + ? WHERE id = ?')
->execute([$coins, $user_id]);
$pdo->prepare(
'INSERT INTO payment.tx (account_id, amount_tl, coins, provider, provider_tx, created_at)
VALUES (?, ?, ?, "iyzico", ?, NOW())'
)->execute([$user_id, $amount_tl, $coins, $data['paymentId']]);
$pdo->commit();
echo 'OK';
} catch (Exception $e) {
$pdo->rollBack();
http_response_code(500);
error_log($e->getMessage());
}
Anti-Cheat ve İçeride Hile Yönetimi
Metin2 client'ı 2004 mimarisi olduğundan, modern bir anti-cheat (BattlEye, EAC) entegrasyonu hazır gelmez. Yayıncılar üç katmanda mücadele eder: (1) client-side anti-cheat (memory scan, DLL injection detection), (2) server-side validation (movement speed, attack rate, item dupe pattern detection), (3) davranışsal analiz (anormal yang/saat oranı, 24 saat aktif olma).
- Speed hack: server tarafında oyuncu hareket hızını her packet'ta doğrulayın. Toleransın üstünde anomali = kick + flag.
- Item dupe: item_log tablosunda ardışık 1 saniye içinde aynı vnum'un 2'den fazla CREATE'i = inceleme listesi.
- Bot tespiti: 3+ saat sürekli aynı haritada, hareket pattern'i, mob kill rate. Captcha challenge ile doğrula.
- Multi-client: aynı IP'den 5+ aynı anda oyuncu = potansiyel bot ağı (bazı oyunlarda yasal değil — kuralınızı belirleyin).
- Yang transferi: yeni karakter → eski karakter arası anormal yang akışı = RMT (real money trading) işareti.
- Veritabanı denetim log'u: GM panel üzerinden yapılan her item ekleme, yang ekleme işlemi audit log'a yazılsın.
Performans İzleme: Prometheus + Grafana
Bir Metin2 sunucusunu 'çalışıyor' olarak bırakmak yetmez; her oyuncu giriş anında, her event'ta metrikleri görebilmek gerekir. Prometheus ve Grafana ile Sunucu İzleme rehberimiz kurulumu adım adım anlatıyor; aşağıda Metin2'ye özel metrik tasarımı.
# /etc/prometheus/prometheus.yml — Metin2'ye özel scrape
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['localhost:9100']
- job_name: 'mysql'
static_configs:
- targets: ['localhost:9104']
- job_name: 'metin2-game'
static_configs:
- targets:
- 'localhost:9200' # auth
- 'localhost:9201' # ch1
- 'localhost:9202' # ch2
- 'localhost:9203' # ch3
scrape_interval: 5s
- job_name: 'blackbox-tcp'
metrics_path: /probe
params:
module: [tcp_connect]
static_configs:
- targets:
- 'oyun-ip:11002' # auth port erişim testi
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
Custom exporter ile sunucu içinden şu metrikleri push edebilirsiniz: metin2_online_players, metin2_packets_per_second, metin2_db_query_latency_ms, metin2_login_attempts_total, metin2_item_created_total. Grafana üzerinde 4-5 panel'lik dashboard ile yarısaatlik patern değişimlerini hemen yakalarsınız.
Alerting: Ne Zaman Uyandırılmalı?
# /etc/prometheus/alerts.yml
groups:
- name: metin2_critical
rules:
- alert: AuthDown
expr: probe_success{instance="oyun-ip:11002"} == 0
for: 1m
labels: { severity: critical }
annotations:
summary: "Auth server cevap vermiyor"
- alert: PlayerDropSudden
expr: |
(metin2_online_players offset 5m) - metin2_online_players > 200
for: 2m
labels: { severity: warning }
annotations:
summary: "5 dk içinde 200+ oyuncu düştü - DDoS olabilir"
- alert: MysqlSlowQueriesSpike
expr: rate(mysql_global_status_slow_queries[5m]) > 5
for: 5m
labels: { severity: warning }
annotations:
summary: "Yavaş sorgu oranı arttı, slow.log incelenmeli"
- alert: DiskAlmostFull
expr: |
(node_filesystem_free_bytes{mountpoint="/"} /
node_filesystem_size_bytes{mountpoint="/"}) < 0.10
for: 10m
labels: { severity: critical }
annotations:
summary: "Root disk %10'un altında"
Log Yönetimi ve Olay Müdahalesi
Yangın çıktığında log'larınız tek müttefiğinizdir. Game core log'ları, MySQL slow query, panel access log, sistem auth.log, fail2ban ban log — hepsi merkezileştirilmeli. Elastic Stack (ELK) Log Analizi rehberimiz tek bir yerden arama yapma altyapısını anlatıyor; daha hafif çözüm için Loki + Promtail + Grafana üçlüsü Metin2 ölçeği için fazlasıyla yeterli.
# /etc/promtail/config.yml — Loki'ye log gönderim
server:
http_listen_port: 9080
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki.ornek.com:3100/loki/api/v1/push
scrape_configs:
- job_name: metin2
static_configs:
- targets: [localhost]
labels:
job: metin2
host: oyun01
__path__: /usr/games/metin2/*/syserr.txt
- job_name: nginx
static_configs:
- targets: [localhost]
labels:
job: nginx
__path__: /var/log/nginx/*.log
- job_name: mysql
static_configs:
- targets: [localhost]
labels:
job: mysql
__path__: /var/log/mysql/*.log
Konteynerizasyon: Docker ile Metin2 Sunucusu
Modern bir Metin2 yayıncısı için Docker, geliştirme ve test ortamlarında muazzam bir hızlandırıcıdır. Production tarafında game core'un 32-bit kütüphanelerine ihtiyacı olduğundan base image olarak i386/centos:7 veya i386/debian:11 kullanmak gerekir. Docker ile Uygulama Deploy ve Docker Compose Rehberi yazılarımız temel kavramları kapsıyor.
# docker-compose.yml — geliştirme ortamı
version: '3.9'
services:
mysql:
image: mariadb:10.11
environment:
MARIADB_ROOT_PASSWORD: devroot
MARIADB_DATABASE: account
volumes:
- mysql-data:/var/lib/mysql
-./sql/init:/docker-entrypoint-initdb.d:ro
ports:
- "127.0.0.1:3306:3306"
command: --max-connections=200
--innodb-buffer-pool-size=2G
--character-set-server=utf8mb4
db:
build:./containers/db
depends_on: [mysql]
volumes:
-./game/db:/usr/games/metin2/db
networks: [mt2net]
auth:
build:./containers/game
depends_on: [db]
ports:
- "11002:11002"
volumes:
-./game/auth:/usr/games/metin2/auth
networks: [mt2net]
ch1:
build:./containers/game
depends_on: [auth]
ports:
- "13001-13003:13001-13003"
volumes:
-./game/channel1:/usr/games/metin2/channel1
networks: [mt2net]
networks:
mt2net:
driver: bridge
volumes:
mysql-data:
Yasal ve Etik Boyut: Telif, KVKK, Vergi
Türkiye'de Metin2 private sunucusu işletmek hukuki olarak gri bir alanda durur. Oyunun resmi sahibi (Webzen / Korean MMO/2 dağıtıcıları) zaman zaman cease & desist gönderir. Yayıncı olarak şu konularda dikkatli olun: marka kullanımı (logo, isim, içerik), oyuncu kişisel verilerinin korunması (KVKK uyumu), ödeme alıyorsanız vergi mükellefiyeti (şahıs şirketi veya LTD).
- KVKK uyumu: Oyuncudan e-posta, IP, ödeme bilgisi alıyorsanız aydınlatma metni ve gizlilik politikası şart. VERBİS kayıt yükümlülüğünüz olabilir.
- Vergi: Aylık 10.000₺+ gelir varsa şahıs şirketi açın. Stopaj ve KDV beyannameleri.
- Marka: 'Metin2' isminin doğrudan kullanımı riskli; '..mt2', '...m2' gibi türevler daha güvenli.
- Oyuncu sözleşmesi: TOS ve kurallar net yazılı olmalı; ban itirazları için yöntem.
- Geri ödeme politikası: Tüketici hakları kapsamında 14 günlük cayma; dijital ürünlerde istisna kuralları.
İçerik Üretimi ve Topluluk Yönetimi
Teknik altyapı sadece denklemin bir tarafı. Aktif bir Metin2 sunucusunun yaşaması için sürekli içerik (yeni event, balance patch, sezonluk kostüm), aktif bir Discord topluluğu, GM ekibi, etkinlik takvimi ve şikayet yönetim süreci gerekir. Discord'unuzu aşağıdaki yapıyla kurun: #duyurular, #genel-sohbet, #destek, #bug-bildirimi, #öneri, #lonca-arayışı, #ticaret, #pvp-eventleri.
- Haftalık event: Her cumartesi büyük event (lonca savaşı, 1v1 turnuva, drop boost saati).
- Sezonluk patch: Her 6-8 haftada bir balance + yeni içerik (yeni harita, yeni boss, yeni item set).
- GM yönetimi: Çatışma çıkmaması için GM'lerin in-game yetkileri net rol bazlı; tüm yetkili işlemler audit log.
- Şikayet süreci: Discord ticket bot ile (örn. Tickety, Ticket Tool); 24 saat içinde ilk yanıt.
- Geri bildirim: Aylık anket, top oyuncularla aylık 1:1 görüşme.
- Teaser ve trailer: Yeni içerik öncesi YouTube short ve TikTok ile heyecan yaratma.
Yeni Sunucu Açılışı: Launch Checklist
Açılış gecesi doğru gitmezse 6 ay emek bir gecede yıkılabilir. Aşağıdaki check-list'i açılıştan 7 gün önce başlayıp adım adım uygulayın.
- D-7: Final stress test, 2x beklenen peak yükle (örn. 3000 bot client). Slow query log'u temiz olmalı.
- D-5: Yedekleme akışı end-to-end test edildi, restore denendi ve doğrulandı.
- D-3: DDoS scrubbing aktif, statik IP test edildi. Backup IP hazır.
- D-2: Patcher CDN warmup, 100 farklı IP'den indirme testi.
- D-1: GM ekibi brifingi, yetki listeleri kontrol, Discord moderasyon aktif. Ödeme entegrasyonu canary işlemle doğrulandı.
- D-day, T-2 saat: Tüm log akışı izleniyor, dashboard'lar açık. Anonsa sosyal medya kanallarında ilk teaser.
- D-day, T-30 dk: Final maintenance, restart sequence: db → auth → all channels.
- T+0: Açılış. İlk 30 dakikada CPU, DB, network grafiklerini canlı izleyin. Tek bir anomalinin uzaması saatlerin kaybı.
- T+24h post-mortem: Açılış geceniz nasıl geçti, neyin kötü gittiği, neyin patch'leneceği yazılı raporu.
Migration: Sağlayıcı veya Donanım Değiştirme
Bir sunucuyu başka bir lokasyona, sağlayıcıya veya daha güçlü donanıma taşımak yayıncı yaşamında en stresli operasyondur. Doğru planlama ile downtime'ı 15-30 dakikaya indirebilirsiniz. Yanlış planlama 4-8 saat kapatabilir.
# Migration sequence — özet (her komutu önceden test edin!)
# 1. Yeni sunucuda ortamı hazırla, dosyaları paralel kopyala
rsync -az --delete \
--exclude '/usr/games/metin2/*/syserr.txt' \
--exclude '/usr/games/metin2/*/syslog.txt' \
/usr/games/metin2/ \
new-server:/usr/games/metin2/
# 2. MySQL replication kur (eski = master, yeni = slave)
# my.cnf eski: server-id=1, log_bin=binlog
# my.cnf yeni: server-id=2, relay_log=relay
# Yeni'de:
mysql -e "CHANGE MASTER TO
MASTER_HOST='OLD_IP',
MASTER_USER='repl', MASTER_PASSWORD='...',
MASTER_LOG_FILE='binlog.000123',
MASTER_LOG_POS=4567;
START SLAVE;"
# 3. Replication lag 0 olana kadar bekle
mysql -e "SHOW SLAVE STATUS\G" | grep 'Seconds_Behind_Master'
# 4. T-0: eski sunucuda sunucuyu kapatır kapatmaz
systemctl stop metin2-ch1@1 metin2-ch1@2 metin2-auth metin2-db
mysql -e "FLUSH TABLES WITH READ LOCK; FLUSH LOGS;"
# 5. Yeni sunucuda slave'i durdur, master'lığı al
mysql -e "STOP SLAVE; RESET MASTER;"
systemctl start metin2-db metin2-auth
systemctl start metin2-ch1@1 metin2-ch1@2
# 6. DNS A kaydını yeni IP'ye çevir (TTL'i önceden 60s'ye düşürmüş olun!)
# Patcher version.txt'yi güncelle (yeni IP varsa)
# 7. İlk 1 saat: çift izleme, geri dönme planı hazır
Sıkça Sorulan Sorular
Metin2 sunucusu açmak yasal mı?
Türkiye'de Metin2 private sunucusu işletmek doğrudan suç değildir ancak telif sahibinin (Webzen) gönderebileceği hukuki uyarılar nedeniyle gri alandadır. Marka adını doğrudan kullanmamak, ödeme alıyorsanız vergi mükellefi olmak ve KVKK uyumu kritik öneme sahiptir. Profesyonel hukuk danışmanlığı önerilir.
Hangi işletim sistemi en iyisi?
Yeni başlayanlar için AlmaLinux 9 veya Ubuntu Server 22.04 LTS önerilir; eski pack'lerle uyumluluk için CentOS 7 hâlâ kullanılabilir (ancak güvenlik desteği bitti). FreeBSD bilenler için 13.2+ hâlâ Metin2 için çok performanslı bir tercih.
Tek sunucuda kaç oyuncu kaldırılır?
Donanıma bağlı olarak 100 ile 6.000+ arasında değişir. 16GB RAM + Ryzen 9 + NVMe SSD'li bir VDS, optimize edilmiş bir kuruluma 1.500-2.500 simultane oyuncu kaldırabilir. 6.000+ için dedicated, 12.000+ için multi-server cluster gereklidir.
DDoS koruma fiyatları nasıl?
Datacenter dahili koruma genelde paket fiyatına dahildir. Üst seviye scrubbing servisleri (Path.net, Voxility, OVH Game) aylık 600-3.000₺ ek bütçe ister. 1+ Tbps koruma için kurumsal anlaşmalar 5.000₺/ay üzerinde olabilir.
Hangi ödeme entegrasyonunu seçmeliyim?
İyzico kullanıcı dostu API ve düşük komisyonu ile yaygın tercih. Paytr ve Sipay rekabetçi alternatifler. Yurt dışı oyuncu kitlesi varsa Stripe veya PayPal entegrasyonu da değerlendirilmeli. Komisyon oranları %2.4-3.5 arasında değişir.
İleri Okuma ve Kaynaklar
- MySQL InnoDB tunable parameters
- nginx.org/en/docs — official nginx documentation
- ArchWiki — nftables
- Cloudflare — DDoS attack types
- prometheus.io documentation
- Percona blog — MySQL/MariaDB performance
- Brendan Gregg — Linux Performance
- Docker resmi dokümantasyon
- KVKK Kurumu resmi sitesi
İlgili KEYDAL Yazıları
- VPS Nedir? VPS ile VDS Farkı ve VPS Kiralama Rehberi
- DDoS Saldırılarına Karşı Çok Katmanlı Koruma
- Linux Sunucu Yönetimi Temelleri
- VPS Güvenlik Sertleştirme
- Fail2ban ile SSH Brute Force Koruması
- Nginx Yapılandırma: Reverse Proxy, Cache, Rate Limit
- Prometheus ve Grafana ile Sunucu İzleme
- Elastic Stack (ELK) Log Analizi
- Veritabanı Yedekleme Stratejileri
- Docker Compose: Çoklu Servis Mimarisi
- SQL Sorgu Optimizasyonu
- Password Hashing: bcrypt ve argon2id Karşılaştırması
Donanım seçimi, DDoS koruması, MySQL tuning, monitoring ve güvenlik sertleştirme dahil uçtan uca Metin2 sunucu altyapısı kurulumu için iletişime geçin