Синхронизация времени в контейнере KVM

Дата: 11.08.2015Метки:

Без регулярной синхронизации, в зависимости от нагрузки на хост-систему, время внутри KVM контейнера может быстро сбивается. Причина такого поведения вызвана архитектурой операционной системы и особенностями технологии виртуализации.

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

Для поддержания времени в актуальном состоянии необходимо регулярно выполнять синхронизацию. Для этих целей можно использовать ntpd, но для контейнеров KVM предпочтительнее использовать синхронизацию системного времени с аппаратными часам kvm-clock.

Время kvm-clock соответствуют времени на хост-системе, таким образом нет необходимости использовать ntpd в каждой гостевой системе.

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

/sbin/hwclock --hctosys

Для того что бы система регулярно каждый час синхронизировала часы, добавим задание в cron:

crontab -e
0 */1 * * * /sbin/hwclock --hctosys

 

Wget ERROR: The certificate is not trusted

Дата: 11.08.2015Метки:

Из-за отсутствия в системе корневых сертификатов, wget при попытке получить данные с сервера по протоколу https не может выполнить проверку подлинности сертификата. В результате мы получим такую ошибку:

ERROR: The certificate of 'openssl.org' is not trusted.

Для решения проблемы необходимо установить пакет ca-certificates:

apt-get install ca-certificates

Как вариант можно использовать опцию игнорирования проверки подлинности:

wget --no-check-certificate

Следует отметить, использовать данную опцию необходимо крайне осторожно, это потенциально опасно и может поставить под угрозу всю систему.

Изменяем title страниц в WordPress

В WordPress по умолчанию для каждой страницы в содержимое тега title дописывается название сайта. С точки зрения SEO это не всегда правильно. Изменить формат тега title можно при помощи различный SEO плагинов. Для простых случаев можно обойтись редактированием файла functions.php, добавив в него следующий код:

function theme_name_wp_title( $title, $sep ) {
	global $page, $paged;

	if ( is_home() || is_front_page() ) {
		$title = get_bloginfo( 'name', 'display' ) . ' - ' . get_bloginfo( 'description', 'display' );
	}
	if ( is_page() ) {
		$title = get_the_title();
	}
	if ( is_single() ) {
		$title = get_the_title();
	}
	if ( is_category() ) {
		$title = single_cat_title( 'Рубрика: ', false );
	}
	if ( is_archive() && !is_category()) {
		$title = 'Месяц: ' . get_the_date( _x( 'F Y', 'monthly archives date format', 'twentyten' ) );
	}
	if ( is_search() ) {
		$title = 'Результаты поиска: ' . get_search_query();
	}
	if ( is_tag() ) {
		$title = single_tag_title('Метка: ', false);
	}
	if ( ( $paged >= 2 || $page >= 2 ) && ! is_404() ) {
		$title .= '. Страница ' . $paged . '.';
	}
	return $title;
}
add_filter( 'pre_get_document_title', 'theme_name_wp_title', 10, 2 );

Начиная с WordPress 4.4 функция wp_title() упразднена, вместо нее необходимо использовать pre_get_document_title.

Использование веб-шрифтов внутри CSS

Дата: 10.08.2015Метки:

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

Основная мысль статьи заключается в том, что за счет хранения шрифтов в CSS файле мы можем ускорить загрузку сайта и уменьшить количество запросов к серверу. С технической стороны метод выглядит следующим образом. Используя Base64-представление, мы переводим бинарные данные шрифта в ASCII-текст, после чего записываем его в CSS-файл.

Несмотря на очевидные преимущества, у данного метода есть свои недостатки. Если Google Fonts автоматически отдает шрифты в понятном для браузера формате, то в нашем случае придется использовать специальный скрипт. Я же склоняюсь к более простому варианту — просто пожертвовать совместимостью со старыми версиями браузеров.

Шрифты WOFF на текущий момент являются наиболее предпочтительными для использования. Если верить статистике сaniuse.com, этот формат поддерживают более 88% используемых браузеров в мире.

