Verification: a143cc29221c9be0

Nextcloud в системе не установлены рекомендуемые модули php imagick

Nextcloud в системе не установлены рекомендуемые модули php imagick

Создание нового пользователя

  • Новый unix-пользователь

    useradd -d /home/new_user -s /bin/bash new_user
  • Домашний каталог для нового пользователя

    mkdir /home/new_user
  • Установка владельца для домашнего каталога

    chown new_user:new_user /home/new_user
  • Задание пароля пользователя

    passwd new_user
  • Логин под новым пользователем

    su new_user

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

Например, инсталятор Debian'а не позволяет создавать пользователей, чьи имена содержат нижнее подчёркивание, что может идти в разрез с исторически сложившимися традициями с одной стороны, с другой стороны ручное создание пользователя может противоречить требованию единого id пользователя при работе с файловой системой на кластере.

В общем, разные бывают ситуации, иногда переименовать пользователя необходимо, сохранив его id.

  • Переменовать пользователя и группу:

    groupmod --new-name newuser olduser
    usermod --login newuser --home /home/newhome olduser
  • Переместить домашний каталог

    mv /home/oldhome  /home/newhome
  • При необходимости заменить имя пользователя в конфигурационнфх файлах программ пользователя, но желательно переименовывать только новых пользователей.

SSL-сертификат для сайта

Создание самоподписанного SSL-сертификата состоит из следующих этапов.

  1. Приватный ключ сервера.

    openssl genrsa -des3 -out jurik-phys.net.key 2048
  2. Запрос на подпись сертификата Сertificate Signing Request

    openssl req -new -key jurik-phys.net.key -out jurik-phys.net.csr

    В поле «Common Name» ввести доменное имя сайта, несколько имён через запятую, или маску сайта, например, *.jurik-phys.net

  3. Удаление пароля секретного ключа. Необходимо, чтобы apache при каждом запуске не спрашивал пароль секретного ключа.

    mv jurik-phys.net.key jurik-phys.net.key.org
    openssl rsa -in jurik-phys.net.key.org -out jurik-phys.net.key
  4. Генерация самоподписанного сертификата

    openssl x509 -req -days 365 -in jurik-phys.net.csr -signkey jurik-phys.net.key -out jurik-phys.net.crt

    Внимание! Использование самоподписанного сертификата будет вызывать в браузере предупреждение безопасности

  5. Другой вариант - получить (за соответствующую плату) сертификат от центра сертификации, отправив ему на обработку csr-файл.

  6. Необходимо скопировать сертификаты в каталог, где их ожидает увидеть Apache, настроить SSL сайта, перезапустить Apahce.

VNC

Запуск при старте ситемы

В файле /etc/rc.local добавить:

su - user_name -c "vncserver -geometry 1920x1080  -depth 24 -deferupdate 0" & 

Запуск DE (Xfce4) в VNC

В файле ~/.vnc/xstartup

exec /usr/bin/xfce4-session &
# x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
# x-window-manager &

Terminal: текстовый редактор

  • Просмотр возможных альтернатив текстовых редакторов

    update-alternatives --list editor
  • Выбор удобного редактора (vim)

    update-alternatives --config editor
  • В случае неуспеха (например, mc по прежнему используетиспользует внутренний редактор)

    select-editor

Руссификация

Квадраты в терминале

Русские буквы в консоли Debian/Ubuntu. После очередного обновления можно столкнуться с «квадратами» вместо букв. Решение:

dpkg-reconfigure console-setup

Выбрать:

    UTF-8
    Combined - Latin; Slavic and non-Slavic Cyrillic
    Fixed
    Размер по вкусу.

Шрифт Fixed т.к., Terminus может отображаеться квадратами.

Закрепить результат:

update-initramfs -u

Дополнительная информация по ссылке.

Переключение раскладки

Отправка e-mail'а из оболочки

Один из простых способов отправить электронную почку из шелла - использовать консольный почтовый клиент mutt в связке с внешним smtp сервером.

  • Настройка mutt (на примере mail.ru):

    vim ~/.muttrc
    set imap_user="mail_login"
    set imap_pass="mail_password"
    set realname = "Printed info"
    set smtp_url="smtps://$imap_user@smtp.mail.ru:465"
    set smtp_pass="$imap_pass"
    set ssl_force_tls=yes
  • Скрипт отправки сообщения:

    vim mail-send.sh
    #! /bin/bash
    
    subject="Email from bash"
    body="This email send using a bash scritpt"
    from="mail_login@mail.ru"
    to="resieve_email@mail.ru"
    
    echo "Sending email..."
    echo "$body" | mutt -s "$subject" -e "my_hdr From:$from" -b $from "$to"
  • Отправка скрытой копии на адрес отправителя позволяет сохранять отправленные сообщения на удалённом почтовом сервере.

Отправка online сообщения через Телеграм

  1. Создание собственного бота:

    • добавить в список пользователей @BotFather'а;

    • начать с ним разговор и выполнить команду /newbot;

    • установить человеко читаемое имя бота (name);

    • установить уникальное имя бота (username) вида @super_messages_bot;

    • сохранить в надёжном месте полученный TokenID созданного бота.

  2. Создание группы и добавление в неё бота

    • Рекомендация. В диалоге с @BotFather'ом в разделе «Bot Settings» запретить добавление приватного бота в сторонние группы настройкой «/setjoingroups»

  3. Активирование созданной группы, путём написания «/bla-bla-bla for @super_messages_bot»;

  4. Определение ID группы или «chat id»;

    • В полученном сообщении находим раздел «chat» и в нём запись «id:» . Отрицательное число и есть искомый «chat id»

  5. Отправка сообщения с помощью curl:

    curl -X POST "https://api.telegram.org/botXXX:YYYY/sendMessage" -d "chat_id=-zzzzzzzzzz&disable_notification=false&text=My sample text"

Сообщение с компьютера пришло на телефон в «телегу».

SSH

Запрет логина от root'а

В файле /etc/ssh/sshd_config установить

PermitRootLogin no

или

PermitRootLogin without-password

Копирование файлов

На удалённую машину:

scp local_file user_name@server_name:/path/to/new/place/ 

С удалённой машины:

Обратно тоже можно:
scp user_name@server_name:/path/to/remote_file /local_path/

