пятница, 24 ноября 2023 г.

Debian. Изменение Time, Date и Timezone

Просмотр даты:

# date


Просмотр даты, времени и временной зоны:

# timedatectl


Перед ручной корректировкой даты, времени или временной зоны, отключаем синхронизацию времени:

# timedatectl set-ntp no


Изменение даты (в формате "YYYY-MM-DD"):

# timedatectl set-time 2023-11-24


Изменение времени (в формате "hh-mm-ss"):

# timedatectl set-time 10:12


Просмотр временных зон:

# timedatectl list-timezones


Установка временной зоны Europe/Astrakhan (GMT+4):

# timedatectl set-timezone Europe/Astrakhan

вторник, 20 июня 2023 г.

Создание нескольких виртуальных хостов (Apache2 vhosts)

 Источник: https://www.digitalocean.com/community/tutorials/how-to-set-up-apache-virtual-hosts-on-ubuntu-18-04-ru#


Шаг 1. (НЕ ОБЯЗАТЕЛЬНО) Обновляем ОС Debian и устанавливаем Apache2:

# sudo apt-get update && sudo apt-get upgrade

#sudo apt-get install -y apache2


Шаг 2. Создаем каталоги для сайтов:

#sudo mkdir -p /var/www/test1.local

#sudo mkdir -p /var/www/test2.local


Шаг 3. Даем права пользователю на каталоги сайтов:

#sudo chown -R user:user /var/www/test1.local

#sudo chown -R user:user /var/www/test2.local

#sudo chmod -R 755 /var/www


Шаг 4. Создаем конфигурации для сайтов:

#sudo nano /etc/apache2/sites-available/test1.local.conf

<VirtualHost *:80>
    ServerName test1.local
    ServerAdmin admin@test1.local
    DocumentRoot /var/www/test1.local
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>


#sudo nano /etc/apache2/sites-available/test2.local.conf

<VirtualHost *:80>
    ServerName test2.local
    ServerAdmin admin@test2.local
    DocumentRoot /var/www/test2.local
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>


Шаг 5. Проверка конфигурации Apache2

#apachectl -t

[ Syntax OK ] 


Шаг 6. Активация конфигурационных файлов

#sudo a2ensite test1.local.conf

#sudo a2ensite test2.local.conf


Шаг 7. Деактивация сайта по умолчанию

#sudo a2dissite 000-default.conf


Шаг 8. Перезагрузка сервера Apache2

#sudo systemctl restart apache2

#sudo systemctl status apache2


Шаг 9. Настройка файла hosts

В ОС Linux /etc/hosts

В ОС Windows c:\Windows\System.32\Drivers\etc\hosts

добавляем две записи для 2-х созданных виртуальных хостов:

IP_вашего_web_сервер      test1.local
IP_вашего_web_сервер      test2.local

четверг, 23 марта 2023 г.

PHP, ООП, автозагрузка классов (файлы классов в разных каталогов)

При разработке web-приложения на языке PHP с применением средств объектно-ориентированного программирования (ООП), удобно использовать автоматическую загрузку классов, особенно когда классов много, чтобы не использовать require_once или include для каждого файла, содержащего определенным класс.

Идея основана на применении функции Standart PHP Library - spl_autoload_register().
При создании класса: $class = new Class1(), если класс не найден, то вызывается функция spl_autoload_register().

Каждый класс хранится в отдельном файле.

Файл: /test/Framework/Autoloader.php
class Autoloader
{
    // Список каталогов, в которых расположены классы
    public static $dir_list = array('Framework/Core/', 'Framework/UI/');

    public static function register()
    {
        ini_set('unserialize_callback_func', 'spl_autoload_call');
        spl_autoload_register(array(new self, 'autoload'));
    }

    private static function autoload($class)
    {
        foreach (self::$dir_list as $dir)
        {
            $file = trim($dir, '/').'/'.$class.'.php';
            if (is_file($file))
            {
                require_once($file);
            }
        }
    }
}

Файл: /test/index.php
<?php
    required_once('Framework/Autoloader.php');

    // в случае если каталог поиска файлов классов надо установить свой
    // Autoloader::$dir_list = array('Framework/UI');

     Autoloader::register();

    $core = new Core();
    $menu = new Menu();
?>

