Göm menyn

TDDD80 Projekt: Mobila och sociala applikationer

Laboration S3: Hosting


Syfte

I denna laboration ska ni flytta er labb-applikation så att den kör på en extern server. På den externa servern ska ni använda en PostgreSQL-databas.

Genomförande

Första steget i laborationen är att utforska (Googla) och skriftligt förklara viktiga grundbegrepp. Det är viktigt att ni för varje svar lägger med de URL:er (länkar) som ni har bedömt vara trovärdiga och som ni har använt för att sammanställa ert svar. (Svaren lämnas in i README-fil i Gitlab, tillsammans med labb-koden):

  1. Vad är Azure för typ av tjänst?
  2. Varför rekommenderas ni köra en annan typ av databas än SQLite, dvs. vad finns det för fördelar med att köra PostgreSQL istället för SQLite på Azure?
  3. Att genomföra under/efter laborationen: Redogör för något begrepp/problem som ni har behövt googla på under arbetet med labb3 (inkludera länk(ar) till de svar som ni tyckte var mest informativa).

Laborationen genomförs i par. Ni ansvarar själva för att installera nödvändig programvara för att utveckla med Python+Flask+SQLAlchemy+PostgreSQL, samt enhetstestning med code coverage.

Uppstart

Ladda de programmoduler som används i kursen genom att skriva följande (om ni har gjort initadd tidigare, kan ni hoppa över detta steg):

  • module initadd courses/TDDD80

Eller, för att bara få Azure command line interface (CLI):

  • module initadd prog/azure-cli/4.22.1

Starta en terminal och ställ dig i er labbmapp. Skriv sedan följande:

  • >> source my_env/bin/activate

Starta PyCharm:

  • >> pycharm.sh

SQLite ska även i fortsättningen användas som databas lokalt, men PostgreSQL ska användas när applikationen körs på deploymentservern.

Krav

Utöver kraven från laboration 1 och 2 ska ni uppfylla följande

  • På Azure ska en PostgreSQL-databas användas
  • Lokalt ska en SQLite-databas användas
  • Koden ska fungera både lokalt och på Azure utan förändringar
  • Glöm inte att pusha er kod till gitlab för redovisning av labbarna.

Steg för att komma igång med Azure

Förbered den egna miljön

  • Öppna ett terminalfönster, ställ er i projektets rotmapp (där ert lokala git finns), och aktivera ert virtual environment. Installera sedan följande (psycopg2 behövs för att SQLAlchemy ska kunna koppla till PostgreSQL):
    >> pip install psycopg2-binary
    >> pip freeze | grep -v "pkg-resources" >| requirements.txt
    (requirements.txt kommer att läsas av Azure för att återskapa er miljö i molnet. Vi vill dock inte ha med pkg-resources--vilket vi inte heller använder.)
  • Redigera requirements.txt-filen och att ta bort versionsnummer på de bibliotek som listas i filen. På det här sättet kommer Azure fritt kunna matcha biblioteksversioner med vald python-version, så att allt kan arbeta i samklang på deploymentservern.

Förbered den egna koden

  • Lägg till följande kod i er config.py eller data_handler.py (eller i motsvarande fil där ni normalt pekar ut er databas):
    if "AZURE_POSTGRESQL_CONNECTIONSTRING" in os.environ:
        conn = os.environ["AZURE_POSTGRESQL_CONNECTIONSTRING"]
        values = dict(x.split("=") for x in conn.split(' '))
        user = values['user']
        host = values['host']
        database = values['dbname']
        password = values['password']
        db_uri = f'postgresql+psycopg2://{user}:{password}@{host}/{database}'
        app.config['SQLALCHEMY_DATABASE_URI'] = db_uri 
        debug_flag = False
    else: # when running locally: use sqlite
        db_path = os.path.join(os.path.dirname(__file__), 'app.db')
        db_uri = f'sqlite:///{db_path}'
        debug_flag = True
    

Skapa studentkonto på Azure

  • Gå in på minit.liu.se. Där får ni tillgång till länken för Microsoft Devtools. I Microsoft Devtools kan ni skapa ett Azure-konto.
  • Se sedan till att få en viss mängd krediter ($100).
  • Vänta tålmodigt på att krediterna aktiveras. Det kan ta uppemot 5 minuter.

Sätt upp Azure

  • När du är inloggad, skriv "web app database" i sökrutan längst upp i Azure portalen. När du får upp resultaten, titta under Marketplace, och välj Web App + Database under Marketplace. Får du inte några Marketplace sökresultat, vänta tålmodigt på att dina krediter ska aktiveras. Försök igen efter några minuter, med att skriva "web app database" i sökrutan.
  • På 'Create web app + database' sidan, ange följande. (Ersätt 'tddd80-labs3-rmk' med ett eget unikt namn. Ange 'Name' först, så kommer 'Resource-group', etc. att namnges automatiskt utifrån app-namnet ni angett. Runtime-stack bör matcha det python ni använder i projektet. Hosting plan ska vara 'Basic').



  • Klicka vidare, och klicka till slut på Create.
  • Vänta en låååång stund.
  • När appen skapats, klicka på Configuration i navigations-fältet, och lägg till denna variabel till er webapp konfiguration (denna behövs så att er requirements.txt läses, biblioteken som listas där laddas in, och er webapp byggs (kompileras och biblioteken länkas in) när ni kör igång appen från er lokala dator via Azure CLI (se nedan steg). För vidare detaljer: denna dokumentation):

