# Makefile для GPIO Monitor Server .PHONY: all build clean run test fmt lint help install dev deb prepare-debian version deb-clean deb-info deb-contents # Переменные APP_NAME := gpio-monitor-server CMD_PATH := ./cmd/server BUILD_DIR := ./build BINARY := $(BUILD_DIR)/$(APP_NAME) WEB_DIR := ./cmd/server/web DEB_DIR := ./debian DEB_PACKAGE := $(DEB_DIR)/$(APP_NAME) # Целевая платформа (по умолчанию) GOOS ?= linux GOARCH ?= arm64 # Версионирование DEB пакета BASE_VERSION := $(shell awk '/^Version:/ {print $$2; exit}' $(DEB_DIR)/control 2>/dev/null) BASE_VERSION := $(if $(BASE_VERSION),$(BASE_VERSION),1.0.0) GIT_COMMIT_COUNT := $(shell git rev-list --count HEAD 2>/dev/null || echo 0) DEB_VERSION := $(BASE_VERSION)-build$(GIT_COMMIT_COUNT) DEB_FILENAME := $(APP_NAME)_$(DEB_VERSION)_$(GOARCH).deb # Флаги сборки LDFLAGS := -ldflags="-s -w" # Цвета для вывода RED := \033[0;31m GREEN := \033[0;32m YELLOW := \033[0;33m NC := \033[0m # No Color # ============================================ # ИНИЦИАЛИЗАЦИЯ И ПОДГОТОВКА СИСТЕМЫ # ============================================ .PHONY: init check-node ## init - Полная подготовка окружения после git clone init: check-node deps @echo "$(GREEN)Проект успешно инициализирован и готов к сборке!$(NC)" @echo "Запустите '$(IMAGE_TARGET) make build' для сборки или 'make run' для запуска." # Проверка установленного Node.js и npm check-node: @echo "$(YELLOW)Проверка окружения...$(NC)" @which node > /dev/null 2>&1 || (echo "$(RED)❌ Ошибка: Node.js не установлен!$(NC)" && echo "Установите его командой: sudo apt install nodejs npm" && exit 1) @which npm > /dev/null 2>&1 || (echo "$(RED)❌ Ошибка: npm не установлен!$(NC)" && exit 1) @echo "$(GREEN) Node.js и npm найдены.$(NC)" # ============================================ # ОСНОВНЫЕ ЦЕЛИ # ============================================ all: help ## build - Полная сборка проекта (фронтенд + бекенд) build: build-frontend build-backend @echo "$(GREEN)Сборка завершена!$(NC)" @ls -lh $(BINARY) ## build-frontend - Сборка TypeScript фронтенда build-frontend: @echo "$(YELLOW)Сборка TypeScript фронтенда...$(NC)" @cd $(WEB_DIR) && \ if [ ! -d "node_modules" ]; then \ echo " Установка npm зависимостей..."; \ npm install; \ fi && \ echo " Компиляция TypeScript..." && \ npm run build && \ echo "$(GREEN)TypeScript скомпилирован успешно!$(NC)" ## build-backend - Сборка Go сервера build-backend: @echo "$(YELLOW)Сборка Go сервера...$(NC)" @mkdir -p $(BUILD_DIR) @echo " Целевая платформа: $(GOOS)/$(GOARCH)" @GOOS=$(GOOS) GOARCH=$(GOARCH) go build $(LDFLAGS) -o $(BINARY) $(CMD_PATH) @echo "$(GREEN)Go сервер скомпилирован успешно!$(NC)" ## run - Запуск сервера (сборка + запуск) run: build @echo "$(YELLOW)Запуск сервера...$(NC)" @$(BINARY) ## dev - Режим разработки (без оптимизации, с hot-reload) dev: @echo "$(YELLOW)Режим разработки...$(NC)" @go run $(CMD_PATH) -port :8080 ## clean - Очистка артефактов сборки clean: @echo "$(YELLOW)Очистка...$(NC)" @rm -rf $(BUILD_DIR) @rm -rf $(WEB_DIR)/dist @rm -rf $(WEB_DIR)/node_modules @rm -rf $(DEB_PACKAGE) @rm -f *.deb @echo "$(GREEN)Очищено$(NC)" ## test - Запуск тестов test: @echo "$(YELLOW)Запуск тестов...$(NC)" @go test -v ./... ## fmt - Форматирование кода fmt: @echo "$(YELLOW)Форматирование кода...$(NC)" @go fmt ./... @cd $(WEB_DIR) && npm run format 2>/dev/null || true ## lint - Проверка кода lint: @echo "$(YELLOW)Проверка кода...$(NC)" @golangci-lint run ./... 2>/dev/null || echo " Установите golangci-lint: go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest" ## deps - Установка зависимостей deps: @echo "$(YELLOW)Установка зависимостей Go...$(NC)" go mod download go mod tidy @echo "$(YELLOW)Установка npm-пакетов фронтенда (это может занять время)...$(NC)" cd $(WEB_DIR) && npm install --progress=true --loglevel=info ## install - Установка бинарника в систему install: build @echo "$(YELLOW)Установка $(APP_NAME)...$(NC)" @sudo cp $(BINARY) /usr/local/bin/$(APP_NAME) @echo "$(GREEN)Установлено в /usr/local/bin/$(APP_NAME)$(NC)" ## uninstall - Удаление из системы uninstall: @echo "$(YELLOW)🗑Удаление $(APP_NAME)...$(NC)" @sudo rm -f /usr/local/bin/$(APP_NAME) @echo "$(GREEN)Удалено$(NC)" ## help - Показать справку help: @echo "$(GREEN)GPIO Monitor Server - команды Makefile$(NC)" @echo "" @echo "Доступные команды:" @awk '/^##/ { \ cmd = $$0; \ gsub(/^## /, "", cmd); \ printf " $(GREEN)%-20s$(NC) %s\n", $$2, cmd \ }' $(MAKEFILE_LIST) | sort @echo "" @echo "Примеры:" @echo " make build - Полная сборка" @echo " make run - Сборка и запуск" @echo " make dev - Запуск в режиме разработки" @echo " make clean - Очистка" @echo " make install - Установка в систему" @echo " make deb - Сборка DEB пакета" # ============================================ # СБОРКА DEB ПАКЕТА # ============================================ ## prepare-debian - Подготовка структуры для deb-пакета prepare-debian: @echo "$(YELLOW)Подготовка структуры DEB пакета...$(NC)" @# Создаем основную структуру @mkdir -p $(DEB_PACKAGE)/DEBIAN @mkdir -p $(DEB_PACKAGE)/usr/bin @mkdir -p $(DEB_PACKAGE)/usr/share/doc/$(APP_NAME) @mkdir -p $(DEB_PACKAGE)/opt/gpio-monitoring/web @mkdir -p $(DEB_PACKAGE)/etc/gpio-monitoring @mkdir -p $(DEB_PACKAGE)/etc/systemd/system @# Копируем DEBIAN файлы @sed -e 's/^Version:.*/Version: $(DEB_VERSION)/' \ -e 's/^Architecture:.*/Architecture: $(GOARCH)/' \ $(DEB_DIR)/control > $(DEB_PACKAGE)/DEBIAN/control @if [ -f $(DEB_DIR)/preinst ]; then cp $(DEB_DIR)/preinst $(DEB_PACKAGE)/DEBIAN/; fi @if [ -f $(DEB_DIR)/postinst ]; then cp $(DEB_DIR)/postinst $(DEB_PACKAGE)/DEBIAN/; fi @if [ -f $(DEB_DIR)/prerm ]; then cp $(DEB_DIR)/prerm $(DEB_PACKAGE)/DEBIAN/; fi @if [ -f $(DEB_DIR)/postrm ]; then cp $(DEB_DIR)/postrm $(DEB_PACKAGE)/DEBIAN/; fi @# Копируем документацию @if [ -f $(DEB_DIR)/copyright ]; then cp $(DEB_DIR)/copyright $(DEB_PACKAGE)/usr/share/doc/$(APP_NAME)/; fi @if [ -f $(DEB_DIR)/changelog ]; then \ cp $(DEB_DIR)/changelog $(DEB_PACKAGE)/usr/share/doc/$(APP_NAME)/; \ gzip -9 -n $(DEB_PACKAGE)/usr/share/doc/$(APP_NAME)/changelog 2>/dev/null || true; \ fi @# Устанавливаем права @chmod 755 $(DEB_PACKAGE)/DEBIAN/* 2>/dev/null || true @chmod 644 $(DEB_PACKAGE)/DEBIAN/control $(DEB_PACKAGE)/DEBIAN/md5sums 2>/dev/null || true @echo "$(GREEN)Структура подготовлена$(NC)" ## deb - Сборка DEB пакета deb: clean build-frontend build-backend prepare-debian @echo "$(YELLOW)Сборка DEB пакета...$(NC)" @# Копируем бинарник @cp $(BINARY) $(DEB_PACKAGE)/usr/bin/ @# Копируем веб-файлы @if [ -d "$(WEB_DIR)/dist" ]; then cp -r $(WEB_DIR)/dist $(DEB_PACKAGE)/opt/gpio-monitoring/web/; fi @if [ -d "$(WEB_DIR)/css" ]; then cp -r $(WEB_DIR)/css $(DEB_PACKAGE)/opt/gpio-monitoring/web/; fi @if [ -d "$(WEB_DIR)/fonts" ]; then cp -r $(WEB_DIR)/fonts $(DEB_PACKAGE)/opt/gpio-monitoring/web/; fi @if ls $(WEB_DIR)/*.html 1>/dev/null 2>&1; then cp $(WEB_DIR)/*.html $(DEB_PACKAGE)/opt/gpio-monitoring/web/ 2>/dev/null || true; fi @if [ -f "$(WEB_DIR)/favicon.png" ]; then cp $(WEB_DIR)/favicon.png $(DEB_PACKAGE)/opt/gpio-monitoring/web/ 2>/dev/null || true; fi @# Копируем systemd сервис @if [ -f "$(DEB_DIR)/$(APP_NAME).service" ]; then cp $(DEB_DIR)/$(APP_NAME).service $(DEB_PACKAGE)/etc/systemd/system/; fi @# Копируем конфиг @if [ -f "$(DEB_DIR)/$(APP_NAME).conf" ]; then cp $(DEB_DIR)/$(APP_NAME).conf $(DEB_PACKAGE)/etc/gpio-monitoring/config; fi @# Копируем скрипт для логов @if [ -f "$(DEB_DIR)/usr/bin/gpio-logs" ]; then \ cp $(DEB_DIR)/usr/bin/gpio-logs $(DEB_PACKAGE)/usr/bin/; \ chmod +x $(DEB_PACKAGE)/usr/bin/gpio-logs; \ fi @# Устанавливаем правильные права @chown -R root:root $(DEB_PACKAGE) 2>/dev/null || true @# Создаем архив с контрольными суммами @cd $(DEB_PACKAGE) && find . -type f ! -path "./DEBIAN/*" -exec md5sum {} \; > DEBIAN/md5sums 2>/dev/null || true @# Собираем пакет @mkdir -p $(BUILD_DIR) @dpkg-deb --root-owner-group --build $(DEB_PACKAGE) $(BUILD_DIR)/$(DEB_FILENAME) @echo "$(GREEN)DEB пакет создан: $(BUILD_DIR)/$(DEB_FILENAME)$(NC)" @ls -lh $(BUILD_DIR)/$(DEB_FILENAME) @echo "" @echo "$(GREEN)Информация о пакете:$(NC)" @dpkg-deb -I $(BUILD_DIR)/$(DEB_FILENAME) | head -15 # ============================================ # ДОПОЛНИТЕЛЬНЫЕ ЦЕЛИ # ============================================ ## build-arm64 - Сборка для ARM64 (Raspberry Pi) build-arm64: @$(MAKE) build GOOS=linux GOARCH=arm64 ## build-amd64 - Сборка для AMD64 build-amd64: @$(MAKE) build GOOS=linux GOARCH=amd64 ## build-mac - Сборка для macOS build-mac: @$(MAKE) build GOOS=darwin GOARCH=amd64 ## build-windows - Сборка для Windows build-windows: @$(MAKE) build GOOS=windows GOARCH=amd64 ## build-all - Сборка для всех платформ build-all: build-arm64 build-amd64 build-mac build-windows @echo "$(GREEN)Все платформы собраны$(NC)" ## docker-build - Сборка Docker образа docker-build: @echo "$(YELLOW)Сборка Docker образа...$(NC)" @docker build -t gpio-monitor:latest . ## docker-run - Запуск в Docker docker-run: @echo "$(YELLOW)Запуск в Docker...$(NC)" @docker run -p 8080:8080 gpio-monitor:latest ## version - Показать вычисленную версию и имя deb-пакета version: @echo "BASE_VERSION: $(BASE_VERSION)" @echo "GIT_COMMIT_COUNT: $(GIT_COMMIT_COUNT)" @echo "DEB_VERSION: $(DEB_VERSION)" @echo "DEB_FILENAME: $(DEB_FILENAME)" ## deb-clean - Очистка временных файлов deb-пакета deb-clean: @echo "$(YELLOW)Очистка deb-временных файлов...$(NC)" @rm -rf $(DEB_PACKAGE) @rm -f $(BUILD_DIR)/$(APP_NAME)_*.deb @echo "$(GREEN)Очищено$(NC)" ## deb-info - Показать информацию о deb-пакете deb-info: @if [ -f "$(BUILD_DIR)/$(DEB_FILENAME)" ]; then \ dpkg-deb -I $(BUILD_DIR)/$(DEB_FILENAME); \ else \ echo "$(RED)Пакет не найден. Сначала выполните: make deb$(NC)"; \ fi ## deb-contents - Показать содержимое deb-пакета deb-contents: @if [ -f "$(BUILD_DIR)/$(DEB_FILENAME)" ]; then \ dpkg-deb -c $(BUILD_DIR)/$(DEB_FILENAME); \ else \ echo "$(RED)Пакет не найден. Сначала выполните: make deb$(NC)"; \ fi