Python: Zaawansowane zastosowania
Dalsze kroki z wdrożeniami Python
👋 Witamy w dokumentacji Stackhero!
Stackhero oferuje gotowe do użycia rozwiązanie Python cloud, które zapewnia wiele korzyści, w tym:
- Wdrażaj swoją aplikację w kilka sekund za pomocą prostego
git push.- Używaj własnej nazwy domeny i korzystaj z automatycznej konfiguracji certyfikatów HTTPS dla zwiększonego bezpieczeństwa.
- Ciesz się spokojem dzięki automatycznym kopiom zapasowym, aktualizacjom jednym kliknięciem oraz prostemu, przejrzystemu i przewidywalnemu cennikowi.
- Uzyskaj optymalną wydajność i solidne zabezpieczenia dzięki prywatnej i dedykowanej VM.
Oszczędzaj czas i upraszczaj sobie życie: wypróbowanie rozwiązania Python cloud hosting Stackhero zajmuje tylko 5 minut!
Wdrażanie gałęzi innej niż main
Do tej pory używaliśmy polecenia git push stackhero main, aby wdrożyć gałąź main do produkcji.
Jeśli potrzebujesz wdrożyć inną gałąź, możesz użyć tego polecenia, gdzie <BRANCH> to nazwa gałęzi, którą chcesz wdrożyć:
git push stackhero <BRANCH>:main
Na przykład, jeśli chcesz wdrożyć gałąź production, po prostu uruchom:
git push stackhero production:main
Wdrażanie tagu zamiast gałęzi
Możesz wybrać wdrożenie tagu zamiast gałęzi. Aby wdrożyć konkretny tag, zamień <TAG> na żądany tag w poniższym poleceniu:
git push stackhero '<TAG>^{}:main'
Na przykład, aby wdrożyć tag v1.0.0, wykonaj:
git push stackhero 'v1.0.0^{}:main'
Składnia
^{}zapewnia, że przesyłasz oznaczony commit, a nie samą referencję tagu.
Wdrażanie konkretnego commitu
Oprócz wdrażania gałęzi lub tagów, możesz również wdrożyć konkretny commit, używając jego hash. Zamień <COMMIT_HASH> na hash commitu, który chcesz wdrożyć:
git push -f stackhero <COMMIT_HASH>:main
Na przykład, aby wdrożyć commit z hashem abcde, uruchom:
git push -f stackhero abcde:main
Cofanie do poprzedniej wersji
Jeśli ostatnie wdrożenie wprowadziło problemy, możesz cofnąć się do wcześniejszego commitu, wdrażając ten commit. Najpierw zidentyfikuj hash commitu, uruchamiając:
git log
To polecenie wyświetla datę, hash i opis każdego commitu.
Na przykład, wynik może wyglądać tak:
git log
commit cccc8b3ebdccb9abc1926ef49ee589dae5c5fe06 (HEAD -> main, stackhero/main)
Author: Developer
Date: Fri Apr 28 09:36:18 +0000
Break the code
commit bbbb622301772072c3d82f3cc0d91e29e6e84901
Author: Developer
Date: Wed Apr 26 12:49:28 +0000
Update the code
commit aaaa1d8b06535b413e0df8298ccf52339dfef3ff
Author: Developer
Date: Wed Apr 26 12:44:50 +0000
Improve the code
Jeśli obecne wdrożenie produkcyjne to commit "Break the code" (hash zaczynający się od cccc), a chcesz cofnąć się do poprzedniego commitu "Update the code" (hash zaczynający się od bbbb), wykonaj:
git push -f stackhero bbbb622301772072c3d82f3cc0d91e29e6e84901:main
Aby uniknąć wdrażania wadliwego kodu i zwiększyć stabilność produkcji, zaleca się posiadanie środowiska "staging".
Umieszczone między rozwojem a produkcją, środowisko staging zapewnia niemal identyczną replikę konfiguracji produkcyjnej. Pomaga dokładnie przetestować kod przed wdrożeniem na żywo.
Korzystanie ze staging zwiększa pewność co do funkcjonalności i wydajności kodu, co skutkuje bardziej solidnym wdrożeniem produkcyjnym.
Ten typ środowiska zostanie omówiony później w dokumentacji.
Konfigurowanie środowiska staging
Środowisko staging to najlepsza praktyka, gdy jest używane wraz z środowiskami rozwoju i produkcji. Replikuje środowisko produkcyjne, aby można było testować aktualizacje i zmiany przed ich wprowadzeniem na żywo, zmniejszając ryzyko problemów w produkcji.
Środowisko staging musi ściśle odzwierciedlać środowisko produkcyjne.
Jednak powinno używać sklonowanej wersji bazy danych produkcyjnej lub połączonych usług, a nie bazy danych produkcyjnej na żywo.
Jeśli Twoja usługa Python zależy od baz danych lub innych usług, odtwórz je w nowym stacku
<Project> - Staging.
Postępuj zgodnie z tymi krokami, aby skonfigurować środowisko staging z Stackhero:
- Na pulpicie nawigacyjnym Stackhero zmień nazwę istniejącego stacka z
<Project>na<Project> - Production. Na przykład, jeśli Twój projekt nazywa sięChat Bot, stack staje sięChat Bot - Production. - Utwórz nowy stack o nazwie
<Project> - Staging. Dla projektuChat Bot, stack staje sięChat Bot - Staging. - Uruchom usługę Python w stacku staging.
- Pobierz polecenie
git remotei postępuj zgodnie z instrukcjami w dokumentacji Wdrażanie do środowiska staging.
Ta konfiguracja zapewnia w pełni funkcjonalne środowisko staging do testowania aktualizacji przed wdrożeniem produkcyjnym.
Wdrażanie do środowiska staging
Zaleca się utrzymywanie oddzielnych środowisk staging i produkcji. Aby zarządzać wieloma środowiskami, zacznij od zmiany nazwy bieżącego zdalnego repozytorium. Na przykład, zmień nazwę zdalnego stackhero na stackhero-production za pomocą:
git remote rename stackhero stackhero-production
Następnie utwórz nową usługę Python dla środowiska staging. Pobierz polecenie git remote add i zmodyfikuj je, zastępując <XXXXXX> domeną Twojej usługi:
-
Oryginalne polecenie:
git remote add stackhero ssh://stackhero@<XXXXXX>.stackhero-network.com:222/project.git -
Zmodyfikowane polecenie:
git remote add stackhero-staging ssh://stackhero@<XXXXXX>.stackhero-network.com:222/project.git
Możesz następnie wdrażać do dowolnego środowiska, używając następujących poleceń:
-
Wdrażanie do staging:
git push stackhero-staging main -
Wdrażanie do produkcji:
git push stackhero-production main
Aby usprawnić proces wdrażania, sugerujemy korzystanie z ulepszonej wersji Makefile.
Dzięki temu ulepszonemu
Makefile, wdrażanie do produkcji lub staging staje się tak proste, jak uruchomieniemake deploy-productionlubmake deploy-staging.
Ulepszona wersja Makefile
Poniżej znajduje się ulepszony Makefile, który obsługuje wiele reguł:
make dev(lub po prostumake): Uruchamia aplikację w trybie deweloperskim.make deploy: Wdraża aplikację do zdalnego o nazwiestackhero. Działa dobrze, gdy masz jedną instancję Stackhero.make deploy-production: Wdraża aplikację do zdalnego o nazwiestackhero-production.make deploy-staging: Wdraża aplikację do zdalnego o nazwiestackhero-staging.
Ten
Makefilejest zaprojektowany do obsługi sytuacji, gdy kod się nie zmienił, unikając błędu "Everything up-to-date".
Skopiuj i wklej poniższą zawartość jako swój nowy Makefile:
# Domyślna reguła do wykonania przy wywołaniu "make" bez argumentu
.DEFAULT_GOAL := dev
# Stackhero dla Python wykona regułę "run" na Twojej instancji.
# To jest polecenie do uruchomienia w środowiskach produkcji i staging.
run:
ENV=production gunicorn app:app \
--error-logfile - \
-b 0.0.0.0:8080
# Polecenie do użycia w środowisku deweloperskim
dev:
python app.py
# Reguła "deploy" do wdrażania na instancji "stackhero".
# Odpowiednia, jeśli masz tylko jedną instancję.
deploy:
@$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero DEPLOY_BRANCH=main
# Reguły "deploy-*" wdrażają na instancję o nazwie "stackhero-*".
# Na przykład, uruchomienie "make deploy-production" wdraża na "stackhero-production",
# lub "make deploy-staging" wdraża na "stackhero-staging".
deploy-%:
@$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero-$* DEPLOY_BRANCH=main
# Wewnętrzna reguła wdrażania. Nie modyfikuj jej.
deploy-script:
@echo "Wdrażanie gałęzi \"${DEPLOY_BRANCH}\" do \"${DEPLOY_REMOTE}\"..."
@echo
@if [ -n "$$(git status --porcelain)" ]; then \
echo "Nie można wdrożyć, ponieważ są niezatwierdzone zmiany:"; \
echo "\e[0m"; \
git status -s; \
echo ""; \
echo "\e[0;31m"; \
echo "Możesz użyć tego polecenia, aby zatwierdzić zmiany:"; \
echo "git add -A . && git commit -m \"Twoja wiadomość\""; \
echo "\e[0m"; \
exit 1; \
fi
@git push --dry-run ${DEPLOY_REMOTE} ${DEPLOY_BRANCH} 2>&1 | grep -q -F "Everything up-to-date"; \
EXIT_CODE=$$?; \
if [ $$EXIT_CODE -eq 0 ]; then \
echo -n "Nic nowego do wdrożenia... Wymusić wdrożenie (to stworzy nowy commit)? (y/N) "; \
read answer && \
case $$answer in \
y|Y|yes|YES) \
git commit --allow-empty -m "Force update for deploy purpose to \"${DEPLOY_REMOTE}\"" ; \
;; \
*) \
echo "Nic do wdrożenia!"; \
exit 1; \
;; \
esac \
fi
git push ${DEPLOY_REMOTE} ${DEPLOY_BRANCH}
Zarządzanie sekretami (zmienne środowiskowe)
W pewnym momencie będziesz musiał przechowywać sekrety, takie jak tokeny i hasła do baz danych lub usług zewnętrznych. Ważne jest, aby przechowywać je bezpiecznie. Unikaj osadzania ich bezpośrednio w repozytorium lub kodzie, ponieważ stwarza to znaczne ryzyko bezpieczeństwa.
Używanie zmiennych środowiskowych oferuje dwa kluczowe korzyści:
- Twoje sekrety nigdy nie są przechowywane w repozytorium Git, co zmniejsza ryzyko nieautoryzowanego dostępu.
- Możesz używać różnych poświadczeń dla różnych środowisk, na przykład używając bazy danych produkcyjnej w produkcji i bazy danych deweloperskiej podczas rozwoju.
Konfigurowanie zmiennych środowiskowych dla rozwoju
W środowisku deweloperskim utwórz plik .env w katalogu głównym projektu. Ten plik powinien być wykluczony z Git, aby upewnić się, że nigdy nie zostanie zatwierdzony.
Aby automatycznie odczytać plik .env, możesz użyć modułu python-dotenv:
pip install python-dotenv
pip freeze > requirements.txt
Następnie utwórz plik .env w katalogu głównym projektu i dodaj swoje zmienne:
ENV="development"
DATABASE_PASSWORD="secretPassword"
THIRD_API_PRIVATE_KEY="secretKey"
# ...
Na koniec upewnij się, że plik .env jest wykluczony z Git, dodając go do .gitignore:
echo ".env" >> .gitignore
Konfigurowanie zmiennych środowiskowych dla staging i produkcji
Plik .env nie jest wystarczająco bezpieczny dla środowisk staging i produkcji. Zamiast tego, Stackhero pozwala na bezpieczne przechowywanie zmiennych środowiskowych bezpośrednio w konfiguracji usługi Python.
Możesz ustawić te zmienne na pulpicie nawigacyjnym Stackhero, wybierając swoją usługę Python, a następnie klikając przycisk "Configure".
Zmienne środowiskowe Python na Stackhero
Dostęp do zmiennych środowiskowych w Python
Dostęp do zmiennych środowiskowych w Python jest prosty. Po prostu użyj os.environ.get(), jak pokazano poniżej:
import os
print(os.environ.get('ENV'))
Na przykład, połączenie z serwerem Redis przy użyciu zmiennej środowiskowej można wykonać w ten sposób:
import os
import redis
r = redis.from_url(os.environ.get("REDIS_URL"))
W środowisku deweloperskim ustaw REDIS_URL w pliku .env w następujący sposób:
REDIS_URL="redis://localhost:6379"
Dla produkcji i staging, zdefiniuj REDIS_URL na pulpicie nawigacyjnym Stackhero w konfiguracji usługi Python:
REDIS_URL="rediss://default:<yourPassword>@<XXXXXX>.stackhero-network.com:6380"
Zarządzanie pakietami Python
Zaleca się zarządzanie pakietami Python za pomocą pliku requirements.txt. Ten plik wymienia wszystkie niezbędne pakiety i ich wersje, aby niezawodnie uruchomić Twój kod.
Utrzymywanie tego pliku w aktualności zapewnia:
- Wszystkie wymagane pakiety są zainstalowane.
- Używane są tylko kompatybilne wersje pakietów.
Podczas wdrażania na instancję Stackhero, pakiety określone w requirements.txt są automatycznie instalowane.
Aby wygenerować lub zaktualizować requirements.txt, uruchom następujące polecenie po zainstalowaniu nowych pakietów:
pip freeze > requirements.txt
Otwieranie portów UDP/TCP
Większość aplikacji Python używa portów HTTP 80 (HTTP) i 443 (HTTPS).
Jeśli Twoja aplikacja musi otworzyć dodatkowe porty lub używa innych protokołów (TCP lub UDP), możesz dostosować ustawienie "Ports Redirections" w swojej usłudze Python na pulpicie nawigacyjnym Stackhero.
Dla każdego dodatkowego portu określ port wejściowy (publiczny), port docelowy (używany przez Twoją aplikację Python) i protokół (TCP lub UDP).
Przekierowania portów na pulpicie nawigacyjnym Stackhero
Przechowywanie plików
Do przechowywania plików, takich jak zdjęcia użytkowników lub dokumenty, najlepiej jest używać rozwiązania do przechowywania obiektów.
Przechowywanie obiektów pozwala na udostępnianie plików między wieloma usługami lub instancjami i oddziela przechowywanie od kodu, zgodnie z najlepszymi praktykami.
Polecamy MinIO, szybkie i potężne rozwiązanie kompatybilne z protokołem Amazon S3.
Jeśli wolisz lokalne przechowywanie plików, możesz użyć trwałego przechowywania dostarczonego z Twoją instancją Python, znajdującego się w /persistent/storage/. Jednak ta metoda nie jest zalecana w większości przypadków.
UWAGA: Nigdy nie przechowuj danych poza folderem
/persistent/storage/!Przechowywanie danych poza tym folderem może prowadzić do utraty danych podczas ponownego uruchamiania, aktualizacji instancji lub przesyłania nowego kodu.
Apple/macOS: zapisywanie hasła do prywatnego klucza SSH
Na macOS może być niewygodne wpisywanie hasła do prywatnego klucza SSH za każdym razem, gdy przesyłasz kod. Chociaż bezpieczeństwo jest najważniejsze, możesz bezpiecznie zapisać swoje hasło, używając Keychain Apple, zamiast usuwać je z klucza.
Aby zapisać hasło do klucza o nazwie id_ed25519, wykonaj:
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
Po tym nie będziesz proszony o hasło do klucza, co oszczędza czas i wysiłek.
Jeśli używasz klucza RSA zamiast tego, zamień
id_ed25519naid_rsaw poleceniu:ssh-add --apple-use-keychain ~/.ssh/id_rsa