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

Unit Test

composer global require "codeception/codeception" --dev
composer global require "codeception/specify=*"
composer global require "codeception/verify=*"
composer global status

> composer global status
Changed current directory to C:/Users/des1roer/AppData/Roaming/Composer
No local changes


vendor/bin/phpunit common/tests/unit/models/FirstTest.php

php vendor/codeception/codeception/codecept run common/tests/unit/models/FirstTest.php


~$ PATH=$PATH:~/.composer/vendor/bin
~$ export PATH


---------------------------------------
php vendor/bin/codecept run
---------------------------------------
php vendor/bin/phpunit run frontend/tests/unit/entities/Movie/CreateTest.php
---------------------------------------

http://codeception.com/docs/reference/Commands#Console

<?php
namespace common\tests\unit;

use PHPUnit\Framework\TestCase;

class SecondTest extends TestCase
{
    public function testMaths()
    {
        $result = 2+2;
        $this->assertEquals($result, 4);
    }

    public function testTrue()
    {
        $this->assertTrue(true);
    }
}

пятница, 17 февраля 2017 г.

деплой на сервер yii2

Рано или поздно придется столкнуться с тем, чтобы выгрузить уже свой первый проект на продакшн сервер. Это можно сделать несколькими способами. Один из способов сегодня опишу и я, которым пользуюсь. Мягко говоря он очень прост, если хочется побыстрее все выгрузить и долго не заморачиваться всякими настройками. Много слов никто не любит поэтому:
  1. Делаем комит в репозиторий. Теперь в нашем репозитории имеются все необходимые файлы для загрузки на сервер. 
  2. Заходим на наш продакшн сервер под ssh.
  3. Ставим git. Подробные инструкции по установке гита на сервер расписывать не буду, в интернете полно инструкций. Один из способов: 
apt-get install git-core
git config --global user.name "NewUser" git config --global user.email you@email.com

     4. Далее выполняем:
cd /home/username/web/domain.com/public_html/ (где public_html корневая папка сайта)
git clone https://username@bitbucket.org/username/repository.git (вместо ссылки используйте ссылку на свой репозиторий с разворачиваемым проектом)
     5. Далее возможно запросит пароль от вашего репозитория. Как только это произойдет, вводим, после чего все файлы скопируются на сервер, после чего можно приступить к следующему шагу. Обратите внимание на то, куда скопируются файлы. Указать папку, куда гит скопирует репозиторий можно третьим параметром:
git clone https://username@bitbucket.org/username/repository.git folder_to_copy (где folder_to_copy папка куда будут скопированы файлы)
Обычно folder_to_copy является корневой папкой сервера. Прим.: /home/user/web/test.ru/public_html/
Проследите за тем, чтобы файлы скопировались в корневую папку сервера. И так, файлы скопировали в корень сервера, что дальше?
     6. Дальше ставим composer. Как его ставить, тоже полно инструкций. Вот быстрый и простой способ:
apt-get install php5 git php5-curl (необходимые зависимости)
cd /home/username/web/domain.com/public_html/ (где public_html корневая папка сайта)
curl -sS https://getcomposer.org/installer | php (скачиваем composer в корневую папку сайта)
После установки видим сообщение:
....
Use it: php composer.phar
Это значит что все ок, можем продолжать.
    7. Запускаем: 
php composer.phar install
После чего пойдет установка необходимых пакетов. В принципе все должно пройти гладко. Один из подводных камней может быть то, что процесс прервется с ошибкой из-за того, что какие-то пакеты composer не сможет найти. Что можно предпринять? Проверить файл composer.json, чтобы у пакетов везде стояли "*". Прим.: 
"package/name": "*"

Сохраняем файл, закидываем его по ftp на сервер и повторяем:
php composer.phar install
После чего все должно установиться.
    8. Следующий шаг:
php yii init
Где выбираем "Production mode". 
Правим конфигурационные файлы приложения (прописываем подключение к базе данных). Вот почти и все. Осталось перенести базу данных. Правильно это сделать так:
создаем миграции. Кладем их в папку на сервере: /console/migrationsПрим.: /home/username/web/domain.com/public_html/console/migrations/
Запускаем: php yii migrate 
И подтверждаем применение миграции. Все. Проверяем работоспособность сайта.

Что дальше?
  1. Дальше разрабатываем сайт
  2. Делаем commit
  3. Заходим на сайт по ssh
  4. git pull
  5. php composer.phar install
  6. yii migrate

На этом все.

Настройка Virtual Private Network на AWS EC2 c OpenVPN на Linux


Amazon Web Service предоставляет возможность бесплатного запуска в течение тестового периода (12 месяцев) серверов Amazon EC2. Такой сервер может быть использован для VPN (англ. Virtual Private Network — виртуальная частная сеть). При использовании этой технологии удаленный сервер служит посредником между вашим компьютером и другими серверами в Интернет.

