Что выведет код с изображения? №28
Anonymous Quiz
12%
TypeError
44%
14
8%
ValueError
29%
2 2 2 2 2 2 2
8%
Нет верного ответа
🔥6
Анонс конкурса для начинающих программистов от Telegram-канала "Код на салфетке"
Приветствуем!
Мы объявляем о конкурсе по программированию на Python для начинающих программистов!
Посмотреть анонс конкурса можно на нашем YouTube-канале!
Вся информация о задаче, условиях проведения и призе будет завтра.
Рассказывайте друзьям! Вместе будет интереснее! Также вступайте в наш чат для обсуждения!
P.S. Как оказалось, YouTube в Shorts любит не только лайки, но и время просмотра видео. Будем благодарны, если вы посмотрите видео до конца и поставите лайк. Так мы сможем получить больший охват. Спасибо!
Пост на сайте
Поддержать проект на Boosty
Поддержать проект в Telegram
#проект #код_на_салфетке #python #shorts #соревнование #programming #github #обучение #программирование #портфолио #конкурс
Приветствуем!
Мы объявляем о конкурсе по программированию на Python для начинающих программистов!
Посмотреть анонс конкурса можно на нашем YouTube-канале!
Вся информация о задаче, условиях проведения и призе будет завтра.
Рассказывайте друзьям! Вместе будет интереснее! Также вступайте в наш чат для обсуждения!
P.S. Как оказалось, YouTube в Shorts любит не только лайки, но и время просмотра видео. Будем благодарны, если вы посмотрите видео до конца и поставите лайк. Так мы сможем получить больший охват. Спасибо!
Пост на сайте
Поддержать проект на Boosty
Поддержать проект в Telegram
#проект #код_на_салфетке #python #shorts #соревнование #programming #github #обучение #программирование #портфолио #конкурс
🔥4👍1🤩1
Вчерашняя задача была короткой и даже простой, если вы внимательно читали наши прошлые разборы, но справилось с ней всего 34% - 13 человек из 38-ми.
Код задачи:
Разбор задачи
Сперва пройдёмся по строкам.
Объявляем переменную
Затем мы выводим результат выражения
Давайте разберём это выражение по частям:
1. Умножение списка на число:
- Когда мы умножаем список на число
- В нашем случае
2. Распаковка списка с оператором `*`:
- Оператор
- Поэтому
В итоге функция
Что могло пойти не так?
Задача проверяет ваше знание двух важных аспектов Python: умножение списков и распаковка списков с помощью оператора
Итак, правильный ответ:
Код задачи:
b = [2]
print(*b * 7)
Разбор задачи
Сперва пройдёмся по строкам.
Объявляем переменную
b и присваиваем ей список, содержащий одно число 2.Затем мы выводим результат выражения
print(*b * 7).Давайте разберём это выражение по частям:
1. Умножение списка на число:
- Когда мы умножаем список на число
7, мы получаем новый список, в котором элементы исходного списка повторяются 7 раз.- В нашем случае
b * 7 создаст список [2, 2, 2, 2, 2, 2, 2].2. Распаковка списка с оператором `*`:
- Оператор
* перед списком распаковывает его, превращая каждый элемент в отдельный аргумент для функции print().- Поэтому
print(*(b * 7)) эквивалентно print(2, 2, 2, 2, 2, 2, 2).В итоге функция
print() выведет элементы списка через пробел.Что могло пойти не так?
Задача проверяет ваше знание двух важных аспектов Python: умножение списков и распаковка списков с помощью оператора
*. Ошибки могли бы возникнуть, если вы неверно понимаете, как работает распаковка или умножение списков.Итак, правильный ответ:
2 2 2 2 2 2 2.🔥3
Подготовили видео версию разбора задачи в YouTube Shorts!
https://youtube.com/shorts/ph3ALmRfgHo?feature=share
Будем благодарны, если вы посмотрите видео до конца и поставите лайк. Так мы сможем получить больший охват. Спасибо!
https://youtube.com/shorts/ph3ALmRfgHo?feature=share
Будем благодарны, если вы посмотрите видео до конца и поставите лайк. Так мы сможем получить больший охват. Спасибо!
🔥2👍1
Конкурс для начинающих программистов от Telegram-канала "Код на салфетке"
Автор: Иван Ашихмин
Приветствуем.
У нас на канале много тех, кто в данный момент учится или закончил обучение, но всё ещё не нашёл работу, а также тех, кто хочет применить свои знания, но не предоставляется возможности.
Подписчик канала и чата Сергей предложил идею провести конкурс по программированию среди подписчиков и мы согласились.
Код на салфетке объявляет конкурс по программированию для начинающих разработчиков!
Какая цель?
Цель — дать возможность проявить себя, показать свои навыки или изучить новое для решение задачи. Погрузиться в обсуждение и поиски способа решения. Посоревноваться с другими программистами за первое место. Заполучить в GitHub, пусть и небольшую, но работу над реальным проектом.
Автор: Иван Ашихмин
Приветствуем.
У нас на канале много тех, кто в данный момент учится или закончил обучение, но всё ещё не нашёл работу, а также тех, кто хочет применить свои знания, но не предоставляется возможности.
Подписчик канала и чата Сергей предложил идею провести конкурс по программированию среди подписчиков и мы согласились.
Код на салфетке объявляет конкурс по программированию для начинающих разработчиков!
Какая цель?
Цель — дать возможность проявить себя, показать свои навыки или изучить новое для решение задачи. Погрузиться в обсуждение и поиски способа решения. Посоревноваться с другими программистами за первое место. Заполучить в GitHub, пусть и небольшую, но работу над реальным проектом.
🔥6👍1
Задача:
У нас есть "Бот на салфетке" - бот для канала и чата. В связи с большим количеством спамеров, приходящих в чат и спамящих своим "очень интересным предложением", возникла необходимость в защите - введением проверки новых пользователей чата через "капчу", при правильном ответе на которую пользователь может продолжить общаться, в противном случае бот исключает его из чата.
Способов решения задачи несколько, от чего она является идеальной для конкурса.
Необходимо:
- Реализовать "капчу" для нового участника чата.
- "Капча" должна быть в виде изображения.
- Для упрощения, достаточно реализовать задачу на сложение, результат которой будет проверять бот.
- Дать пользователю три попытки на решение задачи.
- Если пользователь три раза вводит неверный ответ - исключение из чата.
- Все сообщения пользователя без верного ответа - удалять.
- (Опционально) Добавить таймер в течении которого пользователь должен ответить (включая неверные ответы), если не было верного ответа или не было сообщений вовсе - исключение.
Процесс проведения:
На выполнение задания даётся ровно неделя.
На следующей неделе мы объявим список участников со ссылками на их ветки и запустим голосование.
По результатам голосования будет выбран победитель.
Как участвовать?
На GitHub создан репозиторий с исходным кодом бота: https://github.com/proDreams/napkin_contest
- Необходимо сделать fork (именно fork, а не clone!) проекта.
- Написать функционал антиспама в отдельной ветке.
- Убедиться, что всё работает.
- Прописать в
- Сделать push в свой репозиторий и из него pull request в наш.
- Ждать начала голосования и участвовать в обсуждении своего и решений других участников.
Приз:
Участник набравший больше всех голосов получит небольшой, но приятный приз - 2000 рублей!
1000 рублей идёт от нашей редакции и ещё 1000 от нашего спонсора Сергея!
Правила:
- При количестве участников меньше 3-х конкурс считается недействительным.
- При обсуждении работ других участников будьте вежливы и учтивы. Любая токсичность или принижение будет караться удалением сообщений. Приветствуется конструктивная критика и предложение способов решения.
Пост на сайте
Поддержать проект на Boosty
Поддержать проект в Telegram
#проект #код_на_салфетке #aiogram #telegram #python #telegram_бот #соревнование #programming #github #обучение #программирование #портфолио #конкурс
У нас есть "Бот на салфетке" - бот для канала и чата. В связи с большим количеством спамеров, приходящих в чат и спамящих своим "очень интересным предложением", возникла необходимость в защите - введением проверки новых пользователей чата через "капчу", при правильном ответе на которую пользователь может продолжить общаться, в противном случае бот исключает его из чата.
Способов решения задачи несколько, от чего она является идеальной для конкурса.
Необходимо:
- Реализовать "капчу" для нового участника чата.
- "Капча" должна быть в виде изображения.
- Для упрощения, достаточно реализовать задачу на сложение, результат которой будет проверять бот.
- Дать пользователю три попытки на решение задачи.
- Если пользователь три раза вводит неверный ответ - исключение из чата.
- Все сообщения пользователя без верного ответа - удалять.
- (Опционально) Добавить таймер в течении которого пользователь должен ответить (включая неверные ответы), если не было верного ответа или не было сообщений вовсе - исключение.
Процесс проведения:
На выполнение задания даётся ровно неделя.
На следующей неделе мы объявим список участников со ссылками на их ветки и запустим голосование.
По результатам голосования будет выбран победитель.
Как участвовать?
На GitHub создан репозиторий с исходным кодом бота: https://github.com/proDreams/napkin_contest
- Необходимо сделать fork (именно fork, а не clone!) проекта.
- Написать функционал антиспама в отдельной ветке.
- Убедиться, что всё работает.
- Прописать в
README.md описание проделанной работы.- Сделать push в свой репозиторий и из него pull request в наш.
- Ждать начала голосования и участвовать в обсуждении своего и решений других участников.
Приз:
Участник набравший больше всех голосов получит небольшой, но приятный приз - 2000 рублей!
1000 рублей идёт от нашей редакции и ещё 1000 от нашего спонсора Сергея!
Правила:
- При количестве участников меньше 3-х конкурс считается недействительным.
- При обсуждении работ других участников будьте вежливы и учтивы. Любая токсичность или принижение будет караться удалением сообщений. Приветствуется конструктивная критика и предложение способов решения.
Пост на сайте
Поддержать проект на Boosty
Поддержать проект в Telegram
#проект #код_на_салфетке #aiogram #telegram #python #telegram_бот #соревнование #programming #github #обучение #программирование #портфолио #конкурс
🔥9
Что бы вы хотели создать или уже создаёте в качестве PET-проекта?
Anonymous Poll
20%
Сайт
16%
Мобильное приложение
0%
Игру
36%
Telegram-бота
8%
Обучить собственную нейросеть
8%
Приложение с GUI
12%
Другое (напишите в комментариях)
🔥5
Приветствуем!
Утром мы объявили о конкурсе и уже появились первые участники!
Представляю участников на текущий момент:
- Александр Бабичев
- Виктор Вангели
- Худайберген
Ηe_ΙΙροcΤο_Tακ
Сдали pull request:
Виктор Королев
Расскажите друзьям, знакомым, соседям из вашего ЖЭКа о конкурсе! Чем больше участников - тем интереснее будет смотреть на варианты реализации и читать обсуждения.
Утром мы объявили о конкурсе и уже появились первые участники!
Представляю участников на текущий момент:
- Александр Бабичев
- Виктор Вангели
- Худайберген
Ηe_ΙΙροcΤο_Tακ
Сдали pull request:
Виктор Королев
Расскажите друзьям, знакомым, соседям из вашего ЖЭКа о конкурсе! Чем больше участников - тем интереснее будет смотреть на варианты реализации и читать обсуждения.
Telegram
Код на салфетке
Конкурс для начинающих программистов от Telegram-канала "Код на салфетке"
Автор: Иван Ашихмин
Приветствуем.
У нас на канале много тех, кто в данный момент учится или закончил обучение, но всё ещё не нашёл работу, а также тех, кто хочет применить свои знания…
Автор: Иван Ашихмин
Приветствуем.
У нас на канале много тех, кто в данный момент учится или закончил обучение, но всё ещё не нашёл работу, а также тех, кто хочет применить свои знания…
🔥4🤩1
Приветствуем.
К объявленному вчера конкурсу в чате и в личку поступил ряд вопросов. Дабы не повторяться отвечу сразу для всех:
1. Что нужно для запуска бота? — Нужен ключ бота полученный у BotFather, ID администратора бота и ID группы в которой будете тестировать. Получить ID можно у бота: https://t.iss.one/getmyid_bot
2. Нужно ли использовать ИИ? — Использовать можно всё, что угодно. Вы вольны выбирать понравившуюся вам реализацию, однако, для использования ИИ нужны ключи доступа к API и если кто-то другой захочет протестировать, это может вызвать лишние неудобства.
3. У меня ошибка в файле
4. У меня ошибка Telegram
5. Там есть Dockerfile, для запуска нужен докер? — Нет, это файл от одного из постов. Инструкция по запуску описана в README.md.
6. У меня ошибка Pydantic — Даже если некоторые переменные окружения не нужны для конкурса, они все равно нужны в коде. Просто добавьте их с любым значением, а ещё лучше переменуйте .env.example в .env и проблем не будет.
Вроде всё, если что-то забыли или есть другие вопросы - пишите!
К объявленному вчера конкурсу в чате и в личку поступил ряд вопросов. Дабы не повторяться отвечу сразу для всех:
1. Что нужно для запуска бота? — Нужен ключ бота полученный у BotFather, ID администратора бота и ID группы в которой будете тестировать. Получить ID можно у бота: https://t.iss.one/getmyid_bot
2. Нужно ли использовать ИИ? — Использовать можно всё, что угодно. Вы вольны выбирать понравившуюся вам реализацию, однако, для использования ИИ нужны ключи доступа к API и если кто-то другой захочет протестировать, это может вызвать лишние неудобства.
3. У меня ошибка в файле
transcribe_voice.py — Ошибка связана с тем, что у меня Python 3.12 и в f-строке используются одинаковые кавычки. Просто измените внутренние на одинарные. Обновлять репозиторий не буду, т.к. участники уже сделали форки и ради двух кавычек им придётся стягивать изменения. 4. У меня ошибка Telegram
chat not found — Необходимо добавить вашего бота в вашу группу и дать ему права администратора.5. Там есть Dockerfile, для запуска нужен докер? — Нет, это файл от одного из постов. Инструкция по запуску описана в README.md.
6. У меня ошибка Pydantic — Даже если некоторые переменные окружения не нужны для конкурса, они все равно нужны в коде. Просто добавьте их с любым значением, а ещё лучше переменуйте .env.example в .env и проблем не будет.
Вроде всё, если что-то забыли или есть другие вопросы - пишите!
🔥3🤯2
У нас много интересных субботних задач "что выведет этот код" и мы решили вышедшие ранее тоже превратить в видео.
Ссылка на задачу, если вы пропустили: https://t.iss.one/press_any_button/425
Видео версия "Что выведет этот код? №3":
https://youtube.com/shorts/zgmoAAIkXgk
Будем благодарны лайку и досмотру видео до конца, спасибо!
Ссылка на задачу, если вы пропустили: https://t.iss.one/press_any_button/425
Видео версия "Что выведет этот код? №3":
https://youtube.com/shorts/zgmoAAIkXgk
Будем благодарны лайку и досмотру видео до конца, спасибо!
🔥4
Telegram ввёл обязательное наличие политики конфиденциальности в ботах
Автор: Иван Ашихмин
Telegram объявил о введении новых правил для ботов и мини-приложений, которые вступают в силу немедленно. Эти изменения направлены на усиление защиты данных пользователей и соблюдение международных стандартов конфиденциальности.
Коротко:
Теперь все боты и мини-приложения обязаны предоставлять свою собственную политику конфиденциальности и соблюдать правила диктуемые Telegram, Apple, Google и законы.
Основные нововведения:
Соответствие законодательству о конфиденциальности: Все боты и мини-приложения должны соблюдать все применимые законы и правила о конфиденциальности, включая требования Apple и Google.
Политика конфиденциальности:
- Все боты и мини-приложения должны иметь отдельную политику конфиденциальности, которая должна быть легко доступна пользователям.
- Мини-приложения должны разместить ссылку на политику конфиденциальности на странице «Настройки».
Автор: Иван Ашихмин
Telegram объявил о введении новых правил для ботов и мини-приложений, которые вступают в силу немедленно. Эти изменения направлены на усиление защиты данных пользователей и соблюдение международных стандартов конфиденциальности.
Коротко:
Теперь все боты и мини-приложения обязаны предоставлять свою собственную политику конфиденциальности и соблюдать правила диктуемые Telegram, Apple, Google и законы.
Основные нововведения:
Соответствие законодательству о конфиденциальности: Все боты и мини-приложения должны соблюдать все применимые законы и правила о конфиденциальности, включая требования Apple и Google.
Политика конфиденциальности:
- Все боты и мини-приложения должны иметь отдельную политику конфиденциальности, которая должна быть легко доступна пользователям.
- Мини-приложения должны разместить ссылку на политику конфиденциальности на странице «Настройки».
🔥3
- Боты должны предоставлять доступ к политике конфиденциальности через команду
Хранение и обработка данных:
- Данные пользователей должны храниться и обрабатываться в соответствии с условиями использования Telegram и применимыми законами.
- Запрещается сбор данных сверх необходимого для функционирования сервиса.
- Данные должны быть удалены по запросу пользователя или по окончании использования бота/мини-приложения.
Защита данных и безопасность:
- Все данные пользователей должны быть зашифрованы при хранении и храниться отдельно от ключей шифрования.
- Необходимо оповещать пользователей о любом нарушении безопасности данных в соответствии с применимыми законами.
- Разработчики должны применять все необходимые меры для защиты своих сервисов от злонамеренных клиентов.
Запрещение сбора данных:
- Запрещается использовать боты и мини-приложения для сбора данных, направленных на создание больших наборов данных или моделей машинного обучения.
Подробнее можно прочесть по ссылке: https://telegram.org/tos/bot-developers#4-privacy
Пример политики конфиденциальности для простых ботов можно посмотреть у нас: https://t.iss.one/press_any_button_bot
Пост на сайте
Поддержать проект на Boosty
Поддержать проект в Telegram
#Telegram #новости #код_на_салфетке #telegram_бот #политика_конфиденциальности #правила #google #apple #privacy_policy
/privacy.Хранение и обработка данных:
- Данные пользователей должны храниться и обрабатываться в соответствии с условиями использования Telegram и применимыми законами.
- Запрещается сбор данных сверх необходимого для функционирования сервиса.
- Данные должны быть удалены по запросу пользователя или по окончании использования бота/мини-приложения.
Защита данных и безопасность:
- Все данные пользователей должны быть зашифрованы при хранении и храниться отдельно от ключей шифрования.
- Необходимо оповещать пользователей о любом нарушении безопасности данных в соответствии с применимыми законами.
- Разработчики должны применять все необходимые меры для защиты своих сервисов от злонамеренных клиентов.
Запрещение сбора данных:
- Запрещается использовать боты и мини-приложения для сбора данных, направленных на создание больших наборов данных или моделей машинного обучения.
Подробнее можно прочесть по ссылке: https://telegram.org/tos/bot-developers#4-privacy
Пример политики конфиденциальности для простых ботов можно посмотреть у нас: https://t.iss.one/press_any_button_bot
Пост на сайте
Поддержать проект на Boosty
Поддержать проект в Telegram
#Telegram #новости #код_на_салфетке #telegram_бот #политика_конфиденциальности #правила #google #apple #privacy_policy
🔥5
Docker 8. Разворачивание Django-проекта в Docker compose
Автор: Иван Ашихмин
Docker - это не просто инструмент для запуска контейнеров с различными проектами и сервисами. Сегодня Docker является одним из основных способов разворачивания (деплоя) приложений на сервере.
Автор: Иван Ашихмин
Docker - это не просто инструмент для запуска контейнеров с различными проектами и сервисами. Сегодня Docker является одним из основных способов разворачивания (деплоя) приложений на сервере.
🔥4
Один из ключевых компонентов Docker – это Docker Compose. Docker Compose позволяет запускать контейнеры в так называемом "композ сервисе", объединяя их в единую локальную сеть. Он решает множество проблем, с которыми сталкиваются разработчики при работе с отдельными контейнерами. Он упрощает управление зависимостями, позволяя описывать все сервисы проекта в одном YAML-файле, что облегчает запуск и конфигурацию. Вместо того, чтобы вручную запускать каждый контейнер, можно использовать одну команду
В нескольких предыдущих постах мы подготовили всё необходимое для разворачивания, а именно:
- В посте "Django 42. Запуск Django-проекта на VPS" подготовили наш Django-проект.
- В постах "AIOgram3 17. Подготовка к разворачиванию на сервере" и "Docker 7. Разворачивание Telegram-бота в Docker на VPS" подготовили бота.
- В посте "Docker 3. Контейнер с PostgreSQL" - мы показали, как запускать контейнер с PostgreSQL.
Теперь осталось собрать всё воедино и добавить к этому веб-сервер NGINX для обработки входящих запросов.
Подготовка.
Да, нам снова нужна подготовка.
На VPS создайте директорию
Убедититесь, что у вас есть достаточные права доступа и место на диске для всех необходимых файлов и контейнеров.
В директории
Должна получиться следующая структура:
Предложенная структура проекта является примером и может быть изменена в зависимости от специфики проекта.
Файл docker-compose.yaml.
Файл
Обратите внимание! Поскольку это YAML-файл, он придерживается строгих правил форматирования. Учтите это при написании конфигурации.
Откроем файл.
Раньше в самом начале файла было обязательно писать версию используемого Docker Compose-протокола. Обычно все писали
Сервис Базы Данных.
Первым сервисом, который мы опишем будет PostgreSQL.
Прописываем ключ
docker-compose up, чтобы поднять все сервисы. Более того, Compose обеспечивает портативность и воспроизводимость конфигурации, что позволяет любому разработчику быстро развернуть проект на любом сервере без сложной настройки окружения. Таким образом, Docker Compose значительно упрощает процесс разработки, тестирования и деплоя многокомпонентных приложений.В нескольких предыдущих постах мы подготовили всё необходимое для разворачивания, а именно:
- В посте "Django 42. Запуск Django-проекта на VPS" подготовили наш Django-проект.
- В постах "AIOgram3 17. Подготовка к разворачиванию на сервере" и "Docker 7. Разворачивание Telegram-бота в Docker на VPS" подготовили бота.
- В посте "Docker 3. Контейнер с PostgreSQL" - мы показали, как запускать контейнер с PostgreSQL.
Теперь осталось собрать всё воедино и добавить к этому веб-сервер NGINX для обработки входящих запросов.
Подготовка.
Да, нам снова нужна подготовка.
На VPS создайте директорию
project и поместите в неё файлы Django-проекта и файлы бота в соответствующих директориях, например, pressanybutton для сайта и pressanybutton_bot для бота. Также создайте директорию postgres-db для хранения файлов базы данных.Убедититесь, что у вас есть достаточные права доступа и место на диске для всех необходимых файлов и контейнеров.
В директории
project создайте файл docker-compose.yaml.Должна получиться следующая структура:
project/
├── pressanybutton/
│ ├── manage.py
│ ├── requirements.txt
│ ├── Dockerfile
│ ├── .env
│ └── <директории проекта>
├── pressanybutton_bot/
│ ├── main.py
│ ├── requirements.txt
│ ├── Dockerfile
│ ├── .env
│ └── <директории проекта>
├── postgres-db/ # пока пустая директория
└── docker-compose.yaml # файл, в котором будем описывать сервис
Предложенная структура проекта является примером и может быть изменена в зависимости от специфики проекта.
Файл docker-compose.yaml.
Файл
docker-compose.yaml описывает, какие сервисы (контейнеры) будут входить в композ-сервис, как они будут запускаться, какие образы использовать и так далее. Параметров, доступных для определения сервиса, много и они позволяют настроить работу сервисов практически под любой случай.Обратите внимание! Поскольку это YAML-файл, он придерживается строгих правил форматирования. Учтите это при написании конфигурации.
Откроем файл.
Раньше в самом начале файла было обязательно писать версию используемого Docker Compose-протокола. Обычно все писали
version: "3" и этого было достаточно. Разработчики Docker поняли, что это бессмысленный параметр и в последних версиях Docker от него отказались. Поэтому первое, что мы напишем - это ключ services:. После этого ключа начинается описание будущих контейнеров.services:
Сервис Базы Данных.
Первым сервисом, который мы опишем будет PostgreSQL.
Прописываем ключ
db со следующим содержимым:🔥4
db:
image: postgres:15
restart: always
environment:
- POSTGRES_USER=db_user
- POSTGRES_PASSWORD=db_password
- POSTGRES_DB=db_name
- PGDATA=/var/lib/postgresql/data/pgdata
- POSTGRES_EXTENSIONS=pg_trgm
volumes:
- ./postgres-db:/var/lib/postgresql/data
Разберём написанное:
-
image: postgres:15 — Указываем используемый образ. В нашем случае это официальный образ 15-й версии PostgreSQL. Можно указать другую версию или образ из другого источника при необходимости.-
restart: always — Указываем, что если в контейнере произойдёт сбой, то он будет перезагружаться автоматически. Это позволяет контейнеру возобновить свою работу при возникших неполадках. Однако, иногда это может привести к проблемам, например, когда в проекте ошибка, из-за которой контейнер не может запуститься. В этом случае он будет перезагружаться пока его не остановят принудительно.-
environment: — В этих строках описываются переменные окружения, передаваемые внутрь контейнера. В прошлых постах мы использовали .env-файл для передачи переменных окружения, однако, если нужно передать немного переменных, можно прописать их здесь, чтобы не создавать лишние файлы. Переменные окружения разберём чуть ниже.-
volumes: — Указываем подключаемые внутри контейнера внешние директории. Это нужно не для всех контейнеров, однако, для контейнера с базой данных это обязательный пункт, поскольку контейнер ненадёжное место. После перезагрузки он сбрасывается в состояние созданного образа, что может привести к потере важных данных. В данном пункте мы прописываем, что созданная ранее директория postgres-db будет примонтирована внутри контейнера по пути /var/lib/postgresql/data.Переменные окружения:
-
POSTGRES_USER — Указываем имя пользователя базы данных.-
POSTGRES_PASSWORD — Указываем пароль для пользователя базы данных.-
POSTGRES_DB — Создаём базу данных, связанную с указанным выше пользователем.-
PGDATA — Определяем, в какой директории будут храниться файлы базы данных внутри контейнера.-
POSTGRES_EXTENSIONS=pg_trgm — Определяем подключенные к базе данных расширения, в нашем случае это расширение pg_trgm для поддержки триграммного поиска. Подробнее об этом в посте "Django 29.1 Добавляем поиск на сайт".Подготовка Django
Прежде чем мы приступим к описанию Django-сервиса, необходимо дополнительно подготовиться (снова).
Дело в том, что в посте "Django 42. Запуск Django-проекта на VPS" мы с вами сделали запуск Django на встроенном веб-сервере, который хорош для разработки, но не подходит для полноценной работы.
Для работы с большим объёмом запросов и лучшей производительности необходим WSGI (Web Server Gateway Interface) или ASGI (Asynchronous Server Gateway Interface). Это мост между веб-сервером (например, NGINX) и веб-приложением (например, фреймворк Django).
Поскольку мы работаем с синхронным Django, нам необходим WSGI. Библиотек для работы с ним много, например,
Gunicorn или uWSGI. Мы будем использовать uWSGI.Пропишите его в файле
requirements.txt Django-проекта:uwsgi==2.0.26
Обратите внимание! Библиотека uWSGI не работает в Windows. К тому же, при локальной разработке она ни к чему, её можно не устанавливать, а оставить только для VPS.
Далее нам необходимо создать файл конфигурации для
uWSGI. В директории pressanybutton, где находится файл manage.py, создадим новый файл uwsgi.ini и откроем его.Пропишем следующее содержимое:
🔥4
[uwsgi]
socket = /code/pab_app.sock
chdir = /code/pressanybutton
module = pressanybutton.wsgi:application
master = true
chmod-socket = 666
uid = www-data
gid = www-data
vacuum = true
Разберём параметры:
-
socket = /code/pab_app.sock — Этот параметр указывает путь к сокету Unix, который будет использоваться для связи между uWSGI и веб-сервером. Сокет позволяет передавать запросы от веб-сервера к приложению и возвращать ответы обратно.-
chdir = /code/pressanybutton — Параметр chdir изменяет текущий рабочий каталог процесса uWSGI на указанный. В данном случае это /code/pressanybutton. Это полезно, когда приложение или его зависимости находятся в определённом месте и нужно, чтобы процесс uWSGI работал из этого каталога.-
module = pressanybutton.wsgi:application — Указывает модуль и объект WSGI приложения, которые будут загружены и запущены uWSGI. В нашем случае uWSGI будет искать объект application в модуле pressanybutton.wsgi, который является проектом Django.-
master = true — Этот параметр включает режим мастера. В режиме мастера uWSGI запускается как главный процесс, который управляет дочерними процессами.-
chmod-socket = 666 — Параметр chmod-socket задаёт права доступа к сокету Unix. Значение 666 означает, что сокет будет доступен для чтения и записи всем пользователям.-
uid = www-data и gid = www-data — Эти параметры задают идентификатор пользователя (uid) и группы (gid), под которым будет работать процесс uWSGI. Значение www-data обычно используется для веб-серверов Apache и Nginx, что позволяет избежать проблем с правами доступа к файлам.-
vacuum = true — Параметр vacuum указывает uWSGI удалять старые версии сокета перед созданием нового. Это помогает предотвратить проблемы с "зависшими" сокетами, если приложение было перезапущено без соответствующей очистки.Далее следует изменить наш Dockerfile, удалив из него две последние команды:
EXPOSE 8000
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
Больше нет необходимости автоматически запускать проект из Dockerfile, так как запуск будет указан в
docker-compose.yaml.Остался последний момент, который необходимо подготовить, а именно скрипт
wait-for-it.sh. Этот скрипт перед запуском Django проверяет доступность базы данных, поскольку может возникнуть ситуация, когда сервис с сайтом запустился и пытается подключиться к БД, но сервис с БД ещё не инициализировался полностью. Это может привести к перезагрузке с ошибкой или остановке сервиса сайта.Мы не будем писать этот скрипт сами. Воспользуемся готовым скриптом. Скачайте файл
wait-for-it.sh из репозитория https://github.com/vishnubob/wait-for-it и поместите его в директорию с Django-проектом.Сервис Django-сайта.
Следующим опишем сервис сайта.
Пропишем ключ
web со следующим содержимым:web:
build: ./pressanybutton
command: [ "./wait-for-it.sh", "db:5432", "--", "uwsgi", "--ini", "/code/uwsgi.ini" ]
restart: always
env_file:
- ./pressanybutton/.env
volumes:
- ./pressanybutton:/code
depends_on:
- db
Разберём новые параметры:
-
build: ./pressanybutton — В сервисе для базы данных мы указывали готовый образ, а в посте "Django 42. Запуск Django-проекта на VPS" мы сперва собирали образ, а затем запускали его. Сейчас мы указываем параметр build, означающий, что необходимо взять Dockerfile из указанной директории и автоматически собрать образ для сервиса.🔥4
-
-
-
- Указать всю директорию с проектом. Таким образом можно изменять файлы проекта "на лету", и для применения изменений достаточно будет перезагрузить контейнер с Django.
-
Про команду запуска: первым аргументом идёт скрипт
Сервис Telegram-бота.
Тут совсем просто и коротко.
Пропишем ключ
Указываем откуда брать Dockerfile и политику перезапуска.
Подготовка NGINX.
Перед тем, как приступим к описанию сервиса с NGINX, необходимо подготовить его конфигурационный файл.
В директории
Затем в директории
У нас будет четыре блока конфигурации:
Первый будет блок
В нём указываем группу по имени
Следующий блок
Далее ещё один блок переадресации: на этот раз прослушивается 443-й HTTPS-порт и при обращении на поддомен с
Последний, самый большой и основной блок прослушивает 443-й HTTPS порт. Внутри блока также указываем:
- SSL-сертификат и его ключ.
- Вывод ошибок в терминал.
command: — Параметр определяет команду, которая будет выполнена при запуске контейнера, аналог CMD из Dockerfile. Команду разберём ниже.-
env_file: — Так же, как мы ранее указывали .env при запуске контейнера, указываем этот файл для сервиса Django.-
volumes: — Так же, как и с сервисом базы данных, указываем монтируемую директорию. Тут есть два варианта:- Вместо всей директории указать только монтируемые пути для static и media директорий, чтобы впоследствии дать доступ к ним веб-серверу.- Указать всю директорию с проектом. Таким образом можно изменять файлы проекта "на лету", и для применения изменений достаточно будет перезагрузить контейнер с Django.
-
depends_on: — Параметр, указывающий на зависимость от другого сервиса. В нашем случае это сервис базы данных. Это необходимо для того, чтобы сперва был запущен сервис с БД и только после этого сервис с Django.Про команду запуска: первым аргументом идёт скрипт
wait-for-it.sh. Далее передаём хост и порт базы данных. Обратите внимание, что в качестве хоста мы указываем имя сервиса базы данных. Таким образом, обращения сайта к базе данных будут происходить в пределах сервера. Специальный символ -- (double dash), является разделителем между двумя командами. Сперва выполняется команда до символа, затем команда после. Далее указываем, что запускаем uWSGI с конфигурационным файлом по указанному абсолютному пути внутри контейнера.Сервис Telegram-бота.
Тут совсем просто и коротко.
Пропишем ключ
bot со следующим содержимым:bot:
build: ./pressanybutton_bot
restart: always
Указываем откуда брать Dockerfile и политику перезапуска.
Подготовка NGINX.
Перед тем, как приступим к описанию сервиса с NGINX, необходимо подготовить его конфигурационный файл.
В директории
project создадим директорию ssl. В эту директорию следует поместить SSL-сертификат и приватный ключ для используемого домена. Как получить сертификат, рассказано в посте "Certbot - бесплатный SSL-сертификат для сайта".Затем в директории
project, рядом с файлом docker-compose.yaml, создадим файл default.conf.template. В этом файле опишем конфигурацию веб-сервера.У нас будет четыре блока конфигурации:
Первый будет блок
upstream:upstream pressanybutton {
server unix:/code/pab_app.sock;
}
В нём указываем группу по имени
pressanybutton. По этому имени будем обращаться в другом блоке для проксирования обращений. Внутри блока указываем, что сервером является Unix-сокет, который создаёт uWSGI в Django.Следующий блок
server прослушивает 80-й HTTP-порт и при обращении на домен по HTTP перенаправляет с 301-м HTTP-кодом на HTTPS протокол:server {
listen 80;
server_name www.pressanybutton.ru pressanybutton.ru;
return 301 https://$host$request_uri;
}
Далее ещё один блок переадресации: на этот раз прослушивается 443-й HTTPS-порт и при обращении на поддомен с
www происходит переадресация на домен без www. Поскольку это HTTPS, в этом блоке указываем путь до SSL-сертификата и ключа:server {
listen 443 ssl;
ssl_certificate /code/ssl/cert.crt;
ssl_certificate_key /code/ssl/privkey.key;
server_name www.pressanybutton.ru;
return 301 https://pressanybutton.ru$request_uri;
}
Последний, самый большой и основной блок прослушивает 443-й HTTPS порт. Внутри блока также указываем:
- SSL-сертификат и его ключ.
- Вывод ошибок в терминал.
🔥4
- В параметре
- Указываем, что включено gzip-сжатие и настройки этого сжатия.
- Блок
-
Конфигурация NGINX может быть разной в зависимости от конкретных потребностей проекта. Настройка кэширования, ограничения доступа и другие параметры могут быть изменены для повышения производительности и безопасности.
Сервис веб-сервера NGINX.
Последним сервисом опишем веб-сервер.
Пропишем ключ
Разберём параметры:
-
- Монтируем директорию с Django. Нам это нужно для доступа к статическим и медиа файлам, а также к Unix-сокету.
- Монтируем директорию
-
Перед запуском.
Перед тем, как мы всё запустим, убедитесь, что в
Запуск Docker compose.
Для запуска Docker Compose достаточно выполнить команду:
Разберём команду:
-
-
-
-
После выполнения команды начнётся скачивание и сборка образов.
Миграции и статика.
После того, как соберутся и запустятся сервисы, при переходе по адресу сайта может возникнуть ошибка, сообщающая о том, что таблицы в базе данных не найдены.
client_max_body_size указываем максимально допустимый размер загружаемого файла. В нашем случае это 100МБ.- Указываем, что включено gzip-сжатие и настройки этого сжатия.
- Блок
location / — В нём указываем, что используется uWSGI-сокет, на который происходят перенаправление со всех запросов на сайт.-
location /static/ и location /media/ — В них указываем, что если в пути запроса есть static или media, то необходимо отдавать файлы из соответствующих директорий. Также добавляем кэширование статических и медиа файлов на стороне клиента.server {
listen 443 ssl;
ssl_certificate /code/ssl/cert.pem;
ssl_certificate_key /code/ssl/privkey.pem;
server_name pressanybutton.ru;
error_log stderr warn;
access_log /dev/stdout main;
client_max_body_size 100M;
gzip on;
gzip_comp_level 6;
gzip_min_length 1024;
gzip_proxied any;
gzip_vary on;
gzip_types
application/javascript
application/json
application/ld+json
application/manifest+json
application/x-web-app-manifest+json
text/css
text/plain
text/xml
text/x-component
text/x-cross-stream;
gzip_disable "text/javascript";
location / {
include /etc/nginx/uwsgi_params;
uwsgi_pass pressanybutton;
}
location /static/ {
alias /code/static/;
add_header Cache-Control "max-age=604800";
}
location /media/ {
alias /code/media/;
add_header Cache-Control "max-age=604800";
}
}
Конфигурация NGINX может быть разной в зависимости от конкретных потребностей проекта. Настройка кэширования, ограничения доступа и другие параметры могут быть изменены для повышения производительности и безопасности.
Сервис веб-сервера NGINX.
Последним сервисом опишем веб-сервер.
Пропишем ключ
nginx со следующим содержимым:nginx:
image: nginx
restart: always
volumes:
- ./default.conf.template:/etc/nginx/templates/default.conf.template
- ./pressanybutton:/code/
- ./ssl:/code/ssl
ports:
- "80:80"
- "443:443"
Разберём параметры:
-
volumes: — Прописываем три монтирования:- Монтируем файл конфигурации внутри контейнера.- Монтируем директорию с Django. Нам это нужно для доступа к статическим и медиа файлам, а также к Unix-сокету.
- Монтируем директорию
ssl для доступа к сертификатам внутри контейнера.-
ports: — Данный параметр указывает, какие порты будут доступны вне контейнера и с какими портами они связаны внутри контейнера. В данном случае прослушиваются и вещаются 80-й и 443-й порт — стандартные порты для веб.Перед запуском.
Перед тем, как мы всё запустим, убедитесь, что в
.env указаны верные параметры, например, хост базы данных это db, и что все файлы доступны.Запуск Docker compose.
Для запуска Docker Compose достаточно выполнить команду:
sudo docker compose up -d
Разберём команду:
-
sudo docker — Указывает, что мы обращаемся к приложению Docker с правами администратора (root).-
compose — Указывает, что нам необходим плагин Compose.-
up — Указывает, что мы хотим запустить Docker Compose-сервис из docker-compose.yaml, расположенного в этой директории.-
-d — Указывает, что мы запускаем сервис в фоновом режиме.После выполнения команды начнётся скачивание и сборка образов.
Миграции и статика.
После того, как соберутся и запустятся сервисы, при переходе по адресу сайта может возникнуть ошибка, сообщающая о том, что таблицы в базе данных не найдены.
🔥4
Необходимо применить миграции. Для этого выполним следующие команды:
Разберём команды:
-
-
-
-
Если сейчас снова открыть сайт, он загрузится, но в нём могут отсутствовать стили и другая статика. Для решения этой проблемы выполним команду:
Всё это можно сделать в исполняемом при сборке скрипте, но это тема для другого раза.
Дополнительно.
Остановка композ-сервиса.
Если вы хотите остановить и удалить все запущенные контейнеры, выполните команду:
Логи контейнеров
Для просмотра логов запущенных контейнеров используйте команду:
После выполнения команды будут выведены логи всех контейнеров. Если необходимо посмотреть логи конкретного контейнера, сделать это можно, выполнив команду:
Обновление образов.
Для обеспечения безопасности и стабильности проекта рекомендуется регулярно обновлять Docker образы и зависимости. Это можно сделать с помощью команды:
Эта команда обновит образы до последних версий, указанных в
Заключение.
Теперь вы знаете, как можно развернуть свой сайт на Django с использованием Docker Compose. На первый взгляд, всё это кажется сложным, и в процессе неизбежно возникнут трудности на разных этапах, но с каждым последующим разом начинает выполняться "на автомате". Вы начинаете понимать, где возникла ошибка и как её решить.
Данный пост – базовая инструкция, которую можно адаптировать и расширять в зависимости от специфики вашего проекта. Не забывайте регулярно обновлять ваши образы и контейнеры до последних версий для обеспечения безопасности и использования новых возможностей. С Docker Compose это делается довольно просто и эффективно.
На этом с Django мы не заканчиваем. Там ещё много всего, что можно сделать.
Файлы к посту, можно получить в боте по коду: 274821
Пост на сайте
Поддержать проект на Boosty
Поддержать проект в Telegram
#Docker #PostgreSQL #Django #AIOgram #Код_на_салфетке #NGINX #деплой #Гайд #разворачивание_проекта #Docker_compose
# Создадим миграции, если они не были созданы ранее.
sudo docker exec -it project-web-1 python /code/manage.py makemigrations
# Применим миграции.
sudo docker exec -it project-web-1 python /code/manage.py migrate
Разберём команды:
-
exec — Указывает, что мы хотим выполнить команду внутри контейнера.-
-it — Указывает, что мы хотим интерактивный режим.-
project-web-1 — Имя контейнера.-
python /code/manage.py migrate — Команда, которую хотим выполнить внутри контейнера.Если сейчас снова открыть сайт, он загрузится, но в нём могут отсутствовать стили и другая статика. Для решения этой проблемы выполним команду:
sudo docker exec -it project-web-1 python /code/manage.py collectstatic
Всё это можно сделать в исполняемом при сборке скрипте, но это тема для другого раза.
Дополнительно.
Остановка композ-сервиса.
Если вы хотите остановить и удалить все запущенные контейнеры, выполните команду:
sudo docker compose down
Логи контейнеров
Для просмотра логов запущенных контейнеров используйте команду:
sudo docker compose logs -f
После выполнения команды будут выведены логи всех контейнеров. Если необходимо посмотреть логи конкретного контейнера, сделать это можно, выполнив команду:
sudo docker logs имя_контейнера
Обновление образов.
Для обеспечения безопасности и стабильности проекта рекомендуется регулярно обновлять Docker образы и зависимости. Это можно сделать с помощью команды:
sudo docker compose pull
Эта команда обновит образы до последних версий, указанных в
docker-compose.yaml.Заключение.
Теперь вы знаете, как можно развернуть свой сайт на Django с использованием Docker Compose. На первый взгляд, всё это кажется сложным, и в процессе неизбежно возникнут трудности на разных этапах, но с каждым последующим разом начинает выполняться "на автомате". Вы начинаете понимать, где возникла ошибка и как её решить.
Данный пост – базовая инструкция, которую можно адаптировать и расширять в зависимости от специфики вашего проекта. Не забывайте регулярно обновлять ваши образы и контейнеры до последних версий для обеспечения безопасности и использования новых возможностей. С Docker Compose это делается довольно просто и эффективно.
На этом с Django мы не заканчиваем. Там ещё много всего, что можно сделать.
Файлы к посту, можно получить в боте по коду: 274821
Пост на сайте
Поддержать проект на Boosty
Поддержать проект в Telegram
#Docker #PostgreSQL #Django #AIOgram #Код_на_салфетке #NGINX #деплой #Гайд #разворачивание_проекта #Docker_compose
🔥4
В этот раз видео по шестой задаче!
Ссылка на задачу, если вы пропустили: https://t.iss.one/press_any_button/475
Видео версия "Что выведет этот код? №6":
https://youtube.com/shorts/NbwEAPnYjrg
Будем благодарны лайку и досмотру видео до конца, спасибо!
Ссылка на задачу, если вы пропустили: https://t.iss.one/press_any_button/475
Видео версия "Что выведет этот код? №6":
https://youtube.com/shorts/NbwEAPnYjrg
Будем благодарны лайку и досмотру видео до конца, спасибо!
🔥7