icomHOST

Wszystko o domenach i hostingach

Jak przygotować stronę do migracji na nowy hosting

Jak przygotować stronę do migracji na nowy hosting

Staranna przeprowadzka serwisu na nowy hosting to nie tylko skopiowanie plików i bazy danych. To pełny proces obejmujący analizę architektury, kontrolę zgodności środowisk, planowanie okna zmian, a także mechanizmy wycofania, gdyby coś poszło nie tak. Dobrze przygotowana migracja pozwala uniknąć przestojów i utraty danych, a przy okazji bywa świetnym momentem na modernizację stosu technologicznego, poprawę wydajność i szczelności zabezpieczeń. Poniżej znajdziesz przewodnik krok po kroku wraz z listami kontrolnymi i wskazówkami praktyków, które pomogą przejść cały proces bezpiecznie i przewidywalnie.

Plan i audyt: od czego zacząć, zanim ruszy kopia plików

Dobre przygotowanie zaczyna się od audytu obecnego środowiska i spisania zależności. W praktyce najwięcej problemów nie wynika z samego przeniesienia danych, lecz z różnic w konfiguracji systemów, wersjach bibliotek i usług towarzyszących. Warto też z góry określić cele: czy chodzi wyłącznie o zmianę dostawcy, czy może o skok jakościowy – np. przejście z hostingu współdzielonego na kontenerowy PaaS albo na klaster z autoskalowaniem.

W ramach audytu zbierz informacje o:

  • Stosie aplikacyjnym: wersje PHP/Node/Python/Ruby, framework (np. Laravel, Django), używane rozszerzenia i moduły (np. imagick, intl, mbstring), narzędzia build (Composer, npm, pnpm, Bundler).
  • Bazach danych: rodzaj (MySQL/MariaDB/PostgreSQL), wersja, silniki tabel (InnoDB vs MyISAM), kodowanie i zestaw znaków (utf8mb4), porównania (collation), wielkość i tempo przyrostu danych.
  • Warstwie cache i sesji: Redis/Memcached, TTL, mechanizmy invalidacji, sposób przechowywania sesji (plikowy vs Redis vs DB).
  • Warstwie prezentacji: serwer WWW (Nginx/Apache/OpenLiteSpeed), reguły przepisywania, kompresja (gzip/Brotli), HTTP/2/3 (QUIC), HSTS, nagłówki bezpieczeństwa.
  • Integracjach zewnętrznych: bramki płatności, ERP, CRM, systemy mailingowe i SMS, webhooki, listy dozwolonych adresów IP i klucze API.
  • Mechanizmach dostarczania plików: CDN, object storage (S3 kompatybilny), miniaturyzacja grafiki, wersjonowanie assetów, pipeline CI/CD.
  • Zadaniach cyklicznych: CRON/queue workers, harmonogram, zależności środowiskowe, uprawnienia użytkowników systemowych.
  • Logach i monitoringu: gdzie trafiają logi (syslog, pliki, ELK/Promtail), obecność alertów i dashboardów.

Na tej podstawie określ wymagania wobec nowego hostingu: zasoby CPU/RAM/IOPS, przepustowość sieci, typ i wydajność dysków (NVMe), potrzeba izolacji (kontenery, VM), region (zgodność z RODO), wsparcie IPv6, automatyczne certyfikaty SSL/TLS, panele i API, a także gwarancje SLA, RTO/RPO. Zdecyduj, czy kluczowa jest maksymalna dostępność (HA), czy raczej minimalizacja kosztów, oraz jakie warunki skalowania będą niezbędne w szczytach.

Wybór i przygotowanie nowego środowiska hostingowego

Rozważ modele: współdzielony, VPS, serwer dedykowany, chmura zarządzana, PaaS/Kubernetes. Każdy niesie inne konsekwencje operacyjne. PaaS i menedżerowie kontenerów ułatwiają automatyzację i skalowanie, natomiast klasyczne VPS-y dają pełną kontrolę kosztem większej odpowiedzialności nad aktualizacjami i twardnieniem systemu.

Podstawy konfiguracji systemu

  • Utwórz użytkowników i klucze SSH (bez haseł); włącz 2FA tam, gdzie to możliwe.
  • Aktualizuj system i jądro, ustaw automatyczne łatki bezpieczeństwa. Zainstaluj firewalla (ufw/nftables) i rozważ fail2ban/WAF.
  • Zarezerwuj miejsce na logi i backupy w oddzielnych wolumenach; ustaw rotację logów (logrotate).
  • Włącz swap w sposób przemyślany, kontroluj vm.swappiness; w środowiskach intensywnie I/O rozważ ograniczenia swapu.