Autoloader::$dir_list = позволяет определить массив строк, определяющих каталоги, в которых необходимо искать используемые файлы классов, или если для проекта список каталогов является одним и тем же списком, то этот список каталогов можно прописать прямо в статическую переменную класса Autoload `public static $dir_list = ...` и Autoloader::$dir_list не использовать.

Структура каталогов:
/test
    /Framework
        /Core
            Core.php

        /UI
            Menu.php

    Autoloader.php

index.php

вторник, 7 марта 2023 г.

Debian + php + ssmtp (Отправка почты с VDS или VMWare Player)

1. Обновляем Debian
sudo apt-get updat
sudo apt-get upgrade



2. Устанавливаем ssmtp
sudo apt-get install ssmtp


3. Устанавливаем mailutils (для использования `mail` в php-скрипте)
sudo apt-get install mailutils


4. Создаем учётную запись на почтовом сервер Yandex, например, user@yandex.ru с паролем user_111.

4.1. Заходим в настройки Яндекс.Почты созданного профиля и разрешаем "Все настройки" -> "Почтовые программы" и разрешаем доступ к почтовому ящику с помощью почтовых клиентов.

4.2. Создаем отдельный пароль для приложения, чтобы не сообщать сторонним сервисам ваш общий пароль на Яндексе (не помню где именно эта ссылка, можно найти через yandex.ru).


5. Добавляем к концу файл /etc/ssmtp/revaliases (используется для отправки письма с командной строки от имени учётной записи `root` и от исполнительного имени web-службы `www-data`)
root:user@yandex.ru:smtp.yandex.ru:465
www-data:user@yandex.ru:smtp.yandex.ru:465


6. Добавляем в файл /etc/ssmtp/ssmtp.conf настройки подключения к почтовому ящику:
mailhub=smtp.yandex.ru:465
AuthUser=user@yandex.ru
AuthPass=[Пароль из шага 4.2]
rewriteDomain=[hostnmae or domain-name]
hostname=[hostname or domain-name]
UseTLS=Yes
TLS_CA_File=/etc/ssl/certs/ca-certificates.crt
FromLineOverride=Yes
root=user@yandex.ru


Проверка через командную строку:
root@palem:~# echo "Test message!" | ssmtp user@yandex.ru


Проверка через php-скрипт:
<?php
    $to      = 'UserOld@list.ru';
    $subject = 'Test Email';
    $message = 'Hello Igor';
    $headers = 'From: Support Team <user@yandex.ru>' . "\r\n" .
        'Reply-To: support@server.com' . "\r\n" .
        'MIME-Version: 1.0' . "\r\n" .
        'Content-Type: text/html; charset=utf-8' . "\r\n" .
        'Content-Transfer-Encoding: quoted-printable';

    print mail($to, $subject, $message, $headers);
?>

понедельник, 19 декабря 2022 г.

Debian 11, включить модуль Apache rewrite

Источник: этот

Шаг 1. Активируем mod_rewrite
sudo a2enmod rewrite
sudo systemctl restart apache2


Шаг 2. Разрешаем использование файла .htaccess
sudo nano /etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
    <Directory /var/www/html>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    
    . . .
</VirtualHost>

Шаг 3. Проверяем корректность конфигурационного файла 
sudo apache2ctl configtest

Шаг 4. Перезапускаем службу Apache
sudo systemctl restart apache2

Шаг 5. В корне нашего web-сайта создаём файл `.htaccess`, и пишем в него две строки
sudo nano /var/www/html/.htaccess

Options +FollowSymLinks
Redirect /test.html http://7d3.ru


Страницу "test.html" не создаем. При попытке открыть страницу /test.html если переадресованы на 7d3.ru, значит .htaccess работает.

суббота, 10 декабря 2022 г.

C# dotnet 4.7.2 std - Асинхронный запрос к web-ресурсу (HttpClient, POST-метод, FilesAttach)

            Класс: CustomWebRequest_v3
         Копирайт: Виктор Туляков, дек-2022
       Назначение: Выполнение web-запроса
    Метод запроса: POST
 Доп. возможность: Прикрепление нескольких файлов

Пример использования:

...

