Перейти до змісту

Development Workflow

Практичний гід по щоденній роботі з production стеком notes_chat_app. Цей розділ містить унікальний контент: реальні workflows, debug tips і корисні команди.


Типовий workflow: перший запуск

# 1. Скопіювати конфігурацію:
cp .env.example .env

# 2. Відредагувати .env:
#   - SECRET_KEY  — згенеруй (інструкція нижче)
#   - NGROK_AUTHTOKEN — з https://dashboard.ngrok.com/authtokens
#   - NGROK_DOMAIN — з https://dashboard.ngrok.com/domains
#   - SEED_DEMO_DATA=1 — щоб одразу мати демо-дані

# 3. Збілдити і запустити:
docker compose up --build
# --build: перезбирає образ (потрібно при першому запуску або зміні Dockerfile/requirements)

# 4. Переконатись що все піднялось:
docker compose ps

# 5. Відкрити застосунок:
# http://localhost — через nginx (логін: demo_alice / demo1234)
# http://localhost:4040 — ngrok dashboard

Очікуваний вивід

db-1       | database system is ready to accept connections
redis-1    | Ready to accept connections
web-1      |   Applying notes_app.0001_initial... OK
web-1      | 128 static files copied to '/app/staticfiles'
web-1      | Seeding demo data...
web-1      | INFO:     Uvicorn running on http://0.0.0.0:8001
nginx-1    | Starting nginx
ngrok-1    | started tunnel session ... url=https://your-domain.ngrok-free.app

Щоденна розробка

# Підняти стек (без rebuild якщо Dockerfile не змінився):
docker compose up

# Слідкувати за логами Django у реальному часі:
docker compose logs -f web

# Слідкувати за логами nginx:
docker compose logs -f nginx

Після зміни requirements.txt або Dockerfile

# Перебілдити web контейнер:
docker compose up --build

# Без кешу (після зміни pip dependencies що могли бути закешовані):
docker compose build --no-cache web
docker compose up

Зміна коду Python — uvicorn --reload

uvicorn запускається з --reload у entrypoint.sh. При зміні будь-якого .py файлу uvicorn автоматично перезапускається:

# Лог при авторезапуску:
web-1  | WARNING:  Detected file change in 'notes_app/views.py'. Reloading...
web-1  | INFO:     Started server process [1]
web-1  | INFO:     Application startup complete.

Для шаблонів (.html) і статики (.css, .js) — перезавантаж браузер вручну.


Нова міграція

# 1. Змінив models.py → створити міграцію:
docker compose exec web python manage.py makemigrations

# 2. Застосувати міграцію:
docker compose exec web python manage.py migrate

# 3. Перевірити стан:
docker compose exec web python manage.py showmigrations
# Всі міграції мають мати [X]

Django shell

docker compose exec web python manage.py shell

# Приклади у shell:
>>> from notes_app.models import Note, User
>>> User.objects.count()
4
>>> Note.objects.filter(user__username='demo_alice').count()
8
>>> from notes_app import selectors
>>> selectors.get_user_tags(User.objects.get(username='demo_alice'))
<QuerySet [<Tag: django>, <Tag: python>, <Tag: ідеї>]>

Зупинка

docker compose down           # зупинити (дані в volumes зберігаються)
docker compose down -v        # зупинити + видалити volumes (скинути БД!)
docker compose down --rmi all # зупинити + видалити images
docker compose restart web    # перезапустити тільки web сервіс

Debug tips

# Статус всіх контейнерів:
docker compose ps

# Переглянути детальний стан і health:
docker compose ps -a

# Увійти в shell web контейнера:
docker compose exec web bash

# Переглянути змінні оточення у контейнері:
docker compose exec web env | grep -E 'DEBUG|SECRET|REDIS|DATABASE|NGROK'

# Перевірити мережу:
docker network inspect notes_chat_app_app-net

# Тест connectivity між контейнерами:
docker compose exec web ping db
docker compose exec web ping redis
docker compose exec nginx curl -I http://web:8001/accounts/login/

# Production readiness check:
docker compose exec web python manage.py check --deploy

Корисні команди: Django management

docker compose exec web python manage.py check --deploy    # перевірка production readiness
docker compose exec web python manage.py showmigrations     # стан міграцій
docker compose exec web python manage.py createsuperuser    # admin access
docker compose exec web python manage.py dbshell           # psql до PostgreSQL
docker compose exec web python manage.py collectstatic     # зібрати static вручну
docker compose exec web python manage.py seed_demo_data --reset  # скинути демо-дані

Корисні команди: PostgreSQL

# Підключитись до PostgreSQL напряму:
docker compose exec db psql -U notes_user -d notes_db

# Команди у psql:
\dt          # список таблиць
\d note      # схема таблиці note
SELECT id, username, email FROM auth_user;
SELECT count(*) FROM notes_app_note;
\q           # вийти

Корисні команди: Redis

# Підключитись до Redis напряму:
docker compose exec redis redis-cli

# Команди у redis-cli:
KEYS *            # всі ключі (обережно на великих БД!)
TYPE channels:*   # тип ключа
TTL channels:*    # TTL ключа
MONITOR           # live stream всіх команд (Ctrl+C щоб зупинити)

Корисні команди: nginx

# Перевірити конфіг nginx:
docker compose exec nginx nginx -t

# Перезапустити nginx (після зміни nginx.conf):
docker compose restart nginx

# Тест upstream з середини nginx контейнера:
docker compose exec nginx curl -I http://web:8001/accounts/login/

Читання логів nginx

nginx-1  | 172.29.0.1 - - [13/Jun/2026:10:00:00 +0000] "GET /notes/ HTTP/1.1" 200 4523 "-" "Mozilla..."
          │             │                               │             │    │
          IP клієнта    Час                             Метод+URL     Статус  Байти

nginx-1  | "GET /ws/groups/7/chat/ HTTP/1.1" 101 839
                                                  ↑ 101 = WebSocket upgrade SUCCESS

nginx-1  | "GET /static/admin/css/base.css HTTP/1.1" 304 0
                                                       ↑ 304 = Not Modified (браузер кешує)

nginx-1  | "POST /accounts/login/ HTTP/1.1" 302 0
                                              ↑ 302 = Redirect після успішного логіну

Доступ після запуску

# Local:
http://localhost          # через nginx
http://localhost:8001     # напряму до uvicorn (для Selenium тестів)
http://localhost:4040     # ngrok dashboard
http://localhost:7900     # VNC (Selenium Chrome браузер живцем)

# Public (через ngrok):
https://your-domain.ngrok-free.app

# Демо-облікові записи (пароль: demo1234):
# demo_alice, demo_bob, demo_carol

У книзі


Офіційна документація