Warstwa HTTP i aplikacyjna

  • Wybierz serwer WWW (Nginx/Apache/OpenLiteSpeed). Skonfiguruj HTTP/2/3, kompresję Brotli, cache statyk, ETag/Last-Modified.
  • Skonfiguruj PHP-FPM pools per-app, limity (pm.max_children), OPcache (preloading), rozszerzenia. Dopasuj wersję do wymagań.
  • Dla Node/Python/Ruby przygotuj menedżer wersji (nvm/pyenv/rbenv), izoluj środowiska wirtualne.
  • Ustaw ograniczenia uploadu, maksymalny rozmiar żądań, limity pamięci i czasu wykonania.
  • Skonfiguruj certyfikaty Let’s Encrypt lub własne, w tym OCSP stapling i HSTS. Pamiętaj o SNI i wsparciu dla IPv6.

Bazy danych, cache i storage

  • Zainstaluj i dostrój DB: bufor InnoDB, redo/undo logs, binlog_format, wal_level (dla Postgres), parametry połączeń.
  • Zapewnij Redis/Memcached do cache i sesji; ustaw politykę eviction, monitoruj hit ratio.
  • Jeśli pliki użytkowników są liczne i rosną, rozważ S3/objekt storage z CDN; unikniesz blokad na I/O i ograniczysz koszty.

Na etapie przygotowania zaplanuj redundancja usług krytycznych: replikę bazy danych, dodatkowe węzły aplikacyjne, multi-AZ, a także mechanizmy automatycznego przełączenia w razie awarii. To często wymaga niewielkiej inwestycji w narzędzia orkiestracji, ale wielokrotnie zwraca się podczas nieplanowanych incydentów.

Strategia i narzędzia przeniesienia danych

Istnieją dwa popularne podejścia: jednorazowy snapshot i przeniesienie w oknie serwisowym lub synchronizacja wstępna z krótkim delta-cutover. Drugi wariant zwykle minimalizuje niedostępność.

Pliki aplikacji i uploady

  • Wykonaj wstępną synchronizację rsync: rsync -aHAX –delete –info=progress2 źródło/ cel/. Pozwoli to przenieść większość danych zawczasu.
  • W oknie przełączenia włącz tryb konserwacji i zrób szybki rsync delta skracający okno.
  • Dla dużych katalogów z uploadami rozważ chwilowe wysyłanie nowych plików równolegle do starego i nowego miejsca (dual write) lub przejście na S3 + CDN.
  • Sprawdź prawa i właścicieli plików (chown, umask); w innych dystrybucjach SELinux/AppArmor może blokować dostęp – uwzględnij kontekst bezpieczeństwa.

Bazy danych

  • MySQL/MariaDB: użyj mysqldump z –single-transaction –routines –triggers, by uniknąć blokad (dla InnoDB). W dużych instalacjach rozważ Percona XtraBackup/physical backup.
  • PostgreSQL: pg_dump/pg_basebackup; dla minimalnego przestoju replikacja strumieniowa i przełączenie ról (promote).
  • Waliduj kodowanie (utf8mb4) i collation, zwłaszcza przy różnicach między MariaDB a MySQL. Sprawdź kompatybilność funkcji i typów danych.
  • Po imporcie ANALYZE/OPTIMIZE (lub VACUUM ANALYZE w Postgres), aby odtworzyć statystyki i zoptymalizować plany zapytań.

Nie zapomnij o spójności – w systemach transakcyjnych warto chwilowo włączyć tryb tylko do odczytu tuż przed docelową synchronizacją. Zmniejsza to prawdopodobieństwo konfliktów, zwłaszcza gdy w grę wchodzi koszyk, zamówienia czy operacje finansowe.

Domena, certyfikaty i e-mail: układanka sieciowa bez przerw

Przełączenie ruchu jest tak proste, jak aktualizacja rekordów DNS, lecz to etap najbardziej wrażliwy na błędy i czas propagacji. Na kilka dni przed migracją obniż TTL kluczowych rekordów (A/AAAA, CNAME, MX), aby skrócić okres cache po stronie resolverów. Przy bardzo krytycznych wdrożeniach rozważ tymczasowy reverse proxy lub CDN z możliwością dynamicznego przełączenia zaplecza.

  • Certyfikaty: wygeneruj na nowym hostingu i przetestuj łańcuch zaufania, OCSP stapling, konfigurację protokołów. Upewnij się, że od razu aktywne jest przekierowanie 301 do HTTPS i HSTS na docelowej domenie.
  • E-mail: jeśli serwer obsługuje pocztę wysyłkową, przygotuj SPF, DKIM, DMARC i reverse DNS. To kluczowe dla dostarczalności – zły rDNS lub brak DKIM kończy się w spamie.
  • Subdomeny usługowe: panel, api, assets, static – sprawdź wszystkie wpisy, zwłaszcza wildcardy i delegacje stref (NS na subdomenę).

