Zobacz wyniki ankiety na temat zarobków programistów w Polsce. Czytaj więcej..
1

1

Prowadzę swój nieduży serwis napisany w php+mysql, oparty o jeden z większych frameworków. Serwis ten nie jest "ukończony" - ciągle wprowadzam nowe funkcjonalności. Wymaga to oczywiście edycji kodu a także również schematu w bazie danych (nowe pola, nowe tabele). Podczas pracy nad stroną zmiany w kodzie/schemacie bazy przeprowadzam na lokalnym serwerze.

I teraz pytanie: jak wprowadzone zmiany wydajnie i szybko wdrożyć na serwerze produkcyjnym?

Mógłbym przesłać pełny katalog projektu bezpośrednio na serwer, ale wiąże się to z przesyłaniem setek zbędnych plików oraz plików które różnią się między serwerem produkcyjnym a lokalnym (np. pliki z konfiguracją). Aktualnie po prostu robię listę plików które zmieniły się od ostatniej aktualizacji (pomaga tu vcs) i tylko te pliki wysyłam, ale wiąże się to z mozolnym, ręcznym skakaniem po katalogach i wysyłaniem pojedynczych plików poprzez FTP. Podobnie sytuacja przedstawia się z bazą danych, z tym że wszelkie zmiany wprowadzone lokalnie na serwerze dodaje ręcznie za pomocą phpMyAdmina.

Na koniec dodam, że serwer produkcyjny to VPS, mogę instalować tam dowolne oprogramowanie.

flag

5 Answers

1

Robię to tak:

  1. cała konfiguracja jest przeniesiona do bazy danych, oprócz samych danych dostępowych bazy
  2. kod znajduje się w repozytorium RCS'a (u mnie subversion), więc aktualizacja na serwerze, to zwykła aktualizacja danych z repozytorium
  3. aktualizacje struktury bazy danych przygotowuje w postaci dwóch plików: data_nazwa_install.sql oraz data_nazwa_unistal.sql, pliki "install" po prostu wczytuję na serwerze, widząc, że "przybiegły" w czasie aktualizacji
  4. aktualizacje danych jako plik który trzeba wykonać na serwerze
link|flag
Możesz rozwinąć drugi pkt ? Również używam systemu kontroli wersji ale repozytorium trzymam w zupełnie osobnym miejscu. – mucin Jul 15 at 12:22
Serwis jest po prostu snapshotem z repo, więc (w niektórych miejscach) mam w crona wrzucone "svn up /katalog/", ze specjalnym użytkownikiem, który ma prawa tylko do odczytu. – Marcin Jul 16 at 11:14
1

Do synchronizacji plików przez FTP mam taki skrypt znaleziony w sieci:

#!/bin/bash

HOST="domena.net"
USER="borzole"
PASS="123hasło"
LCD="/folder/lokalny/"
RCD="/folder/na/serwerze"

# synchronizowana jest cała zawartość lokalnego folderu,
# Uwaga! jeśli pliku nie ma lokalnie, to usuwany jest również z serwera
lftp -c "set ftp:list-options -a;
open ftp://$USER:$PASS@$HOST;
lcd $LCD;
cd $RCD;
mirror --reverse \
       --delete \
       --verbose \
       --exclude-glob a-dir-to-exclude/ \
       --exclude-glob a-file-to-exclude \
       --exclude-glob a-file-group-to-exclude* \
       --exclude-glob other-files-to-esclude"
link|flag
0

Wygodne jest użycie rsync a do bazy danych - wygenerować dumpa struktury (bez danych) a potem wczytanie z polecenia mysql używając

source plik.sql

I działa.

link|flag
0

Przy upload(dzie) w WinSCF zaznacz "Tylko nowe lub aktualizowane pliki" jednak najwygodniejszy jest sposób który podał Marcin (pkt 2)

link|flag
0

Aktualizacja plików:

Najlepiej do trzymania kodu wykorzystać system kontroli wersji - przydaje się to nie tylko, gdy pracujesz w grupie. Najpopularniejszy jest aktualnie SVN, który oferuje coś takiego jak hook scripts.

EDIT: skrypt do update'u plików po commicie

Aktualizacja bazy danych:

Tutaj tak różowo niejest. Najlepszym znalezionym rozwiązaniem, które wymaga jednak poświęcenie czasu oraz dużej dyscypliny są migracje, wprowadzone w RoR oraz w najnowszej wersji symfony. Linki poniżej pomogą zrozumieć czym są właściwie migracje:

Konfiguracja:

Niekoniecznie w bazie, frameworki wprowadzają coś zwanego środowiskami, które ustawiane są jako np. zmienna środowiskowa systemu (lokalnie ustawiasz wartość np. 'dev', 'test' ..., na serwerze 'prod'. Na podstawie tej wartości wybierana jest wykorzystywana konfiguracja. Napisanie samemu takiego mechanizmu również nie nastręcza wielu problemów.

link|flag

Your Answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.