Python: Išplėstiniai naudojimo būdai

Toliau su jūsų Python diegimais

👋 Sveiki atvykę į Stackhero dokumentaciją!

Stackhero siūlo paruoštą naudoti Python cloud sprendimą, kuris suteikia daugybę privalumų, įskaitant:

  • Įdiekite savo programą per kelias sekundes su paprastu git push.
  • Naudokite savo domeno vardą ir pasinaudokite automatinės HTTPS sertifikatų konfigūracijos privalumais, kad padidintumėte saugumą.
  • Mėgaukitės ramybe su automatinėmis atsarginėmis kopijomis, vieno paspaudimo atnaujinimais ir paprasta, skaidria bei prognozuojama kainodara.
  • Gaukite optimalią veikimo ir tvirtą saugumo lygį dėka privačios ir dedikuotos VM.

Taupykite laiką ir supaprastinkite savo gyvenimą: išbandyti Stackhero Python cloud hosting sprendimą užtrunka tik 5 minutes!

Iki šiol naudojome komandą git push stackhero main, kad diegtume main šaką į gamybą.

Jei reikia diegti kitą šaką, galite naudoti šią komandą, kur <BRANCH> yra šakos, kurią norite diegti, pavadinimas:

git push stackhero <BRANCH>:main

Pavyzdžiui, jei norite diegti production šaką, tiesiog vykdykite:

git push stackhero production:main

Galite pasirinkti diegti žymą, o ne šaką. Norėdami diegti konkrečią žymą, pakeiskite <TAG> į norimą žymą šioje komandoje:

git push stackhero '<TAG>^{}:main'

Pavyzdžiui, norėdami diegti žymą v1.0.0, vykdykite:

git push stackhero 'v1.0.0^{}:main'

^{} sintaksė užtikrina, kad jūs stumiate pažymėtą commit'ą, o ne pačią žymos nuorodą.

Be šakų ar žymų diegimo, galite taip pat diegti konkretų commit'ą naudodami jo hash. Pakeiskite <COMMIT_HASH> į commit'o, kurį norite diegti, hash:

git push -f stackhero <COMMIT_HASH>:main

Pavyzdžiui, norėdami diegti commit'ą su hash abcde, vykdykite:

git push -f stackhero abcde:main

Jei neseniai atliktas diegimas sukėlė problemų, galite grįžti prie ankstesnio commit'o diegdami tą commit'ą. Pirmiausia, nustatykite commit'o hash vykdydami:

git log

Ši komanda rodo kiekvieno commit'o datą, hash ir aprašymą.

Pavyzdžiui, išvestis gali atrodyti taip:

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

Jei dabartinis gamybos diegimas yra commit'as "Break the code" (hash prasideda cccc), ir norite grįžti prie ankstesnio commit'o "Update the code" (hash prasideda bbbb), vykdykite:

git push -f stackhero bbbb622301772072c3d82f3cc0d91e29e6e84901:main

Norint išvengti klaidingo kodo diegimo ir padidinti gamybos stabilumą, labai rekomenduojama turėti "staging" aplinką.

Esanti tarp kūrimo ir gamybos, staging aplinka suteikia beveik identišką gamybos konfigūraciją. Ji padeda kruopščiai išbandyti jūsų kodą prieš tiesioginį diegimą.

Naudojant staging padidėja pasitikėjimas jūsų kodo funkcionalumu ir našumu, todėl gamybos diegimas tampa patikimesnis.

Šio tipo aplinka bus aptarta vėliau dokumentacijoje.

Staging aplinka yra geriausia praktika, kai ji naudojama kartu su kūrimo ir gamybos aplinkomis. Ji atkartoja gamybos aplinką, kad galėtumėte išbandyti atnaujinimus ir pakeitimus prieš juos įgyvendinant, taip sumažinant problemų riziką gamyboje.

Staging aplinka turi glaudžiai atitikti gamybos aplinką.

Tačiau ji turėtų naudoti klonuotą jūsų gamybos duomenų bazės ar prijungtų paslaugų versiją, o ne tiesioginę gamybos duomenų bazę.

Jei jūsų Python paslauga priklauso nuo duomenų bazių ar kitų paslaugų, atkurkite jas naujame <Project> - Staging stack'e.

Vykdykite šiuos veiksmus, kad nustatytumėte staging aplinką su Stackhero:

  1. Stackhero prietaisų skydelyje pervadinkite esamą stack'ą iš <Project> į <Project> - Production. Pavyzdžiui, jei jūsų projektas vadinasi Chat Bot, stack'as tampa Chat Bot - Production.
  2. Sukurkite naują stack'ą pavadinimu <Project> - Staging. Projektui Chat Bot, stack'as tampa Chat Bot - Staging.
  3. Pradėkite Python paslaugą staging stack'e.
  4. Gaukite git remote komandą ir vykdykite instrukcijas dokumentacijoje Diegimas į staging aplinką.

Ši konfigūracija užtikrina, kad turite visiškai funkcionalią staging aplinką, skirtą atnaujinimų testavimui prieš gamybos diegimą.