Konfiguracja aplikacji: środowisko, sekrety i integracje

Upewnij się, że wszystkie sekrety, klucze i tokeny są umieszczone w bezpiecznym źródle (menedżer sekretów lub zaszyfrowane .env) i przekazywane do aplikacji zgodnie z dobrymi praktykami. Przeniesienie kluczy bez kontroli wersji i przy właściwych uprawnieniach minimalizuje ryzyko wycieku.

  • Pliki .env i konfiguracje: zmienne DB_HOST, CACHE_HOST, MAILER, URL bazowy aplikacji, strefy czasowe.
  • Reguły przepisywania (Nginx/Apache): odwzorowanie .htaccess na Nginx conf, canonicale, trailing slash, kompresja, cache-control.
  • Mechanizmy sesji: po przeniesieniu użytkownicy mogą być wylogowani – to normalne. Jeśli wymagane, wdroż wspólny store (Redis) na czas cutover.
  • CRON i workers: przenieś harmonogramy i upewnij się, że nie działają równolegle na starym i nowym środowisku (ryzyko duplikacji zadań).
  • Integracje zewnętrzne: zaktualizuj adresy IP w whitelistach partnerów, przekieruj webhooki, ustaw nowe endpointy zwrotne w panelach usług.

Przejrzyj także nagłówki bezpieczeństwa: Content-Security-Policy, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, a także parametry cookies (SameSite, Secure). To dobry moment, by realnie podnieść bezpieczeństwo i odporność na ataki XSS/CSRF.

Środowisko testowe i weryfikacja jakości

Przed przełączeniem ruchu uruchom pełną kopię aplikacji na tymczasowej domenie lub przez wpis w pliku hosts. Zastosuj dane maskowane lub zanonimizowane, jeśli pracujesz na środowisku nieprodukcyjnym. Opracuj plan testów pokrywający funkcje krytyczne, a nie tylko stronę główną.

  • testy funkcjonalne: logowanie, rejestracja, reset hasła, koszyk, płatności, formularze, wyszukiwarka, uploady.
  • Wydajnościowe: TTFB, p95/p99, czas generowania strony, obciążenie CPU/RAM/IO, przepustowość i opóźnienia, profilery.
  • SEO: statusy HTTP, canonicale, sitemap, robots.txt, hreflang, przekierowania 301/410. Brak miękkich 404 i pętli redirectów.
  • Bezpieczeństwo: SSL Labs A/A+, brak mixed content, HSTS preloading (jeśli uzasadnione), CSP bez zbyt luźnych reguł.
  • Obserwowalność: logi aplikacyjne i serwerowe, metryki, alerty progiem na błędy 5xx, drop rate w kolejkach.

Przełączenie ruchu i minimalizacja przestoju

Typowy scenariusz minimalizujący przestój to: obniżony TTL, tryb konserwacji, delta rsync dumpu i plików, finalny import, sanity-check, aktualizacja DNS, monitorowanie. Jeśli to możliwe, zastosuj blue/green deployment: ruch idzie na Blue, zielone (Green) środowisko jest gotowe i przetestowane; przełączenie odbywa się na poziomie load balancera, reverse proxy lub DNS.

  • Rozważ chwilową blokadę zapisu (read-only) lub krótkie zatrzymanie usług modyfikujących stan, aby uniknąć rozjazdu danych.
  • W przypadku CDN ustaw origin na nowy serwer, sprawdź purging cache i respektowanie nagłówków.
  • Po przełączeniu sprawdź logi w czasie rzeczywistym, wskaźniki błędów 5xx, opóźnienia i saturację zasobów.

W niektórych przypadkach pomocny bywa etap kanarkowy: część ruchu kierujesz na nowe środowisko, resztę na stare. Pozwala to wykryć regresje przed pełnym przełączeniem. Wymaga to jednak spójności warstwy danych i dobrej izolacji sesji.

Powdrożeniowe kontrole i optymalizacje