Авторизация по ключу

  • Создание открытого и закрытого ключей локальной системы («Enter» для откака от ключевой фразы):

    ssh-keygen -t rsa
  • Настройка авторизации ssh по открытому ключу с помощью ssh-copy-id:

    ssh-copy-id -i ~/.ssh/id_rsa.pub user@remote
  • Eсли ssh-copy-id нет:

    • Копирование открытого ключа на удалённую систему

      scp ~/.ssh/id_rsa.pub  user@remote:id_rsa.pub
    • Авторизация на удалённом сервере:

      ssh user@remote
    • Добавление открытого ключа локальный системы в авторизованные ключи удаленной системы, установка правильных прав, «уборка мусора»:

      # создаем директорию и даём права
      [ -d ~/.ssh ] || (mkdir ~/.ssh; chmod 711 ~/.ssh) 
       
      # добавляем открытый ключ
      cat ~/id_rsa.pub >> ~/.ssh/authorized_keys        
       
      # делаем правильные права 
      chmod 600 ~/.ssh/authorized_keys                  
       
      # удаляем не нужное
      rm ~/id_rsa.pub
  • Проверка работоспособности на локальном компьютере:

    ssh user@remote
  • Запрет логина по паролю:

    PasswordAuthentication no

Эмуляция Socks proxy через SSH

ssh -D 127.0.0.1:8080 -f -N user.name@remote.domain.name

Ошибки подключения

Connection closed by

Образ системы на VPS зачастую идёт с пустыми ключами шифрования, о чём можно судить по ошибкам в /var/log/authorize «No supported key exchange format» и нулевым размерам ключей в /etc/ssh/. Сервис ssh в данном случае не запускается.

Решение заключается в генерации новых ключей:

ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key

Выполнение команд на удаленном сервере

ssh [user]@[server] '[command]'

DNSCrypt

Работу DNSCrypt можно оценить через один из сервисов проверки DNS:

Net.Storage over Яндекс.Диск

Идея: зарегистрировать N учётных записей Yandex.Disk'а по 10GB и примонтировать с помощью WebDAV N каталогов, объединить все N каталогов в единое облачное хранилище размером в N*10GB, прикрутить шифрование на стороне клиента и пользоваться сервисом для хранения редко используемых данных.

Особенности регистрации. Похоже, что за один подход лучше не регистрировать более 3-х учётных записей, иначе при переходе в Яндекс.Диск можно словить блокировку (мобильный в помощь):

Доступ временно ограничен

Соответственно, диск через WebDAV не монтируется c ошибкой:

402 Payment Required

Итог. Прежде чем переходить к следующему этапу, необходимо убедиться через Web-интерфейс, что Яндекс.Диск доступен для всех предполагаемых к использованию учётных записей.

Реализация Net.Storage в статье.

Облако Mail.ru

UPDATE: WEBDAV отключён

Подключение

В /etc/fstab, mail_user - имя пользователя

https://webdav.cloud.mail.ru/ /mnt/mail.ru davfs uid=mail_user,file_mode=666,dir_mode=777,user,noauto   0 0

В /etc/davfs2/secrets

/mnt/mail.ru  mail_user@mail.ru  "password"

Монтирование:

mount /mnt/mail.ru

Cогласно договору, mail.ru получает авторские права на все загружаемые данные, и может использовать их по своему усмотрению. Данные надо шифровать.

Шифрование

Например, с помощью EncFS, которая использует директорию для хранения зашифрованных файлов, а не специально подготовленную ФС.

Создадим точку монтирования для расшифрованного каталога:

mkdir /mnt/crypt.mail.ru

Установка пакета encfs

apt-get install encfs

Подключение зашифрованного каталога в облаке.

encfs /mnt/mail.ru/.encfs /mnt/crypt.mail.ru

При первом запуске утилита попросит ввести пароль для шифрования. Если каталог уже зашифрован, то утилита спросит пароль для расшифровки. После этого все операции необходимо производить через /mnt/crypt.mail.ru.

Отключение зашифрованного каталога

fusermount -u /mnt/crypt.mail.ru

Разное

Разрешить не root пользователям монитровать EncFS.

Файл /etc/fuse.conf:

user_allow_other

Добавить пользователя в группу fuse

usermod -a -G fuse $USER

Pulseaudio

Перенаправление звуковых потоков

Руководство по настройке перенаправления на лету вывода звука приложения между передними выходами звуковой карты (front-left,front-right) и задними выходами (rear-left,rear-right).

Данный способ позволяет подключить к компьютеру акустическую систему на передние выводы, а на задние, например, наушники и при необходимости перенаправлять вывод звука на то или иное устройство.

Однако, как выяснилось, при создании виртуальных sink'ов в /etc/pulse/default.pa, согласно руководству, монофонические файлы не будут слышны при воспроизводстве, увы. Проблема известная и связанная с тем, что предлагаемый способ требует установки «enable-remixing = no».

Предлагаемое решение состоит в том, чтобы cделать виртуальные sink'и «speakers» и «headphones» не 2-х канальными, а 4-х канальными, с дублированием выходов звуковой карты, но различающимися входами.

Первоначальный вариант при котором монофонические файлы не звучат выглядит так

load-module module-remap-sink sink_name=speakers   master=alsa_output.pci-0000_08_05.0.analog-surround-40 channels=2 master_channel_map=front-left,front-right channel_map=front-left,front-right remix=no 
load-module module-remap-sink sink_name=headphones master=alsa_output.pci-0000_08_05.0.analog-surround-40 channels=2 master_channel_map=rear-left,rear-right   channel_map=front-left,front-right remix=no

Изменённый вариант выглядит так:

load-module module-remap-sink sink_name=speakers   master=alsa_output.pci-0000_08_05.0.analog-surround-40 channels=4 master_channel_map=front-left,front-right,front-left,front-right channel_map=front-left,front-right,mono,mono remix=no
load-module module-remap-sink sink_name=headphones master=alsa_output.pci-0000_08_05.0.analog-surround-40 channels=4 master_channel_map=rear-left,rear-right,rear-left,rear-right channel_map=front-left,front-right,mono,mono remix=no

Замечание первое. sound_card_name для master= определяется из вывода команды

pacmd list-sinks | grep name

Замечание второе. В файле /etc/pulse/daemon.conf необходимо установить enable-remixing = no

Управление потоком Flash'а через PulseAudio

Настройка качества звука

Файл /etc/pulse/daemon.conf

resample-method = soxr-vhq
; resample-method = src-sinc-best-quality
default-sample-format = float32le
default-sample-rate = 192000
alternate-sample-rate = 96000

Цена улучшения звука - несколько бОльшая загрузка процессора.

Узнать поддерживаемые алгоритмы ресамплинга

pulseaudio --dump-resample-methods

Проверить текущий формат вывода звука картой

cat /proc/asound/card0/pcm0p/sub0/hw_params

Звуковой сервер в локальной сети

