Metin2 Server Nasıl Kurulur? Adım Adım PvP Server Kurulumu
Hazırlayan: Metin2VIP Editörleri Yayın: 8 dk okuma
İçindekiler
- Metin2 server kurmak için ne gerekir?
- Adım 1: MySQL veritabanlarını hazırlamak
- Adım 2: Dosyaları yerleştirmek ve izinleri vermek
- Adım 3: gen_settings.py ile kanal yapısını üretmek
- Adım 4: Questleri derlemek
- Adım 5: Sunucuyu başlatmak ve durdurmak
- İlk çalıştırmada sık görülen hatalar
- İlk hesabı açmak ve oyuna bağlanmak
- 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.rulesiçindekidefault_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_IPverilmezse bütün ağ arabirimlerini dinler. Çekirdekler aynı makinedeyse ve CONFIG'lerdekiDB_ADDR127.0.0.1 ise conf.txt'yeBIND_IP = 127.0.0.1eklemek 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/Makefilevesql/run_proto.shiç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_IPboşsa port güvenliği bu komutların hepsini reddeder; arayüzü kullanacaksanADMINPAGE_PASSWORDile kendi parolanı tanımla veADMINPAGE_IPsatırına yalnız kendi IP'ni yaz. Port güvenliği olmayan derlemelerde bu iki satır mutlaka doldurulmalıdır. TEST_SERVERdeğerini 0 bırak: açık olduğunda oyundaki herkes en yüksek GM yetkisini alır.- Yedek al.
sh admin_panel.sh 4account, common ve player'ı tam, log'u yalnız yapı olarak yedekler;5sunucu 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
- Metin2 CONFIG Ayarları: Game Çekirdeği Seçenekleri ve Anlamları (Server kurma)
- Metin2 GM Nasıl Yapılır? gmlist Tablosu ve GM Yetki Seviyeleri (Server kurma)
- Metin2 Kanal ve Port Yapısı: auth, ch1, ch99 ve P2P (Server kurma)
- Metin2 Quest Nasıl Yazılır? Lua Quest Yapısı, State ve When Blokları (Server kurma)
- Metin2 Server Dosyaları: Klasör Yapısı ve Her Dosyanın Görevi (Server kurma)
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?