Labai rekomenduojama palaikyti atskiras staging ir gamybos aplinkas. Norėdami valdyti kelias aplinkas, pradėkite pervadindami dabartinį nuotolinį saugyklą. Pavyzdžiui, pervadinkite nuotolinį stackhero į stackhero-production su:

git remote rename stackhero stackhero-production

Tada sukurkite naują Python paslaugą savo staging aplinkai. Gaukite git remote add komandą ir pakeiskite ją, pakeisdami <XXXXXX> į jūsų paslaugos domeną:

  • Originali komanda:

    git remote add stackhero ssh://stackhero@<XXXXXX>.stackhero-network.com:222/project.git
    
  • Pakeista komanda:

    git remote add stackhero-staging ssh://stackhero@<XXXXXX>.stackhero-network.com:222/project.git
    

Tada galite diegti į bet kurią aplinką naudodami šias komandas:

  • Diegti į staging:

    git push stackhero-staging main
    
  • Diegti į gamybą:

    git push stackhero-production main
    

Norėdami pagerinti diegimo procesą, siūlome naudoti patobulintą Makefile versiją.

Su šiuo patobulintu Makefile, diegimas į gamybą ar staging tampa toks paprastas, kaip vykdyti make deploy-production arba make deploy-staging.

Žemiau pateikiamas patobulintas Makefile, kuris palaiko kelias taisykles:

  • make dev (arba tiesiog make): Paleidžia programą kūrimo režimu.
  • make deploy: Diegia programą į nuotolinį pavadinimu stackhero. Tai gerai veikia, kai turite vieną Stackhero instanciją.
  • make deploy-production: Diegia programą į nuotolinį pavadinimu stackhero-production.
  • make deploy-staging: Diegia programą į nuotolinį pavadinimu stackhero-staging.

Šis Makefile yra sukurtas tvarkyti situacijas, kai kodas nepasikeitė, išvengiant klaidos "Everything up-to-date".

Nukopijuokite ir įklijuokite šį turinį kaip savo naują Makefile:

# Taisyklė, kuri vykdoma pagal nutylėjimą, kai "make" kviečiamas be argumento
.DEFAULT_GOAL := dev


# Stackhero Python vykdys "run" taisyklę jūsų instancijoje.
# Tai komanda, kurią reikia vykdyti tiek gamybos, tiek staging aplinkose.
run:
  ENV=production gunicorn app:app \
    --error-logfile - \
    -b 0.0.0.0:8080


# Komanda, kurią reikia naudoti kūrimo aplinkoje
dev:
  python app.py


# Taisyklė "deploy" diegti į instanciją "stackhero".
# Tinka, jei turite tik vieną instanciją.
deploy:
  @$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero DEPLOY_BRANCH=main


# "deploy-*" taisyklės diegia į instanciją pavadinimu "stackhero-*".
# Pavyzdžiui, vykdant "make deploy-production" diegiama į "stackhero-production",
# arba "make deploy-staging" diegiama į "stackhero-staging".
deploy-%:
  @$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero-$* DEPLOY_BRANCH=main


# Vidinė diegimo taisyklė. Nemodifikuokite jos.
deploy-script:
  @echo "Diegiama šaka \"${DEPLOY_BRANCH}\" į \"${DEPLOY_REMOTE}\"..."
  @echo

  @if [ -n "$$(git status --porcelain)" ]; then \
    echo "Negalima diegti, nes yra neįsipareigojusių pakeitimų:"; \
    echo "\e[0m"; \
    git status -s; \
    echo ""; \
    echo "\e[0;31m"; \
    echo "Galite naudoti šią komandą pakeitimams įsipareigoti:"; \
    echo "git add -A . && git commit -m \"Jūsų žinutė\""; \
    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 "Nieko naujo diegti... Priverstinis diegimas (tai sukurs naują commit'ą)? (y/N) "; \
    read answer && \
    case $$answer in \
      y|Y|yes|YES) \
      git commit --allow-empty -m "Priverstinis atnaujinimas diegimo tikslu į \"${DEPLOY_REMOTE}\"" ; \
      ;; \
    *) \
      echo "Nieko diegti!"; \
      exit 1; \
      ;; \
    esac \
  fi

  git push ${DEPLOY_REMOTE} ${DEPLOY_BRANCH}

Tam tikru momentu jums reikės saugoti slaptus duomenis, tokius kaip tokenai ir slaptažodžiai duomenų bazėms ar trečiųjų šalių paslaugoms. Svarbu juos saugoti saugiai. Venkite jų tiesioginio įterpimo į savo saugyklą ar kodą, nes tai sukelia didelę saugumo riziką.

Aplinkos kintamųjų naudojimas suteikia du pagrindinius privalumus:

  1. Jūsų slapti duomenys niekada nėra saugomi jūsų Git saugykloje, sumažinant neteisėtos prieigos riziką.
  2. Galite naudoti skirtingus prisijungimus įvairioms aplinkoms, pavyzdžiui, naudoti gamybos duomenų bazę gamyboje ir kūrimo duomenų bazę kūrimo metu.

