• Пару вопросов по использованию докера в продакшене?

    Griboks
    @Griboks
    Использовать докер в продакшене - нормальное решение?

    Да, но есть один нюанс... Судя по вашему вопросу, вы его точно не учли.

    Не упустил ли я какие-то важные команды, которые не используются при разработке, но нужны перед сборкой продакшена?

    Выкидываете build и git, создаёте docker registry, предварительно собираете образы (без гита, только полезные файлы в slim образе), пушите их в реестр, на проде прописываете нужные образы нужных версий. Поднимаете через compose + устанавливаете restart = unless stopped.

    после чего память на сервере закончилась

    Выкидываете git, делаете docker system prune раз в месяц, ставите в настройках демона ротацию логов.

    Автоматический бекап базы данных - ответственность самого сервиса (в коде делать дамп), докера (использовать какой-то image для бекапов) или сервера (непосредственно на сервере настроить крон)?

    Docker image не используется для бэкапов, потому что он не может изменять свои файлы. Файлы изменяются в контейнерах, volume или маунтах.
    Поэтому бэкап - это задача сервера. Только бэкапить надо не рядом с базой, а на другой сервер.

    Как не терять данные из бд при перезапусках контейнера?

    Контейнер не теряет файлы при перезапуске. Скорее всего, вы его тупо удаляете, а затем пересоздаёте.

    Но тк приложение работает в докере, я не могу выполнить nano app.logs для просмотра логов.

    Писать логи в другое место/ docker attach / docker cp / экспорт логов и метрик в сервис мониторинга.

    p.s.
    Вот вам линтер для обучения.
    Ответ написан
    Комментировать
  • Как правильно реализовать очередь?

    Vindicar
    @Vindicar
    RTFM!
    Я вижу в тегах aiohttp, так что предполагаю, что код у тебя асинхронный.
    Мне тут как-то доводилось отвечать на подобный вопрос, может, и тебе пригодится...
    Идея простая - ты держишь долгоиграющую задачу, которая мониторит очередь запросов, и выбирает запросы из очереди один за другим. При этом каждый элемент очереди содержит future, в которое будет помещен результат работы корутины, и которое получает код, обратившийся к ресурсу.
    Я попробовал оформить это в виде декоратора, который автоматически троттлит обращения к функции. Возможно, код неоптимален, и его придётся допилить.
    Код

    import typing
    import asyncio
    import functools
    
    
    def throttled(delay: float, measure: typing.Literal['end_to_start', 'start_to_start'] = 'start_to_start'):
        def decorator(actual_func: typing.Coroutine) -> typing.Coroutine:
            queue = None
            task = None
            
            async def _single_query(future, args, kwargs):
                try:
                    result = await actual_func(*args, **kwargs)  # тут делаем асинхронное обращение к сервису
                except BaseException as err:
                    future.set_exception(err)  # была ошибка - теперь await future выкинет исключение
                else:
                    future.set_result(result)  # полуен результат - await future вернёт его
            
            async def _work_loop():
                nonlocal queue
                nonlocal task
                while True:
                    try:
                        # ждем, пока не придёт запрос, или пока не закончится таймаут
                        future, args, kwargs = await asyncio.wait_for(queue.get(), delay)
                    except asyncio.TimeoutError:  # новые запросы долго не приходят, сворачиваем работу, чтобы не тратить ресурсы
                        queue = None
                        task = None
                        return
                    single_task = _single_query(future, args, kwargs)
                    if measure == 'start_to_start':
                        asyncio.create_task(single_task)
                    else:
                        await single_task
                    queue.task_done()  # каждому успешному get() соответствует task_done()
                    await asyncio.sleep(delay)
            
            @functools.wraps(actual_func)
            async def query(*args, **kwargs):
                nonlocal queue  # обращение к переменной выше уровнем, но не глобальной
                nonlocal task
                future = asyncio.Future()  # Future просигналит, когда наш запрос будет обслужен
                if task is None:  # либо это первый запрос, либо запросы долго не приходили, и мы свернули работу
                    queue = asyncio.Queue()
                    task = asyncio.create_task(_work_loop())
                await queue.put((future, args, kwargs))
                return await future
            
            return query
        
        return decorator



    Пример использования:
    # delay - минимальный интервал между запросами в секундах
    # measure - как мерять интервалы между запросами: начало-начало или конец-начало
    @throttled(delay=5.0, measure='start_to_start')
    async def my_coroutine(*args, **kwargs) -> ReturnValue:
        ...

    При этом если задекорировать несколько функций, каждая из них будет иметь свою очередь задач.
    Минус - задача мониторинга будет висеть некоторое время после последнего запроса. А именно, пока таймаут между запросами не истечет.
    Ответ написан
    3 комментария
  • Ошибка импорта при сборке в docker alpine python приложения?

    Пакет libev не установлен в Alpine.
    Если этого недостаточно, тогда пиши автору в https://github.com/jonashaag/bjoern/issues
    Ответ написан
    Комментировать
  • Для чего используется каррирование (карринг) в реальных задачах?

    suguby
    @suguby
    программист, python, django, mysql, git, hg, linux
    Предположим есть функция, которая берет много параметров, а первый параметр - имя класса формы (в джанго)
    def cool_staff(form_class, inits, defaults, user, other_param):
        # много строчек кода

    и вы вдруг обнаруживаете что в вашем коде куча вызовов, у которых первый параметр одинаков.
    ...
    res = cool_staff(form_class=MainForm, inits={a:1, b:3}, defaults=[1,2,3], ...)
    ...
    res = cool_staff(form_class=MainForm, inits={a:100500, b:42}, defaults=[3,2,1], ...)
    ...

    Тогда делаете так:
    main_cool_staff = lambda **kwargs: cool_staff(form_class=MainForm, **kwargs)

    и ваши вызовы упрощаются
    ...
    res = main_cool_staff(inits={a:1, b:3}, defaults=[1,2,3], ...)
    ...
    res = main_cool_staff(inits={a:100500, b:42}, defaults=[3,2,1], ...)
    ...

    было в реальном проекте.
    UPD. Такая форма карринга не сработает для неименованных параметров
    main_cool_staff = lambda *args, **kwargs: cool_staff(form_class=MainForm, *args, **kwargs)

    поэтому используйте всегда именованные параметры, это хороший стиль.

    UPD2. Еще подсказали вариант
    import functools
    main_cool_staff = functools.partial(cool_staff, MainForm)

    работает и с неименованными параметрами. Спасибо Андрей Дугин
    Ответ написан
    6 комментариев
  • Как сделать телеграм бота мультиязычным c помощью i18n?

    qavitalii
    @qavitalii Автор вопроса
    Начинающий python програмист.
    Вот, в этому уроке нашел ответ. Всем спасибо.
    Ответ написан
    Комментировать
  • Как прикрутить WebHook к боту telegram (библиотека aiogram)?

    @krabodyan
    Расскажу как делал я:
    Скопировал код из примера по этой ссылке: https://github.com/aiogram/aiogram/blob/dev-2.x/ex...
    Установил ngrok и создал с его помощью ссылку на localhost:5000
    Порт можно использовать любой
    Переписал код таким образом:
    WEBHOOK_PATH = "" # да, тут пусто
    WEBHOOK_URL = "https://хххххххххххх.ngrok.io"
    WEBAPP_HOST = '127.0.0.1'
    WEBAPP_PORT = 5000
    Ответ написан
    2 комментария
  • Docker - как его понять новичку?

    @CHtommy
    Супер-мега-быстрый гайд для джунов.
    Есть канал на ютубе = СЛЁРМ. Маст-хев для начинающих с их школой. Там прям все по полочкам разложено. Хочу помочь тебе обратить ВНИМАНИЕ на dockerfile - т.к на нем создается весь конфиг твоего будущего стека. Соответственно можешь загуглить и посмотреть, как он создается. А после его внедрения он получит тот же phpmyadmin, linux, php,js и т.д (ИМЕННО DOCKERFILE(DOCKER-COMPOSE) СЛУЖИТ НАСТРОЙКОЙ ВСЕХ БУДУЩИХ КОМПОНЕНТОВ)
    И ты там спрашивал про то, что все компоненты скачиваются с ОС - не совсем, там урезанная версия OC, которая будет запускать только основные компоненты, а остальное ты сам дополняешь через dockerfile. Например тот же alpine весит не больше 15 мб,а остальная движуха по типу htop - ты уже сам закидываешь в dockerfile.

    Если еще короче, то: Все, что ты делал ранее на линуксе и настраивал под себя - нужно закинуть в dockerfile. Вдруг ты хочешь свапнутся на другой пк, а у тебя линукс стоит вообще хз где, ты dockerfile забираешь с собой и на другом пк ставишь docker и все. Все действия, которые ты делал на протяжении 3-6 часов компилятся автоматически за тебя и ты получаешь свою ОС с настройками и движухой.

    НО по мимо dockerfile, если вы в проде мутите "движуху "- скорее всего понадобится docker-compose. Просто загугли чем отличается одно от другого и там будет вся доступая инфа.

    Далее... docker-hub. Это как маркет с приложениями. Уже все готово и если ты не хочешь разворачивать LAMP & WAMP, то просто скачиваешь один из пакетов и все запускается за 2 минуты.

    И последнее...Если ты например для дома все это делаешь или тебе нужна вторая ОС для твоих задач, а не просто запустить сервер и готово, то есть WSL2 (привет win10). Туда же можно поставить ubuntu&debian&alpine и т.д

    Как по мне...Докер для форточки - это мусор никому не нужный. Что там запускать и тестить - я не знаю. Разве что девопсам опыт получать дома...

    UPD: Все твои вопросы описанные в теме - все они относятся к dockerfile. Там и ОС, там и стек, там и настройки.
    Ответ написан
    Комментировать
  • Сохранить позицию скролла при изменении размера окна?

    RAX7
    @RAX7
    Способ весьма костыльный, но вроде работает.
    Ответ написан
    1 комментарий
  • Что такое webhook?

    Negezor
    @Negezor
    Senior Shaurma Developer
    Webhook — механизм оповещения системы о событиях.

    Допустим есть определённый сервис который должен оповещать о событиях когда они происходят.
    Как вариант постоянно запрашивать новые данные на сервере, минус будет скорее в скорости получения данных если на сервере например стоит задержка на получения новых оповещений.
    А вот webhook исправляет этот недочёт, когда происходит событие он запрашивает адрес сайта с параметрами, например example.com/webhook/notification и передаёт в теле POST запроса JSON (зачастую) и там будут свежие данные.

    Простой пример можно посмотреть: создание бота для telegram на webhooks.
    Ответ написан
    4 комментария
  • Требуется ли для позиции джуна на django портфолио?

    approximate_solution
    @approximate_solution
    JS Developer. Angular\React\Vue\Ember
    Определенно нужно, хотя бы посмотреть как вы пишите код, и делите ли вы его на какие-либо логические модули. Это дает разработчику возможность подумать - а стоит ли давать вам техническое задание, или просто пропустить резюме. И оно так же позволяет оценить - был ли код в портфолио написан вами осмысленно, или же просто украден из репозитория гитхаба.

    Когда он видит красивый код из "портфолио", и некрасивую лапшу из тестового задания = все становится явью :)
    Ответ написан
  • Требуется ли для позиции джуна на django портфолио?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Где-то требуется, где-то нет. Но конкуренция среди джунов на столько высокая, что лучше иметь как можно больше поводов для найма.
    Ответ написан
    5 комментариев
  • Как после определённой кнопки заносить message.text в бд sqlite?

    MinTnt
    @MinTnt
    Нужно использовать..
    bot.register_next_step_handler(message, process_name_step)

    def process_name_step(message)

    https://github.com/eternnoir/pyTelegramBotAPI/blob...

    Кратко как работает: оно перенаправляет на выполнение следующей указанной функции, где она после получения message выполнит заданные действия, и перейдёт на главную(основную)(та что стоит под хандлером)
    Ответ написан
    Комментировать
  • Как в telegram боте совершать определенное действие каждые несколько часов?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    import asyncio
    
    from aiogram import Bot, types
    from aiogram.dispatcher import Dispatcher
    from aiogram.utils import executor
    
    DELAY = 7200
    
    bot = Bot(token='BOT TOKEN HERE')
    dp = Dispatcher(bot)
    
    @dp.message_handler(commands=['start', 'help'])
    async def send_welcome(message: types.Message):
        await message.reply("Hi!\nI'm EchoBot!\nPowered by aiogram.")
    
    
    async def update_price():
        ...
    
    
    def repeat(coro, loop):
        asyncio.ensure_future(coro(), loop=loop)
        loop.call_later(DELAY, repeat, coro, loop)
    
    
    if __name__ == '__main__':
        loop = asyncio.get_event_loop()
        loop.call_later(DELAY, repeat, update_price, loop)
        executor.start_polling(dp, loop=loop)

    Естественно, стоит позаботиться о том, чтобы внутри update_price не вызывались блокирующие операции.
    Ответ написан
    2 комментария
  • Как настроить вертикальную синхронизацию в браузере?

    @skaarj_ghost
    Попробуйте,
    в командной строке ввести "chrome://flags"
    далее по поиску
    Аппаратная растеризация Mac, Windows, Linux, Chrome OS, Android = вкл
    Подсчет количества образцов MSAA для аппаратной растеризации = 0
    Число потоков растрового изображения = 3

    Как подключен монитор, по какому кабелю? Например, вот этот ролик https://www.youtube.com/watch?v=AY9vvDGfytY периодически рвется на телевизоре, к. подключен как клон по hdmi 1.2, при этом на мониторе Philips 272P всё идеально (1080р, DVI-D). Видеокарт Asus GTX750.

    Из руководства по Филипсу:
    Обязательно ли использовать DP кабель версии 1.2, а не 1.1?
    Для улучшения передачи данных при последовательном подключении (daisy chaining) следует использовать кабель DisplayPort 1.2.
    Ответ написан
    2 комментария
  • Есть ли сообщество начинающих программистов-единомышленников?

    tundramani
    @tundramani
    русскоязычные люди (бывшие советские граждане) не способны создавать сообщества
    это наша национальная черта - мы не умеем совместно жить и работать
    когда-то давно в ссср могли но сдулись и деградировали
    и до ссср в 1917м государство тоже самоубилось как в 1991м

    например здесь на тостере хорошо помогают
    но тут нет нормального полноценного сообщества
    это сообщество индивидуалистов атомизированных

    хорошее сообщество это община, как семья, как родня
    где старшие заботятся о младших, где стимулируют талантливых

    русская общинность исчезла лет 50 назад
    последний рывок был - индустриализация, война и послевоенное строительство
    и всё, люди из общинных патриархальных деревень были переселены в города, и люди разучились жить

    и всё так потому что в современном обществе главное это деньги
    не творчество наука и изобретение и тд
    всё измеряется деньгами
    деньги это высшая ценность
    это культ бабла и потребления в котором человек человеку волк
    люди стали похожи на паразитов пожирающих биосферу

    с другой стороны ты ничем не ограничен - создавай любую социальную платформу и программируй сообщество
    просто большинство людей тупо не понимают как это делать
    некоторые даже скажут - фу! как можно программировать людей!
    да, люди программируются через обучение и воспитание
    и сообщество программируется через идеологию и закон

    это называется социальное программирование

    некоторые считают что нельзя программировать людей и любые идеологии должны быть запрещены - это философия одноклеточных анархистов-либералов-нигилистов-демократов, то есть невежественных атомизированных людей которых теперь большинство
    Ответ написан
    44 комментария
  • Где лучше учить Python самостоятельно?

    @Andrei1penguin1
    Если хочешь учить питон 2 года до уровня новичка, пожалуйста, делай как говорят, читай книжки и делай все по линеечке
    Если тебе нужен успех в этом деле, твои действия следующие:
    Поставил цель, проект, и начал выполнять
    Все, что не знаешь—гуглишь
    И так постепенно ставишь все более и более сложные проекты
    Во-первых опыт, во-вторых портфолио, а в-третьих куски кода из предыдущих проектов сможешь использовать в дальнейшем
    Ответ написан
  • Книжка/курс по Linux для новичка?

    @Mako_357
    Брайан Уорд Внутренее устройство Linux. Проще книгу не видел, затрагивает все устройство Linux, но кратко и по существу. На 380 стр. Читается легко.
    Из видеоуроков порекомендую канал Кирилла Семаева на ютубе. Ищется легко. Тебе нужен плейлист LPIC-1. Объясняет понятно и интересно.
    Ответ написан
    Комментировать
  • Где можно пройти курс по алгоритмам и структурам данных?

    @Andrey_Dolg
    Почитайте "Грокаем алгоритмы" книжка на 1 вечер, но сэкономит тучу времени на понимание основ. В ней есть лишь часть алгоритмов, но разжевано до основания, потому и на 1 вечер. Структуры тоже представлены частично.
    Ответ написан
    4 комментария