Skip to content

Сделать, чтобы в сгенерённом проекте работал healthcheck #576

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
f213 opened this issue Mar 16, 2024 · 14 comments
Labels
enhancement New feature or request

Comments

@f213
Copy link
Member

f213 commented Mar 16, 2024

Сейчас мы не добавляем healthcheck в итоговый проект, потому что указываем в нём HTTP HOST. Нужно решить эту проблему — к примеру сделать так, чтобы итоговая джанга не требовала правильного хоста — в 2024 году это не актуально.

@f213 f213 added the enhancement New feature or request label Mar 16, 2024
Copy link

Stale issue message

Copy link

Stale issue message

Copy link

Stale issue message

@nkiryanov
Copy link
Contributor

Сейчас мы не добавляем healthcheck в итоговый проект, потому что указываем в нём HTTP HOST

А можешь плз пояснить плз.
сс @kazqvaizer может быть ты знаешь.

Насколько понимаю в проекте по умолчанию создаем эндпоинт api/v1/healthchecks/ в котором чекаем коннекшн с БД:

  1. Вот тут устанавливаем django-healthchecks
  2. Тут конфигрурем какой healthcheck использовать, a тут добавляем url

Или речь про что-то другое?

p.s.
вообще у меня давно предлложение — а не написать ли healthcheck самим. В 99% тестируем только коннекшн с БД и это оч мало кода. Так смогли бы убрать одну зависимость (к слову django-healthchecks не обновлялся 3 года и уже сталкивался с ворнингами)

@kazqvaizer
Copy link
Contributor

Подозреваю, что речь про HEALTHCHECK инструкцию внутри Dockerfile, для uwsgi её нету. Т.е. что-то вроде

HEALTHCHECK --interval=15s --timeout=15s --start-period=5s --retries=3 \
  CMD wget -q -O /dev/null http://localhost:8000/api/v1/healthchecks/postgresql/ --header "Host: MY-HOST.RU" || exit 1

@kazqvaizer
Copy link
Contributor

к слову django-healthchecks не обновлялся 3 года и уже сталкивался с ворнингами

Зачем менять то, что сделано настолько хорошо!

А если серьезно, то согласен, давай обновим, вот, к примеру:

https://github.com/revsys/django-health-check

@f213
Copy link
Member Author

f213 commented Apr 22, 2025

@kazqvaizer а почему не хочешь сделать свою реализацию? Это же 5 строк кода, и избавимся от целой зависимости!

from django import AnyStockDjangoModel

def healthcheck(request):
  AnyStockDjangoModel.objects.exists()
  return 'ok'

Правда тут задача немного про другое — мы сейчас не можем сделать работающий по дефолту healthcheck, потому что в докерфайле должен быть обязательно указан HTTP-хост, который прописан в проекте. Это дыра с точки зрения DX — мы заставляем программиста думать о какой-то неважной фигне: хттп-хостах вместо бизнеса.

Этот хедер приходится добавлять из-за проверки ALLOWED_HOSTS, которая наглухо вшита в джангу, и не несёт никакого смысла в 2025 году. Просто так от неё не избавиться — ALLOWED_HOSTS нельзя указывать пустым, и единственный вариант, который я придумал — это манкипатчить get_host().

@kazqvaizer
Copy link
Contributor

а почему не хочешь сделать свою реализацию?

А я и не против, но пакет выше любопытный.

В целом согласен, все атаки на ALLOWED_HOST действительно редкие и защищаться от них нет смысла, т.к. для этого нужно написать код, который полагается на Host в заголовке. Я правда, считал, что это отключается ALLOWED_HOST = ['*'], странно, что это не работает и нужно патчить

@nkiryanov
Copy link
Contributor

nkiryanov commented Apr 23, 2025

Этот хедер приходится добавлять из-за проверки ALLOWED_HOSTS, которая наглухо вшита в джангу, и не несёт никакого смысла в 2025 году. Просто так от неё не избавиться — ALLOWED_HOSTS нельзя указывать пустым, и единственный вариант, который я придумал — это манкипатчить get_host().

Вариант ALLOWED_HOST = ['*'] норм работает
Делаю в #792 , там же скриншот что работает норм (заодно проверял когда ломалось).

Переписать healthcheck вручную — сделаю отдельно.

@f213
Copy link
Member Author

f213 commented Apr 23, 2025

вариант ALLOWED_HOST = ['*'] норм работает

Уверен, что ты проверял с DEBUG=False? Я не могу найти по коду, но точно помню, что где-то на проде у нас ALLOWED_HOST = ['*'] не работал.

@nkiryanov
Copy link
Contributor

Уверен, что ты проверял с DEBUG=False?

Угу — разворачивал проект с нуля + почитал документацию. Там * валидное значение.
Допускаю конечно, что что-то потерялось, но проверял как в прод разворачивал бы.

@f213
Copy link
Member Author

f213 commented Apr 25, 2025

Я можешь на всякий случай проверить, работает ли такая конструкция для не-FQDN хостов? Скажем, овтечает ли нормально приложение, если запросить его по адресу http://app_backend:8000/? Кажется у меня проблема была где-то в этом районе

@nkiryanov
Copy link
Contributor

Я можешь на всякий случай проверить, работает ли такая конструкция для не-FQDN хостов?

Да, всё в порядке. Пример: добавил такого клиента в compose.yml:

Image

и в клиенте проверил, что бэкежнд доступен:

Image

@nkiryanov
Copy link
Contributor

сделали в #792

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Development

No branches or pull requests

3 participants