На звуковом сервере в файле /etc/pulse/default.pa раскомментировать загрузку сетевого модуля и установить авторизацию для локальной сети

load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.0.0/16

На удалённом клиенте запускать приложение в виде

 PULSE_SERVER=

Подробности раз, два, три.

Динамическое перенаправление звука на сервер (1)

На клиенте в /etc/pulse/default.pa

load-module module-tunnel-sink-new sink_name=edifier   server=dirac
update-sink-proplist edifier    device.description="Remote Bum-Bum"

Динамическое перенаправление звука на сервер (2)

На сервере /etc/pulse/default.pa

load-module module-zeroconf-publish

На клиенте /etc/pulse/default.pa

load-module module-zeroconf-discover

После перезапуска pulseaudio всё работает, но имя принимающего тунеля на сервере будет не очень красивым. Исправление на сервере

update-sink-proplist alsa_output.pci-0000_01_01.0.iec958-stereo device.description="Edifire R2800"

где alsa_output.pci-0000_01_01.0.iec958-stereo device.description определяется из вывода команды pactl list

Микрофон на выход (loopback)

Система с несколькими пользователями

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

Решение 1. Использовать системный демон pulseaudio

  • /etc/pulse/daemon.conf:

    deamonize = yes
    system-instance=yes
    local-server-type = system
  • Модуль для systemd, если отсутсвует в дистрибутиве /etc/systemd/system/pulseaudio.service

    [Unit]
    Description=PulseAudio Daemon
    
    [Service]
    Type=forking
    RemainAfterExit=yes
    ExecStart=/usr/bin/pulseaudio -D
    
    [Install]
    WantedBy=multi-user.target
    systemctl enable pulseaudio.service 
  • Добавить пользователя в группу pulse-access:

    adduser user_name pulse-access

Данный способ разработчики рекомендуют избегать, но он самый безглючный в плане звука.

Решение 2. Организовать подключение к пульсе для второго пользователя через unix-сокеты, открываемые первым пользователем. Источник.

/etc/pulse/default.pa:

load-module module-native-protocol-unix auth-anonymous=1 socket=/tmp/my-pulse-socket-name

У второго пользователя ~/.config/pulse/client.conf:

default-server = unix:/tmp/my-pulse-socket-name

Минусы. При логине второго пользователя до первого, звука у второго пользователя не будет вовсе т.к, при запуске pulseaudio выдаст ошибку:

pulseaudio --start
N: [pulseaudio] main.c: Обнаружен настроенный вручную сервер на %s, отказ от запуска.

Pulseaudio не видит USB устройство в списке карт

В файл /etc/pulse/default.pa добавить

load-module module-alsa-sink device=hw:X

Здесь «X» - индекс звуковой карты, согласно выводу команды

aplay -l | grep card

Источник

Kernel

Добавить модуль в initrd

Описание. Системный раздел зашифрован, при загрузке необходимо ввести пароль. Однако usb-клавиатура после начала загрузки ядра и до момента ввода пароля не функционирует.
Решение. Необходимо добавить модули отвечающие за работу подсистемы usb и hid в образ первоначальной загрузки (initrd).
Реализация (debian). Прописать в /etc/initramfs-tools/modules необходимые модули.

usbcore
usbhid
hid_generic
hid
ehci_pci
ehci_hcd
xhci_hcd

Обновить образ начальной загрузки.

update-initramfs -u -k all

Результат. Добавленные в initrd модули инициализируют подсистему USB до монтирования основной ФС, благодаря чему с помощью usb-клавиатуры можно ввести пароль шифрования и продолжить загрузку операционной системы.

Backup

Xfce

xfce4-appfinder (slow start)

xfconf-query -c xfce4-keyboard-shortcuts -p '/commands/custom/F2' -s "xfrun4 --disable-server"

Подробнее... v

Проблема системного лотка

Проблема с отображением значков в системном лотке Xfce (Ubuntu). Решение:

  • Отключение indicator-application в автозагрузке (снять галочку с Indicator Application).

  • Удаление пакета indicator-application.

Автологин в Xfce4 (lightdm)

vim /etc/lightdm/lightdm.conf
[SeatDefaults]
autologin-user=auto_login_user_name

Video

  • ffmpeg вырезать видео по времени

    ffmpeg -i ./file.avi -acodec copy -vcodec copy -ss 00:00:00 -t 00:02:13 ./new_file.avi

Audio

  • конвертироварть *.m4a to *.flac

    for file in *.m4a; do avconv -i "$file" -f flac "`basename "$file" .m4a`.flac"; done
  • именование файлов в соответствии с временем создания

    for file in *.mp3; do id=`stat --format=%Y "${file}"`; mv "${file}" "${id}"."${file}"; echo $id; done

Image

  • конвертировать *.png to *.tiff

    for f in *.png; do convert -colors 2  -colorspace Gray -normalize +dither "$f" "${f%%.*}.tiff"; done

Wine|CrossОver

Won't open docx, xlsx

Проблема: Не открываются docx, xlsx документы.
Решение: update-binfmts –disable jar
Подробнее...

Squid and VPS

http://nikhgupta.com/code/installing-squid-proxy-server-on-centos-5-vps/

По-умолчанию все внешние соединения с proxy запрещены (при необходимости учитывать):

# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS

# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
#http_access allow localnet
http_access allow localhost

# And finally deny all other access to this proxy
http_access deny all

Boot Flash Windows 7

Восстановление загрузчика

Linux [Grub 2]

Способ №1

  1. Загрузка с LiveCD (Linux)

  2. Монтирование корня восстанавливаемой системы

     mount /dev/sda1 /mnt
  3. Монтирование служебных каталогов в базовую систему

     mount --bind /dev /mnt/dev
    mount --bind /proc /mnt/proc
    mount --bind /sys /mnt/sys
  4. Смена корня загруженной системы

    chroot /mnt 
  5. Восстановление загрузчика

    update-grub

    или

    grub-install /dev/sda
    grub-mkconfig -o /boot/grub/grub.cfg
  6. Перезагрузка.

Способ №2

  1. Загрузка с LiveCD (Linux).

  2. Монтирование корня или /boot-раздела восстанавливаемой системы:

    mount /dev/sda1 /mnt/custom
  3. Восстановление загрузчика:

    grub2-install /dev/sda
  4. Перезагрузка.

  5. Из меню grub осмотреться командой «ls»;

  6. Настроить параметры загрузки и убедиться, что загрузчик видит файлы модулей:

    1. для /boot-раздела:

      set prefix=(hd0,1)/grub
      set root=(hd0,1)
      ls /grub
    2. для /-раздела:

      set prefix=(hd0,1)/boot/grub
      set root=(hd0,1)
      ls /boot/grub
  7. Если файлы модулей видны, то подключаем необходимые:

    insmod ext2
    insmod normal
  8. Переводим grub в полнофункциональный режим:

    normal
  9. Выбрав необходимый пункт появившегося меню, загружаем систему.

  10. Окончательно восстанавливаем загрузчик из рабочей системы:

    grub2-install --root-directory=/ /dev/sda

