Andrey on .NET | Запускаем ASP.NET Core приложение под Linux

Запускаем ASP.NET Core приложение под Linux

ASP.NET+Linux logoВ документации ASP.NET Core есть раздел описывающий установку и запуск приложений под Linux . Однако большое количество вводимых команд и некоторые неожиданные моменты делают эту задачу не совсем простой. Это будет особенно актуально при отсутствии опыта работы с Linux. Поэтому давайте рассмотрим этот процесс подробнее и, по возможности, упростим его.

Поскольку в ASP.NET Core начиная с версии RC2 были сделаны большие изменения, то данная информация актуальна только для версий RC1 и младше.

Для создания тестовой среды отлично подойдет использование виртуальной машины (VM) на компьютере разработчика. В качестве операционных систем можно использовать Debian или Ubuntu.

Разворачиваем ОС на виртуальной машине

Загрузить дистрибутивы ОС можно с официальных сайтов:

Для тестирования работы веб-приложений лучше всего подойдет или серверная версия Ubuntu или Debian без GUI, т.к. они компактны и требуют меньше ресурсов. Особого преимущества от установки GUI для решаемой задачи нет, т.к саму разработку все равно удобнее вести в Visual Studio. Кроме того, плюсом будет получение навыков работы с терминалом Linux.

На момент написания статьи, запустить CoreCLR и Mono на Ubuntu 15 не получилось, поэтому далее используется 14-ая версия этой ОС.

Сама установка ОС достаточно простая и быстрая, но стоит отметить некоторые моменты:

  • для VM выделите 1024 MB памяти изначально и включите Dynamic Memory;
  • для установки и запуска Debian под VM необходимо выключить Secure Boot;
    VM settings
  • для Ubuntu параметр Secure Boot можно или отключить или установить в значение "Microsoft UEFI Certificate Authority";
  • можно установить только ядро ОС (без дополнительных пакетов).

В процессе установки и дальнейшей настройки желательно периодически фиксировать текущее состояние VM (checkpoint). В дальнейшем это позволит переключаться между ними. Например, можно создать варианты с CoreCLR и с Mono.

Перед сохранением состояния необходимо завершить работу Linux и выключить VM командой: sudo shutdown now –P

Проблемы с Debian

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

user@server:~$ su
root@server:~$ apt-get install sudo
root@server:~$ adduser <userName> sudo
root@server:~$ exit
user@server:~$ exit

Это загрузит утилиту sudo и разрешит указанному пользователю <userName> ее запускать. Обратите внимание на две команды exit в завершении. Это не опечатка. Для вступления изменений в силу необходимо перезапустить терминал текущего пользователя.

CoreCLR vs Mono

Можно возникнуть вопрос, что выбрать для разработки: CoreCRL или Mono. Все зависит от самого проекта. Вот какие факторы нужно учесть при выборе run-time:

  • CoreCLR занимает гораздо меньше места по сравнению Mono.
  • CoreCLR на данный момент содержит меньше функциональности, чем Mono. Но догонит его в перспективе.
  • Компилятор в CoreCLR более современный и поддерживает все новые возможности. Здесь уже Mono в догоняющих.

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

Проблемы с установкой CoreCLR и Mono

CoreCRL

Ничего сложно в установке CoreCLR для Linux нет. Но официальная документация содержит достаточно большое количество команд, которые предлагается вводить вручную. Вариант упрощения напрашивается сам собой – скрипт.

Mono

С Mono ситуация немного сложнее. Согласно документации все что необходимо – это установить пакет mono-complete и сам run-time. Однако, кроме этого так же потребуется:

  • добавить источники пакетов для загрузки Mono;
  • установить сертификаты сайтов, используемых для восстановления пакетов NuGet.

А это все потребует ввода новых команд, которых к тому же нет в документации ASP.NET. Решение проблемы то же самое, что и в первом случае: написать скрипт.

Устанавливаем CoreCLR и Mono с помощью скрипта

В дальнейшем предполагается что у пользователя Linux есть права записи с текущую директорию. Такой является его домашняя директория /home/<UserName>, в которую он обычно попадает после запуска терминала. Самостоятельно перейти в нее можно c помощью команды cd /home/<UserName>, где <UserName> это логин пользователя.

Нажатие кнопки Tab в процессе набора команды, показывает варианты ее завершения или подставляет текст, когда остается только один вариант. Например, удобно вводить путь до директории, указывая 1 или 2 начальные буквы и нажимая Tab для завершения имении.

Проект с вспомогательными скриптами для установки .NET расположен на GitHub по адресу: https://github.com/VeselovAndrey/dotnet-install

На данный момент он содержит два скрипта:

  • debian-dotnet-install.sh – устанавливает CoreCLR, Mono, Node.js на Debian и Ubuntu
  • samba-share-dir.sh – создает директорию и открывает к ней доступ по сети

Загрузить их можно 2 способами:

  • Загрузка скрипта с помощью wget

Этот способ подходит если необходимо загрузить только один скрипт. Например: debian-dotnet-install.sh. В терминале необходимо выполнить следующие 2 команды (они записаны в одной строке через &&):

user@server:~$ wget -N https://raw.githubusercontent.com/VeselovAndrey/dotnet-install/master/debian-dotnet-install.sh && chmod +x debian-dotnet-install.sh

