Как создать и развернуть приложение на Gin в App Platform

    Команда Simple-Server
    03.06.2026
    14 мин

    Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.

    Кратко о задаче

    Наше приложение будет поддерживать основные CRUD-операции (создание, чтение, обновление, удаление) для заметок через RESTful API. В ходе разработки мы обсудим ключевые аспекты интеграции Gin и ORM-библиотеки GORM, а также продемонстрируем, как обеспечить безопасность и производительность нашего веб-приложения. Основные возможности нашего приложения включают:

    • * Пользователь сможет добавить новую заметку, отправив POST-запрос с заголовком и содержимым заметки.
    * Приложение сохранит новую заметку в базе данных и вернет её уникальный идентификатор.
    • Пользователь сможет добавить новую заметку, отправив POST-запрос с заголовком и содержимым заметки.

    • Приложение сохранит новую заметку в базе данных и вернет её уникальный идентификатор.

    • * Пользователь сможет запросить список всех заметок, отправив GET-запрос.
    * Приложение вернет все заметки из базы данных в формате JSON.
    • Пользователь сможет запросить список всех заметок, отправив GET-запрос.

    • Приложение вернет все заметки из базы данных в формате JSON.

    • * Пользователь сможет получить конкретную заметку по её идентификатору, отправив GET-запрос с указанным ID.
    * Приложение найдет заметку в базе данных и вернет её в формате JSON.
    • Пользователь сможет получить конкретную заметку по её идентификатору, отправив GET-запрос с указанным ID.
    • Приложение найдет заметку в базе данных и вернет её в формате JSON.
    1. Обновление существующей заметки:

    Обновление существующей заметки:

    • * Пользователь сможет обновить существующую заметку, отправив PUT-запрос с новым заголовком и содержимым заметки.
    * Приложение обновит данные заметки в базе данных и вернет обновленную заметку.
    • Пользователь сможет обновить существующую заметку, отправив PUT-запрос с новым заголовком и содержимым заметки.

    • Приложение обновит данные заметки в базе данных и вернет обновленную заметку.

    • * Пользователь сможет удалить заметку по её идентификатору, отправив DELETE-запрос с указанным ID.
    * Приложение удалит заметку из базы данных и вернет статус успешного выполнения операции.
    • Пользователь сможет удалить заметку по её идентификатору, отправив DELETE-запрос с указанным ID.
    • Приложение удалит заметку из базы данных и вернет статус успешного выполнения операции.

    Подразумевается, что у вас установлен Go версии 1.22 (установить его можно, например, по одной из этих инструкций Windows, Ubuntu, MacOS). При использовании более ранних версий, в процессе запуска проекта могут возникнуть ошибки. Также у вас есть базовое представление о Git и аккаунт на одном из сервисов хостинга Git репозиториев (GitHub, GitLab, Bitbucket, Gitea и т.п.).

    1. Создадим директорию проекта командой:

    Создадим директорию проекта командой:

    И перейдем в нее, выполнив:

    1. Инициируем новый модуль Go командой:

    Инициируем новый модуль Go командой:

    go mod init gin-notes-api
    1. Установим необходимые для проекта пакеты: Gin, GORM и SQLite для работы с базой данных, командами:

    Установим необходимые для проекта пакеты: Gin, GORM и SQLite для работы с базой данных, командами:

    go get -u github.com/gin-gonic/gin go get -u gorm.io/gorm go get -u gorm.io/driver/sqlite
    1. Создадим структуру проекта. Она должна выглядеть вот так:

    Создадим структуру проекта. Она должна выглядеть вот так:

    GinTW/ ├── go.mod ├── main.go ├── models/ │ └── note.go ├── handlers/ │ └── note_handlers.go ├── storage/ │ └── storage.go │ └── database.go

    Создать структуру вы можете средствами IDE или выполнив следующую команду в терминале:

    mkdir -p models handlers storage && touch go.mod main.go models/note.go handlers/note_handlers.go storage/storage.go storage/database.go

    Определяет структуру данных для заметок. Модель Note описывает поля заметки и используется для работы с базой данных через ORM-библиотеку GORM.

    package models // Определение структуры заметки type Note struct { ID int `json:"id" gorm:"primaryKey;autoIncrement"` // Уникальный идентификатор заметки, автоматически инкрементируемый Title string `json:"title"` // Заголовок заметки Content string `json:"content"` // Содержание заметки }

    Этот файл содержит функции для инициализации базы данных и получения экземпляра базы данных. Здесь используется ORM-библиотека GORM для работы с базой данных SQLite.

    package storage import ( // Импортирование необходимых пакетов "gorm.io/driver/sqlite" // Драйвер для работы с SQLite "gorm.io/gorm" // Основная библиотека GORM для работы с ORM "gin-notes-api/models" // Импортирование пакета с определением моделей данных ) // Объявление глобальной переменной для хранения экземпляра базы данных var db *gorm.DB // Функция инициализации базы данных func InitDatabase() error { var err error // Открытие подключения к базе данных SQLite с использованием GORM db, err = gorm.Open(sqlite.Open("notes.db"), &gorm.Config{}) if err != nil { // Возвращение ошибки, если подключение не удалось return err } // Автоматическое создание таблицы для модели Note, если она еще не существует return db.AutoMigrate(&models.Note{}) } // Функция для получения экземпляра базы данных func GetDB() *gorm.DB { // Возвращение глобальной переменной db, содержащей подключение к базе данных return db }

    Этот код обеспечивает выполнение основных операций CRUD (создание, чтение, обновление, удаление) для модели Note, используя GORM для взаимодействия с базой данных SQLite.

    package storage import ( "gin-notes-api/models" // Импортирование пакета с определением моделей данных ) // Функция для получения всех заметок из базы данных func GetAllNotes() []models.Note { var notes []models.Note // Использование GORM для выполнения SQL-запроса SELECT и заполнения среза notes db.Find(¬es) return notes // Возвращение всех найденных заметок } // Функция для получения заметки по ID func GetNoteByID(id int) *models.Note { var note models.Note // Использование GORM для выполнения SQL-запроса SELECT с условием WHERE id = id заметки if result := db.First(¬e, id); result.Error != nil { return nil // Возвращение nil, если заметка с указанным ID не найдена } return ¬e // Возвращение найденной заметки } // Функция для создания новой заметки func CreateNote(title, content string) models.Note { note := models.Note{ Title: title, Content: content, } // Использование GORM для выполнения SQL-запроса INSERT и сохранения новой заметки в базе данных db.Create(¬e) return note // Возвращение созданной заметки } // Функция для обновления существующей заметки по ID func UpdateNote(id int, title, content string) *models.Note { var note models.Note // Использование GORM для выполнения SQL-запроса SELECT с условием WHERE id = id заметки if result := db.First(¬e, id); result.Error != nil { return nil // Возвращение nil, если заметка с указанным ID не найдена } note.Title = title note.Content = content // Использование GORM для выполнения SQL-запроса UPDATE и сохранения обновленной заметки в базе данных db.Save(¬e) return ¬e // Возвращение обновленной заметки } // Функция для удаления заметки по ID func DeleteNoteByID(id int) bool { // Использование GORM для выполнения SQL-запроса DELETE с условием WHERE id = id заметки if result := db.Delete(&models.Note{}, id); result.Error != nil { return false // Возвращение false, если удаление не удалось } return true // Возвращение true при успешном удалении заметки }
    • handlers/note_handlers.go

    Этот файл содержит функции-обработчики (хендлеры) для обработки HTTP-запросов. Эти функции вызываются в ответ на различные маршруты и выполняют действия, такие как создание, получение, обновление и удаление заметок.

    Этот файл является основной точкой входа в приложение. В нем происходит инициализация базы данных и настройка маршрутов для обработки HTTP-запросов с использованием веб-фреймворка Gin.

    package main import ( "log" // Пакет для логирования "github.com/gin-gonic/gin" // Веб-фреймворк Gin "gin-notes-api/handlers" // Импортирование модуля с обработчиками запросов "gin-notes-api/storage" // Импортирование модуля для работы с базой данных ) func main() { // Инициализация базы данных if err := storage.InitDatabase(); err != nil { log.Fatalf("Failed to initialize database: %v", err) // Логирование ошибки и завершение программы, если инициализация базы данных не удалась } // Создание нового роутера Gin с настройками по умолчанию router := gin.Default() // Определение маршрутов и привязка их к соответствующим обработчикам router.GET("/notes", handlers.GetNotes) // Маршрут для получения всех заметок router.GET("/notes/:id", handlers.GetNoteByID) // Маршрут для получения заметки по ID router.POST("/notes", handlers.CreateNote) // Маршрут для создания новой заметки router.PUT("/notes/:id", handlers.UpdateNoteByID) // Маршрут для обновления заметки по ID router.DELETE("/notes/:id", handlers.DeleteNoteByID) // Маршрут для удаления заметки по ID // Запуск веб-сервера на порту 8080 router.Run(":8080") }

    Теперь мы можем запустить приложение локально и протестировать его функциональность.

    Для запуска используем команду:

    Примеры curl-запросов для тестирования функционала

    curl -X POST http://localhost:8080/notes -H "Content-Type: application/json" -d '{"title":"Заголовок","content":"Тело заметки"}' curl -X GET http://localhost:8080/notes curl -X GET http://localhost:8080/notes/1 curl -X PUT http://localhost:8080/notes/1 -H "Content-Type: application/json" -d '{"title":"Обновленный заголовок","content":"Обновленное тело заметки"}' curl -X DELETE http://localhost:8080/notes/1

    Деплой приложения в Simple-Server App Platform

    Для развертывания приложения с помощью App Platform, необходимо разместить проект в git-репозитории. В данном примере используется GitHub.

    Создание и загрузка репозитория

    Создайте новый репозиторий на GitHub и инициализируйте его локально в директории вашего проекта:

    git init -b main git add . git commit -m 'First commit'

    Теперь можем загрузить репозиторий на удаленный сервер, воспользовавшись командами, которые указаны при создании нового репозитория github:

    git remote add origin git@github.com:ваш_пользователь/ваш_репозиторий.git git push -u origin main

    Настройка Simple-Server App Platform

    • Перейдите в раздел App Platform и нажмите «Создать».

    • В разделе «Тип» выберите вкладку «Backend» и найдите фреймворк Gin.

    • Подключите ваш GitHub-аккаунт, предоставив доступ к репозиториям, или выберите необходимый репозиторий вручную.

    Перейдите в раздел App Platform и нажмите «Создать».

    В разделе «Тип» выберите вкладку «Backend» и найдите фреймворк Gin.

    Подключите ваш GitHub-аккаунт, предоставив доступ к репозиториям, или выберите необходимый репозиторий вручную.

    • После подключения Github-аккаунта, разделе «Репозиторий» выберите ваш репозиторий с приложением.

    После подключения Github-аккаунта, разделе «Репозиторий» выберите ваш репозиторий с приложением.

    • Выберите регион, в котором будет размещено приложение.

    • В разделе «Конфигурация» выберите минимальные настройки, их будет достаточно для текущего проекта. При необходимости, конфигурацию можно будет изменить позже.

    • В разделе «Настройки приложения» оставьте значения по умолчанию. В более сложных проектах можно указать переменные окружения и команду для сборки приложения.

    • Укажите имя будущего приложения и нажмите «Запустить деплой».

    Выберите регион, в котором будет размещено приложение.

    В разделе «Конфигурация» выберите минимальные настройки, их будет достаточно для текущего проекта. При необходимости, конфигурацию можно будет изменить позже.

    В разделе «Настройки приложения» оставьте значения по умолчанию. В более сложных проектах можно указать переменные окружения и команду для сборки приложения.

    Укажите имя будущего приложения и нажмите «Запустить деплой».

    Процесс деплоя может занять до 10 минут. После завершения вы увидите сообщение «Deployment successfully completed» в логах деплоя.

    Перейдите в раздел «Настройки» на странице приложения, где будет указан домен, привязанный к вашему приложению.

    В этом же разделе можно изменить конфигурацию сервера, отредактировать настройки деплоя и изменить привязку домена. При подключении своего домена, для него автоматически будет установлен сертификат Let’s Encrypt, который будет автоматически продлеваться за 7 дней до истечения срока.

    Для проверки, что приложение работает корректно, можем выполнить curl-запрос, изменив localhost на привязанный домен:

    curl -X GET https://ваш_домен/notes

    Мы разработали базовое веб-приложение для управления заметками с использованием фреймворка Gin и библиотеки GORM. Созданный RESTful API поддерживает основные CRUD-операции, что делает приложение простым и удобным в использовании.

    Gin показал себя как эффективный и простой в освоении инструмент. Его система маршрутизации и поддержка одновременных запросов упростили процесс разработки. GORM помог легко работать с базой данных, автоматизировав многие задачи.

    Приложение успешно развернуто на платформе Simple-Server App Platform, что сделало процесс деплоя быстрым и надежным. App Platform предоставляет все необходимые инструменты для комфортного управления приложением.

    В будущем можно добавить новые функции, такие как аутентификация пользователей и улучшенные возможности поиска заметок.

    Этот проект продемонстрировал, как современные инструменты разработки, такие как Gin и GORM, могут упростить создание веб-приложений.


    Нужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.

    VPS для проекта

    VPS с root-доступом, NVMe и поддержкой 24/7 на Simple-Server.

    StarterVDS

    490₽

    в месяц

    1 ядро

    1 ГБ RAM

    20 ГБ NVMe

    • 1 IPv4
    • KVM
    • Root-доступ
    • Безлимитный трафик
    Заказать VPS
    Рекомендуем

    PerformanceVDS

    1190₽

    в месяц

    2 ядра

    4 ГБ RAM

    60 ГБ NVMe

    • 1 IPv4
    • KVM
    • Root-доступ
    • Базовая DDoS-защита
    Заказать VPS

    Нужна другая конфигурация или чистый VPS без панели?

    Все тарифы VPS

    Похожие статьи, которые могут быть вам интересны