Kūrimo aplinkoje sukurkite .env failą savo projekto šaknyje. Šis failas turi būti neįtrauktas į Git, kad būtų užtikrinta, jog jis niekada nebus įsipareigotas.

Norėdami automatiškai skaityti .env failą, galite naudoti python-dotenv modulį:

pip install python-dotenv
pip freeze > requirements.txt

Tada sukurkite .env failą savo projekto šaknyje ir pridėkite savo kintamuosius:

ENV="development"
DATABASE_PASSWORD="secretPassword"
THIRD_API_PRIVATE_KEY="secretKey"
# ...

Galiausiai, užtikrinkite, kad .env failas būtų neįtrauktas į Git, pridėdami jį prie .gitignore:

echo ".env" >> .gitignore

.env failas nėra pakankamai saugus staging ir gamybos aplinkoms. Vietoj to, Stackhero leidžia saugiai saugoti jūsų aplinkos kintamuosius tiesiogiai jūsų Python paslaugos konfigūracijoje.

Galite nustatyti šiuos kintamuosius Stackhero prietaisų skydelyje, pasirinkdami savo Python paslaugą ir tada spustelėdami mygtuką "Configure".

Python aplinkos kintamieji StackheroPython aplinkos kintamieji Stackhero

Aplinkos kintamųjų pasiekimas Python yra paprastas. Tiesiog naudokite os.environ.get(), kaip parodyta žemiau:

import os

print(os.environ.get('ENV'))

Pavyzdžiui, prisijungimas prie Redis serverio naudojant aplinkos kintamąjį gali būti atliekamas taip:

import os
import redis

r = redis.from_url(os.environ.get("REDIS_URL"))

Kūrimo aplinkoje nustatykite REDIS_URL savo .env faile taip:

REDIS_URL="redis://localhost:6379"

Gamybai ir staging, nustatykite REDIS_URL Stackhero prietaisų skydelyje pagal Python paslaugos konfigūraciją:

REDIS_URL="rediss://default:<yourPassword>@<XXXXXX>.stackhero-network.com:6380"

Rekomenduojama valdyti Python paketus naudojant requirements.txt failą. Šis failas išvardija visus reikalingus paketus ir jų versijas, kad jūsų kodas veiktų patikimai.

Laikant šį failą atnaujintą užtikrinama:

  1. Visi reikalingi paketai yra įdiegti.
  2. Naudojamos tik suderinamos paketų versijos.

Diegiant į savo Stackhero instanciją, paketai, nurodyti requirements.txt, yra automatiškai įdiegiami.

Norėdami sugeneruoti arba atnaujinti requirements.txt, vykdykite šią komandą po naujų paketų įdiegimo:

pip freeze > requirements.txt

Dauguma Python programų naudoja HTTP portus 80 (HTTP) ir 443 (HTTPS).

Jei jūsų programa turi atidaryti papildomus portus arba naudoja kitus protokolus (TCP ar UDP), galite koreguoti "Ports Redirections" nustatymą savo Python paslaugoje Stackhero prietaisų skydelyje.

Kiekvienam papildomam portui nurodykite įėjimo portą (viešai matomą), paskirties portą (naudojamą jūsų Python programos) ir protokolą (TCP ar UDP).

Portų nukreipimai Stackhero prietaisų skydelyjePortų nukreipimai Stackhero prietaisų skydelyje

Failams, tokiems kaip naudotojų nuotraukos ar dokumentai, saugoti paprastai geriausia naudoti objektų saugojimo sprendimą.

Objektų saugojimas leidžia dalintis failais tarp kelių paslaugų ar instancijų ir atskiria jūsų saugojimą nuo jūsų kodo, laikantis geriausių praktikų.

Rekomenduojame MinIO, greitą ir galingą sprendimą, suderinamą su Amazon S3 protokolu.

Jei pageidaujate vietinio failų saugojimo, galite naudoti nuolatinį saugojimą, pateiktą su jūsų Python instancija, esančią /persistent/storage/. Tačiau šis požiūris daugeliu atvejų nerekomenduojamas.

ĮSPĖJIMAS: Niekada nesaugokite duomenų už /persistent/storage/ aplanko ribų!

Duomenų saugojimas už šio aplanko ribų gali sukelti duomenų praradimą, kai jūsų instancija yra paleidžiama iš naujo, atnaujinama arba kai stumiate naują kodą.

macOS sistemoje gali būti nepatogu kiekvieną kartą įvesti savo SSH privačios rakto slaptažodį, kai stumiate savo kodą. Nors saugumas yra svarbiausias, galite saugiai išsaugoti savo slaptažodį naudodami Apple Keychain, o ne pašalindami jį iš savo rakto.

Norėdami išsaugoti rakto, pavadinto id_ed25519, slaptažodį, vykdykite:

ssh-add --apple-use-keychain ~/.ssh/id_ed25519

Po to jums nebereikės įvesti savo rakto slaptažodžio, taupant laiką ir pastangas.

Jei naudojate RSA raktą vietoj to, pakeiskite id_ed25519 į id_rsa komandoje:

ssh-add --apple-use-keychain ~/.ssh/id_rsa