Способ №3

Загрузиться с установочного диска в режим восстановления, согласно инструкции[дистрибутив Debian]. :

  • To access rescue mode, select rescue from the boot menu, type rescue at the boot: prompt, or boot with the rescue/enable=true boot parameter.

Windows 7

  1. Загрузка с установочного диска

  2. Вызов командной строки Shift+F10

  3. В зависимости от «тяжести» случая выполнить

    Bootrec.exe /FixMbr
    Bootrec.exe /FixBoot
    Bootrec.exe /RebuildBcd
  4. Перезагрузка.

Suspend

Windows

Предотвращение отключения usb и переход в настоящий suspend. Мануал тут.

OpenVPN

Cоздание удостоверяющего центра

Система пользовательских сертификатов, центра сертификации и БД отозванных сертификатов называется PKI - Public Key Infrastructure.

На стороне сервера создается корневой сертификат [ca.crt] и закрытый ключ [ca.key].

  • Корневой сертификат [ca.crt] раздается всем клиентам. Служит для проверки подписи сертификатов клиента и сервера центром сертификации.

  • Корневой закрытый ключ [ca.key] используется для подписи сертификата сервера и всех клиентских сертификатов.

Для создания корневого сертификата и закрытого используется утилита easy-rsa из состава OpenVPN [/usr/share/doc/openvpn/examples/easy-rsa]. Начиная с версии 2.3 данную утилиту из пакета удалили, поэтому после установки отдельного пакета примеры лежат в /usr/share/easy-rsa. Путь к каталогу с PKI не должен содержать пробелов.

source ./vars
./clean-all
./build-ca 

Последняя команда [build-ca] создаст корневой сертификат [ca.crt] и приватный ключ центра сертификации [ca.key], вызвав интерактивную команду openssl.
Большинство запрошенных параметров установлены в значения по умолчанию взятые из файла vars, common name - единственный параметр, который должен быть явно указан.

Дополнение. Для избежания ошибки вида: The field needed to be the same in the CA certificate and the request необходимо отредактировать поле , изменив его с «match» на «optional» в файле openssl.cnf. Подробнее.

Генерация сертификата и приватного ключа OpenVPN сервера

Аналогично, с помощью утилиты easy-rsa генерируются сертификат сервера [server.crt] и закрытый ключ сервера [server.key]:

 ./build-key-server server 

Большинство параметров могут быть оставлены в значениях по умолчанию, явного ввода требует параметр Common name, можно ввести «server». Два других запроса требуют положительных ответов, «Sign the certificate? (Подписать сертификат?) [y/n]« и «1 out of 1 certificate requests certified, commit? (заверен 1 из 1 запросов на сертификацию, фиксировать?) [y/n]».

Генерация параметров Diffie Hellman'а

Для сервера OpenVPN необходимо создать параметры Diffie Hellman'а:

./build-dh

Дополнительная проверка пакетов "рукопожатия" SSL/TLS

openvpn --genkey --secret keys/ta.key

Файл ta.key должен быть доступен как на сервере, так и на клиент. При этом в конфигурации необходимо добавить

tls-auth ta.key N

, где параметр N должен принимать значение «0» на одной стороне и «1» на другой. Например, если на сервере N = «0», то на клиенте N должен быть установлен в «1».

Создание ключей для клиентов

source ./vars
./build-key client_somename 

Нюансы Android раз, два.

Основные файлы

Cозданные ключи и сертификаты расположены в каталоге keys.

Имя файла Где необходим Назначение Секретный
ca.crt сервер + все клиенты Корневой CA-сертификат НЕТ
ca.key машина для подписи ключей Корневой CA-ключ ДА
dh{n}.pem только сервер Параметры Diffie Hellman'а НЕТ
server.crt только сервер Сертификат сервера НЕТ
server.key только сервер Ключ сервера ДА
client1.crt только клиент1 Сертификат клиента1 НЕТ
client1.key только клиент1 Ключ клиента1 ДА
client2.crt только клиент2 Сертификат клиента2 НЕТ
client2.key только клиент2 Ключ клиента2 ДА

При подготовке материала по OpenVPN использовались источники: opennet.ru, habrahabr.ru, wiki.525.su, debian-help.ru

Настройка клиента (tap - интерфейс)

Файл /etc/openvpn/newton.conf

client
dev-type tap
dev vpn0
proto udp

remote AA.BB.CC.DD

resolv-retry infinite
persist-key
persist-tun
comp-lzo
ns-cert-type server
mute-replay-warnings

ca   /etc/openvpn/key/ca.crt
cert /etc/openvpn/key/newton.crt
key  /etc/openvpn/key/newton.key

script-security 3 system

up   /etc/openvpn/dhcp.sh
down /etc/openvpn/dhcp.sh

verb 0

Файл dhcp.sh

#!/bin/bash
#

[ -x /sbin/dhclient ] || exit 0

case $script_type in

up)
        # set mac address for tap interface
        ip link set dev ${dev} address 92:56:cd:85:43:d7
     
        # echo "Your misson should you choose to accept it:"
        # echo "dhclient -v ${dev}"
        # echo "You have 30 seconds...GO!"
        dhclient -v "${dev}" &
        ;;
down)
        echo "Releasing ${dev} DHCP lease."
        dhclient -r "${dev}"
        ;;
esac

Запрет на изменение resolv.conf при старте OpenVPN

Подсмотрено здесь. Создать ловушку для обхода изменения /etc/resolv.conf, путём создания файла /etc/dhcp/dhclient-enter-hooks.d/nodnsupdate следующего содержания:

#!/bin/sh
make_resolv_conf(){
	:
}

Сделать его исполняемым:

chmod +x /etc/dhcp/dhclient-enter-hooks.d/nodnsupdate

Данный скрипт заменяет функцию replace make_resolv_conf() на изменённую, которая ничего не делает.

Также может понадобиться отключить обновление dns в NetworkManager'е (см. ссылку).

Wi-Fi и OpenVPN

Особенность. OpenVPN релизован в виде tap интерфейса, сеть openvpn входит в домашнюю подсеть 192.168.93.xxx.

