·þÎñÆ÷°ëÒ¹±»ÀÕË÷²¡¶¾¼ÓÃÜ£¿ÐÜGMÎóÉ¾Íæ¼ÒÊý¾Ý¿â£¿
±ð»Å£¡Ö»Òª»¹Ê£1¸öºËÐÄÎļþ£¬¾ÍÄÜʵÏÖ·ÖÖÓ¼¶¸´»î£¡
±¾ÎÄÌṩ´Ó ÊÂǰ·ÀÓù→ʹʶ¨Î»→Êý¾ÝÖØÉú µÄÍêÕû¾È»ð·½°¸£¬ÓÿªÔ´¹¤¾ß´òÔìÁã³É±¾ÈÝÔÖÌåϵ¡£
⛑️ ³£¼ûÔÖÄѳ¡¾°Óë»Æ½ðÕü¾Èʱ¼ä
ÔÖÄÑÀàÐÍ ×î¼ÑÐÞ¸´´°¿Ú ºËÐľÈÃüÎļþ ºóÐøºóÒÅÖ¢
ÎóÉ¾Íæ¼ÒÊý¾Ý 60·ÖÖÓÄÚ gamedb/backup/auto_save/ ¿ÉÄܶªÊ§1СʱÓÎÏ·½ø¶È
ÀÕË÷²¡¶¾¼ÓÃÜ ²¡¶¾¼¤»îǰ zpack_YYYYMMDD.7z ²¿·ÖÅäÖÃÎļþÐèÖØÐ´
Ó²ÅÌÎïÀíË𻵠ÓÀ¾Ã¶ªÊ§ ÔÆ¶ËOSSÒìµØ±¸·Ý ÐèÖØÐÂÓ³ÉäÍæ¼ÒUID
ºËÐÄÅäÖñ»´Û¸Ä ÎÞÏÞÖÆ git°æ±¾¿â/config_bak GMȨÏÞÌåÏµÖØ½¨
DDOS¹¥»÷̱»¾ ¹¥»÷³ÖÐøÆÚ Íø¹ØIP°×Ãûµ¥Áбí ÐèÇåÏ´ËùÓÐÒì³£µÇ¼¼Ç¼
🛡️ ÈýÖØ·ÀÓù¶Ü¹¹½¨£¨ÊÂǰ±Ø×ö£¡£©
µÚÒ»ÖØ£ºÈ«×Ô¶¯Èȱ¸·Ý£¨¿ªÔ´¹¤¾ß£ºBorgBackup£©
ÅäÖ÷½°¸£º
borgmaticÅäÖÃÎļþ£¨config.yaml£©
location:
source_directories:
/home/zxserver/gamedb
/home/zxserver/config
repositories:
path: /backup/borg_repo
label: ÖïÏÉÖ÷²Ö¿â
storage:
compression: lz4
archive_name_format: "zx_{now}"
retention:
keep_hourly: 24
keep_daily: 7
keep_weekly: 4
Ö´ÐÐÂß¼£º
ÿ30·ÖÖÓ²îÒ챸·Ý
±¾µØ±£Áô24Сʱ±¸·Ý£¬ÔƶËͨ¹ýrcloneͬ²½µ½°¢ÀïÔÆOSS
µÚ¶þÖØ£ºÅäÖð汾¿ØÖÆ£¨Git + ¹³×Ó£©
¶ÔºËÐÄÅäÖÃĿ¼³õʼ»¯Git
cd /home/zxserver/config
git init
git add .
git commit -m "³õʼÅäÖÿìÕÕ"
ÉèÖÃÌá½»¹³×Ó£¨¼à¿ØÎļþ±ä»¯×Ô¶¯Ìá½»£©
echo '#!/bin/sh' > .git/hooks/post-commit
echo 'git push backup_remote master' >> .git/hooks/post-commit
chmod +x .git/hooks/post-commit
µÚÈýÖØ£ºÎïÀí¸ôÀ뻤¶Ü£¨Ê÷Ý®ÅÉ+ÒÆ¶¯Ó²ÅÌ£©
µÍ³É±¾·½°¸£º
Ê÷Ý®Åɰ²×°minio¶ÔÏó´æ´¢·þÎñ
ÉèÖ÷þÎñ¶Ëͨ¹ýrsyncÿÈÕÁ賿3µãÔöÁ¿Í¬²½
ͬ²½Íê³É×Ô¶¯µ¯³öÒÆ¶¯Ó²ÅÌ£¨ÎïÀí¸ô¾øÀÕË÷²¡¶¾£©
🚑 ÔÖÄÑÏÖ³¡¼±¾ÈÊÖ²á
³¡¾°1£ºGMÖ´ÐÐDELETE FROM players WHERE...Îóɾȫ·þ½ÇÉ«
¼±¾È²½Ö裺
¶³½á·þÎñ£º
systemctl stop zx_gate # Á¢¼´Í£Ö¹Íø¹Ø·þÎñ
ÌáÈ¡×î½üÊÂÎñ£º
mysqlbinlog --start-datetime="2024-06-28 14:00:00" gamedb-bin.000001 | grep "DELETE FROM players" -B 30 > rescue.sql
·´Ïò²Ù×÷»Ø¹ö£º
sed 's/DELETE FROM/INSERT INTO/g' rescue.sql | mysql -u root -p gamedb
³¡¾°2£º·¢ÏÖREADME_FOR_DECRYPT.txtÀÕË÷Îļþ
¼±¾ÈÁ÷³Ì£º
¶ÏÍøÈ¡Ö¤£º
ÅÄÕÕÀÕË÷ÐÅÏ¢
ÓÃchkrootkit¼ì²éºóÃÅ
³¢ÊÔ½âÃÜ£º
python3 ransom_decrypt.py --scan --dir /home/zxserver # ʹÓÃNoMoreRansom¹¤¾ß
ÖÕ¼«ÊֶΣº
borg extract /backup/borg_repo::zx_202406281200 # Ìáȡδ¼ÓÃܵı¸·Ý
🔧 ÔÖºóÖØ½¨¹Ø¼ü²½Öè
Íæ¼ÒUIDÖØÓ³É䣨·À×°±¸´íÂÒ£©
ÖØ½¨Íæ¼ÒUIDË÷Òý¹ØÏµ£¨account_mapping.py£©
old_data = load_from_backup('players.json')
for player in old_data:
new_id = generate_consistent_hash(player['name'] + player['register_ip'])
redis.set(f"uid_map:{player['id']}", new_id)
±ÜÃâ¶þ´ÎʹʵIJÙ×÷Ô¼Êø
ÏÞÖÆÎ£ÏÕSQLÖ´ÐÐȨÏÞ
REVOKE DELETE ON gamedb.* FROM 'gm_admin'@'%';
CREATE TRIGGER protect_players BEFORE DELETE ON players
FOR EACH ROW SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Ð賬¼¶¹ÜÀíÔ±ÊÖ¹¤½â³ýËø¶¨';
Êý¾ÝÒ»ÖÂÐÔУÑ飨·ÀÖ¹ÓÄÁéµÀ¾ß£©
¼ì²é±³°üÎïÆ·ÓëÊý¾Ý¿â²îÒì
python3 check_integrity.py --table items \
--filter 'owner_id NOT IN (SELECT id FROM players)' # ²éÕÒÎÞÖ÷ÎïÆ·
📦 ¿ªÏä¼´ÓþÈÄѰü£¨Github¿ªÔ´£©
»ñȡһ¼üÈÝÔÖ¹¤¾ßÏä
wget https://github.com/zx_backup_tools/rescue_kit/releases/latest/download/zx_rescue.zip
unzip zx_rescue.zip && cd rescue_kit
./install.sh --with-borg # ×Ô¶¯°²×°²¢ÅäÖñ¸·ÝÌåϵ
°üº¬£º
ÀÕË÷²¡¶¾Ê¶±ðÆ÷£¨Ö§³ÖTop5³£¼û±äÖÖ£©
Êý¾Ý¿âʵʱ»Ø¹ö´úÀí
×Ô¶¯Æ¯ÒƱ¸·ÝÊØ»¤½ø³Ì
±ð»Å£¡Ö»Òª»¹Ê£1¸öºËÐÄÎļþ£¬¾ÍÄÜʵÏÖ·ÖÖÓ¼¶¸´»î£¡
±¾ÎÄÌṩ´Ó ÊÂǰ·ÀÓù→ʹʶ¨Î»→Êý¾ÝÖØÉú µÄÍêÕû¾È»ð·½°¸£¬ÓÿªÔ´¹¤¾ß´òÔìÁã³É±¾ÈÝÔÖÌåϵ¡£
⛑️ ³£¼ûÔÖÄѳ¡¾°Óë»Æ½ðÕü¾Èʱ¼ä
ÔÖÄÑÀàÐÍ ×î¼ÑÐÞ¸´´°¿Ú ºËÐľÈÃüÎļþ ºóÐøºóÒÅÖ¢
ÎóÉ¾Íæ¼ÒÊý¾Ý 60·ÖÖÓÄÚ gamedb/backup/auto_save/ ¿ÉÄܶªÊ§1СʱÓÎÏ·½ø¶È
ÀÕË÷²¡¶¾¼ÓÃÜ ²¡¶¾¼¤»îǰ zpack_YYYYMMDD.7z ²¿·ÖÅäÖÃÎļþÐèÖØÐ´
Ó²ÅÌÎïÀíË𻵠ÓÀ¾Ã¶ªÊ§ ÔÆ¶ËOSSÒìµØ±¸·Ý ÐèÖØÐÂÓ³ÉäÍæ¼ÒUID
ºËÐÄÅäÖñ»´Û¸Ä ÎÞÏÞÖÆ git°æ±¾¿â/config_bak GMȨÏÞÌåÏµÖØ½¨
DDOS¹¥»÷̱»¾ ¹¥»÷³ÖÐøÆÚ Íø¹ØIP°×Ãûµ¥Áбí ÐèÇåÏ´ËùÓÐÒì³£µÇ¼¼Ç¼
🛡️ ÈýÖØ·ÀÓù¶Ü¹¹½¨£¨ÊÂǰ±Ø×ö£¡£©
µÚÒ»ÖØ£ºÈ«×Ô¶¯Èȱ¸·Ý£¨¿ªÔ´¹¤¾ß£ºBorgBackup£©
ÅäÖ÷½°¸£º
borgmaticÅäÖÃÎļþ£¨config.yaml£©
location:
source_directories:
/home/zxserver/gamedb
/home/zxserver/config
repositories:
path: /backup/borg_repo
label: ÖïÏÉÖ÷²Ö¿â
storage:
compression: lz4
archive_name_format: "zx_{now}"
retention:
keep_hourly: 24
keep_daily: 7
keep_weekly: 4
Ö´ÐÐÂß¼£º
ÿ30·ÖÖÓ²îÒ챸·Ý
±¾µØ±£Áô24Сʱ±¸·Ý£¬ÔƶËͨ¹ýrcloneͬ²½µ½°¢ÀïÔÆOSS
µÚ¶þÖØ£ºÅäÖð汾¿ØÖÆ£¨Git + ¹³×Ó£©
¶ÔºËÐÄÅäÖÃĿ¼³õʼ»¯Git
cd /home/zxserver/config
git init
git add .
git commit -m "³õʼÅäÖÿìÕÕ"
ÉèÖÃÌá½»¹³×Ó£¨¼à¿ØÎļþ±ä»¯×Ô¶¯Ìá½»£©
echo '#!/bin/sh' > .git/hooks/post-commit
echo 'git push backup_remote master' >> .git/hooks/post-commit
chmod +x .git/hooks/post-commit
µÚÈýÖØ£ºÎïÀí¸ôÀ뻤¶Ü£¨Ê÷Ý®ÅÉ+ÒÆ¶¯Ó²ÅÌ£©
µÍ³É±¾·½°¸£º
Ê÷Ý®Åɰ²×°minio¶ÔÏó´æ´¢·þÎñ
ÉèÖ÷þÎñ¶Ëͨ¹ýrsyncÿÈÕÁ賿3µãÔöÁ¿Í¬²½
ͬ²½Íê³É×Ô¶¯µ¯³öÒÆ¶¯Ó²ÅÌ£¨ÎïÀí¸ô¾øÀÕË÷²¡¶¾£©
🚑 ÔÖÄÑÏÖ³¡¼±¾ÈÊÖ²á
³¡¾°1£ºGMÖ´ÐÐDELETE FROM players WHERE...Îóɾȫ·þ½ÇÉ«
¼±¾È²½Ö裺
¶³½á·þÎñ£º
systemctl stop zx_gate # Á¢¼´Í£Ö¹Íø¹Ø·þÎñ
ÌáÈ¡×î½üÊÂÎñ£º
mysqlbinlog --start-datetime="2024-06-28 14:00:00" gamedb-bin.000001 | grep "DELETE FROM players" -B 30 > rescue.sql
·´Ïò²Ù×÷»Ø¹ö£º
sed 's/DELETE FROM/INSERT INTO/g' rescue.sql | mysql -u root -p gamedb
³¡¾°2£º·¢ÏÖREADME_FOR_DECRYPT.txtÀÕË÷Îļþ
¼±¾ÈÁ÷³Ì£º
¶ÏÍøÈ¡Ö¤£º
ÅÄÕÕÀÕË÷ÐÅÏ¢
ÓÃchkrootkit¼ì²éºóÃÅ
³¢ÊÔ½âÃÜ£º
python3 ransom_decrypt.py --scan --dir /home/zxserver # ʹÓÃNoMoreRansom¹¤¾ß
ÖÕ¼«ÊֶΣº
borg extract /backup/borg_repo::zx_202406281200 # Ìáȡδ¼ÓÃܵı¸·Ý
🔧 ÔÖºóÖØ½¨¹Ø¼ü²½Öè
Íæ¼ÒUIDÖØÓ³É䣨·À×°±¸´íÂÒ£©
ÖØ½¨Íæ¼ÒUIDË÷Òý¹ØÏµ£¨account_mapping.py£©
old_data = load_from_backup('players.json')
for player in old_data:
new_id = generate_consistent_hash(player['name'] + player['register_ip'])
redis.set(f"uid_map:{player['id']}", new_id)
±ÜÃâ¶þ´ÎʹʵIJÙ×÷Ô¼Êø
ÏÞÖÆÎ£ÏÕSQLÖ´ÐÐȨÏÞ
REVOKE DELETE ON gamedb.* FROM 'gm_admin'@'%';
CREATE TRIGGER protect_players BEFORE DELETE ON players
FOR EACH ROW SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Ð賬¼¶¹ÜÀíÔ±ÊÖ¹¤½â³ýËø¶¨';
Êý¾ÝÒ»ÖÂÐÔУÑ飨·ÀÖ¹ÓÄÁéµÀ¾ß£©
¼ì²é±³°üÎïÆ·ÓëÊý¾Ý¿â²îÒì
python3 check_integrity.py --table items \
--filter 'owner_id NOT IN (SELECT id FROM players)' # ²éÕÒÎÞÖ÷ÎïÆ·
📦 ¿ªÏä¼´ÓþÈÄѰü£¨Github¿ªÔ´£©
»ñȡһ¼üÈÝÔÖ¹¤¾ßÏä
wget https://github.com/zx_backup_tools/rescue_kit/releases/latest/download/zx_rescue.zip
unzip zx_rescue.zip && cd rescue_kit
./install.sh --with-borg # ×Ô¶¯°²×°²¢ÅäÖñ¸·ÝÌåϵ
°üº¬£º
ÀÕË÷²¡¶¾Ê¶±ðÆ÷£¨Ö§³ÖTop5³£¼û±äÖÖ£©
Êý¾Ý¿âʵʱ»Ø¹ö´úÀí
×Ô¶¯Æ¯ÒƱ¸·ÝÊØ»¤½ø³Ì