Утилита wget предназначена для загрузки файлов из сети. Поскольку в параметрах нет особых указаний, данные будут сохранены в текущую директорию. Если в ней уже существует файл с таким именем, то wget его перезапишет (ключ "-N"). После загрузки скрипту будут добавлены права на запуск (chmod +x).

  • Загрузка скриптов с помощью git

Поскольку проект размещён на GitHub его можно просто клонировать.

user@server:~$ sudo apt-get install git
user@server:~$ git clone git://github.com/VeselovAndrey/dotnet-install.git ~/dotnet-install
user@server:~$ cd dotnet-install
user@server:~/dotnet-install$ chmod +x *.sh

Здесь выполняются следующие действия:

  • sudo позволяет запускать команды с привилегиями супер пользователя.
  • apt-get это менеджер пакетов Linux. Используя его, в систему добавляем git.
  • С помощью git клонируем проект в директорию "/home/<UserName>/dotnet-install".
  • Переходим в директорию проекта.
  • Разрешаем запуск всех скриптов вызовом chmod.

Устанавливаем CoreCLR и/или Mono

После того как загрузка завершена можно запустить установку .NET с помощью вызова debian-dotnet-install.sh. Скрипт всегда устанавливает CoreCLR, а так же ряд других компонентов, определяемых параметрами:

  • --coreclr – устанавливает CoreCLR.
  • --mono – устанавливает Mono.
  • --nodejs – устанавливает Node.js.
  • --help – выводит список доступных параметров.

Пример вызова скрипта для установки CoreCLR, Mono и Node.js:

user@server:~$ ./debian-dotnet-install.sh --coreclr --mono --nodejs

Обратите внимание: в начале указывается "./" для вызова скрипта из текущей директории.

По завершению установки необходимо перезапустить терминал, выйдя из него командой exit. Так же, при установке Mono, потребуется подтверждение добавления сертификатов сайтов. К сожалению, ключ для автоматизации данного процесса у утилиты certmgr отсутствует.

Дополнительно: настройка директории для обмена файлами

Второй скрипт, samba-add-shared-dir.sh, помогает решить простую задачу – обмен файлами с компьютером разработчика. Например, это пригодиться для копирования проекта на тестовый сервер. Все что нужно – запустить скрипт с указанием имени директории. Она будет автоматически создана в каталоге /home/<UserName> и открыта для доступа по сети:

user@server:~$ ./samba-add-shared-dir.sh [имя директории] [сетевое имя]

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

Запускаем текстовый проект

Для проверки работоспособности можно клонировать и запустить демонстрационный проект с GitHub.

Для того, чтобы узнать адрес VM/сервера c Linux можно использовать команду ifconfig.

user@server:~$ git clone git://github.com/aspnet/home.git ~/aspnet-home
user@server:~$ cd aspnet-home/samples/1.0.0.-rc1-update1/HelloMvc
user@server:~/aspnet-home/samples/1.0.0-rc1-update1/HelloMvc$ dnu restore
user@server:~/aspnet-home/samples/1.0.0-rc1-update1/HelloMvc$ dnx web

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

Комментарии (7) -

Мельник Александр 12.01.2016 16:45:57

Андрей рекомендую присмотреться к контеренизации
https://www.docker.com

~$ git clone https://github.com/aspnet/aspnet-docker
~$ docker build -t aspnet aspnet-docker/1.0.0-rc1-final-coreclr
~$ git clone https://github.com/aspnet/Home.git
~$ docker run -v /home/moris/Home/samples/1.0.0-rc1-final/HelloMvc:/data/app -p:80:5004 -it aspnet /bin/bash -c "cd /data/app && dnu restore && dnx web"

Если честно я не понимаю зачем Microsoft двигается в этом направлении.
Я понимаю, что основной акцент сейчас на облочный бизнес и создание удобной и универсальной  инфраструктуры. Но я сильно ��омневаюсь, что С# программисты будут пользоваться этой возможностью. Разница на виртуалку Windows vs Linux 20$.

Мне кажется что более верным решение со стороны Microsoft было сделать бесплатным OS Windows-Core...

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

Что касается разницы в стоимости, то не думаю что в этом суть. Кроме облаков, вот еще ситуация (сам сталкивался), когда у клиента развернуто N-дцать Linux серверов, все настроено, админится, поэтому новый проект будет на PHP/Java и т.д. Но никак ни на C#. Поэтому, как разработчик, я только приветствую универсальность.

Пожалуйста, не пишите больше таких диллетантских статей, а то только людей с толку сбиваете

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

К сожалению, установка с указанными ключами падает с сообщением
"================ Installing node.js
fatal: destination path '/home/user/.nvm' already exists and is not an empty directory."

Помогло:
./debian-dotnet-install.sh --nodejs
потом
./debian-dotnet-install.sh --coreclr --mono

Blush А node.js не был установлен до этого? Или ошибка если только все три ключа указаны. Какой дистрибутив и какая версия?

Павел 10.02.2017 23:03:15

Маленькое уточнение. Не всегда папка пользователя находится в /home/
Что бы перейти в домашнюю, достаточно выполнить cd ~

Добавить комментарий