Задача.

  1. При подключении к домашнему Wi-Fi не подключать OpenVPN т.к. нет необходимости в поднятии туннеля до домашней локальной сети.

  2. При подключении к иной Wi-Fi сети подключать OpenVPN, поднимая тем самым туннель до домашней локальной сети, а следовательно и её сетевым ресурсам.

Решение.

Запускать1) OpenVPN2) при подключении Wi-Fi, проверяя SSID текущей сети, отключать OpenVPN при закрытии Wi-Fi.

Запуск отключение реализуется через параметры Network Manager'а в файле /etc/NetworkManager/dispatcher.d/01ifupdown:

        up|vpn-up)
             export MODE="start"
             export PHASE="post-up"
             ############################
             /etc/openvpn/vpn_status_test
             ############################
             run-parts /etc/network/if-up.d
             ;;
         down|vpn-down)
             export MODE="stop"
             export PHASE="post-down"
             ############################
             /etc/init.d/openvpn stop &
             ############################
             run-parts /etc/network/if-post-down.d
             ;;

/etc/openvpn/vpn_status_test:

#!/bin/bash
 
# jurik_phys@jabber.ru - ssid домашней сети
local_wifi=`/sbin/iwconfig wlan0 | /bin/grep -c  "jurik_phys@jabber.ru"`
# 192.168.93.5 - домашний ip для ethernet порта ноута
local_wire=`/sbin/ifconfig eth0 | /bin/grep -c "192.168.93.5"`
 
if [ $local_wifi == "1" ] || [ $local_wire == "1" ]; then 
  # echo "Home network. OpenVPN will be stop now"
 
  # SysV init version
  # /etc/init.d/openvpn stop
 
  # SystemD version
  systemctl stop openvpn@tesla
else 
  # SysV init version
  # vpn_not_run=`/etc/init.d/openvpn status | /bin/grep -c "not running"`
 
  # SystemD version
  vpn_not_run=`systemctl status openvpn@tesla | grep -c "inactive"`
 
  if [ $vpn_not_run == "1" ]; then 
     # echo "Intranet and OpenVPN not running. OpenVPN will be start"
 
 
     # SysV init version
     # /etc/init.d/openvpn restart
 
     # SystemD version
     systemctl start openvpn@tesla
  fi
fi

Steam

Locale en_US проблема

Missing library: libc.so.6

Решение на LOR'е

Cool Reader 3 (Debian)

Проблема. Версия cr3-3.0.56 с сайта проекта мало того, что не проходит по зависимостям (приходится вытаскивать содержимое deb-пакета), так ещё и не сохраняет настройки пользователя, пытаясь сохранить их в системном каталоге /usr/share/cr3.

Решение. Использовать данную версию из репозитория Alt Linux'а. Содержимое rpm пакета также придётся доставать вручную. Правда в дебиане потребуется собрать библиотеку libpng15.so и положить ещё в /usr/lib.

SystemD

Руководство администратора по SystemD от RH. Рассуждения справедливы для Debian 8 «Jessie».

Также хороший обзорный материал, SystemD in Action.

OpenVPN and NetworkManager

Запуск OpenVPN после появления connect'а в NetworkManager'е (конфигурация openvpn расположена в /etc/openvpn/newton.conf):

  1. Создать каталог

    /etc/systemd/system/openvpn@newton.service.d
  2. В каталоге создать файл NetworkManager-dependency.conf, следующего содержания

    [Unit]
    After=NetworkManager-wait-online.service wpa_supplicant.service
  3. Включить сервис NetworkManager-wait-online

    systemctl enable NetworkManager-wait-online.service

