CentminMod site & adatbázis migráció

  • Linux
  • 2025. február 15.

CSF Firewall konfiguráció

Először megfelelően engedélyezd a forrás- és távoli szerver IP-címét, valamint az SSH portokat a CSF tűzfalban.

A forrásadat-szerveren add hozzá az alábbi sort az /etc/csf/csf.allow fájlhoz, amely engedélyezi a TCP-kapcsolatokat az alapértelmezett 22-es SSH-porton a távoli szerver (111.222.333.444) felé. Ha a távoli szerver SSH-portja nem 22, módosítsd ennek megfelelően.

tcp|out|d=22|d=111.222.333.444

Majd indítsd újra a CSF tűzfal szolgáltatást:

csf -ra

A távoli szerveren add hozzá az /etc/csf/csf.allow fájlhoz az alábbi sort, amely engedélyezi a TCP-kapcsolatokat a 22-es SSH-porton a forrásadat-szerver (1.2.3.4) felől:

tcp|in|d=22|s=1.2.3.4

Ezután indítsd újra a CSF tűzfal szolgáltatást:

csf -ra

Keygen.sh jelszómentes beállítás

Második lépésként állítsd be a keygen.sh eszközt a forrásadat-szerveren (ahol az átmásolandó adatok találhatók).

mkdir -p /root/tools
cd /root/tools
git clone https://github.com/centminmod/keygen

Ezután generáld le az SSH-kulcspárt a keygen.sh eszközzel. Ehhez szükséged lesz a távoli szerver IP-címére.

Állítsd be a változókat a terminálban a távoli szerver IP-címével, az SSH-porttal és egy megjegyzéssel a kulcs azonosítására. Ezek a változók csak az aktuális SSH-munkamenetben lesznek érvényesek.

remoteip=111.222.333.444
port=22
comment=mykey
remoterootpass=yourremoteserver_rootpassword

Ezután futtasd a keygen.sh eszközt:

cd /root/tools/keygen
./keygen.sh gen rsa $remoteip $port root $comment $remoterootpass

Első csatlakozáskor az SSH kérni fogja a kapcsolat hitelesítését. Írd be:

The authenticity of host 'remoteipaddress (remoteipaddress)' can't be established.
ECDSA key fingerprint is 68:8x:2e:6d:c0:c1:7s:81:73:c0:7a:82:45:2e:1c:98.
Are you sure you want to continue connecting (yes/no)? yes

A generált kulcsok neve myX formátumú lesz, ahol X egy automatikusan növekvő szám. Privát kulcs: /root/.ssh/my1.key Publikus kulcs: /root/.ssh/my1.key.pub

A privát kulcs megadásával SSH kapcsolatot létesíthetsz a távoli szerverrel:

ssh root@$remoteip -p 22 -i ~/.ssh/my1.key

A távoli szerveren az /root/.ssh/authorized_keys fájlban megjelenik a generált kulcs az előzőleg megadott megjegyzéssel (mykey):

cat /root/.ssh/authorized_keys
ssh-rsa AAAAB3....pOlOCB/UhEQ== mykey

A keygen.sh teszteli a kapcsolatot

-------------------------------------------------------------------
Testing connection please wait...
-------------------------------------------------------------------

ssh [email protected] -p 22 -i /root/.ssh/my1.key 'uname -nr'

------ 5.14.0-503.23.2.el9_5.x86_64

-------------------------------------------------------------------
Setup source server file /root/.ssh/config
-------------------------------------------------------------------

Add to /root/.ssh/config:
Host my1
        Hostname 111.222.333.444
        Port 22
        IdentityFile /root/.ssh/my1.key
        IdentitiesOnly=yes
        User root
        #LogLevel DEBUG3

saved copy at /etc/keygen/logs/ssh-config-alias-my1-111.222.333.444.key.log

cat /etc/keygen/logs/ssh-config-alias-my1-111.222.333.444.key.log >> /root/.ssh/config

-------------------------------------------------------------------
Once /root/.ssh/config entry added, can connect via Host label:
 my1
-------------------------------------------------------------------

ssh my1