В качестве источника шрифтов лучше всего использовать Goole Fonts. Просто загружаем WOFF-файлы по ссылкам из CSS. По умолчанию в Chrome загружаются шрифты в формате WOFF2, поэтому для загрузки WOFF необходимо использовать браузер Internet Explorer.

Как запасной вариант — можно выполнить конвертирование из формата TTF в WOFF. Для этих целей в интернете есть множество онлайн-сервисов. Следует отметить, что после такой конвертации отрисовка шрифта может незначительно отличаться.

В целом я могу порекомендовать для этих целей Webfont Generator. Кроме функции конвертирования, он еще умеет оптимизировать шрифты и отдавать их в закодированном Base64 виде.

Еще можно использовать ttf to woff converter. Что бы перевести шрифты в Base64-представление используем утилиту Base64 Encode/Decode:

b64 -e input.woff output.txt

Поле того чего копируем шрифты в CSS:

@font-face {
 font-family: 'Noto Sans';
 font-style: normal;
 font-weight: 400;
 src: url(data:application/font-woff;charset=utf-8;base64,
d09GRgABAAAAAGfQABEAAAAAoxQAAQABAAAAAAAAAAAAAAAAAAAAAAAAAABHREVGAAABgAAA
AEQAAABeBXMEg0dQT1MAAAHEAAAF4wAADKz1RCPkR1NVQgAAB6gAAAAMAAAADAAVAApPUy8y
AAAHtAAAAGAAAABgd9GZHGNtYXAAAAgUAAABFQAAAYz5wR+KY3Z0IAAACSwAAACWAAAA/hmv
GsVmcGdtAAAJxAAABHkAAAe0NgsWDGdhc3AAAA5AAAAAEAAAABAAFgAjZ2x5ZgAADlAAAFDx
...
) format('woff');
}

Файл со шрифтами подключают как обычные CSS или загружают специальным скриптом:

Установка сертификатов StartSSL

Дата: 05.08.2015Метки:

Данная статья предполагает, что мы уже успешно прошли процедуру регистрации на сайте StartSSL и в нашем распоряжении есть следующие файлы: сертификат ssl.crt с проверкой домена и приватный ключ ssl.key. Копируем эти два файла на сервер. Приватный ключ перед использованием необходимо расшифровать командой:

openssl rsa -in ssl.key -out private.key

На этом этапе необходимо будет ввести пароль, который мы указывали в процессе заказа сертификата на сайте StartSSL.

Для безопасности установим права доступа на private.key:

# Только владелец может читать файл
chmod 400 /etc/nginx/ssl/*

Скачиваем сертификат Class 1 Intermediate Server CA:

wget http://www.startssl.com/certs/sub.class1.server.ca.pem

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

cat ssl.crt sub.class1.server.ca.pem > domain.pem

Минимальная конфигурацию NGINX для проверки работы SSL:

server {
    listen       443 ssl;
    server_name  domain.net;

    ssl_certificate      /etc/nginx/ssl/domain_com/domain.pem;
    ssl_certificate_key  /etc/nginx/ssl/domain_com/domain.key;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

После изменения настроек необходимо перезапустить NGINX:

service nginx restart

Для проверки правильности установки сертификатов используем сервис Symantec SSL Toolbox.

Подключение к OneDrive по протоколу WebDav

Последовательность действий аналогична подключению обычной сетевой папки, за исключением одной особенности — необходимо знать свой CID. Для этого в веб-интерфейсе OneDrive заходим в любой каталог, в адресной строке браузера вы увидите параметр cid=XXXXXXXXXXXXXXX.

Адрес подключения к хранилищу OneDrive по протоколу WebDAV выглядит следующим образом:

https://d.docs.live.net/XXXXXXXXXXXXXXX

Его необходимо скопировать в окно подключения сетевого диска, когда система запросит авторизацию, введите логин и пароль от вашего аккаунта OneDrive.

Для подключения также можно использовать командную строку:

net use S: https://d.docs.live.net/XXXXXXXXXXXXXXX/ /user:"user@live.com" "password" /persistent:yes

Backup данных на Яндекс Диск в Linux

Простой и одновременно надежный скрипт для создания и дальнейшего хранения бэкапов на Яндекс Диске. В примере ниже скрипт ежедневно в полночь делает дамп базы MySQL и создает архив всех файлов в заданном каталоге. Переменная TIME подобрана таким образом, чтобы бэкап за предыдущий день, кроме последнего числа месяца, затирался свежей резервной копией. При желании можно хранить бэкапы за каждый день, для этого измените формат даты на +%Y-%m-%d.

Создаем файл backup.sh, копируем в него следующие строки:

#!/bin/bash
# Задаем формат даты
TIME=`date +%Y-%b`

FILES=/tmp/www.$TIME.tar.gz
MYSQL=/tmp/mysql.$TIME.sql.gz

# Создаем архив файлов
tar -czf $FS_FILE -P /www

# Создаем архив базы MySQL
mysqldump -u backup --password=password --all-databases --ignore-table=mysql.event | gzip > $MYSQL

# Загружаем данные
curl --user user@yandex.ru:password -T "{$FILES,$MYSQL}" https://webdav.yandex.ru/

# Удаляем файлы
rm $FILES $MYSQL

Создадим пользователя для бэкапа данных MySQL, назначим права для SELECT и Lock Tables:

CREATE USER 'backup'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT, LOCK TABLES ON * . * TO 'backup'@'localhost' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

Даем скрипту права на запуск:

chmod 0700 backup.sh

Добавим задание в crontab:

crontab -e
# Запускаем скрипт каждый день в полночь
0 0 * * * /home/backup.sh

Backup данных на OneDrive в Linux

В Windows 10 клиент OneDrive установлен в системе по умолчанию и изначально для хранения данных сервис предоставляет 15GB бесплатного пространства. Дополнительно можно получить «вечных» +30GB за счет бонусных программ. В моем случае это были: привлечение новых пользователей, загрузка изображений с камеры и программа лояльности. Как видите, можно получить существенный объем хранилища совсем даром. Так почему бы не использовать это место с пользой? Связи с чем я решил отказаться от использования DropBox и перенести все важные данные в облако OneDrive.

Еще я использовал Яндекс Диск в качестве хранилища бэкапов для Linux сервера. Главное достоинство Яндекс Диска — возможность заливать файлы по протоколу WebDAV просто используя сurl. Что бы все важные данные хранились в одном месте, было принято решение перенести бэкапы в OneDrive.

Для работы с OneDrive в Linux без использования клиента необходимо использовать OneDrive API. Я не горел желанием самостоятельно его ковырять, поэтому был взят уже готовый скрипт скрипт bash-onedrive-upload. Для работы скрипта необходимо указать Client ID и Client secret, для этого в Microsoft account Developer Center необходимо создать новое приложение. В настройках приложения «Edit settings» — «API Settings» обязательно нужно выбрать опцию «Mobile or desktop client app: yes».

Заливаем скрипт bash-onedrive-upload на сервер, bash-json-parser необходимо скачать отдельно и положить в каталог /libs/json/. Даем право на запуск:

chmod 0700 onedrive-authorize onedrive-base onedrive-upload ./libs/json/bash-json-parser

В файле onedrive.cfg необходимо указать полученные Client ID и Client secret:

export refresh_token_file="${script_base_folder}/.refresh_token"

# Authentication config
export api_client_id="Client ID"
export api_client_secret="Client secret"

# Upload config
# Leave empty for root folder
export api_folder_id=""
export max_upload_threads=2

Если оставить параметр export api_folder_id пустым, то по умолчанию файлы будут заливаться в корень OneDrive. При желании можно задать любой вложенный каталог. Для этого из адресной строки веб-интерфейса OneDrive необходимо скопировать id этого каталога.

Запускаем скрипт onedrive-authorize. Скрипт попросит перейти в браузере по указанной ссылке, где вам необходимо разрешить доступ приложению к данным OneDrive. После отверждения откроется пустая страница, из адресной строки которой в окно терминала необходимо скопировать значение параметра code. Если вы все сделали правильно, то увидите в терминале нечто похожее на это:

./onedrive-authorize
Please open the following URL in your browser and follow the steps until you see a blank page:
https://login.live.com/oauth20_authorize.srf?client_id=0000000000000000&scope=wl.skydrive%20wl.skydrive_update%20wl.offline_access&response_type=code&redirect_uri=https://login.live.com/oauth20_desktop.srf

When ready, please enter the value of the code parameter (from the URL of the blank page) and press return
111111111-1111-1111-1111-111111111111
It seems like we have a refresh token, so we are ready to go

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

#загрузка файла в коневой каталог
./onedrive-upload file1

#загрузка файла в вложенный каталог
./onedrive-upload -f "path" file1

Скрипт создания бэкапа и загрузки на сервер OneDrive:

BACKUP_FILES="/home/www /etc/nginx"
MYSQL_USER="user"
MYSQL_PASS="password"
TMP_DIR=/tmp/backup
BACKUP_TAR=/tmp/backup.`date +%y.%m.%d`.tar

mkdir -p $TMP_DIR

# Backup files
tar -czf $TMP_DIR/fs.tar.gz -P $BACKUP_FILES

# Backup MySQL
for db in $(mysql -B -s -u $MYSQL_USER --password=$MYSQL_PASS -e 'show databases' | grep -v information_schema)
do
# Exclude database
    if [ $db != "performance_schema" ] && [ $db != "mysql" ]; then
    mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $db | gzip > $TMP_DIR/mysql.$db.sql.gz
    fi
done

# Merge files
tar -cf - -C $TMP_DIR . > $BACKUP_TAR

# OneDrive upload
./onedrive-upload -f "Sites/backup" $BACKUP_TAR

rm -r $TMP_DIR $BACKUP_TAR

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

Переименовываем папку пользователя в Windows 10

Дата: 01.08.2015Метки:

После чистой установки Windows 10, я обнаружил что имя папки пользователя состояло из обрезанного до 5 символов логина учетной записи Microsoft. Как говориться: мелочь, а неприятно.

В редакторе реестра переходим по адресу:

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionProfileList

Находим свой профиль и меняем значение строкового параметра ProfileImagePath на желаемый путь, перезагружаем компьютер.

Вход в сиcтему будет выполнен под временным профилем. Переименуйте папку пользователя C:UersMyName в соответствие значению ProfileImagePath. Если все сделали правильно, то после следующей перезагрузки, вход в систему будет выполнен под вашим текущим профилем.

Для изменения папки синхронизации OneDrive, необходимо запустить:

"C:UsersMyNameAppDataLocalMicrosoftOneDriveUpdateOneDriveSetup.exe"

Установка Google Chrome в Fedora

Дата: 01.08.2015Метки:

На данном примере я опишу установку Google Chrome в Fedora 25, в случае использования более ранних версий Fedora или RHEL/CentOS, вместо менеджера пакетов dnf необходимо использовать yum. Для поддержания браузера в актуальном состоянии лучший вариант установки Chrome из официального репозитория Google. Добавляем информацию о репозитории:

cat << EOF > /etc/yum.repos.d/google-chrome.repo
[google-chrome]
name=google-chrome - \$basearch
baseurl=http://dl.google.com/linux/chrome/rpm/stable/\$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
EOF

Для установки Google Chrome используем одну из следующих команд:

#Установка стабильной версии
dnf install google-chrome-stable

#Установка бета-версии
google-chrome-beta

#Установка dev-версии
dnf install google-chrome-unstable