Задать вопрос
  • Сколько nft потянет ips?

    @Shaman_RSHU
    nft будет постоянно увеличивать потребление оперативки. Теоретически лечь не должен.

    Если fail2ban добавляет отдельные правила (drop ip saddr x.x.x.x) — это плохо, так как каждое правило — отдельный объект, и при сотнях тысяч их ядро может начать тормозить. Если используется динамическое множество (set) , например: add set inet filter blocked_ips { type ipv4_addr; flags interval; } и затем просто: add element inet filter blocked_ips { x.x.x.x } то это гораздо эффективнее.

    nft поддерживает TTL (время жизни) для элементов множеств - это позволит автоматически очищать старые записи. Но с TTL придётся поиграться)

    WAF + Cloudflare не советую по понятным причинам (если конечно подверженный ресурс не в зоне атаки РКН))
    Ответ написан
    1 комментарий
  • Почему вываливается предупреждение nginx: [warn] "ssl_stapling"?

    ky0
    @ky0 Куратор тега Nginx
    Миллиардер, филантроп, патологический лгун
    Попробуйте resolver добавить.

    А, ну и OCSP стал deprecated:
    May 7, 2025

    Prior to this date we will have added CRL URLs to certificates
    On this date we will drop OCSP URLs from certificates
    On this date all requests including the OCSP Must Staple extension will fail

    https://letsencrypt.org/2024/12/05/ending-ocsp/
    Ответ написан
    5 комментариев
  • Как по rsync передать файлы только с .doc расширением?

    Wispik
    @Wispik
    --include="*.doc"
    Ответ написан
    Комментировать
  • Как лимитировать трафик с определенной страны в Nginx?

    @dodo512
    limit_req_zone
    В качестве ключа можно использовать текст, переменные и их комбинации.
    Запросы с пустым значением ключа не учитываются.

    С помощью map новой переменной присваивать либо пустую строку либо $binary_remote_addr.

    limit_req_zone $bad_locale zone=zh_limit:10m rate=10r/s;
    
    map $cookie_locale $bad_locale {
        default     "";
        "zh"        $binary_remote_addr;
    }

    Дальше использовать limit_req zone=zh_limit как обычно. Ограничивать будеть только тех кто с нужной кукой.

    Ещё вариант $http_accept_language если нужно проверять содержимое заголовка Accept-Language.
    map $http_accept_language $bad_locale {
    default     "";
    ~^zh        $binary_remote_addr;
    }
    Ответ написан
    3 комментария
  • Чем отличается функция от конструктора и где применять то или это?

    К большому моему (личному) сожалению, Javascript - это язык, в котором возможно и разрешено вообще всё. Язык постоянно дополняется из "хотелок" пользователей.

    И вот в один момент разработчики спецификации ECMA-script решили, а давайте мы всё же оправдаем первые 4 буквы в названии языка, а именно "Java", и дадим пользователям сахарок, нарисованный над нашим прототипным наследованием, чтобы они могли везде писать class, extends и implements, как и все остальные ООП-динозавры. И сделали это.

    И с этим решением в наш прекрасный язык пришло понимание конструктора, как метода, создающего экземпляр класса. Конструктор очень сильно помогает с инкапсуляцией. В языках, имеющих настоящий ООП, есть приватные поля, которые не могут быть инициализированы прямым присваиванием в какой-то внешней функции, создающей объект, потому что к ним нет прямого доступа, и для такого придётся писать публичные сеттеры. А это плохо, потому что кто угодно сможет менять при помощи этих сеттеров то состояние, которое менять не надо.
    А вот из конструктора к приватным полям прямой доступ имеется. В Javascript приватные поля появились, кстати, вот буквально совсем недавно.

    class ClassWithPrivate {
      #privateField;
      publicField;
    
      constructor() {
        this.#privateField = "Доступ только изнутри класса";
      }
    }
    
    const instance = new ClassWithPrivate();
    
    instance.publicField = "Доступ извне класса";
    instance.#privateField; // Ошибка: SyntaxError: Private field '#privateField' must be declared in an enclosing class


    Еще одной особенностью конструктора является то, что он активно используется при наследовании (крестится и плюётся через левое плечо от отвращения). Если в дочернем классе не описан свой конструктор, то будет использован конструктор родителя. Это упрощает ООП.

    class Animal {
    
      constructor(name) {
        this.speed = 0;
        this.name = name;
      }
    
      run(speed) {
        this.speed = speed;
        alert(`${this.name} бежит со скоростью ${this.speed}.`);
      }
    
      stop() {
        this.speed = 0;
        alert(`${this.name} стоит.`);
      }
    
    }
    
    class Rabbit extends Animal {
      hide() {
        alert(`${this.name} прячется!`);
      }
    
      stop() {
        super.stop(); // вызываем родительский метод stop
        this.hide(); // и затем hide
      }
    }
    
    let rabbit = new Rabbit("Белый кролик"); // используется конструктор родителя
    
    rabbit.run(5); // Белый кролик бежит со скоростью 5.
    rabbit.stop(); // Белый кролик стоит. Белый кролик прячется!


    Таким образом, если вдарились в классический ООП, пользуйтесь везде конструктором, потому что ООП развивается десятилетиями, люди прошли сквозь страдания и выработали определённые "лучшие практики" для ООП.
    Если же вы используете объекты в основном как очень простые структуры без классической инкапсуляции с приватными полями, не используете наследование, а весь ваш код написан, в основном, на функциях, то делайте, ради бога, что вам вздумается, и отдельная функция-фабрика для создания объектов - это тоже вариант.
    Ответ написан
    Комментировать
  • Как поправить правила nftables при syn flood атаке?

    @alkeksy
    Я бы отправил через транслятор iptables->nftables что-то вроде
    iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 3 --connlimit-mask 24 -j DROP
    либо с матчем на limit,
    iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 5 -j ACCEPT
    connlimit ограничивает одновременное количество соединений, connlimit-mask говорит подключения из какого CIDR считать в один каунтер, /24 в примере выше,
    а limit ограничивает количество открывающехся соединений в единицу времени
    Ответ написан
  • Как в nginx отдать файл с другим расширением?

    @dodo512
    Или хотя бы отобразить по ссылке на file.jpeg, сам file.gif

    Создать новую переменную и заменить .jpeg на .gif с помощью map.
    map $uri $gif {
    default         $uri;
    ~^(.*)\.jpeg$  "$1.gif";
    }
    
    
    server {
        location @original {
            try_files $image_folder_1$uri  $image_folder_0$uri $image_folder_1$gif $image_folder_0$gif @errors;
        }
    Ответ написан
    5 комментариев
  • Как в express-validator отменить проверку поля?

    yarkov
    @yarkov
    Помог ответ? Отметь решением.
    А документация что говорит? Например эта страница: https://express-validator.github.io/docs/guides/cu...

    Плюс есть оператор if: https://express-validator.github.io/docs/api/valid...
    Ответ написан
    1 комментарий
  • Через что блокировать массово IP адреса на сервере?

    CityCat4
    @CityCat4
    Дома с переломом ноги
    man ipset
    Ответ написан
    Комментировать
  • Через что блокировать массово IP адреса на сервере?

    SignFinder
    @SignFinder
    Wintel\Unix Engineer\DevOps
    Такой массив адресов лучше хранить в ipset, а блокировать в iptables - iptables умеет взаимодействовать с данными из ipset.
    Ответ написан
    3 комментария
  • Как пересобрать массив объектов, выкинув из него лишнее?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Как-то так, если без учёта дубликатов, в один проход.
    function removeSomeShit(arr) {
      const table = {};
      const result = [];
    
      for(const current of arr) {
        const {uid, owner, createdAt} = current;
    
        const uidOvnerKey = `${uid}\0${owner}`;
        const ownerUidKey = `${owner}\0${uid}`;
    
        const matched = table[uidOvnerKey];
    
        if (matched) {
          delete table[uidOvnerKey];
          result.push(matched.createdAt > createdAt ? matched : current);
        } else {
          table[ownerUidKey] = current;
        }
      };
      
      return Object.values(table).concat(result);
    }
    Ответ написан
    1 комментарий
  • Как в nginx создать переменную с датой в формате yyyy-mm-dd?

    karabanov
    @karabanov
    Системный администратор
    map $time_iso8601 $date {
        ~(\d+-\d+-\d+).* $1;
        default "0000-00-00";
    }
    Ответ написан
    Комментировать
  • Как задать в nginx определенную директорию с учетом GET запроса?

    Lynn
    @Lynn
    nginx, js, css
    Как посоветовал ky0, лучше использовать явные аргументы вида $arg_name.

    map $arg_h:$arg_blur $imgdir {
        default                "/image";
        ~^(?<height>\d+):true$ "/tmp/h$height/blur";
        ~^(?<height>\d+):      "/tmp/h$height";
    }
    Ответ написан
    6 комментариев
  • Как задать в nginx определенную директорию с учетом GET запроса?

    ky0
    @ky0 Куратор тега Nginx
    Миллиардер, филантроп, патологический лгун
    Вместо того, чтобы всё усложнять и усложнять свою регулярку, сделайте условия с переменными-аргументами.
    Ответ написан
    2 комментария
  • Почему не отправляется почта через nodemailer?

    С недавнего времени ужесточилась политика обработки входящих email у google и yahoo. Теперь записи DKIM и DMARC обязательны. Без них оно просто не будет обработано сервисом.
    https://habr.com/ru/companies/globalsign/articles/...
    Ответ написан
    Комментировать
  • Как можно обновить head в next.js?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Я бы использовал существующий компонент Head, вместе с контекстом и состоянием, а так же кастомный HeadProvider:
    // _app.js
    import {HeadProvider} from './HeadProvider';
    
    function App({Component, pageProps}) {
        return (
            <HeadProvider>
                <Component {...pageProps} />
            </HeadProvider>
        );
    }

    // HeadProvider.js
    import React, {createContext, useContext, useState} from 'react';
    
    const HeadContext = createContext();
    export const useHead = () => useContext(HeadContext);
    
    export function HeadProvider({children}) {
        const [headData, setHeadData] = useState({
            title: 'Init title',
            description: 'Init description',
            keywords: 'Init keywords'
        });
    
        return (
            <HeadContext.Provider value={{headData, setHeadData}}>
                {children}
            </HeadContext.Provider>
        );
    }

    // MyBestHead.js
    import Head from 'next/head';
    import {useHead} from './HeadProvider';
    
    export function MyBestHead() {
        const {headData} = useHead();
    
        return (
            <Head>
                <title>{headData.title}</title>
                <meta name="description" content={headData.description}/>
                {/* more head items */}
            </Head>
        );
    }

    // MyComponent.js
    import React, {useCallback} from 'react';
    import {useHead} from './HeadProvider';
    
    export function MyComponent() {
        const {setHeadData} = useHead();
    
        const handleClick = useCallback(() => {
            setHeadData({
                title: 'New title',
                description: 'New description',
                keywords: 'New keywords'
            });
        }, [setHeadData]);
    
        return (
            <button onClick={handleClick}>Update Head Data</button>
        );
    }
    Ответ написан
    1 комментарий
  • Как проверить объект на присутствие неизвестного ключа?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    function isPermittedObject(obj) {
      if (!obj) return false;
      
      const permitted = new Set(["v", "c", "g"]);
      let max = 1;
    
      for (const key in obj)
        if (!permitted.has(key) || !max--) 
          return false;
      return true;
    }
    
    console.log(!isPermittedObject({
      v: 1,
      c: 3,
      g: 5
    }))
    
    console.log(!isPermittedObject({
      v: 1
    }))
    Ответ написан
    Комментировать
  • Как проверить объект на присутствие неизвестного ключа?

    @StockholmSyndrome
    const valid = (obj, allowedKeys) => (v => v.length === 1 && allowedKeys.includes(v[0]))(Object.keys(obj))
    Ответ написан
    Комментировать
  • Как в моем случае правильно обработать статику в Nginx?

    @dodo512
    Полный путь к файлу формируется из значения root и строки в try_files.
    Если root /var/www/staticHandle, то в try_files нужно передать "/../static/photos/image.jpg".
    В $uri уже есть "/photos/image.jpg" осталось добавить "/../static".

    try_files $imgdir/$imgfile /../static$uri /../static1$uri /../static2$uri /../static3$uri @image;
    Ответ написан
    Комментировать
  • Почему такая долгая загрузка в Яндекс Диск?

    @Maxim_Q
    Яндекс специально ограничивает скорость и вставляет палки в колеса при использовании Яндекс Диска по webdav, это уже разбирали тысячу раз и все матюкались на это дело. Янедексу не выгодно чтобы вы напрямую подключались к диску, т.к. за вами нельзя шпионить через их приложения.
    Это никак не исправить и никак на это не повлиять, проблема не у вас, а у Яндекса и он это решать не будет.
    Ответ написан
    Комментировать