Это может быть полезно в случаях когда необходимо зайти на сайт в обход блокировок (для вашего провайдера вы связываетесь с вашим VPN сервером, а не с сайтом с которого вы фактически получаете данные), или, скажем, иметь постоянный IP с которого осуществляется доступ к определенным сервисам, или иметь IP связанный не с тем регионом в котором вы физически находитесь (сайт определяет заход с IP вашего сервера, а не с IP вашей рабочей машины).

Создание сервера на AWS EC2


Итак, для начала регистрируемся на https://aws.amazon.com, для регистрации потребуется работающая кредитная карта.

После регистрации переходим в консоль https://console.aws.amazon.com/console/home

В правом верхнем углу нажимаем на меню "Services" и в разделе "Compute" выбираем "EC2".

image

Для доступа к будущему серверу нам потребуется создать ключ. Нажимаем "Key Pairs", далее кнопку "Create Key Paire", задаем имя для ключа, например "myVPNkey" и сохраняем этот файл (c расширением .pem) на свой компьютер, обычно в папку ~/.ssh

Теперь переходим в папку в которой мы сохранили ключ и задаем права на доступ к файлу:

cd ~/.ssh 
chmod 400 myVPNkey.pem

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

Далее на сайте AWS возвращаемся в EC2 Dashboard (см. меню в в левом верхнем углу), и там нажимаем на большую синюю кнопку "Launch Instance"

  1. Выбираем операционную систему для сервера: Ubuntu Server 14.04 LTS (HVM) 64-bit (именно 14.04, не 16.04)
  2. Выбираем конфигурацию сервера. Для наших целей вполне достаточно конфигурации бесплатной на пробный период:
    t2.micro (Variable ECUs, 1 vCPUs, 2.5 GHz, Intel Xeon Family, 1 GiB memory, EBS only) — будет отмечен зеленым ярлыком "Free tier eligible". Нажимаем синюю кнопку "Review and launch"
  3. (Step 7: Review Instance Launch) в разделе Security Groups нажимаем "Edit security groups"
  4. (Configure Security Group )Выбираем: Assign a security group: * Create a new security group

Выбираем имя в Security group name, например "myVPN". Далее мы видим правила определяющие доступ к серверу. По умолчанию есть одно правило:

Type: SSH
Protocol: TCP
Port Range: 22
Source: Custom 0.0.0.0/0
В данном случае имеется в виду разрешено подключение к серверу с любого IP к порту 22 по протоколу SSH. Это стандартные настройки используемые для подключения ssh.

Нажимаем кнопку "Add Rule", и добавляем новое правило:

Type: All traffic
Protocol: All
Port Range: 0-65535
Source: My IP
в Source указываем IP вашей рабочей машины, если выбрать "My IP", он определится автоматически.

Указание IP означает что в рамках этого правила доступ разрешен только с этого IP (его потом можно будет, естественно, менять, если вы будете заходить в Интернет под другим IP).

Свой IP можно узнать/проверить задав в поиске Google "my ip". Или помощью специализированных сайтов. В консоли:

wget -qO- http://ipecho.net/plain ; echo

или

curl ipecho.net/plain ; echo

Первое правило можно удалить (рекомендуется). Или прописать в нем также свой IP. Или оставить возможность подключения с любого IP и проигнорировать предупреждение "Rules with source of 0.0.0.0/0 allow all IP addresses to access your instance. We recommend setting security group rules to allow access from known IP addresses only".

Снова жмем "Review and Launch", просматриваем информацию, и жмем "Launch" — у нас появиться окно в котором нужно выбрать ключ для доступа к серверу.

Выбираем ключ который мы ранее создали (existing key par), отмечаем пункт "I acknowledge that I have access to the selected private key file (myVPNkey.pem), and that without this file, I won't be able to log into my instance" и нажимаем "Launch Instances".

Если все хорошо, получаем сообщение что сервер запущен. Нажимаем кнопку "View Instances" и переходим в консоль в которой увидим список наших серверов. Когда мы отмечаем сервер в списке мы можем просмотреть его информацию, в частности его IP, а также выполнить действия с сервером (остановить, запустить, удалить и т.п.) Нажатие кнопки "Connect" выведет информацию необходимую для подключения к серверу.

Настройка сервера


Теперь из консоли мы можем подключиться с серверу используя ssh. Имя пользователя по умолчанию: ubuntu, для подключения мы можем использовать либо IP сервера либо его доменное имя вида: ec2-35-163-203-49.us-west-2.compute.amazonaws.com

Вводим в консоли команду:

ssh -i "~/.ssh/myVPNkey.pem" ubuntu@ec2-35-163-203-49.us-west-2.compute.amazonaws.com