Kör igång er kod på Azure

az webapp up

  • På den lokala datorn: Ställ er i den mapp där er kod ligger, dvs. i projektets topp-mapp (där också .git filen bör ligga). Skriv sedan följande (man måste logga in via terminal, dvs. via Azure CLI--Command Line Interface, för att senare kunna lägga upp sin kod i Azure från sin lokala mapp. Azure kommer att hämta kod direkt från mappen, inte från ert lokala repo):
    >> az login
    >> az webapp up --name [ert webapp-namn på Azure] --resource-group [ert group-namn på Azure]
    
    Azure kommer ihåg name och resource-group för denna projektmapp, så vid efterföljande anrop räcker det att skriva:
    >> az webapp up
    

git push

  • Ett alternativt sätt att köra igång sin kod på Azure är att använda git push från ert lokala repo. Fördelen är ni kommer att kunna pusha båda två, inte bara den som skapat Azure webappen.
    • Ställ in local git på er webapp (Deployment Center > Settings > Source = Local Git):



    • Läs av git clone URL, och app credentials under fliken Local Git/FTPS Credentials. Användarnamnet är det som börjar med $, i exemplet nedan: "$tddd80-labs3-rmk". Användarnamn och lösenord kommer ni att använda för att logga in när ni vill pusha er kod till Azure:



    • Ni kommer att skapa en git remote på er dator, så ni kommer att ha två remotes i ert lokala repo, en som heter azure (eller liknande) och en som (förmodligen) heter origin. Ni kommer alltså även fortsättningsvis pusha till origin för att få upp er kod till LiU-gitlab. Vill ni vara supertydliga, kan ni döpa om origin till, t.ex. liu, genom att i er lokala projektmapp skriva kommandot:
      >> git remote rename origin liu
      
      I er lokala projektmapp, lägg till en remote till er git (och döp den till azure eller liknande)
      >> git remote add azure [URL till Azure repot, dvs. Git Clone Uri i Azure panelen]
      
    • Ni kan nu pusha till azure genom:
      >> git push azure main:master
      
      Deployment branch på Azure är master, så om ert lokala repo branch heter main, måste ni explicit ange att main ska mappas på master, genom att skriva main:master.
    • Ni kommer att bli ombedda att logga in. Använd användarnamn och lösenord som ni läste av från Azure credentials. Om ni vill slippa skriva dessa vid varje push, kolla på kommandot 'git config --global credential.helper store' Notera att namn och lösenord kommer att sparas som text, fullt läsbar för den som kan öppna filen ~/.git-credentials

    Håll koll under körning

    • I CLI (Command Line Interface, dvs. i lokal terminal):
      >> az webapp log tail
      

    Databasen

    • Kolla om databasen är uppe: Klicka på SSH under Development tools i vänstra nav-fältet i Azure Home > [er webapp]-skärm. I ssh-terminalen, skriv följande för att få upp en lokal miljö där flask kommandon kan köras med er webapp som kontext:
      >> flask shell
      >> db
      
    • För att skapa er databas på Azure, skriv i flask shell i SSH-terminalen på Azure:
      >> db.create_all()

    Resurser

    Azure CLI commands

    Tutorial: Deploy a Python (Django or Flask) web app with PostgreSQL in Azure

    Quickstart: Deploy a Python (Django or Flask) web app to Azure App Service


    Nå Azure direkt från VSCode

    Använder du VSCode kan du direkt från IDE:n komma åt Azure. Du måste dock först ha installerat Azure Tools, som är en extension till VSCode.

    Du kan då skapa ett Azure for students-konto, etc. direkt från VSCode.

    När du väl är inloggad, har du direkttillgång till en Azure-panel.

    Redovisa

    1. Muntligt redovisa/demonstrera er laboration för en assistent (körning på Azure samt tester med coverage lokalt)
    2. Ladda upp söknings-svaren inkl. länkar (i README-fil), samt er kod (alla relevanta filer för labben) (gärna kontinuerligt) till ert gitlab-projekt
    3. Lägg till er assistent som Reporter på ert projekt
    4. Meddela er assistent att ni lagt upp koden genom att skicka ett mejl. Märk mejlet med TDDD80: Labb S3, och se till att det finns en länk till repot i mejlet. Skicka även med en länk till er Azure-applikation.


    Sidansvarig: Rita Kovordanyi
    Senast uppdaterad: 2024-02-11