Po migracji przychodzi czas na obserwację i strojenie. Zbierz metryki i porównaj z wartościami bazowymi sprzed przenosin. Jeżeli czasy odpowiedzi są gorsze, sprawdź, czy nowy serwer nie ma innych limitów (np. inny scheduler dysku, niższe limity open files, brak preloading OPcache, brak JIT w PHP 8). Zadbaj o poprawne cache’owanie i invalidację, szczególnie przy dynamicznych stronach i katalogach e-commerce.

  • Włącz i zweryfikuj mechanizmy kompresji i cache – nagłówki Cache-Control, Vary, preloading krytycznych zasobów, HTTP/2 server push (tylko jeśli przynosi korzyść).
  • Porównaj plany zapytań DB. Nowe środowisko może tworzyć inne plany – zaktualizuj statystyki, rozważ indeksy.
  • Zweryfikuj budżety błędów i SLA. Skonfiguruj alerty na poziomach SLO (apdex, latency p95, availability).

Przegląd kosztów: po 2–4 tygodniach oceń, czy alokacja zasobów odpowiada faktycznym potrzebom. Przewymiarowane instancje to niepotrzebny wydatek, natomiast zbyt zachowawcze limity CPU/RAM będą generować kolejki i timeouty.

Plan awaryjny, wycofanie i kopie zapasowe

Każda zmiana powinna mieć plan B. Zanim zaczniesz, przygotuj pełne backupy i przetestuj ich odtwarzanie. Kopia, której nie da się odtworzyć, nie jest kopią. Zaplanuj również okno, w którym łatwo jest wrócić do starego środowiska: dopóki nie nastąpi duża ilość nowych zapisów na nowym środowisku, rollback jest stosunkowo prosty.

  • Runbook wycofania: szybkie przywrócenie DNS na stary origin, replikacja wsteczna danych zapisanych po cutover, komunikacja do użytkowników.
  • Retencja: trzymaj różne punkty w czasie (GFS: daily/weekly/monthly), pamiętaj o geografii (offsite) i szyfrowaniu.
  • Testy odtworzeniowe: kwartalne próby przywrócenia losowej kopii na środowisko testowe.

Najczęstsze problemy i sposoby ich uniknięcia

  • Niedopasowanie wersji: brak rozszerzeń (np. intl), inna wersja MariaDB powodująca błędy w zapytaniach. Rozwiązanie: macierz zgodności i kontenery/obrazy pinned do wersji.
  • Permisje: 403/500 przez złe właścicielstwo plików, brak uprawnień do katalogów cache/temp. Rozwiązanie: jawne chown/chmod, SELinux contexts.
  • Mixed content po HTTPS: zasoby po HTTP. Rozwiązanie: korekta URL bazowych i reguł przepisywania, Content-Security-Policy.
  • Wysyłka poczty: brak rDNS, SPF, DKIM. Rozwiązanie: poprawne wpisy, testy dostarczalności, ewentualnie SMTP relay.
  • Brak starych przekierowań: spadek SEO. Rozwiązanie: mapa 301, test crawlerem, sitemap update.
  • Cache pośrednie: CDN trzyma starą wersję. Rozwiązanie: purge po przełączeniu, krótsze TTL w okresie migracji.
  • Limit liczby plików (inodes) i open files: rozjazdy ulimit, fs.inotify max_user_watches. Rozwiązanie: zwiększenie limitów, monitoring.
  • Łańcuch certyfikatów: błędy w starszych przeglądarkach/klientach. Rozwiązanie: pełny chain, testy z różnych systemów.

Specyfika popularnych CMS i frameworków

WordPress i WooCommerce

  • Wp-config.php: klucze SALT, adresy bazy danych, definicje WP_HOME/WP_SITEURL.
  • Permalinks: odtwórz reguły .htaccess lub ich odpowiednik w Nginx.
  • Wtyczki cache/security: wczytaj konfigurację, wyczyść cache po migracji, zwróć uwagę na blokady WAF-ów/pluginów.
  • WooCommerce: zamknij koszyk (read-only) na czas cutover lub zadbaj o replikację transakcyjną.

Laravel

  • .env: APP_URL, APP_KEY, DB_*, CACHE_*, QUEUE_*. Niewłaściwy APP_KEY unieważni sesje i szyfrowanie.
  • Optymalizacja: php artisan config:cache, route:cache, view:cache; usuń cache po zmianach konfiguracji.
  • Migracje bazy: uruchom php artisan migrate na docelowym środowisku, uwzględniając kompatybilność wersji DB.

Magento

  • Tryb maintenance: włącz podczas cutover. Po migracji przebuduj indeksy i cache, zweryfikuj ElasticSearch/OpenSearch.
  • Pamięć i PHP-FPM: Magento bywa pamięciożerne – przydziel odpowiednie limity.