при первом подключении нам нужно будет на вопрос: Are you sure you want to continue connecting (yes/no)? — набрать ответ "yes" (по умолчанию ответ "no", и если просто нажать Enter, получим сообщение "Host key verification failed."

При подключении также может выдаваться ошибка:

"Permissions 0644 for '~/.ssh/myVPNkey.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored."
Этом случае нужно как было указано выше изменить права доступа к файлу
chmod 400 ~/.ssh/myVPNkey.pem


Если подключение происходит благополучно, мы переходим в консоль сервера, о чем свидетельствует переключение командной строки на что-то вроде ubuntu@ip-172-31-21-156:~$

Установка OpenVPN на сервере


Теперь в консоли сервера, сначала (обязательно) обновляем программное обеспечение:

sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get -y autoremove && sudo apt-get install -f

Потом устанавливаем OpenVPN

sudo apt-get install -y openvpn

Настраиваем переадресацию (IP forwarding) (при выключении/перезапуске сервера это повторяем):

sudo modprobe iptable_nat
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
sudo iptables -t nat -A POSTROUTING -s 10.4.0.1/2 -o eth0 -j MASQUERADE

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

cd /etc/openvpn
sudo openvpn --genkey --secret ovpn.key

Создаем файл конфигурации OpenVPN, назовем его openvpn.conf, для этого воспользуемся редактором nano работающим в консоли:

sudo nano openvpn.conf

В файл вставляем:

port 1194
proto tcp-server
dev tun1
ifconfig 10.4.0.1 10.4.0.2
status server-tcp.log
verb 3
secret ovpn.key

Нажимаем CTRL+O и подтверждаем запись в файл, выходим из редактора — CTRL-X.

Запускаем OpenVPN на сервере командой

sudo service openvpn start

Останавливаем соответственно командой:

sudo service openvpn stop

Проверяем запущен ли у нас openvpn

sudo service openvpn status

image

Установка и настройка OpenVPN на локальной машине


Открываем еще одно окно консоли (терминала) на локальной машине. Устанавливаем OpenVPN на локальном компьютере:

sudo apt-get install -y openvpn

В консоли сервера временно меняем права доступа на файл ключа:

sudo chmod 777 /etc/openvpn/ovpn.key

В консоли локальной машины создадим папку для настроек OpenVPN:

mkdir ~/OpenVPNconf && cd  ~/OpenVPNconf

И скачаем туда с сервера ключ OpenVPN:

scp -i "~/.ssh/myVPNkey.pem" ubuntu@ec2-35-163-203-49.us-west-2.compute.amazonaws.com:/etc/openvpn/ovpn.key  ~/OpenVPNconf/

На сервере вернем настройки доступа для файла ключа:

sudo chmod 600 /etc/openvpn/ovpn.key

Также и на локальной:

chmod 600 ~/OpenVPNconf/ovpn.key

На локальной машине создадим файл с настройками OpenVPN, назовем его openvpn.client.conf:

gedit openvpn.client.ovpn 

В файл вставим:

proto tcp-client
remote тут.IP.адрес.сервера.на.Амазон
port 1194                   
dev tun                   
secret "/home/ИмяПользователя/OpenVPNconf/ovpn.key"            
redirect-gateway def1       
ifconfig 10.4.0.2 10.4.0.1

Обратите внимание в настройке в настройке "secret" должен быть полный адрес файла ключа ("ИмяПользователя" должно конечно быть таким как в вашей системе), remote указываем адрес сервера на Amazon вида 35.163.203.49 или ec2-35-163-203-49.us-west-2.compute.amazonaws.com
Сохраняем файл openvpn.client.ovpn

Теперь просто запускаем OpenVPN в консоли командой:

sudo openvpn --config ~/OpenVPNconf/openvpn.client.ovpn 

image
и заходим на http://ipecho.net/plain — теперь он должен показать IP адрес нашего сервера на Amazon. Можно также попробовать зайти на сайт который недоступен в вашем регионе.

UPD: Как правильно указали в комментариях, к этому стоит добавить AWS Elastic IP. Elastic IP — это IP адрес который резервируется пользователем, и может быть связан с серверами запускаемыми на AWS. На один сервер можно бесплатно добавить один Elastic IP, за зарезервированные Elastic IP не привязанные к определенному сервису взымается плата. Elastic IP можно быстро и удобно связывать и отсоединять от используемых сервисов на AWS.

В консоли пользователя AWS EC2 в меню слева выбрать в группе NETWORK & SECURITY опцию Elastic IPs, в открывшемся окне можно создавать новые Elastic IP (кнопка "Allocate New Address")

Далее: в списке имеющихся Elastic IP выбрать адрес и с помощью меню "Actions" (серая кнопка) его можно привязать к серверу запущенному на AWS, или отсоединить от работающего сервиса.

Happy networking!

JavaScript learn

Чтобы вставить элемент после какого-то элемента, нужно создать прототип. Element.prototype.appendAfter = function (element) { element.paren...