Aula 5: Deployment

Docker

O docker serve para conteinerizar! Antes de colocar nosso app na internet, vamos testar o docker no nosso próprio computador.

Containerizando uma aplicação Django

Vamos assumir que já tenhamos um projeto django localizado na pasta projeto na raiz do projeto

Dockerfile:


    # syntax=docker/dockerfile:1
    FROM python:3.12
    ENV PYTHONDONTWRITEBYTECODE=1
    ENV PYTHONUNBUFFERED=1
    WORKDIR /code
    COPY requirements.txt /code/
    RUN pip install -r requirements.txt
    COPY . /code/
    

requirements.txt:


    Django==5.2.7
    psycopg[binary]==3.2.12
    

Já pensando em colocar as coisas online, vamos conectar o Django a um banco de produção, nesse caso o PostgreSQL

docker-compose.yaml:


    services:
      db:
        image: postgres
        volumes:
          - ./data/db:/var/lib/postgresql
        environment:
          - POSTGRES_DB=postgres
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=postgres
      web:
        build: .
        command: python projeto/manage.py runserver 0.0.0.0:8000
        volumes:
          - .:/code
        ports:
          - "8000:8000"
        environment:
          - PYTHONPATH=/code/projeto
          - POSTGRES_NAME=postgres
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=postgres
        depends_on:
          - db
    

Podemos agora montar e executar os containeres com:


    docker compose build
    docker compose up -d
    

Escondendo nossos segredos

.env:


    POSTGRES_NAME=banco
    POSTGRES_USER=usuario
    POSTGRES_PASSWORD=senha
    

docker-compose.yaml:


    services:
      db:
        image: postgres
        volumes:
          - ./data/db:/var/lib/postgresql
        environment:
          - POSTGRES_DB=${POSTGRES_NAME}
          - POSTGRES_USER=${POSTGRES_USER}
          - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      web:
        build: .
        command: python projeto/manage.py runserver 0.0.0.0:8000
        volumes:
          - .:/code
        ports:
          - "8000:8000"
        environment:
          - PYTHONPATH=/code/projeto
          - POSTGRES_DB=${POSTGRES_NAME}
          - POSTGRES_USER=${POSTGRES_USER}
          - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
        depends_on:
          - db
    

.gitignore:


    .venv
    .env
    data
    

Conectando o banco de dados

Agora conectamos ao banco de dados ao nosso aplicativo Django ajustando o settings.py:


    # settings.py

    import os

    [...]

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': os.environ.get('POSTGRES_NAME'),
            'USER': os.environ.get('POSTGRES_USER'),
            'PASSWORD': os.environ.get('POSTGRES_PASSWORD'),
            'HOST': 'db',
            'PORT': 5432,
        }
    }
    

Depois das últimas mudanças, podemos realizar o build dos conteineres e rodá-los novamente. Depois podemos criar as tabelas necessárias com o migrate


    docker compose build
    docker compose up -d
    docker compose run web python projeto/manage.py migrate
    docker compose run web python projeto/manage.py createsuperuser
    

Colocando em produção

Precisamos do uvicorn (ou outro ASGI)

requirements.txt:


    Django==5.2.7
    psycopg[binary]==3.2.12
    uvicorn
    

docker-compose.yaml:


    ...
    web:
      build: .
      command: uvicorn projeto.asgi:application --host 0.0.0.0 --port 8000 --reload
    ...
    

terminal:


    docker compose build
    docker compose up -d
    docker compose logs -f web