private async void button1_Click_1(object sender, EventArgs e)
{
    CustomWebRequest_v3 webReq = 
                                new CustomWebRequest_v3(
                                          "http://192.168.0.101/engine/");

    webReq.event_msg = log;

    Task<string> getReq = webReq.SendCommand(new Dictionary<string, string> {
            { "script", "index"},
            { "key2", "value2"},
            { "key3", "value3"}
        },
        // вторым аргументом крепим файлы, используя new string[] {}
        // если файлы не крепим, то используем метод SendCommand с одним 
        // аргументом new Dictionary<string, string>{{"param", "value"}, ...}
        new string[] { @"d:\image1.jpg", @"d:\journal.txt" });

    string resp = "";

    resp = await getReq;

    if (resp == null)
    {
        log("Ошибка выполнения запроса.");
        return;
    }

    log(resp);
    log();
    log(webReq.lastRequest_DurationInSecond.ToString());
}

private void log(string msg = "")
{
    // Компонент TextBox для отображения событий от класса 'CustomWebRequest_v3'
    tbLog.AppendText(msg + "\r\n");
}

...



-------------------------------------------------------------
Скачать класс: CustomWebRequest_v3.cs

пятница, 9 декабря 2022 г.

Настройка https в Apache

 Источник: https://help.ubuntu.ru/wiki/apache_%D0%B8_https

Создание ключа и ssl-сертификата

Использование самоподписанных сертификатов хоть и защищает от пассивного прослушивания, тем не менее не гарантирует клиентам, что сервер является именно тем сервером, который им нужен. Преймуществом самоподписанных сертификатов является их бесплатность. Сертификат, подписанных компанией-сертификатором (Certificate authority) стоит денег.

# Для создания ключа и сертификата вводим команду:
openssl req -new -x509 -days 30 -keyout server.key -out server.pem

На вопрос «Enter PEM pass phrase:» отвечаем паролем, подтверждаем и запоминаем. На все последующие вопросы отвечаем произвольно, можно просто щелкать по Enter соглашаясь с предложенными вариантами, только на вопрос «Common Name (eg, YOUR name) []:» отвечаем именем сайта, для которого создаем сертификат, например www.example.com.

После ответа на все вопросы в директории должны появиться два новых файла - server.pem и server.crt (ключ и сертификат, соответственно).

Чтобы использовать сгенерированный ключ нужно знать пароль введенный нами, и Apache будет спрашивать его у нас при загрузке, а к чему нам лишние вопросы от демонов? :) Поэтому снимаем пароль с ключа:

cp server.key{,.orig}
openssl rsa -in server.key.orig -out server.key
rm server.key.orig

Скопируем их в /etc/ssl и назначим файлу ключа права чтения только администратору:

sudo cp server.pem /etc/ssl/certs/
sudo cp server.key /etc/ssl/private/
sudo chmod 0600 /etc/ssl/private/server.key

Шаг 2. Настройка Apache
# Для начала необходимо активировать mod_ssl:
sudo a2enmod ssl

# А затем включить настройки HTTPS сайта по умолчанию:
sudo a2ensite default-ssl

Теперь необходимо отредактировать файл с настройками HTTPS сайта по умолчанию, указав в нём пути к вашим сертификатам. Сам файл называется /etc/apache2/sites-enabled/default-ssl (или /etc/apache2/sites-enabled/default-ssl.conf).

# После дерективы
SSLEngine on

# ...добавляем строку для запрета использования устаревшего протокола SSLv2
SSLProtocol all -SSLv2

# Прописываем публичный сертификат сервера
SSLCertificateFile    /etc/ssl/certs/server.pem

# Прописываем приватный ключ сервера
SSLCertificateKeyFile /etc/ssl/private/server.key

# Перезапускаем Apache:
sudo service apache2 restart

При корректности указания параметров, сайт станет доступен по HTTPS.
Протокол HTTPS работает по 443 порту, поэтому если сервер находится за шлюзом, то необходимо на нём пробросить данный порт.

Шаг 3. Перенаправление HTTP запросов на HTTPS
#Для запрета использования HTTP и перенаправления на HTTPS адрес включаем mod_alias. 
sudo a2enmod alias
sudo service apache2 restart

В файл /etc/apache2/sites-enabled/000-default, отвечающий за виртуальный хост по умолчанию для HTTP запросов, добавляем директиву
Redirect / https://example.com/

При этом все настройки директорий можно удалить, поскольку по HTTP на ваши сайты всё равно будет не попасть.

Всё, теперь ещё раз перезапустите Apache и убедитесь, что при заходе по HTTP вы автоматически перенаправляетесь на HTTPS страницу.

Nginx + Let's Crypt

Шаг 1. Установка Certbot # apt-get install python3-acme python3-certbot python3-mock python3-openssl python3-pkg-resources python3-pyparsing...