Ebben leírja, hogy a forrás szerveren létrehozhatsz egy /root/.ssh/config fájlt (ha még nem létezik) vagy, ha igen, akkor hozzá adhatod a végéhez az alábbi sorokat, amivel egy alias-t hozol létre így gyorsabban, az ssh my1 paranccsal is csatlakozhatsz a távoli szerverhez.


Rsync & mysqldump átvitele

Most elkezdhetjük az adatok átvitelét. A biztonság kedvéért ismét adjuk meg a változókat a terminalban és egészítsük ki az előzőekben létrehozott kulccsal.

remoteip=111.222.333.444
port=22
privatekey=my1.key
backupdir=/root/backupsql
DUMPOPT='-Q -K --max_allowed_packet=256M --net_buffer_length=65536 --routines --events --triggers --hex-blob'
CLIENTOPT='--max_allowed_packet=256M --net_buffer_length=65536'

Majd hozzuk létre a backup mappát:

mkdir -p $backupdir

Rsync adatok átvitele

Ez az adatátviteli folyamat feltételezi, hogy a távoli szerveren a Centmin Mod telepítve van, de még nincsenek létrehozva vhostok vagy MySQL-adatbázisok. Az is feltételezett, hogy a /root/.my.cnf fájl be van állítva a MySQL root felhasználó jelszavával, amit a Centmin Mod telepítése automatikusan elvégez.


Fájlok másolása rsync segítségével

Az rsync -avzin opciókkal fut, ahol:

  • -a (archive) – megőrzi a jogosultságokat és tulajdonosi információkat
  • -v (verbose) – részletes kimenetet ad
  • -z (compress) – tömöríti az adatokat a gyorsabb átvitel érdekében
  • -i (itemize-changes) – megmutatja, milyen változtatásokat hajt végre
  • -n (dry-run) – tesztmód, amely nem visz át tényleges adatokat

Ha minden teszt (dry-run) megfelelően működik, távolítsd el az n opciót, és használd -avzi-ként a tényleges átvitelhez.


Megjegyzések

  • Az /etc/csf/csf.conf CSF tűzfal konfigurációs fájl átvitelét kikommenteztem, mert előfordulhat, hogy a forrás szerveren az IPSET le van tiltva, míg a távoli szerveren engedélyezve van. Ha ezt a fájlt átmásolnád, az IPSET letiltásra kerülhet a távoli szerveren is.

  • Az /etc/my.cnf fájl átvitelét szintén kikommenteztem, mert eltérések lehetnek az előre beállított konfigurációk között a forrás és a távoli szerverek között.

  • A nagy méretű adatállományok migrációja hosszú ideig tarthat, ezért ajánlott az alábbi SSH-alapú parancsokat egy Screen vagy Tmux munkamenetben futtatni. Ez lehetővé teszi, hogy az SSH kapcsolat megszakadása esetén is folytathasd a folyamatot. Ha az internetszolgáltatód vagy az SSH kapcsolat megszakad, egyszerűen újra bejelentkezel az SSH-ba, és újracsatlakozol a Screen vagy Tmux munkamenethez.

Ha a távoli (új) szerveren még nincs beállítva a Letsencrypt, akkor azt most installálni kell. Futtassuk ezt az új szerveren:

echo "LETSENCRYPT_DETECT='y'" >> /etc/centminmod/custom_config.inc
/usr/local/src/centminmod/addons/acmetool.sh acmeinstall

Erről részletesebben olvashatsz itt: https://szab.ee/2025/02/centminmod-letsencrypt/

Először futtassuk az alábbi parancsot dry-runnal:

