Skip to content

Jak zaoszczędzić miejsce na VPS przy środowisku stage

Published: at 15:21

Przy rozwoju i utrzymaniu aplikacji webowych niezbędnym dla mnie narzędziem jest środowisko stage, na którym mogę bezpiecznie testować nowe zmiany. Częste kopie i synchronizacja danych powoduje jednak problem - z reguły duplikujemy wszystkie zdjęcia, filmy i inne pliki mediów.

Domyślne mechanizmy wykonują kopię wszystkich plików strony - także utrzymując dodatkową instancję stage - potrzebujemy dwa razy więcej miejsca na te same pliki.

Spis treści

Rozwiń spis treści

Dlaczego Lighter Stage Sync?

Założenie było proste: synchronizować środowisko stagingowe z produkcyjnym, ale bez kopiowania mediów. Dzięki temu oszczędzamy znaczącą ilość miejsca na dysku, ponieważ staging korzysta z mediów bezpośrednio z witryny produkcyjnej.

To rozwiązanie jest idealne, gdy pracujemy nad aktualizacjami lub testujemy nowe funkcje, nie chcąc zapychać serwera niepotrzebnymi duplikatami dużych plików.

Niestety domyślny mechanizm kopii i synchronizacji, z którego korzysta GridPane przy synchronizacji wykorzystuje pełną kopię plików produkcji. Dlatego postanowiłem dopisać skrypt bash, który wykona kopię bazy, ale w zakresie plików da nam większe możliwości kontroli.

Finalnie dokonamy przekierowań na poziomie serwera Nginx, żeby korzystać z plików produkcyjnych, a jednocześnie nie obciążać procesów php.

Jak to działa?

Proces jest stosunkowo prosty:

  1. Tworzymy instancje stage witryny WordPress w panelu GridPane.
  2. Uruchomiamy uzupełniony skrypt sync_light.sh, który automatycznie zsynchronizuje bazę danych stagingu z produkcją. Proces jest jednostronny, ale oczywiście zalecam wykonanie kopii produkcji przed całym procesem.
  3. Skrypt zapyta Cię, czy chcesz skopiować motywy, wtyczki oraz wybrane foldery z wp-content/uploads. Uwaga: specjalnie pominie katalogi z mediami.
  4. Na koniec, skrypt zaktualizuje konfigurację Nginx dla środowiska stage, przekierowując wszystkie zapytania dotyczące mediów do witryny produkcyjnej.

Dlaczego warto przyjąc taki model działania?

Korzystając z tego podejścia, nie tylko oszczędzasz miejsce na dysku serwera, ale także czas potrzebny na synchronizację środowiska. Jest to szczególnie przydatne, gdy pracujesz nad dużymi witrynami WordPress, gdzie każdy gigabajt ma znaczenie.

Uniwersalność rozwiązania

Pomimo iż skrypt został napisany z myślą o serwerach GridPane, z pewnymi drobnymi modyfikacjami może być on również użyteczny na innych hostingach obsługujących SSH i WP-CLI. Mam nadzieję, że to rozwiązanie ułatwi życie niejednemu developerowi WordPress.

Skrypt na GitHub

Skrypt znajdziesz tutaj:

Lighter Stage sync for GridPane

Kluczowe fragmenty

Definicja własnych połączeń i lokalizacja klucza do połączenia:

# Define the path to your private key
PRIVATE_KEY_PATH="/your_private_key_location"

# Define server names and IP addresses
server_names=("Friendly Server name 01" "Friendly Server name 02")
server_ips=("231.x.x.x" "168.x.x.x")

Wykorzystanie WP-CLI do synchronizacji bazy (zmodyfikana składnia GridPane):

echo "Exporting the database from $LIVE_SITE..."
ssh -i "$PRIVATE_KEY_PATH" root@"$SERVER_IP" "gp wp $LIVE_SITE db export $STAGING_DB --add-drop-table --allow-root"

echo ""
echo "Importing database to $site..."
ssh -i "$PRIVATE_KEY_PATH" root@"$SERVER_IP" "gp wp staging.$LIVE_SITE db import $STAGING_DB --allow-root"

# Rewrite URLs from live to staging
echo ""
echo "Rewriting URLs from $LIVE_SITE to staging.$LIVE_SITE..."
ssh -i "$PRIVATE_KEY_PATH" root@"$SERVER_IP" "gp wp staging.$LIVE_SITE search-replace 'https://$LIVE_SITE' 'https://staging.$LIVE_SITE' --skip-columns=guid --all-tables --allow-root"

Więcej o korzystaniu z WP-CLI i składni GridPane: https://gridpane.com/kb/gp-wp-cli/

Przepisanie konfiguracji Nginx:

if [[ $create_nginx_rules =~ ^[Yy]$ ]]; then
    NGINX_CONFIG_FILE="/var/www/staging.$LIVE_SITE/nginx/live-media-main-context.conf"
    LIVE_DOMAIN=${LIVE_SITE/www./}

    # Create Nginx configuration for redirecting media
    echo "Creating Nginx configuration for media redirects..."
    ssh -i "$PRIVATE_KEY_PATH" root@"$SERVER_IP" "echo 'location ~* ^/wp-content/uploads/(.*)\$ { rewrite ^/wp-content/uploads/(.*)\$ https://$LIVE_DOMAIN/wp-content/uploads/\$1 redirect; }' > $NGINX_CONFIG_FILE"

    # Test and reload Nginx
    echo "Testing and reloading Nginx..."
    ssh -i "$PRIVATE_KEY_PATH" root@"$SERVER_IP" "nginx -t && gp ngx reload"
fi

Potrzebujesz pomocy ze swoim WordPressem?

Skontaktuj się ze mną - wspólnie znajdziemy rozwiązanie idealne dla Twojej witryny.