İçeriğe geç

Metin2 Server Nasıl Kurulur? Adım Adım PvP Server Kurulumu

Hazırlayan: Metin2VIP Editörleri Yayın: 8 dk okuma

Kısaca: Bir Metin2 server MySQL veritabanları, db çekirdeği, auth çekirdeği ve haritaları taşıyan oyun çekirdeklerinden oluşur. Kurulum sırası: MySQL'de account, common, player, log ve hotbackup veritabanlarını açıp şemaları yüklemek, sunucu dosyalarını FreeBSD'ye yerleştirip izinleri vermek, gen_settings.py ile CONFIG dosyalarını üretmek, questleri derlemek ve sunucuyu önce db, sonra auth ve kanallar olacak şekilde başlatmak.
İçindekiler
  1. Metin2 server kurmak için ne gerekir?
  2. Adım 1: MySQL veritabanlarını hazırlamak
  3. Adım 2: Dosyaları yerleştirmek ve izinleri vermek
  4. Adım 3: gen_settings.py ile kanal yapısını üretmek
  5. Adım 4: Questleri derlemek
  6. Adım 5: Sunucuyu başlatmak ve durdurmak
  7. İlk çalıştırmada sık görülen hatalar
  8. İlk hesabı açmak ve oyuna bağlanmak
  9. Güvenli kurulum için yapılması gerekenler

Bir Metin2 server dört parçadan oluşur: verileri tutan MySQL, MySQL ile oyun arasında önbellek görevi gören db çekirdeği, hesapları doğrulayan auth çekirdeği ve haritaları taşıyan oyun çekirdekleri. Kurulum da bu sırayı izler: önce veritabanları açılır, sonra dosyalar yerleştirilip kanal yapısı üretilir, en son çekirdekler db'den başlayarak çalıştırılır. PvP server denen özel sunucular aynı dosyalarla kurulur; oranlar ve oyun ayarları sonradan değiştirilir.

Aşağıdaki adımlar, kanal yapısını gen.py betiğiyle üreten yaygın sunucu paketine göre yazıldı. Klasör ve betik adları paketten pakete değişebilir; çekirdeklerin beklediği dosyalar ve veritabanları ise aynıdır.

Metin2 server kurmak için ne gerekir?

Paketteki game ve db dosyaları 32-bit (i386) FreeBSD için derlenmiş, statik bağlı ikililerdir. Statik bağlı oldukları için çalışırken ayrıca MySQL istemci kütüphanesi istemezler. Bu ikililer 32-bit bir FreeBSD'de ya da 32-bit programları çalıştırabilen 64-bit bir FreeBSD'de çalışır. Quest derleyicisi qc ise 32-bit ve dinamik bağlıdır, bu yüzden sistemde 32-bit çalışma kütüphaneleri bulunmalıdır.

Bileşen Paketin beklediği
İşletim sistemi FreeBSD; betikler /usr/local/bin/python2.7, /usr/local/bin/mysqldump ve ipfw yollarını kullanır
Veritabanı MySQL sunucusu, 3306 portu, beş veritabanı
Betikler Python 2.7 (gen.py, start.py, stop.py, clear.py, pre_qc.py)
Derleme (isteğe bağlı) gcc9 ve g++9, -m32, statik bağlama, /usr/local/lib/mysql/libmysqlclient.a

Çekirdeği kaynak koddan kendin derleyeceksen ayrıntılar kaynak kod derleme yazısında. Paketin klasörleri ve her dosyanın görevi Metin2 server dosyaları yazısında anlatılıyor.

Adım 1: MySQL veritabanlarını hazırlamak

Paketin sql klasöründeki run.sh doğru sırayı gösterir. Önce beş veritabanı ve çekirdeklerin kullanacağı kısıtlı kullanıcı oluşturulur, sonra şemalar ve güncellemeler yüklenir:

cd /usr/game/sql
mysql < base/db_create.sql      # account, common, hotbackup, log, player
mysql < base/mt2_user_c.sql     # çekirdeklerin kullanacağı kullanıcı
mysql account < account.sql
mysql common  < common.sql
mysql log     < log.sql
mysql player  < player.sql
mysql common  < updates/common__exp_table.sql
mysql common  < updates/common__priv_settings.sql
mysql log     < updates/log__chat_log.sql
mysql player  < updates/player__skill_proto.sql
mysql player  < updates/player__updates.sql
mysql log     < acce_system/db.log.acce.sql
mysql player  < acce_system/db.player.player.sql

mt2_user_c.sql kullanıcıyı yalnız localhost'tan bağlanacak ve beş veritabanında yalnız SELECT, INSERT, UPDATE ve DELETE yapabilecek şekilde açar. Tablo oluşturma ya da silme yetkisi yoktur; bu doğru bir başlangıçtır. Dosyadaki parola ise basit, herkesin bildiği bir değerdir. Dosyayı çalıştırmadan önce parolayı değiştir, aynı parolayı birazdan kanal ayarlarına yazacaksın.