cd /home
rsync -avzin --progress --stats -e "ssh -p $port -i $HOME/.ssh/$privatekey" --exclude 'domains/*/log/*' --exclude 'domains/*/backup/*' /home/nginx/ root@$remoteip:/home/nginx
rsync -avzin --progress --stats -e "ssh -p $port -i $HOME/.ssh/$privatekey" --exclude 'conf.d/virtual.conf' /usr/local/nginx/conf/ root@$remoteip:/usr/local/nginx/conf
rsync -avzin --progress --stats -e "ssh -p $port -i $HOME/.ssh/$privatekey" /etc/centminmod/custom_config.inc root@$remoteip:/etc/centminmod/custom_config.inc
rsync -avzin --progress --stats -e "ssh -p $port -i $HOME/.ssh/$privatekey" /usr/local/etc/php-fpm.conf root@$remoteip:/usr/local/etc/php-fpm.conf
#rsync -avzin --progress --stats -e "ssh -p $port -i $HOME/.ssh/$privatekey" /etc/my.cnf root@$remoteip:/etc/my.cnf
#rsync -avzin --progress --stats -e "ssh -p $port -i $HOME/.ssh/$privatekey" /etc/csf/csf.conf root@$remoteip:/etc/csf/csf.conf
rsync -avzin --progress --stats -e "ssh -p $port -i $HOME/.ssh/$privatekey" /etc/init.d/memcached root@$remoteip:/etc/init.d/memcached
rsync -avzin --progress --stats -e "ssh -p $port -i $HOME/.ssh/$privatekey" /etc/pure-ftpd/pureftpd.passwd root@$remoteip:/etc/pure-ftpd/pureftpd.passwd

Ha úgy tűnik ez gond nélkül fut, akkor térjünk rá a Let’s Encrypt SSL tanúsítványok és automatikus megújítási profilok és az aktuális SSL tanúsítványok átmásolásához (DRY RUN!!!)

Győződj meg róla, hogy az új szerveren már korábban lefuttattad az /usr/local/src/centminmod/addons/acmetool.sh acmeinstall parancsot, mielőtt az alábbi 3 parancssort futtatnád:

ssh root@$remoteip -p $port -i ~/.ssh/$privatekey mkdir -p /usr/local/nginx/conf/ssl/
rsync -avzin --progress --stats -e "ssh -p $port -i $HOME/.ssh/$privatekey" /root/.acme.sh/ root@$remoteip:/root/.acme.sh/
rsync -avzin --progress --stats -e "ssh -p $port -i $HOME/.ssh/$privatekey" /usr/local/nginx/conf/ssl/ root@$remoteip:/usr/local/nginx/conf/ssl/

Ha lelkileg felkészültünk futtassuk a parancsokat -n nélkül (LIVE RUN!!!)

cd /home
rsync -avzi --progress --stats -e "ssh -p $port -i $HOME/.ssh/$privatekey" --exclude 'domains/*/log/*' --exclude 'domains/*/backup/*' /home/nginx/ root@$remoteip:/home/nginx
rsync -avzi --progress --stats -e "ssh -p $port -i $HOME/.ssh/$privatekey" --exclude 'conf.d/virtual.conf' /usr/local/nginx/conf/ root@$remoteip:/usr/local/nginx/conf
rsync -avzi --progress --stats -e "ssh -p $port -i $HOME/.ssh/$privatekey" /etc/centminmod/custom_config.inc root@$remoteip:/etc/centminmod/custom_config.inc
rsync -avzi --progress --stats -e "ssh -p $port -i $HOME/.ssh/$privatekey" /usr/local/etc/php-fpm.conf root@$remoteip:/usr/local/etc/php-fpm.conf
#rsync -avzi --progress --stats -e "ssh -p $port -i $HOME/.ssh/$privatekey" /etc/my.cnf root@$remoteip:/etc/my.cnf
#rsync -avzi --progress --stats -e "ssh -p $port -i $HOME/.ssh/$privatekey" /etc/csf/csf.conf root@$remoteip:/etc/csf/csf.conf
rsync -avzi --progress --stats -e "ssh -p $port -i $HOME/.ssh/$privatekey" /etc/init.d/memcached root@$remoteip:/etc/init.d/memcached
rsync -avzi --progress --stats -e "ssh -p $port -i $HOME/.ssh/$privatekey" /etc/pure-ftpd/pureftpd.passwd root@$remoteip:/etc/pure-ftpd/pureftpd.passwd

Aztán az ACME:

ssh root@$remoteip -p $port -i ~/.ssh/$privatekey mkdir -p /usr/local/nginx/conf/ssl/
rsync -avzi --progress --stats -e "ssh -p $port -i $HOME/.ssh/$privatekey" /root/.acme.sh/ root@$remoteip:/root/.acme.sh/
rsync -avzi --progress --stats -e "ssh -p $port -i $HOME/.ssh/$privatekey" /usr/local/nginx/conf/ssl/ root@$remoteip:/usr/local/nginx/conf/ssl/

Ha eddig minden rendben ment és átmásoltuk a konfigurációs fájlokat és az adatokat, ne felejtsük el újraindítani az Nginx-et:

ngxrestart

Fontos

Figyelj arra, hogy a fájlok átvitele után frissítsd az Nginx vhost beállításait a /usr/local/nginx/conf/conf.d/virtual.conf fájlban. Ez a fájl tartalmazhatja a régi szerver nevét vagy más eltérő beállításokat, ezért ellenőrizd és szükség esetén módosítsd az új szerver adataival.


MySQL adatbázis biztonsági mentése mysqldump segítségével

A helyi mysqldump adatok közvetlen átvitele a távoli (új) szerverre megkerüli a forráskiszolgálón a helyi SQL dump fájl létrehozását. Ez különösen akkor lehet hasznos, ha a forráskiszolgálón nincs elegendő szabad lemezterület az SQL mentési fájl tárolásához. Nagy méretű MySQL adatbázisok esetén azonban előfordulhat, hogy némi optimalizálásra van szükség.

Mivel a folyamat hosszú időt vehet igénybe, javasolt a következő SSH-alapú parancsokat screen vagy tmux munkamenetben futtatni. Ezek lehetővé teszik, hogy a munkamenet folytatódjon akkor is, ha az SSH-kapcsolat megszakad. Ha az internetkapcsolat vagy az SSH-kapcsolat megszakad, egyszerűen csatlakozzon újra a screen vagy tmux munkamenethez bejelentkezés után, és folytassa a műveletet onnan, ahol abbahagyta.

DBNAME=$(mysql -N -e "show databases;" | grep -wEv '(information_schema|performance_schema|mysql)')
CHARSET=utf8mb4
for db in $DBNAME; do ssh root@$remoteip -p $port -i ~/.ssh/$privatekey mysqladmin create $db; mysqldump --default-character-set=$CHARSET $DUMPOPT $db | ssh root@$remoteip -p $port -i ~/.ssh/$privatekey mysql --default-character-set=$CHARSET $CLIENTOPT $db; done

A fentebb leírt módszer közvetlenül, SSH-val viszi át az adatbázisokat a célszerverre. Ha valami miatt erre nincs lehetőségünk, akkor az adatbázisokat menthetjük a korábban beállított $backupdir változóban tárolt helyre.

mysql -N -e "show databases;" | grep -wEv '(information_schema|performance_schema|mysql)' | while read db; do mysqldump --default-character-set=utf8mb4 $DUMPOPT "$db" > "$backupdir/$db.sql"; done

Ez a parancs az adatbázisokat külön SQL fájlokba menti, amelyeket egyenként visszaállíthatunk a célszerveren a következő paranccsal:

for file in $backupdir/*.sql; do db=$(basename "$file" .sql); mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS $db;" && mysql -u root -p "$db" < "$file"; done

MySQL jogosultságok, felhasználók és jelszavak átvitele

Az adatbázis kaland itt még nem ér véget, mert a jogosultságok az új szerveren még nincsenek létrehozva. Hozzunk létre egy új könyvtárat a /root/dbgrants alatt.

mkdir /root/dbgrants
cd /root/dbgrants

Majd itt futtassuk az alábbi parancsot:

mysql --batch --skip-column-names -e "SELECT user, host FROM user" mysql | while read user host; do 
    if [[ "$user" != 'root' ]]; then 
        mysql --batch --skip-column-names -e "SHOW GRANTS FOR '$user'@'$host'" | sed -e 's|$|;|'; 
    fi; 
done > grants.sql

Mit csinál?

  • Lekéri az összes MySQL felhasználót és hostot.
  • Azon felhasználókra, akik nem root, lekérdezi a jogosultságokat.
  • Az eredményt SQL formátumban elmenti a grants.sql fájlba.

Ezt a fájlt aztán dobjuk át rsync-el a távoli (új) szerverre:

rsync -avzi --progress --stats -e "ssh -p $port -i $HOME/.ssh/$privatekey" /root/dbgrants/grants.sql  root@$remoteip:/root/dbgrants/

Ezután a távoli szerveren töltsük be ezt a fájlt a mysql parancs segítségével:

mysql < /root/dbgrants/grants.sql

Majd futtassuk az alábbi parancsokat, hogy újra töltse a MariaDB a jogosultságokat és újraindítsuk az adatbázis szervert:

mysql -e "FLUSH PRIVILEGES;"
systemctl restart mariadb

Költözés után - tesztek

Az adatok átvitele után meg kell győződnünk arról, hogy a szerver üzemképes-e.

Konfiguráció ellenőrzése

  • A fentebb már említett /usr/local/nginx/conf/conf.d/virtual.conf konfigurációs fájlt nézzük meg és javítsuk a benne lévő paramétereket, ha szükséges.

  • Ellenőrizzük az nginx -t paranccsal az Nginx konfigurációt. Ha minden rendben vagy csak néhány szokásos warning üzenetet ad, akkor indítsuk újra ngxrestart paranccsal vagy systemctl restart nginx paranccsal.

  • Ellenőrizzük le az acme.sh működését:

    1. A /root/.acme.sh/ könyvtárban ellenőrizzük meg a domain címekhez tartozó könyvtárak meglétét.

    2. ./root/.acme.sh/acme.sh --list paranccsal ellenőrizzük le a domainek listáját.

    3. crontab -l | grep acme.sh paranccsal ellenőrizzük az acme.sh meglétét a crontabban, hogy biztosítva legyen a tanúsítványok megújítása. Ha minden rendben van, akkor egy ilyen eredményt kapunk:

      0 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
      

      Ez azt jelenti, hogy naponta egyszer, éjfélkor lefut az acme.sh.

  • Ellenőrizzük a MariaDB-t a systemctl status mariadb paranccsal.

  • Centmin Mod domain előnézete DNS-frissítés előtt

    1. Ha egy áttelepített domaint szeretnél előnézetben megtekinteni az új Centmin Mod szerveren anélkül, hogy frissítenéd a DNS-t, szerkeszd a /etc/hosts fájlt Linuxon, vagy a c:\Windows\System32\Drivers\etc\hosts fájlt Windows PC-n.

      111.222.333.444 domain.com 
      
    2. Titkos tipp: A HostsMan alkalmazással könnyen szerkesztheted a c:\Windows\System32\Drivers\etc\hosts fájlt és ürítheted a DNS gyorsítótárat.


Források

Hasonló bejegyzések

CentminMod (130.00stable): Let's Encrypt

A CentminMod egy optimalizált NGINX + PHP-FPM + MariaDB stack, amely támogatja az SSL/TLS konfigurációt, beleértve az önaláírt (self-signed) tanúsítványokat és a Let’s Encrypt integrációját.

Bővebben

Első bejegyzés - Hugooo!

Ez az első bejegyzésem. Kiégtem a WordPress fejlesztéstől, és teljesen kiábrándultam a “blokkszerkesztőkből”. Tagadhatatlan, hogy gyorsan és egyszerűen lehet velük oldalakat építeni, mégis úgy érzem, hogy ez egy zsákutca. Szerintem a WordPress rossz irányba halad, bár open-source közösségi projektként továbbra is meghatározó szereplője a CMS-piacnak. Ha a közösség időben reagál a kihívásokra, még hosszú ideig a felszínen maradhat.

Bővebben

CentminMod telepítése AlmaLinux 9.5 alatt

A CentminMod egy automatizált telepítési és optimalizálási script CentOS és AlmaLinux rendszerekhez, amely egy LEMP stacket (Linux, Nginx, MariaDB, PHP) állít be. Célja a teljesítményoptimalizált webkiszolgálók gyors és egyszerű telepítése, fejlett cache-megoldásokkal (pl. Redis, Opcache). Főként haladó felhasználóknak és nagy teljesítményű szerverekhez ajánlott.

Bővebben