воскресенье, 19 февраля 2017 г.

Магазин для своего сервера Minecraft.

Установка магазина на Apache

Установка mod_wsgi

В первую очередь необходимо установить модуль wsgi. Либо воспользовавшись исходным кодом (что я и сделал, когда впервые потребовалось прикрутить python к apache) следуя по инструкции. Либо взять готовый модуль из репозитория:
~$ sudo apt-get install libapache2-mod-wsgi

Настройка виртуального хоста

Для этого перейдем в директорию:
~$ cd /etc/apache2/sites-enabled/
и отредактируем наш конфигурационный файл:
~$ sudo vi kalinchyk-ssl.conf
должно получиться что-то в этом роде:

<VirtualHost *>
    ServerName www.kalinchyk.com
    ServerAdmin viacheslav@kalinchyk.com
    DocumentRoot /var/www/minecraft

    WSGIDaemonProcess wsgi user=www-data group=www-data processes=1 threads=5
    WSGIScriptAlias /api /var/www/wsgi/app.wsgi
    <Directory /var/www/wsgi>
            WSGIProcessGroup wsgi
            WSGIApplicationGroup %{GLOBAL}
            Require all granted
    </Directory>
</VirtualHost>

Здесь мы сообщили Apache, что необходимо при обращении клиента к директории /api выполнять python wsgi-скрипт (который физически размещен в директории /var/www/wsgi/app.wsgi) от имени пользователя www-data.
Обязательно проверьте, что вашему пользователю доступны импортируемые библиотеки и все файлы он может читать, а при необходимости и вносить изменения.

Также в настройках виртуального хоста указана основная директория с которой будет клиент работать (/var/www/minecraft).

В этом кусочке конфигурации я убрал строки для настройки ssl-сертификата, логирования и т.д., чтобы не перегружать пример.

После изменений конфигурационных файлов Apache требуется перезапустить:
~$ sudo service apache2 restart

BackEnd

Сначала устанавливаем backend (API магазина). Для этого забираем исходные коды с git-репозитория. Распаковываем архив и содержимое wsgi копируем в нашу wsgi директорию (в моем случае это /var/www/wsgi/).
Т.к. мы для повышения безопасности указали, что python скрипты должны выполняться от имени www-data, то необходимо проверить чтобы директория и содержимое принадлежат этому пользователю.
~$ sudo chmod -R 644 /var/www/wsgi
~$ sudo chown -R www-data:www-data /var/www/wsgi
Первым делом необходимо создать базу данных, выполнив db_update.py от имени нашего пользователя.
~$ python db_update.py
А также при последующих обновлениях необходимо не забывать про эту операцию. Этот скрипт выполняет важные изменения в структуре базы данных. Хоть скрипт самостоятельно сделает резервную копию базы, но необходимо об этом также не забывать и периодически самостоятельно архивировать критически важные данные.

Устанавливаем зависимости

Для корректной работы python приложения необходимо установить несколько зависимостей, а именно bottle, bottle_sqlite, bottle_errorrest. Их можно установить из пакетного менеджера pip:
~$ sudo apt-get install python-pip
~$ sudo -u www-data -H pip install pip
~$ sudo -u www-data -H pip install bottle
~$ sudo -u www-data -H pip install bottle_sqlite
~$ sudo -u www-data -H pip install bottle_errorsrest
И обязательно устанавливаем их для нашего пользователя (параметр -u ww-data), под которым будет выполняться скрипт (параметр -H).

Проверяем работу приложения

В браузере указав адрес своего сервера и директорию, которая обслуживает wsgi, а также суффикс /whoami мы должны получить положительный отклик от сервера.
~$ curl https://test.kalinchyk.com/api/whoami
{"object": "CUSTOMER"}


Настраиваем приложение

Для настройки приложения необходимо создать файл с именем minecraft.json:

{
    "minecraft": {
        "acquiring": {
            "form_method": "post",
            "form_url": "https://sci.interkassa.com/",
            "id": "[идентификатор_кассы_в_interkassa]",
            "sign": "[секретный_ключ_для_формирования_подписи]",
            "sign_test": "[секретный_ключ_для_проверки_подписи_(тест)]",
            "type": "interkassa"
        },
        "admin_username": "[логин_администратора]",
        "admin_password": "[пароль_администратора]",
        "cookie_name": "minecraft_cookie",
        "cookie_sign": "minecraft_secret",
        "server_host": "[адрес_к_серверу_minecraft]",
        "server_query_port": 25565,
        "server_rcon_password": "[пароль_к_rcon]",
        "server_rcon_port": 25575,
        "server_url": "https://test.kalinchyk.com/",
        "server_api": "https://test.kalinchyk.com/"
    }
}

Жирным выделены параметры, которые необходимо заполнить в первую очередь.


FrontEnd

Теперь можно приступить к установке веб-интерфейса магазина. Из ранее извлеченного архива, который был получен на сайте, содержимое minecraft копируем в нашу minecraft директорию (в моем случае это /var/www/minecraft/).


Настраиваем frontend

В директории /var/www/minecraft/ создаем файл .htaccess

Options -Indexes +FollowSymLinks
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* /var/www/minecraft/index.html [L]
DirectoryIndex index.html



Здесь мы включаем модуль rewrite и перенаправляем все запросы на несуществующие файлы/директории будут перенаправлены на index.html


понедельник, 5 октября 2015 г.

WebLogic Server. Encrypt & Decrypt password.

На днях возникла задача хранения некоторой части данных в базе данных. Из темы ясно, что данные должны быть зашифрованы. Чтобы не изобретать велосипед, первым делом отправился в www.google.com с вопросом как же шифруются пароли weblogic'а.

В результате получился маленький класс для шифровки и расшифровки паролей по аналогии как это делает weblogic server.

package com.kalinchyk.util;

import weblogic.security.internal.SerializedSystemIni;
import weblogic.security.internal.encryption.*;

public final class WebLogicSecure {
    
    private static EncryptionService es = null;
    private static ClearOrEncryptedService ces = null;

    public static String decrypt(String pwd) throws Exception {
        es = SerializedSystemIni.getExistingEncryptionService();
        if (es == null)
            throw new Exception("Unable to initialize decryption service");
        ces = new ClearOrEncryptedService(es);
        return ces.decrypt(pwd);
    }    

    public static String encrypt(String pwd) throws Exception {
        es = SerializedSystemIni.getExistingEncryptionService();
        if (es == null)
            throw new Exception("Unable to initialize encryption service");
        ces = new ClearOrEncryptedService(es);
        return ces.encrypt(pwd);
    }
}

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

Для тестирования на локальной машине можно использовать файл SerializedSystemIni.dat из IntegratedWebLogicServer, который необходимо сохранить в директорию с вашим проектом.

понедельник, 27 апреля 2015 г.

JavaScript Frameworks Day 2015

На прошедших выходных (26 апреля 2015 года) прошел очередной ивент от frameworksdays по тематике JavaScript. Как обычно было очень много интересных докладов, конкурсов, подарков!

Спасибо организаторам за яркое воскресенье. 

Есть желание посетить следующие ивенты? Регистрируйтесь и приходите.