Підготовка ASP.NET 5 (Core) проекту і DNX оточення для участі в хакатоне в рамках hack.summit() на 2016 Koding.com

Вирішили ми з другом взяти участь у світовому хакатоне, що проходить в рамках hack.summit() 2016. На хабре є стаття присвячена цій події.

В правилах на сайті було сказано, що фінальний проект повинен буде знаходиться на віртуальній машині Кодинга, і все б добре, та тільки ось платформа Кодинга використовує в якості операційної системи Ubuntu, а ми пишемо на технологіях майкрософта. Постало питання відмови від участі або випробування asp.net 5 на coreclr. Вибрали друге і почалося більш близьке знайомство з нововведеннями з'явилися в цій версії.

На сайті майкрософта дана загалом зрозуміла інструкція як встановити dnx для Linux (за щастя як раз для Ubuntu 14.04), хоча з деякими проблемами довелося зіткнутися, як кажуть «перший млинець — комом», тому хотілося б привести нижче послідовність кроків яка призвела до робочого результату.



Перший крок — установка curl:

sudo apt-get install unzip curl

Другий крок — установка .NET Version Manager:

curl -sSL https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.sh | DNX_BRANCH=dev sh && source ~/.dnx/dnvm/dnvm.sh

Третій крок — установка необхідних для DNX пакетів:

sudo apt-get install libunwind8 gettext libssl-dev libcurl4-openssl-dev zlib1g libicu-dev uuid-dev

Четвертий крок — установка DNX .NET Core:

dnvm upgrade -r coreclr

Далі в майкрософтовской інструкції встановлюється mono, але ми використовували coreclr, тому пропустимо цей крок.

П'ятий крок — установка libuv (необхідного для запуску Kestrel):

sudo apt-get install make automake libtool curl
curl -sSL https://github.com/libuv/libuv/archive/v1.8.0.tar.gz | sudo tar zxfv - -C /usr/local/src
cd /usr/local/src/libuv-1.8.0
sudo sh autogen.sh
sudo ./configure
sudo make
sudo make install
sudo rm -rf /usr/local/src/libuv-1.8.0 && cd ~/
sudo ldconfig

Якщо все пройшло без помилок, ми повинні побачити єдину встановлену версію .Net:

dnvm list


Тут хочеться зробити ремарку, при роботі в Visual Studio у мене постійно злітала потрібна версія .Net і, можливо, з-за цього зависав build коли у властивостях проекту призначена інша версія. Щоб це виправити можна виконати такі команди:

dnvm alias default -a x64 -r coreclr 1.0.0-rc1-update1
dnvm use default -p



Шостим кроком, треба якось зробити доступним паблішинг на цільову машину. Можна для цього просто drag' ' drop'ом перетягнути файли на сторінці Кодинга, але ми вирішили зробити це з FTP. До речі, для відправки фінальної версії проекту на хакатоне довелося користуватися першим варіантом, так як з-за традицією заливати все в останній момент FTP клієнт ніяк не міг з'єднатися з сервером. Щоб не ускладнювати, Кодинг пропонує скористатися своїм менеджером пакетів і відкрити ftp в два рядки:

kpm install ftp

Другий рядком піде зміна пароля користувача віртуальної машини. IP адреса сервера можна подивитися у властивостях машини на сторінці Кодинга.

В папці користувача є папка Web файлів з прикладами, видалимо їх і створимо на їх місці папку ASP.Net, де буде розташовуватися проект.

Виникла наступна складність — на момент участі в хакатоне, Entity Framework 7 не мала реалізації пакету «EntityFramework.MicrosoftSqlServer» для Linux, тому потрібно було використовувати альтернативи MS SQL Server. Хелп EF пропонує використовувати з цією метою SQLite,

Сьомим кроком, встановлюємо SQLite:

sudo apt-get install libsqlite3-dev

Восьмий крок — підготовка проекту в Visual Studio.

