# Makefile для GPIO Monitor Server .PHONY: all build clean run test fmt lint help install dev deb prepare-debian # Переменные 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 # Флаги сборки LDFLAGS := -ldflags="-s -w" # Цвета для вывода RED := \033[0;31m GREEN := \033[0;32m YELLOW := \033[0;33m NC := \033[0m # No Color # ============================================ # ОСНОВНЫЕ ЦЕЛИ # ============================================ 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)Установка зависимостей...$(NC)" @go mod download @go mod tidy @cd $(WEB_DIR) && npm install ## 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 файлы @if [ -f $(DEB_DIR)/control ]; then cp $(DEB_DIR)/control $(DEB_PACKAGE)/DEBIAN/; fi @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 @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 @# Собираем пакет @dpkg-deb --root-owner-group --build $(DEB_PACKAGE) . @mkdir -p $(BUILD_DIR) @mv *.deb $(BUILD_DIR)/ @echo "$(GREEN)DEB пакет создан: $(BUILD_DIR)/$(APP_NAME).deb$(NC)" @ls -lh $(BUILD_DIR)/*.deb @echo "" @echo "$(GREEN)Информация о пакете:$(NC)" @dpkg-deb -I $(BUILD_DIR)/*.deb | 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 ## 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)/$(APP_NAME).deb" ]; then \ dpkg-deb -I $(BUILD_DIR)/$(APP_NAME).deb; \ else \ echo "$(RED)Пакет не найден. Сначала выполните: make deb$(NC)"; \ fi ## deb-contents - Показать содержимое deb-пакета deb-contents: @if [ -f "$(BUILD_DIR)/$(APP_NAME).deb" ]; then \ dpkg-deb -c $(BUILD_DIR)/$(APP_NAME).deb; \ else \ echo "$(RED)Пакет не найден. Сначала выполните: make deb$(NC)"; \ fi