P.S. OpenVPN подключение поднимается не средствами NetworkManager из-за того, что при использовании tap сетевого интерфейса NM не может получить сетевые параметры из openvpn-сети через dhclient (Bug #297707).

Кириллица в именах юнитов

Монтирование NFS при старте системы

Случай управления сетью через systemd-networkd

  1. Проверка статуса сервиса контроля доступности сети:

    systemctl is-enabled systemd-networkd-wait-online.service
  2. Включение сервиса в случае его неактивности:

    systemctl enable systemd-networkd-wait-online.service

Случай доступа к файловому серверу через OpenVPN

  1. Создание mount-юнита. Имя юнита соответсвует пути к точке монтирования, например, /mnt/openvpn/public соответствует:

    /etc/systemd/system/mnt-openvpn-public.mount
  2. Содержание mount-юнита

    [Unit]
    Description=Mount NFS over OpenVPN (public)
    After=openvpn@newton.service
    
    [Mount]
    What=192.168.XX.YY://storage/public
    Where=/mnt/openvpn/public
    Type=nfs4
    Options=rsize=8192,wsize=8192,timeo=5
    
    [Install]
    WantedBy=multi-user.target

    Следует отметить, что в данном случае nfs монтируется из OpenVPN сети после установления связи.
    В категории Options важным параметром является timeo=5, без него монтирование не происходит, а в логах systemd упоминается об истекшем timeout при монтировании ресурса.

  3. Включение mount-юнита в systemd:

    systemctl enable mnt-openvpn-public.mount

Готово, при загрузке системы и удачном подключении openvpn в каталог /mnt/openvpn/public будет автоматически примонтирован удалённый ресурс 192.168.XX.YY:/storage/public.

Однако на этом настройка не закончена, ибо, система при выключении будет вставать в ступор на несколько минут, пытаясь отключить удалённый ресурс… Такой же ступор будет наблюдаться и при установки libvirt-daemon… В общем, очередной Bug #1438612.

Отключение NFS при выключении системы

Обход бага #1438612 связанного с ранним отключением dbus.service реализуется дополнением зависимостей к сервису NetworkManager, для чего:

  1. Необходимо создать каталог

    /etc/systemd/system/NetworkManager.service.d
  2. Внутри каталога создать conf-файл

    nfs-shutdown-unmount.conf

    следующего содержания:

    [Unit]
    After=dbus.service

В итоге выключение системы должно нормализоваться.

Управление сетью

SecuringNFS

Networkd Wait Online

  1. Перейти на управление сетью через systemd-networkd.

  2. Включить systemd-networkd-wait-online

    systemctl enable systemd-networkd-wait-online

Использование screen

Opera Browser

Flash don't start automatically

Флеш не стартует автоматически при включённом Opera Turbo. Решение - отключить Opera Turbo.

Настройка NFS

Основы mdadm

Установка ОС на LVM поверх Raid-1

  1. Удаление с помощью fdisk'а существующих разделов на /dev/sd{a,b} и создание одного большого типа «fd».

  2. Создание массивов:

    mdadm --create /dev/md0 --level=1 --raid-device=2 --metadata=0.90 /dev/sda1 /dev/sdb1
  3. Создание LVM:

    pvcreate /dev/md0
    vgcreate hdd /dev/md0
    lvcreate -n root -L 34G hdd
    lvcreate -n swap -L 3.26 hdd
  4. Ожидание окончания синхронизации массивов:

    watch -n 1 cat /proc/mdstat
  5. В дальнейшем установка Debian'а проходит в штатном режиме. К /dev/hdd/root подключить точку монтирования »/«, к /dev/hdd/swap - раздел подкачки. (Если установщик автоматически не соберёт raid+lvm, то его не сложно собрать через разметку диска установщика).

  6. После установки ОС необходимо установить загруузчик и на второй диск:

    grub-install /dev/sdb

Уменьшение размера Raid-1

Дано:

  1. df -h
    /dev/md5  424G          11G  414G    3% /home
  2. cat /proc/mdstat
    md5 : active raid1 sdb2[0] sda2[1]
          451684216 blocks super 1.2 [2/2] [UU]

    Рейд1 /dev/md5 смонтирован в каталог /home и содержит данные пользователей, размер 414ГБ;

Задача: Уменьшить замер домашнего каталога до 14 ГБ и на оставшихся 400ГБ поднять raid-1 для хранения данных.

Решение:

  1. Размонтировать /home:

    umount /home
  2. Пометить один из дисков сбойным:

    mdadm /dev/md5 --fail /dev/sdb2
    cat /proc/mdstat
    Personalities : [raid1] 
    md5 : active raid1 sdb2[0](F) sda2[1]
          451684216 blocks super 1.2 [2/1] [_U]
  3. Удалить сбойный диск из массива:

    mdadm /dev/md5 --remove /dev/sdb2
    cat /proc/mdstat
    Personalities : [raid1] 
    md5 : active raid1 sda2[1]
          451684216 blocks super 1.2 [2/1] [_U]
  4. Удалить раздел /dev/sdb2, создать два раздела (тип FD) на 4ГБ и 420 ГБ c помощью fdisk'a:

    fdisk /dev/sdb
    fdisk -l /dev/sdb
       Device Boot      Start         End      Blocks   Id  System
    /dev/sdb1   *        2048    73402367    36700160   fd  Linux raid autodetect
    /dev/sdb2        73402368    81790975     4194304   fd  Linux raid autodetect
    /dev/sdb3        81790976   976773167   447491096   fd  Linux raid autodetect
  5. Возможно необходимо перечитать таблицу разделов:

    partprobe
  6. Создать массив под /home и /mnt/srv.misc:

    mdadm --create /dev/md12 --level=1 --raid-devices=2 missing /dev/sdb2
    mdadm --create /dev/md13 --level=1 --raid-devices=2 missing /dev/sdb3
    cat /proc/mdstat
    Personalities : [raid1] 
    md13 : active (auto-read-only) raid1 sdb3[1]
          447359872 blocks super 1.2 [2/1] [_U]
          
    md12 : active (auto-read-only) raid1 sdb2[1]
          4192192 blocks super 1.2 [2/1] [_U]
  7. Форматировать блочные устройства в требуемую ФС, настроит её параметры:

    mkfs.ext4 /dev/md12
    mkfs.ext4 /dev/md13
    tune2fs -m 0 /dev/md12
    tune2fs -m 0 /dev/md13
  8. Остановить массива:

    umount /home
    mdadm --stop /dev/md5
  9. Удалить раздел /dev/sda2, создать два раздела (тип FD) на 4ГБ и 420 ГБ, перечитать таблицу разделов (см. выше).

  10. Добавляем к деградированным raid-1 массивам созданные разделы:

    mdadm /dev/md12 --add /dev/sda2
    mdadm /dev/md13 --add /dev/sda3
    cat /proc/mdstat
    Personalities : [raid1] 
    md13 : active raid1 sda3[2] sdb3[1]
          447359872 blocks super 1.2 [2/1] [_U]
          [>....................]  recovery =  4.5% (20240576/447359872) finish=85.7min speed=83028K/sec
          
    md12 : active raid1 sda2[2] sdb2[1]
          4192192 blocks super 1.2 [2/1] [_U]
            resync=DELAYED

    Видно, что разделы подхватились массивами и запустился поочерёдный процесс синхронизации raid-массивов. На данном этапе уже можно работать с массивами, но желательно дождаться завершения синхронизации.

Замена диска в RAID-1

Bash перенаправление потоков

0 - stdin
1 - stdout
2 - stderr

prog 1>log 2>err
#stderr в stdout:
2>&1

Дисковые квоты

USB Flash I/O

Запись на flash-накопители (ограничение буфера) ссылка.

Настройка KDE

Пропадают эффекты Kde4

KWin has detected that your OpenGL library is unsafe to use, falling back to XRender. 
kwin(5744): Failed to initialize compositing, compositing disabled 

Решение. В ~/.kde/share/config/kwinrc OpenGLIsUnsafe=true изменить на false (см. ссылку).

Обновление дистрибутива

Импортирование нового открытого ключа:

apt-key adv --recv-keys --keyserver keys.gnupg.net KEY-ID

Подготовка системы

Синхронизируем время.

Устанавливаем утилиту chrony:

apt-get install chrony

Выставляем нужный часовой пояс:

timedatectl set-timezone Europe/Moscow

* в данном примере московское время.

Разрешаем запуск демона chrony:

systemctl enable chrony

Настройка сервера баз данных

В качестве СУБД используем MariaDB.

Устанавливаем:

apt-get install mariadb-server

Разрешаем автозапуск и стартуем сервис:

systemctl enable mariadb

systemctl start mariadb

Задаем пароль для суперпользователя mysql:

mysqladmin -u root password

Подключаемся к MariaDB, создаем базу данных и пользователя:

mysql -uroot -p

> CREATE DATABASE nextcloud DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

> GRANT ALL PRIVILEGES ON nextcloud.* TO [email protected] IDENTIFIED BY ‘nextcloud’;

> \q

к содержанию ↑

Установка и настройка веб-сервера

PHP

Устанавливаем PHP, PHP-FPM и необходимые для работы nextcloud модули:

apt-get install php php-fpm php-common php-zip php-xml php-intl php-gd php-mysql php-mbstring php-curl php-imagick

Настраиваем php-fpm:

vi /etc/php/7.4/fpm/pool.d/www.conf

* путь к данной папке зависит от установленной версии php. В данном примере это 7.4.

Снимаем комментарии со следующей строки:

env[PATH] = /usr/local/bin:/usr/bin:/bin

Настраиваем php.ini:

vi /etc/php/7.4/fpm/php.ini

opcache.enable=1
opcache.enable_cli=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1

Разрешаем автозапуск php-fpm и перезапускаем его:

systemctl enable php7.4-fpm

systemctl restart php7.4-fpm

* php7.4-fpm зависит от версии установленного php.

к содержанию ↑

NGINX

Nextcloud можно развернуть на NGINX или Apache. В данной инструкции будем использовать первый.

Устанавливаем веб-сервер:

apt-get install nginx

Создаем виртуальный домен и настраиваем его для работы с облачным сервисом:

vi /etc/nginx/conf.d/nextcloud.conf

server {
        listen 80;
        server_name nextcloud.dmosk.ru;
        return 301 https://$server_name$request_uri;
}

server {
        listen 443 ssl;
        server_name nextcloud.dmosk.ru;

        ssl_certificate /etc/nginx/ssl/cert.pem;
        ssl_certificate_key /etc/nginx/ssl/cert.key;

        root /var/www/nextcloud;

        add_header Strict-Transport-Security “max-age=31536000; includeSubDomains” always;
        client_max_body_size 10G;
        fastcgi_buffers 64 4K;

        rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;
        rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;
        rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;

        index index.php;
        error_page 403 = /core/templates/403.php;
        error_page 404 = /core/templates/404.php;

        location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }

        location ~ ^/(data|config|\.ht|db_structure\.xml|README) {
                deny all;
        }

        location ^~ /.well-known {
                location = /.well-known/carddav { return 301 /remote.php/dav/; }
                location = /.well-known/caldav  { return 301 /remote.php/dav/; }
                location ^~ /.well-known{ return 301 /index.php/$uri; }
                try_files $uri $uri/ =404;
        }

        location / {
                rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
                rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;
                rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;
                try_files $uri $uri/ index.php;
        }

        location ~ ^(.+?\.php)(/.*)?$ {
                try_files $1 = 404;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$1;
                fastcgi_param PATH_INFO $2;
                fastcgi_param HTTPS on;
                fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        }

        location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
                expires modified +30d;
                access_log off;
        }
}