Şemalar MyISAM motorunu, latin1 karakter kümesini ve '0000-00-00 00:00:00' biçiminde sıfır tarih varsayılanlarını kullanır. MySQL'in sql_mode ayarında NO_ZERO_DATE, NO_ZERO_IN_DATE ve katı mod açıksa bu tablolar "Invalid default value" hatasıyla oluşturulamaz; bu seçenekler sql_mode'dan çıkarılmadan şemalar yüklenmez. Tabloların ne tuttuğu Metin2 veritabanları yazısında.

Adım 2: Dosyaları yerleştirmek ve izinleri vermek

game klasörü sunucuda istediğin yere konabilir; gen.py bütün bağları göreli yolla kurduğu için konum fark etmez. Kaynak koddaki derleme dosyası yeni çekirdeği /usr/game/srv1/share/bin/ altına kopyalayacak şekilde yazılmıştır, bu yüzden /usr/game yaygın bir tercihtir.

Dosyalar Windows üzerinden taşındıysa iki şey kaybolur: çalıştırma izinleri ve sembolik bağlar. Bağları 3. adımdaki gen.py yeniden kurar. İzinler şöyle verilir:

cd /usr/game
chmod u+x *.py *.sh
chmod u+x srv1/share/bin/game srv1/share/bin/db

Çekirdekler çalıştıkları klasöre pid, syslog, syserr ve stdout dosyalarını yazar. pid yazılamazsa çekirdek "check owner of pid" iletisiyle kapanır, bu yüzden sunucuyu çalıştıran kullanıcının bütün srv1 ağacına yazma izni olmalıdır. Metin2 portları 1024'ün üstünde olduğundan çekirdeklerin root olarak çalışması gerekmez; ayrı bir kullanıcı açmak daha güvenlidir.

Adım 3: gen_settings.py ile kanal yapısını üretmek

Kanalların, çekirdeklerin ve haritaların dağılımı gen_settings.py dosyasında tanımlanır. gen.py bu tabloyu okuyup her çekirdeğe bir CONFIG, db'ye bir conf.txt yazar, çekirdek klasörlerindeki bağları kurar, başlatma listelerini (start.list, clear.list) ve güvenlik duvarı kurallarını (ipfw.rules) üretir.

Paketteki varsayılan dağılım şöyledir:

Çekirdek Klasör Haritalar (MAP_ALLOW) PORT / P2P_PORT
db srv1/db yok 30000 (BIND_PORT)
auth srv1/auth yok 30001 / 30002
Kanal 1, çekirdek 1 srv1/chan/ch1/core1 1 3 4 21 23 24 41 43 44 30003 / 30004
Kanal 1, çekirdek 2 srv1/chan/ch1/core2 61-73, 104, 208, 216, 217, 351, 352 30005 / 30006
Kanal 1, çekirdek 3 srv1/chan/ch1/core3 301 302 303 304 30007 / 30008
Kanal 99 srv1/chan/ch99/core99 81 110 113 30009 / 30010

Portlar elle yazılmaz: portu PORT.RANDOM olan her çekirdeğe 30000'den başlayarak sırayla boş port verilir. Yeni kanal eklemek için gen_settings.py içinde yoruma alınmış ch2, ch3 ve ch4 bloklarını açmak yeterlidir; portlar yeniden dağıtılır, istemcideki kanal portları da buna göre güncellenmelidir. Kanal 99 özeldir: üzerindeki haritalar (düğün haritası, OX haritası ve 110 numaralı harita) bütün kanallardaki oyunculara açılır. Kanal ve port mantığı kanal ve portlar yazısında.

Veritabanı parolasını ve MySQL adresini düzenledikten sonra yapı, game klasöründeyken yönetim paneliyle üretilir:

sh admin_panel.sh 666    # yarat: gen.py çalışır

gen.py sunucu açıkken de çalıştırılabilir; yalnız ayar dosyalarını tazeler, değişikliklerin geçerli olması için çekirdeklerin yeniden başlatılması gerekir. CONFIG satırlarının anlamı CONFIG ayarları yazısında.

Adım 4: Questleri derlemek

Sunucu questleri derlenmiş halleriyle okur. Derleme yönetim panelinden yapılır:

sh admin_panel.sh 777    # quest: qc'ye çalıştırma izni verir, pre_qc.py -ac çalıştırır

Hangi dosyaların derleneceği srv1/share/locale/turkey/quest/quest_list dosyasında yazılıdır. Quest yazmaya quest yazma yazısından başlanabilir.

Adım 5: Sunucuyu başlatmak ve durdurmak