Створимо з шаблону ASP.NET Web Application, вибираємо шаблон ASP.NET 5 -> Web Application, аутентифікація Individual User Accounts.
Відредагуємо файл project.json додавши SQLite і видаливши зайве, а так само видалимо фреймворк dnx451:

...
"dependencies": {
"EntityFramework.Sqlite": "7.0.0-rc1-final",
...
},
...
"frameworks": { 
"dnxcore50": { }
}
...

В файлі Startup.cs в методі ConfigureServices, видаляємо то що відноситься до SQL Server і додаємо те що потрібно для SQLite:

using Microsoft.Extensions.PlatformAbstractions
...
var path = PlatformServices.Default.Application.ApplicationBasePath;
services.AddEntityFramework()
.AddSqlite()
.AddDbContext<ApplicationDbContext>(options => options.UseSqlite("Filename=" + Path.Combine(path, "site.db")));
...

Якщо у project.json видаляли зайве на зразок IISPlatformHandler і BrowserLink.Loader, то так само треба почистити метод Configure від виклику зайвих middleware.

Дев'ятим кроком заливаємо файли підготовленого проекту з папки src в папку на сервері Кодинга. Папки node_modules та wwwroot\lib залишимо у себе, так як завантажимо ці залежності за допомогою npm і bower на кінцевому сервері.

Десятий крок. Node.js на віртуальній машині вже є, так що можна відразу встановити bower і виправити деякі проблеми з запуском пакетів, а в папці сайту виконаємо необхідні для відновлення пакетів команди:

sudo ln -s /usr/bin/nodejs /usr/bin/node
sudo npm install bower -g
npm install 
bower install

Одинадцятий крок. База даних буде лежати в каталозі сайту і, відповідно конфігурації в Startup.cs, називатися site.db. Міграції для неї були сгенерированны VS автоматично, можна використовувати їх, а можна зробити все заново. Для чистоти експерименту, видалимо папку Migrations і додамо їх заново разом з створенням файлу бази даних.

у мене при першій спробі запуску dnu, з'явилася помилка
failed to locate libcoreclr with error libunwind-x86_64.so.8: cannot open shared object file: No such file or directory 
 
і dnx взагалі відмовилася працювати, значить на третьому кроці, я не натиснув «Y» при завантаженні і встановленні пакетів.
dnu restore
dnu build --quiet
dnx ef migrations add NewOne
dnx ef database update

Сервер Kestrel, на якому запускається asp.net сайт, за замовчуванням працює на 5000'м порту, Майкрасофт рекомендує не світити його в мережу, а використовувати проксі, на віртуальній машині вже встановлено Апач, тому будемо використовувати його з цією метою.

Дванадцятим кроком налаштуємо Апач:

cd /etc/apache2/sites-enabled
sudo nano 000-default.conf

У ньому залишаємо тільки потрібне нам.

<VirtualHost *:80>
S<VirtualHost *:80>
# Rewrite scheme to ws otherwise apache can't do a proxy websocket
RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
RewriteRule .* ws://localhost:3000%{REQUEST_URI} [P]

# Proxy
ProxyRequests On
ProxyPass / http://localhost:5000/
ProxyPassReverse / http://localhost:5000/

ErrorLog ${APACHE_LOG_DIR}/error.log

LogLevel warn

CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Перезапускаємо Апач і, якщо все правильно, при спробі відкрити сайт у браузері бачимо «Service Unavailable»:

sudo /etc/init.d/apache2 restart

Тринадцятий, самий щасливий, крок — запуск сайту. В каталозі сайту виконуємо dnx web і бачимо як в консолі запустився Kestrel:
dnx web

У мене і тут вискочила помилка:

System.DllNotFoundException: Unable to load DLL 'libuv': The specified module could not be found.
 

Це означає, що на п'ятому кроці, я вставив всі команди в консолі разом і щось не спрацювало чи не була натиснута кнопка «Y».
Коли все запустилося, можна відкрити сайт і подивитися як в консолі побіжать запити.



Сайт відкривається, можна зареєструватися — значить база даних працює.

Можна починати роботу над проектом.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.