* где:

  • nextcloud.dmosk.ru — домен, на котором будет работать сервис; 
  • /etc/nginx/ssl — каталог, в котором будут храниться сертификаты; 
  • /var/www/nextcloud — каталог с порталом.

Создаем каталог для хранения сертификатов и переходим в него:

mkdir /etc/nginx/ssl

cd /etc/nginx/ssl

Генерируем сертификат:

openssl req -new -x509 -days 1461 -nodes -out cert.pem -keyout cert.key -subj “/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=nextcloud.dmosk.ru/CN=nextcloud”

* данная команда создаст сертификат на 4 года для URL nextcloud.dmosk.ru или nextcloud.

После установки php мог установиться и запуститься apache. Отключаем его:

systemctl stop apache2

systemctl disable apache2

Проверяем конфигурацию nginx, завершаем его автозапуск и перезапускаем сервис:

nginx -t

systemctl enable nginx

systemctl restart nginx

к содержанию ↑

Установка Nextcloud

Устанавливаем пакет unzip:

apt-get install unzip

Заходим на страницу nextcloud и копируем ссылку на скачивание последней версии программы:

Ссылка для скачивания nextcloud

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

cd /tmp

wget https://download.nextcloud.com/server/releases/nextcloud-22.0.0.zip

* на момент обновления инструкции последняя версия была 22.

Распаковываем скачанный архив:

unzip nextcloud-*.zip

И переносим содержимое архива в каталог /var/www:

mv nextcloud /var/www

Задаем права доступа:

chown -R www-data:www-data /var/www/nextcloud

Открываем браузер и переходим по адресу https://nextcloud.dmosk.ru, где nextcloud.dmosk.ru — адрес облачного сервиса.

Задаем логин и пароль для администратора. В качестве базы данных выбираем MySQL/MariaDB (если предлагается выбор) и вводим в качестве логина, пароля и базы nextcloud.

Задаем параметры для подключения к базе данных

Завершаем установку.

Оптимизируем работу базы данных:

sudo -u www-data php /var/www/nextcloud/occ db:convert-filecache-bigint

к содержанию ↑

Тюнинг после установки

Для корректной работы системы выполним дополнительную настройку. После входа в nextcloud под администратором, переходим в настройки для пользователя:

Переходим в настройку Nextcloud

В разделе «Параметры сервера» переходим в Основные сведения:

Переходим к общим сведениям

В разделе «Проверка безопасности и параметров» мы можем увидеть список проблем:

В разделе «Проверка безопасности и параметров» мы можем увидеть список проблем

Рассмотрим процесс решения некоторых из них.

к содержанию ↑

1. Разрешённое максимальное значение использования памяти PHP ниже рекомендуемого значения в 512 МБ

Открываем на редактирование файл:

vi /etc/php/7.4/fpm/php.ini

Меняем настройку для memory_limit:

memory_limit = 512M

Перезапускаем php-fpm:

systemctl restart php7.4-fpm

2. В системе не установлены рекомендуемые модули PHP

Данная ошибка устраняется в зависимости от списка модулей, которых не хватает системе. Чаще всего, подходит команда:

dnf install php-

Например:

apt-get install php-gmp php-bcmath

После перезапускаем php-fpm:

systemctl restart php7.4-fpm

3. Не настроена система кеширования

Для решения проблемы мы должны установить и настроить одно из средств кэширования:

  • APCu
  • Redis
  • Memcached

Мы рассмотрим два последних варианта.

Redis

Устанавливаем сам Redis Server и модуль php:

apt-get install redis-server php-redis

* в случае установки сервера Redis на отдельный сервер, необходимо выполнить на сервере Nextcloud только установку php-redis.

Перезапускаем php-fpm:

systemctl restart php7.4-fpm

Открываем конфигурационный файл для nextcloud:

vi /var/www/nextcloud/config/config.php

И добавим:

  ‘memcache.local’ => ‘\\OC\\Memcache\\Redis’,
  ‘memcache.distributed’ => ‘\\OC\\Memcache\\Redis’,
  ‘memcache.locking’ => ‘\\OC\\Memcache\\Redis’,
  ‘redis’ => 
      array (
          ‘host’ => ‘localhost’,
          ‘port’ => 6379,
      ),

Готово.

Memcached

Выполняем установку модуля для php и сам сервис memcached:

apt-get install memcached php-memcached

После разрешаем его автозапуск:

systemctl enable memcached

Перезапускаем php-fpm:

systemctl restart php7.4-fpm

После этого открываем конфигурационный файл для nextcloud:

vi /var/www/nextcloud/config/config.php

И добавим:

  …
  ‘memcache.local’ => ‘\\OC\\Memcache\\Memcached’,
  ‘memcache.distributed’ => ‘\\OC\\Memcache\\Memcached’,
  ‘memcached_servers’ =>
  array (
    0 =>
    array (
      0 => ‘localhost’,
      1 => 11211,
    ),
  ),
  …

Готово.

к содержанию ↑

4. Не указан регион размещения этого сервера Nextcloud

Для решения проблемы открываем конфигурационный файл nextcloud:

vi /var/www/nextcloud/config/config.php

Добавляем:


‘default_phone_region’ => ‘RU’,

Работа с пользователями из UNIX-Shell

В состав nextcloud входит php-скрипт occ, с помощью которого можно управлять сервисом из командной строки Linux.

Добавление пользователя

Создать нового пользователя можно командой:

sudo -u www-data php /var/www/nextcloud/occ user:add admin

* где admin — имя учетной записи.

Сброс пароля

При необходимости сбросить пароль пользователя, можно воспользоваться командой:

sudo -u www-data php /var/www/nextcloud/occ user:resetpassword admin

* где admin — учетная запись пользователя, чей пароль хотим сбросить.

Зачем преобразовывать SVG в PNG

Формат SVG по меркам информационных технологий уже давний. С выхода первой версии в 2001 году до актуальной на сегодняшний день версии от 16 августа 2011 прошло целых десять лет. SVG поддерживают все браузеры, и, казалось бы, весь интернет уже должен перейти на векторную графику. Но до сих пор существует масса ограничений на использование SVG.

Например, такие:


  1. SVG-файлы не показываются в большинстве почтовых клиентов — есть хорошее исследование на эту тему.
  2. В фиды RSS, YML (Yandex Market Language) и Google Merchant бессмысленно передавать ссылки на SVG-файлы — они не умеют работать с этим форматом.
  3. SVG нельзя использовать в OpenGraph (это такие вставки в HTML-код страницы, которые позволяют красиво репостить страницу в соцсети с предсказуемой иллюстрацией). Видимо, по той же причине: Facebook не работает с SVG.

Так что если у вас на сайте много векторной графики, пока рано отказываться от растровых картинок — придётся использовать и векторную графику, и её растровый аналог. Растровые изображения нельзя автоматически сконвертировать в векторные, поэтому конвертируем векторные.

Отображение векторных изображений на растровом экране — это, по сути, уже конвертация. Задача, казалось бы, тривиальная, но у меня, например, возникли неожиданные трудности.

У одного из наших клиентов (строительной компании) иллюстрации к продаваемой недвижимости были в SVG-формате: разнообразные чертежи и планы. И мы должны были сконвертировать векторные изображения SVG в растровые PNG — для больших YML-фидов, чтобы импортировать эти существенные объёмы данных в Mindbox и там создать товарные рекомендации, которые в дальнейшем вставлять в рассылки.

Задача конвертации SVG в PNG довольно типовая — в сети масса статей на эту тему с примерами кода. Неразумно использовать свою реализацию алгоритма растеризации SVG: сложно, долго и — словно изобретать велосипед. Нужно использовать готовые библиотеки.

Первая попытка: PHP с библиотекой ImageMagick

Начал я с ImageMagick — программы для работы с графикой, своего рода программным Photoshop. И её возможностями можно пользоваться изнутри программ на PHP. Надо лишь подключить PHP-библиотеку Imagick, то есть специальную комплектацию для PHP.

С этой библиотекой код конвертации SVG в PNG кажется элементарным:

$imagick = new Imagick();

$fp = fopen(‘image.svg’, ’rb’);

$imagick->readImageFile($fp);

$imagick->setImageFormat("png8«); //png8 — это png c 8-битной палитрой

$imagick->writeImage(‘image.png’);

fclose($fp);

Но он не заработал. Оказывается, поддержка SVG в ImageMagick не включена по умолчанию, и необходимо подключить ещё одну библиотеку libmagickcore-6.q16-3-extra. К счастью, на нашем хостинге операционная система Debian Linux, которая позволяет устанавливать любые программы и библиотеки без ограничений.

Ставлю:

sudo apt-get install libmagickcore-6.q16-3-extra

Появилась поддержка SVG. Тестовый код заработал. Но когда я таким способом стал массово конвертировать файлы, программа споткнулась на одном подозрительном файле: она просто остановилась, и ничего не происходило. Ошибка не показывалась, скрипт продолжал «висеть».

Я попробовал для начала просто пропустить этот файл, не конвертировать. Может он один такой аномальный? Но оказалось, что подобных файлов, на которых спотыкается строка $imagick->readImageFile, больше 5%. Это много.

Выяснить, по какой причине происходит это зависание, мне не удалось. Если нет сообщений об ошибках, то нужен не программист, а экстрасенс.

Возможно обновление библиотеки ImageMagick до какой-то версии могло решить эту проблему. Но не стоит заниматься установкой/удалением множества библиотек ради решения одной задачи. Это может повлиять на работоспособность всего хостинга из-за неожиданных конфликтов на других сайтах и программах, использующих ImageMagic текущей версии.


Вторая попытка: Node.js

Если на PHP не выходит, значит, можно попробовать другой язык программирования — JavaScript. И его серверную версию Node.js.

Для работы с SVG были найдены две библиотеки: первая использовала PhantomJS, а вторая — Headless Chrome. Это программы, которые обладают тем же функционалом, что и Chrome-браузер, но не содержат графического интерфейса. С их помощью, например, удобно автоматически делать массовые скриншоты сайтов или имитировать путешествие пользователя по сайту для тестирования. Иными словами, обе библиотеки не преобразовывали SVG в растровую графику самостоятельно, а использовали для этой задачи серверную версию браузера (без графической оболочки). То есть перекладывали всю работу на другие программные компоненты.

При установке мы столкнулись с некоторыми сложностями: библиотеки и их зависимости были установлены, но при попытке сконвертировать SVG в PNG полетели ошибки. Для решения вновь придётся заниматься кропотливой установкой библиотек, соблюдать правильную версионность, искать причины ошибок в сети — на этот раз для node.js.

Современный программист при написании программ массово использует уже готовые библиотеки, написанные и развиваемые кем-то ещё. Это напоминает сборку автомобиля из отдельных узлов и агрегатов.

Но проблема многих модулей и программных библиотек — их несовместимость между собой. Авторы библиотек не успевают за изменениями друг друга. Да и компьютеры и операционные системы у всех разные.

Выход — отказаться от библиотек и использовать чужие готовые программы.