Komut Yaptığı iş
sh admin_panel.sh 1 Başlat: önce db, 3 saniye sonra auth ve kanallar
sh admin_panel.sh 1s Seçmeli başlat: hangi sunucu ve kanalın açılacağını sorar
sh admin_panel.sh 2 Durdur: önce auth ve kanallar, hepsi kapanınca db
sh admin_panel.sh 3 Log dosyalarını temizle
sh admin_panel.sh 999 Bütün CONFIG'lerdeki HOSTNAME ve PORT satırlarını listele

Başlatma betiği zaten çalışan bir çekirdeği ikinci kez açmaz. ./start.py -I <ip> ile çekirdeklere IP verilebilir; verilmezse çekirdek makinedeki ilk genel adresi kendisi bulur, yalnız 192.168.x ya da 10.x gibi iç adres varsa onu kullanır ve oyunculara da bu adresi bildirir. Ağ arabiriminde genel IP görünmeyen sanal sunucularda oyunculara bildirilecek adresin ayrıca ayarlanması gerekir (bu kaynakta CONFIG'deki PROXY_IP satırı).

Durdurma sırası önemlidir. stop.py çekirdeklere varsayılan olarak SIGHUP gönderir: oyun çekirdekleri karakterleri kaydedip kapanır, ardından db çekirdeği bellekte tuttuğu bütün oyuncu ve eşya verisini MySQL'e yazar. db çekirdeği değişen veriyi anında değil, varsayılan ayarla oyuncu verisinde yaklaşık 7, eşyada 5 dakikada bir yazar. kill -9 ya da ./stop.py -l 9 son yazmayı atlar ve son kayıttan sonraki ilerleme kaybolur.

İlk çalıştırmada sık görülen hatalar

Hatalar çekirdek klasörlerindeki syserr ve stdout dosyalarına ya da başlatma komutunun çalıştığı ekrana yazılır. Çekirdeğin açılmamasına yol açan iletilerden bazıları:

İleti Sebep
Loading conf.txt failed. db klasöründe conf.txt yok
SQL_HOTBACKUP not configured (ya da PLAYER, ACCOUNT, COMMON) conf.txt'de bu satır eksik; hotbackup kullanılmasa da satır zorunludur
Could not load mob_proto.txt. Wrong file format? db klasöründe proto dosyası yok ya da bozuk
LOAD_COMMON_SQL_INFO_FAILURE CONFIG'de COMMON_SQL satırı yok
cannot start server while no common sql connected common veritabanına bağlanılamadı: adres, kullanıcı ya da parola yanlış
COMMON_SQL: DirectQuery failed : SELECT mKey, mValue FROM locale common.locale tablosu boş
[SKILL_PERCENT] Query failed locale tablosunda SKILL_POWER_BY_LEVEL satırı yok
DB_PORT not configured, CHANNEL not configured, HOSTNAME must be configured. CONFIG'de ilgili satır eksik
Can not get public ip address çekirdek kullanılabilir bir IP bulamadı
socket_tcp_bind: tcp_socket port kullanımda ya da verilen IP bu makinede yok
!!! FATAL ERROR !!! multiple MAP_ALLOW setting!! aynı harita MAP_ALLOW'a iki kez yazılmış
[INIT_FORKED] Do not open file locale/turkey/forkedmapindex.txt bulunamadı

İlk hesabı açmak ve oyuna bağlanmak

Auth çekirdeği parolayı MySQL'in eski PASSWORD() biçiminde, yani yıldızla başlayan 41 karakterlik bir özet olarak karşılaştırır. Bu özet MySQL sürümünden bağımsız olarak şu ifadeyle üretilir:

INSERT INTO account.account (login, password, social_id, status)
VALUES ('hesapadi', CONCAT('*', UPPER(SHA1(UNHEX(SHA1('GucluBirParola'))))), '1234567', 'OK');

Auth çekirdeği gelen parolanın yalnız ilk 16 karakterini kullanır, daha uzun parola belirlenirse giriş başarısız olur. social_id karakter silerken istenen 7 haneli koddur. status OK dışında bir değerse giriş reddedilir.

İstemci önce auth çekirdeğinin PORT'una (varsayılan dağılımda 30001), oyuncu kanal seçince o kanalın birinci çekirdeğinin PORT'una (kanal 1 için 30003) bağlanır. Oyuncu başka çekirdekteki bir haritaya geçtiğinde yeni adresi db çekirdeği bildirir. İstemci tarafındaki ayar serverinfo yazısında. Kendine yönetici yetkisi vermek için GM yapma yazısına bakabilirsin.

Güvenli kurulum için yapılması gerekenler

  • MySQL'i dışa açma. Çekirdekler MySQL'e localhost üzerinden bağlanır, dışarıdan erişime gerek yoktur.
  • Paketteki güvenlik duvarı şablonu 3306'yı dışa açar. ipfw.rules içindeki default_tcp_yes_ports='22 53 3306' satırından 3306'yı çıkar.
  • Dışarıya yalnız auth PORT'u ve oyun çekirdeklerinin PORT'ları açık olmalı. db portu (30000) ve bütün P2P portları yalnız sunucunun kendisinden erişilebilmeli; şablon bunları zaten kapatır.
  • db çekirdeği BIND_IP verilmezse bütün ağ arabirimlerini dinler. Çekirdekler aynı makinedeyse ve CONFIG'lerdeki DB_ADDR 127.0.0.1 ise conf.txt'ye BIND_IP = 127.0.0.1 eklemek bu kapıyı da kapatır.
  • Bu kaynakta açık olan port güvenliği (ENABLE_PORT_SECURITY) db portuna yalnız 127.0.0.1, 192.168.x ve 10.x adreslerinden, P2P portuna yalnız sunucunun kendi IP'sinden bağlantı kabul eder. Bu derlemede bütün oyun çekirdeklerinin aynı makinede çalışması bu yüzden gerekir.
  • Varsayılan parolaları değiştir. gen_settings.py, mt2_user_c.sql, baks/db/Makefile ve sql/run_proto.sh içinde düz metin parolalar var; yedekleme Makefile'ı MySQL root parolasını komut satırında kullanır.
  • Oyun portuna gelen yönetim komutları için kodda varsayılan bir parola gömülüdür. Bu kaynakta ADMINPAGE_IP boşsa port güvenliği bu komutların hepsini reddeder; arayüzü kullanacaksan ADMINPAGE_PASSWORD ile kendi parolanı tanımla ve ADMINPAGE_IP satırına yalnız kendi IP'ni yaz. Port güvenliği olmayan derlemelerde bu iki satır mutlaka doldurulmalıdır.
  • TEST_SERVER değerini 0 bırak: açık olduğunda oyundaki herkes en yüksek GM yetkisini alır.
  • Yedek al. sh admin_panel.sh 4 account, common ve player'ı tam, log'u yalnız yapı olarak yedekler; 5 sunucu klasörünü arşivler. Yedekler başka bir makineye de kopyalanmalıdır.

Sık sorulan sorular

Metin2 server Windows'ta kurulur mu?
Bu paketteki game ve db ikilileri 32-bit FreeBSD için derlenmiştir, Windows'ta çalışmaz. Betiklerdeki Windows dalları yalnız deneme amaçlıdır; Windows'ta çalıştırmak için kaynak kodun Windows için derlenmesi gerekir.
Metin2 server için hangi portlar açılmalı?
Dışarıya yalnız auth çekirdeğinin PORT'u ve oyun çekirdeklerinin PORT'ları açılır. db portu, P2P portları ve MySQL'in 3306 portu yalnız sunucunun kendisinden erişilebilir kalmalıdır.
Sunucuyu kapatınca oyuncuların son ilerlemesi neden kayboluyor?
db çekirdeği oyuncu ve eşya verisini birkaç dakikada bir MySQL'e yazar. Düzgün kapanışta bekleyen veriyi yazar, kill -9 ile kapatılırsa son kayıttan sonrası kaybolur. Durdurmak için admin_panel.sh 2 ya da stop.py kullanılmalıdır.
Hesap parolası veritabanında hangi biçimde tutulur?
MySQL'in eski PASSWORD() biçiminde: yıldızla başlayan 41 karakterlik çift SHA1 özeti. CONCAT('*', UPPER(SHA1(UNHEX(SHA1('parola'))))) ifadesi aynı sonucu verir. Auth çekirdeği parolanın yalnız ilk 16 karakterini kullanır.

İlgili sayfalar

Kategori: Server Kurma Server Kurulumu pvp server server kurulumu mysql freebsd

Bu sayfadaki bilgiler Metin2'nin sunucu yazılımındaki hesaplamalara ve standart oyun dosyalarına dayanır. Oyun dosyalarını değiştiren sunucularda değerler farklı olabilir. İçerikleri nasıl hazırlıyoruz?

Bu sayfa işine yaradı mı?

Giriş yap, oy ver ya da sayfayı kaydet. Okumak için üyelik gerekmez. WhatsApp X'te paylaş
Yanlış ya da eksik bir bilgi mi gördün? Bildir
Neyin yanlış olduğunu, doğrusunun ne olduğunu ve bunu nereden bildiğini yaz. Mesajın editörlere gider; yazı, kontrol edildikten sonra düzeltilir.
Yalnız editör görür.

Tartışma

Kurallar

Henüz yorum yok. Bu konuda bir deneyimin ya da sorun varsa ilk yorumu sen yaz.

Giriş yap ya da kayıt ol, sonra yorum yaz. Metin2VIP üyeliği hiçbir oyun sunucusunun hesabı değildir.