Python: Geavanceerde toepassingen
Verder gaan met uw Python-deployments
👋 Welkom bij de Stackhero-documentatie!
Stackhero biedt een kant-en-klare Python cloud oplossing die tal van voordelen biedt, waaronder:
- Implementeer uw applicatie in seconden met een eenvoudige
git push.- Gebruik uw eigen domeinnaam en profiteer van de automatische configuratie van HTTPS-certificaten voor verbeterde beveiliging.
- Geniet van gemoedsrust met automatische back-ups, updates met één klik, en eenvoudige, transparante en voorspelbare prijzen.
- Krijg optimale prestaties en robuuste beveiliging dankzij een privé en dedicated VM.
Bespaar tijd en vereenvoudig uw leven: het kost slechts 5 minuten om de Python cloud hosting oplossing van Stackhero te proberen!
Een andere branch dan main deployen
Tot nu toe hebben we het commando git push stackhero main gebruikt om de main branch naar productie te deployen.
Als u een andere branch moet deployen, kunt u dit commando gebruiken waarbij <BRANCH> de naam is van de branch die u wilt deployen:
git push stackhero <BRANCH>:main
Bijvoorbeeld, als u de production branch wilt deployen, voert u eenvoudig uit:
git push stackhero production:main
Een tag in plaats van een branch deployen
U kunt ervoor kiezen om een tag in plaats van een branch te deployen. Om een specifieke tag te deployen, vervangt u <TAG> door de gewenste tag in het onderstaande commando:
git push stackhero '<TAG>^{}:main'
Bijvoorbeeld, om de tag v1.0.0 te deployen, voert u uit:
git push stackhero 'v1.0.0^{}:main'
De
^{}syntax zorgt ervoor dat u de getagde commit pusht in plaats van de tagreferentie zelf.
Een specifieke commit deployen
Naast het deployen van branches of tags, kunt u ook een specifieke commit deployen door de hash te gebruiken. Vervang <COMMIT_HASH> door de hash van de commit die u wilt deployen:
git push -f stackhero <COMMIT_HASH>:main
Bijvoorbeeld, om de commit met de hash abcde te deployen, voert u uit:
git push -f stackhero abcde:main
Teruggaan naar een vorige versie
Als een recente deployment problemen heeft veroorzaakt, kunt u teruggaan naar een eerdere commit door die commit te deployen. Identificeer eerst de commit hash door het volgende uit te voeren:
git log
Dit commando toont de datum, hash en beschrijving van elke commit.
Bijvoorbeeld, de uitvoer kan er als volgt uitzien:
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
Als de huidige productie-deployment de commit "Break the code" is (hash beginnend met cccc), en u wilt teruggaan naar de vorige commit "Update the code" (hash beginnend met bbbb), voert u uit:
git push -f stackhero bbbb622301772072c3d82f3cc0d91e29e6e84901:main
Om te voorkomen dat u defecte code deployt en de stabiliteit van uw productie te verhogen, wordt sterk aanbevolen om een "staging" omgeving te hebben.
Gelegen tussen ontwikkeling en productie, biedt de staging-omgeving een bijna exacte kopie van de productie-setup. Het helpt u om uw code grondig te testen voordat u live gaat.
Het gebruik van staging verhoogt uw vertrouwen in de functionaliteit en prestaties van uw code, wat resulteert in een robuustere productie-deployment.
Dit type omgeving zal later in de documentatie worden besproken.
Een staging-omgeving opzetten
Een staging-omgeving is een best practice wanneer deze wordt gebruikt naast ontwikkelings- en productieomgevingen. Het repliceert de productieomgeving zodat u updates en wijzigingen kunt testen voordat u live gaat, waardoor het risico op problemen in productie wordt verminderd.
Een staging-omgeving moet de productieomgeving nauwkeurig weerspiegelen.
Het moet echter een gekloonde versie van uw productiedatabase of verbonden diensten gebruiken in plaats van de live productiedatabase.
Als uw Python-service afhankelijk is van databases of andere diensten, maak ze dan opnieuw aan in een nieuwe
<Project> - Stagingstack.
Volg deze stappen om een staging-omgeving met Stackhero op te zetten:
- Hernoem op het Stackhero-dashboard uw bestaande stack van
<Project>naar<Project> - Production. Bijvoorbeeld, als uw projectChat Botheet, wordt de stackChat Bot - Production. - Maak een nieuwe stack genaamd
<Project> - Staging. Voor hetChat Botproject wordt de stackChat Bot - Staging. - Start een Python-service binnen de staging-stack.
- Haal het
git remotecommando op en volg de instructies in de Deployen naar staging-omgeving documentatie.
Deze configuratie zorgt ervoor dat u een volledig functionele staging-omgeving heeft om updates te testen voordat u naar productie gaat.
Deployen naar staging-omgeving
Het wordt sterk aanbevolen om aparte staging- en productieomgevingen te onderhouden. Om meerdere omgevingen te beheren, begint u met het hernoemen van de huidige remote repository. Bijvoorbeeld, hernoem de remote stackhero naar stackhero-production met:
git remote rename stackhero stackhero-production
Maak vervolgens een nieuwe Python-service voor uw staging-omgeving. Haal het git remote add commando op en wijzig het door <XXXXXX> te vervangen door het domein van uw service:
-
Origineel commando:
git remote add stackhero ssh://stackhero@<XXXXXX>.stackhero-network.com:222/project.git -
Gewijzigd commando:
git remote add stackhero-staging ssh://stackhero@<XXXXXX>.stackhero-network.com:222/project.git
U kunt vervolgens naar beide omgevingen deployen met de volgende commando's:
-
Deployen naar staging:
git push stackhero-staging main -
Deployen naar productie:
git push stackhero-production main
Om het deploymentproces te verbeteren, raden we aan de verbeterde versie van Makefile te gebruiken.
Met deze verbeterde
Makefilewordt deployen naar productie of staging net zo eenvoudig als het uitvoeren vanmake deploy-productionofmake deploy-staging.
Verbeterde versie van Makefile
Hieronder staat een verbeterde Makefile die meerdere regels ondersteunt:
make dev(of gewoonmake): Start de applicatie in ontwikkelingsmodus.make deploy: Deploy de applicatie naar de remote genaamdstackhero. Dit werkt goed wanneer u een enkele Stackhero-instantie heeft.make deploy-production: Deploy de applicatie naar de remote genaamdstackhero-production.make deploy-staging: Deploy de applicatie naar de remote genaamdstackhero-staging.
Deze
Makefileis ontworpen om situaties te behandelen waarin de code niet is gewijzigd door de "Everything up-to-date" fout te vermijden.
Kopieer en plak de volgende inhoud als uw nieuwe Makefile:
# Standaardregel om uit te voeren bij het aanroepen van "make" zonder argument
.DEFAULT_GOAL := dev
# Stackhero voor Python zal de "run" regel op uw instantie uitvoeren.
# Dit is het commando om uit te voeren op zowel uw productie- als staging-omgevingen.
run:
ENV=production gunicorn app:app \
--error-logfile - \
-b 0.0.0.0:8080
# Het commando om te gebruiken in de ontwikkelingsomgeving
dev:
python app.py
# Regel "deploy" om te deployen naar de instantie "stackhero".
# Geschikt als u slechts één instantie heeft.
deploy:
@$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero DEPLOY_BRANCH=main
# De "deploy-*" regels deployen naar een instantie genaamd "stackhero-*".
# Bijvoorbeeld, het uitvoeren van "make deploy-production" deployt naar "stackhero-production",
# of "make deploy-staging" deployt naar "stackhero-staging".
deploy-%:
@$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero-$* DEPLOY_BRANCH=main
# Interne deploymentregel. Niet wijzigen.
deploy-script:
@echo "Deployen van branch \"${DEPLOY_BRANCH}\" naar \"${DEPLOY_REMOTE}\"..."
@echo
@if [ -n "$$(git status --porcelain)" ]; then \
echo "Kan niet deployen omdat er niet-gecommitte wijzigingen zijn:"; \
echo "\e[0m"; \
git status -s; \
echo ""; \
echo "\e[0;31m"; \
echo "U kunt dit commando gebruiken om de wijzigingen te committen:"; \
echo "git add -A . && git commit -m \"Uw bericht\""; \
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 "Niets nieuws om te deployen... Forceer deploy (dit zal een nieuwe commit maken)? (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 "Niets om te deployen!"; \
exit 1; \
;; \
esac \
fi
git push ${DEPLOY_REMOTE} ${DEPLOY_BRANCH}
Omgaan met geheimen (omgeving variabelen)
Op een gegeven moment moet u geheimen zoals tokens en wachtwoorden voor databases of externe diensten opslaan. Het is belangrijk om deze veilig op te slaan. Vermijd het direct in uw repository of code inbedden, omdat dit een aanzienlijk beveiligingsrisico vormt.
Het gebruik van omgevingsvariabelen biedt twee belangrijke voordelen:
- Uw geheimen worden nooit in uw Git-repository opgeslagen, waardoor het risico op ongeautoriseerde toegang wordt verminderd.
- U kunt verschillende referenties gebruiken voor verschillende omgevingen, zoals het gebruik van een productiedatabase in productie en een ontwikkelingsdatabase tijdens ontwikkeling.
Omgevingsvariabelen instellen voor ontwikkeling
In een ontwikkelingsomgeving maakt u een .env bestand aan in de root van uw project. Dit bestand moet worden uitgesloten van Git om ervoor te zorgen dat het nooit wordt gecommit.
Om het .env bestand automatisch te lezen, kunt u de python-dotenv module gebruiken:
pip install python-dotenv
pip freeze > requirements.txt
Maak vervolgens een .env bestand in de root van uw project en voeg uw variabelen toe:
ENV="development"
DATABASE_PASSWORD="secretPassword"
THIRD_API_PRIVATE_KEY="secretKey"
# ...
Zorg er ten slotte voor dat het .env bestand is uitgesloten van Git door het toe te voegen aan uw .gitignore:
echo ".env" >> .gitignore
Omgevingsvariabelen instellen voor staging en productie
Het .env bestand is niet veilig genoeg voor staging- en productieomgevingen. In plaats daarvan kunt u met Stackhero uw omgevingsvariabelen veilig opslaan in de configuratie van uw Python-service.
U kunt deze variabelen instellen op het Stackhero-dashboard door uw Python-service te selecteren en vervolgens op de knop "Configure" te klikken.
Python omgevingsvariabelen op Stackhero
Toegang tot omgevingsvariabelen in Python
Toegang tot omgevingsvariabelen in Python is eenvoudig. Gebruik gewoon os.environ.get() zoals hieronder getoond:
import os
print(os.environ.get('ENV'))
Bijvoorbeeld, verbinding maken met een Redis-server met behulp van een omgevingsvariabele kan als volgt worden gedaan:
import os
import redis
r = redis.from_url(os.environ.get("REDIS_URL"))
In een ontwikkelingsomgeving stelt u REDIS_URL in uw .env bestand in als volgt:
REDIS_URL="redis://localhost:6379"
Voor productie en staging definieert u REDIS_URL op het Stackhero-dashboard onder de configuratie van de Python-service:
REDIS_URL="rediss://default:<yourPassword>@<XXXXXX>.stackhero-network.com:6380"
Beheer van Python-pakketten
Het is een best practice om Python-pakketten te beheren met behulp van een requirements.txt bestand. Dit bestand bevat alle benodigde pakketten en hun versies om uw code betrouwbaar uit te voeren.
Het up-to-date houden van dit bestand zorgt ervoor dat:
- Alle vereiste pakketten zijn geïnstalleerd.
- Alleen compatibele pakketversies worden gebruikt.
Bij het deployen naar uw Stackhero-instantie worden de pakketten die in requirements.txt zijn gespecificeerd automatisch geïnstalleerd.
Om requirements.txt te genereren of bij te werken, voert u de volgende opdracht uit nadat u nieuwe pakketten hebt geïnstalleerd:
pip freeze > requirements.txt
Openen van UDP/TCP-poorten
De meeste Python-applicaties gebruiken HTTP-poorten 80 (HTTP) en 443 (HTTPS).
Als uw applicatie extra poorten moet openen of andere protocollen (TCP of UDP) gebruikt, kunt u de instelling "Ports Redirections" aanpassen in uw Python-service op het Stackhero-dashboard.
Voor elke extra poort specificeert u de invoerpoort (openbaar), de bestemmingspoort (gebruikt door uw Python-applicatie) en het protocol (TCP of UDP).
Poortomleidingen in het Stackhero-dashboard
Bestandsopslag
Voor het opslaan van bestanden zoals gebruikersfoto's of documenten is het over het algemeen het beste om een objectopslagoplossing te gebruiken.
Objectopslag stelt u in staat om bestanden te delen tussen meerdere diensten of instanties en scheidt uw opslag van uw code, volgens best practices.
We raden MinIO aan, een snelle en krachtige oplossing die compatibel is met het Amazon S3-protocol.
Als u de voorkeur geeft aan lokale bestandsopslag, kunt u de persistente opslag gebruiken die bij uw Python-instantie wordt geleverd, gelegen op /persistent/storage/. Deze aanpak wordt echter in de meeste gevallen niet aanbevolen.
WAARSCHUWING: Sla nooit gegevens op buiten de map
/persistent/storage/!Gegevens opslaan buiten deze map kan leiden tot gegevensverlies wanneer uw instantie opnieuw wordt opgestart, bijgewerkt of wanneer u nieuwe code pusht.
Apple/macOS: sla uw SSH privésleutel wachtwoord op
Op macOS kan het ongemakkelijk zijn om elke keer dat u uw code pusht het wachtwoord van uw SSH privésleutel in te voeren. Hoewel beveiliging van het grootste belang is, kunt u uw wachtwoord veilig opslaan met behulp van Apple's Sleutelhanger in plaats van het uit uw sleutel te verwijderen.
Om het wachtwoord voor een sleutel genaamd id_ed25519 op te slaan, voert u uit:
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
Hierna wordt u niet meer gevraagd om uw sleutelhangerwachtwoord in te voeren, wat tijd en moeite bespaart.
Als u in plaats daarvan een RSA-sleutel gebruikt, vervangt u
id_ed25519doorid_rsain het commando:ssh-add --apple-use-keychain ~/.ssh/id_rsa