Web-приложение на C# Microsoft (.NET) с подключением к SQLite¶
Чтобы развернуть приложение в Amvera, нужно выполнить следующие простые шаги:
Открываем страницу https://cloud.amvera.ru/projects
Нажимаем кнопку Создать и выбираем тип сервиса приложение.
Выгружаем все файлы (можно через git, а можно через интерфейс). Не забудьте добавить конфигурационный файл (amvera.yml) и/или Dockerfile.
После этого начнется сборка и развертывание приложения. Дождитесь появления статуса «Успешно развернуто».
Рассмотрим процесс подробнее.
Напишем простое веб-приложение, которое при открытии сайта выводит всю информацию из базы данных. Будем использовать веб-фреймворк ASP.NET и базу данных SQLite.¶
Создание проекта¶
Для начала создадим новый проект (веб-приложение) с именем «WebService»:
$ dotnet new web -n WebService
Создалась директория WebService, перейдем в нее:
$ cd WebService
Так как мы будем использовать SQLite, то необходимо его добавить в проект:
$ dotnet add package System.Data.SQLite
База данных (SQLite)¶
В файле Program.cs (код доступен в конце документации) реализовано взаимодействие с базой данных. Для использования SQLite в Amvera отдельное приложение/контейнер не требуется. Достаточно в коде указать путь для хранения файлов этой БД в постоянное хранилище. Подробнее можно прочитать здесь.
Важно: обратите внимание на указанный путь к базе данных. Сохранять изменяемые файлы (базы данных и т.д.) нужно именно в постоянное хранилище /data. Это позволит избежать их потери при пересборке. Папка data в коде и постоянное хранилище /data - разные директории.
Конфигурация¶
amvera.yml¶
Написать yaml файл можно как самостоятельно, так и воспользоваться нашим генератором yaml, перейдя по ссылке, либо заполнить в разделе «Конфигурация» личного кабинета.
Пример файла amvera.yml:
meta:
environment: csharp
toolchain:
name: dotnet
version: 8.0
build:
image: mcr.microsoft.com/dotnet/sdk:8.0
run:
image: mcr.microsoft.com/dotnet/sdk:8.0
buildFileName: bin/WebService
persistenceMount: /data
containerPort: 8080
Важно: Поле buildFileName должно быть в формате bin/имя_файла, либо bin/publish/имя_файла если вы делаете через публикацию.
Важно: Обратите внимание на containerPort. При создании приложения в Program.cs порт явно не указывается, поэтому используется значение по умолчанию (8080). Если в файле amvera.yml указан неправильный порт, то возникнет ошибка «Service Unavailable 503». Amvera по умолчанию слушает порт 80.
Рассмотрим альтернативный способ задания конфигурации - через Dockerfile.
Dockerfile¶
Замечание: если вы используете Dockerfile, то конфигурационный файл amvera.yml в большинстве случаев можно не добавлять.
Шаги:¶
Создаем Dockerfile в директории с проектом.
В Dockerfile указываем базовый образ для этапа сборки:
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
вместо 8.0 можете указать любую другую версию, которая вам нужна.
Устанавливаем рабочий каталог внутри контейнера:
WORKDIR /app
Копируем файл WebService.csproj в контейнер:
COPY WebService.csproj ./
Восстанавливаем зависимости:
RUN dotnet restore
Копируем все файлы проекта в контейнер:
COPY . ./
Публикуем приложение для релиза:
RUN dotnet publish -c Release -o WebService
Указываем базовый образ для этапа запуска:
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
Устанавливаем рабочий каталог внутри контейнера:
WORKDIR /app
Копируем опубликованный результат из этапа сборки:
COPY --from=build /app/WebService ./
Устанавливаем точку входа для контейнера:
ENTRYPOINT ["dotnet", "WebService.dll"]
Получившийся Dockerfile:
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /app
COPY WebService.csproj ./
RUN dotnet restore
COPY . ./
RUN dotnet publish -c Release -o WebService
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
WORKDIR /app
COPY --from=build /app/WebService ./
ENTRYPOINT ["dotnet", "WebService.dll"]
Пример файла amvera.yml при использовании вместе с Dockerfile:
meta:
environment: docker
toolchain:
name: docker
version: latest
build:
dockerfile: Dockerfile
skip: false
run:
persistenceMount: /data
containerPort: 8080
Создание проекта в Amvera¶
Последний шаг - развернуть приложение. В файле Program.cs содержится основной код и выполняется подключение к базе данных:
Program.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Data.SQLite;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
// Указываем путь к базе данных:
var connectionString = "Data Source=../data/people.db;";
using var connection = new SQLiteConnection(connectionString);
connection.Open();
var createTableCommand = connection.CreateCommand();
createTableCommand.CommandText = @"
CREATE TABLE IF NOT EXISTS People (
Id INTEGER PRIMARY KEY,
Name TEXT,
Age INTEGER,
Occupation TEXT
);
";
createTableCommand.ExecuteNonQuery();
var insertDataCommand = connection.CreateCommand();
insertDataCommand.CommandText = @"
INSERT OR IGNORE INTO People (Name, Age, Occupation) VALUES
('John Doe', 30, 'Engineer'),
('Jane Smith', 25, 'Teacher'),
('Michael Johnson', 35, 'Doctor');
";
insertDataCommand.ExecuteNonQuery();
app.MapGet("/", async () =>
{
using var selectCommand = connection.CreateCommand();
selectCommand.CommandText = "SELECT * FROM People;";
using var reader = await selectCommand.ExecuteReaderAsync();
string result = "People Database:\n";
while (reader.Read())
{
result += $"ID: {reader.GetInt32(0)}, Name: {reader.GetString(1)}, Age: {reader.GetInt32(2)}, Occupation: {reader.GetString(3)}\n";
}
return result;
});
app.Run();
При необходимости можете изменить путь к базе данных.
Если не хотите использовать стандартный порт (8080), то можно указать другой. Но тогда важно учесть это изменение в конфигурационном файле.
Проверка работоспособности¶
Переходим в настройки проекта и активируем доменное имя.
Теперь можно перейти по нему и откроется наш сайт с записями из базы данных.
Если что-то не работает, рекомендуем ознакомиться с логами Сборки и Приложения.
Видеопример¶
Важно
Сохраняйте файлы БД и иные изменяемые данные в постоянное хранилище, чтобы избежать их потери при обновлении проекта, когда производится «откат» папки код до состояния обновления репозитория. Папка data в корне проекта и директория /data, это разные директории.
Проверить, что сохранение идет в /data, можно зайдя в папку «data» на странице «Репозиторий».
Важно
Чтобы избежать ошибки 502, измените в вашем коде host 127.0.0.1 (или подобный localhost) на 0.0.0.0, и пропишите в конфигурации порт, который слушает ваше приложение (пример - 8080).
Поздравляем, вы успешно создали свое первое приложение в Amvera!
Если у вас не получается развернуть проект¶
Напишите наблюдаемую вами симптоматику на support@amvera.ru с указанием вашего имени пользователя и названия проекта, мы постараемся вам помочь.