Inne stosy

  • Django: SECRET_KEY, ALLOWED_HOSTS, migracje, statyczne pliki collectstatic, uWSGI/gunicorn + Nginx.
  • Next.js/Nuxt: budowa statyk, edge functions, SSR vs SSG, env dla run-time.
  • Rails: secrets, migrations, precompile assets, Puma/Unicorn tunning.

Aspekty prawne, zgodności i organizacji

Przenosząc system, zwłaszcza z danymi osobowymi, uwzględnij wymogi prawne i kontraktowe. Lokalizacja centrów danych, umowy powierzenia, audyty i logowanie operacji administracyjnych są nie mniej ważne niż megaherce i gigabajty.

  • RODO/DPDPA: przetwarzanie w EOG lub zapewnienie odpowiednich zabezpieczeń przy transferze transgranicznym.
  • SLA i wsparcie: czasy reakcji, eskalacje, kanały komunikacji, okna serwisowe.
  • RTO/RPO: zdefiniuj akceptowalny czas przywrócenia i utraty danych; dobierz strategię backupów i replikacji.
  • Kontrola dostępu: zasada najmniejszych uprawnień, segmentacja sieci, dzienniki audytowe.

Od strony komunikacyjnej przygotuj plan informacji dla klientów i zespołów wewnętrznych: okno możliwych przerw, przewidywane zmiany w adresach IP, wymagania po stronie integracji (whitelisty), a także numer dyżurny na czas okna migracyjnego.

W kontekście zgodność operacyjnej pamiętaj o dokumentacji konfiguracyjnej – repozytorium IaC (Terraform/Ansible) lub przynajmniej skrypty shell opisujące kroki, by każdą zmianę dało się odtworzyć i zrecenzować.

Checklisty: przed, w trakcie i po

Przed

  • Audyt środowiska, spis wersji, zależności, integracji.
  • Przygotowanie docelowego hostingu, kont, sieci, firewalli, certyfikatów.
  • Obniżenie TTL w strefie DNS, zaplanowanie okna.
  • Wstępne kopie i test odtworzenia, przygotowany runbook wycofania.
  • Staging uruchomiony, plan testów, lista osób dyżurujących.

W trakcie

  • Tryb konserwacji, delta rsync, dump/import bazy, sanity-check.
  • Aktualizacja DNS i konfiguracji CDN, purge cache.
  • Weryfikacja logów i metryk, szybkie poprawki krytyczne.

Po

  • Monitoring stabilności, performance tuning, indeksy DB.
  • Kontrola SEO i e-mail deliverability, analiza błędów 4xx/5xx.
  • Aktualizacja dokumentacji, zamknięcie incydentu, retrospektywa.

Wykorzystaj migrację do realnych usprawnień

Zmiana hostingu to idealny moment, by wdrożyć praktyki, które wcześniej były odkładane. Zaimplementuj CI/CD, automatyczną budowę artefaktów, skanowanie luk, Infrastructure as Code, polityki backupów i scenariusze DR. Rozważ wprowadzenie WAF, rate limiting, mechanizmów anty-botowych, a także włączenie precyzyjnych dashboardów SLO. Wzrost jakości operacyjnej przekłada się bezpośrednio na stabilność i satysfakcję użytkowników.

Dodatkowo, jeśli dotąd nie korzystałeś z CDN lub storage obiektowego, przeniesienie to dobra chwila na rozdzielenie odpowiedzialności: serwer aplikacyjny nie powinien być magazynem na wieloterabajtowe pliki. Architektura rozdzielająca compute, storage i dostarczanie treści ułatwia skalowanie poziome i podnosi niezawodność.

Podsumowanie

Dobrze przygotowana zmiana hostingu łączy aspekt techniczny z procesowym: od analizy wymagań, przez przygotowanie środowiska docelowego, dokładne przeniesienie plików i bazy, po spójne przełączenie ruchu i kontrolę jakości. Krytyczne elementy to przewidywalne backupy, przemyślany DNS, szczelne SSL/TLS, twardnienie pod kątem bezpieczeństwo, testy wydajności oraz gotowy plan cofnięcia zmian, jeśli zajdzie taka potrzeba. Migrację warto traktować jako projekt modernizacyjny: wprowadzić automatyzację, monitoring i mechanizmy wysokiej dostępność, a także rozsądną redundancja. Dzięki temu nie tylko bezboleśnie przeniesiesz serwis, ale też zyskasz solidną bazę do dalszego rozwoju i skalowania.