µ±Ç°Î»Öà : 145zÓÎÏ·Õ¾¡¡|¡¡ÖïÏÉ¡¡|¡¡¼¼Êõ½Ì³Ì¡¡|¡¡

ÖïÏÉÔÖÄѻָ´Ö¸ÄÏ£ºÔâÓöɾ¿â/ÀÕË÷²¡¶¾ÈçºÎ¼±¾È

Èȶȣº
·þÎñÆ÷°ëÒ¹±»ÀÕË÷²¡¶¾¼ÓÃÜ£¿ÐÜ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³£¼û±äÖÖ£©

Êý¾Ý¿âʵʱ»Ø¹ö´úÀí

×Ô¶¯Æ¯ÒƱ¸·ÝÊØ»¤½ø³Ì