Compare commits
4 Commits
feature/ph
...
v0.2.6
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1bce8086d6 | ||
|
|
0bdd163728 | ||
|
|
fa0f5e321d | ||
|
|
502832ac9a |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -41,3 +41,4 @@ Network Trash Folder
|
|||||||
Temporary Items
|
Temporary Items
|
||||||
.apdisk
|
.apdisk
|
||||||
|
|
||||||
|
releases/
|
||||||
|
|||||||
19
CLAUDE.md
19
CLAUDE.md
@@ -134,9 +134,22 @@ Go 1.22+ | Gin | GORM | MariaDB 11 | SQLite (glebarez/sqlite) | htmx + Tailwind
|
|||||||
|
|
||||||
## Commands
|
## Commands
|
||||||
```bash
|
```bash
|
||||||
go run ./cmd/server # Dev server
|
# Development
|
||||||
go run ./cmd/cron -job=X # cleanup-pricelists | update-prices | update-popularity
|
go run ./cmd/qfs # Dev server
|
||||||
CGO_ENABLED=0 go build -ldflags="-s -w" -o bin/quoteforge ./cmd/server
|
make run # Dev server (via Makefile)
|
||||||
|
|
||||||
|
# Production build
|
||||||
|
make build-release # Optimized build with version (recommended)
|
||||||
|
VERSION=$(git describe --tags --always --dirty)
|
||||||
|
CGO_ENABLED=0 go build -ldflags="-s -w -X main.Version=$VERSION" -o bin/qfs ./cmd/qfs
|
||||||
|
|
||||||
|
# Cron jobs
|
||||||
|
go run ./cmd/cron -job=cleanup-pricelists # Remove old unused pricelists
|
||||||
|
go run ./cmd/cron -job=update-prices # Recalculate all prices
|
||||||
|
go run ./cmd/cron -job=update-popularity # Update popularity scores
|
||||||
|
|
||||||
|
# Check version
|
||||||
|
./bin/qfs -version
|
||||||
```
|
```
|
||||||
|
|
||||||
## Code Style
|
## Code Style
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ localConfigService := services.NewLocalConfigurationService(
|
|||||||
### Шаг 1: Обновить main.go
|
### Шаг 1: Обновить main.go
|
||||||
|
|
||||||
```go
|
```go
|
||||||
// В cmd/server/main.go
|
// В cmd/qfs/main.go
|
||||||
syncService := sync.NewService(pricelistRepo, configRepo, local)
|
syncService := sync.NewService(pricelistRepo, configRepo, local)
|
||||||
|
|
||||||
// Создать isOnline функцию
|
// Создать isOnline функцию
|
||||||
@@ -165,7 +165,7 @@ type PendingChange struct {
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Compile
|
# Compile
|
||||||
go build ./cmd/server
|
go build ./cmd/qfs
|
||||||
|
|
||||||
# Run
|
# Run
|
||||||
./quoteforge
|
./quoteforge
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ mysql -u user -p RFQ_LOG < migrations/004_add_price_updated_at.sql
|
|||||||
- `internal/models/configuration.go` - добавлено поле `PriceUpdatedAt`
|
- `internal/models/configuration.go` - добавлено поле `PriceUpdatedAt`
|
||||||
- `internal/services/configuration.go` - добавлен метод `RefreshPrices()`
|
- `internal/services/configuration.go` - добавлен метод `RefreshPrices()`
|
||||||
- `internal/handlers/configuration.go` - добавлен обработчик `RefreshPrices()`
|
- `internal/handlers/configuration.go` - добавлен обработчик `RefreshPrices()`
|
||||||
- `cmd/server/main.go` - добавлен маршрут `/api/configs/:uuid/refresh-prices`
|
- `cmd/qfs/main.go` - добавлен маршрут `/api/configs/:uuid/refresh-prices`
|
||||||
- `web/templates/index.html` - добавлена кнопка и JavaScript функции
|
- `web/templates/index.html` - добавлена кнопка и JavaScript функции
|
||||||
- `migrations/004_add_price_updated_at.sql` - SQL миграция
|
- `migrations/004_add_price_updated_at.sql` - SQL миграция
|
||||||
- `CLAUDE.md` - обновлена документация
|
- `CLAUDE.md` - обновлена документация
|
||||||
|
|||||||
90
Makefile
Normal file
90
Makefile
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
.PHONY: build build-release clean test run version
|
||||||
|
|
||||||
|
# Get version from git
|
||||||
|
VERSION := $(shell git describe --tags --always --dirty 2>/dev/null || echo "dev")
|
||||||
|
BUILD_TIME := $(shell date -u '+%Y-%m-%d_%H:%M:%S')
|
||||||
|
LDFLAGS := -s -w -X main.Version=$(VERSION)
|
||||||
|
|
||||||
|
# Binary name
|
||||||
|
BINARY := qfs
|
||||||
|
|
||||||
|
# Build for development (with debug info)
|
||||||
|
build:
|
||||||
|
go build -o bin/$(BINARY) ./cmd/qfs
|
||||||
|
|
||||||
|
# Build for release (optimized, with version)
|
||||||
|
build-release:
|
||||||
|
@echo "Building $(BINARY) version $(VERSION)..."
|
||||||
|
CGO_ENABLED=0 go build -ldflags="$(LDFLAGS)" -o bin/$(BINARY) ./cmd/qfs
|
||||||
|
@echo "✓ Built: bin/$(BINARY)"
|
||||||
|
@./bin/$(BINARY) -version
|
||||||
|
|
||||||
|
# Build release for Linux (cross-compile)
|
||||||
|
build-linux:
|
||||||
|
@echo "Building $(BINARY) for Linux..."
|
||||||
|
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="$(LDFLAGS)" -o bin/$(BINARY)-linux-amd64 ./cmd/qfs
|
||||||
|
@echo "✓ Built: bin/$(BINARY)-linux-amd64"
|
||||||
|
|
||||||
|
# Build release for macOS (cross-compile)
|
||||||
|
build-macos:
|
||||||
|
@echo "Building $(BINARY) for macOS..."
|
||||||
|
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags="$(LDFLAGS)" -o bin/$(BINARY)-darwin-amd64 ./cmd/qfs
|
||||||
|
CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -ldflags="$(LDFLAGS)" -o bin/$(BINARY)-darwin-arm64 ./cmd/qfs
|
||||||
|
@echo "✓ Built: bin/$(BINARY)-darwin-amd64"
|
||||||
|
@echo "✓ Built: bin/$(BINARY)-darwin-arm64"
|
||||||
|
|
||||||
|
# Build all platforms
|
||||||
|
build-all: build-release build-linux build-macos
|
||||||
|
|
||||||
|
# Create release packages for all platforms
|
||||||
|
release:
|
||||||
|
@./scripts/release.sh
|
||||||
|
|
||||||
|
# Show version
|
||||||
|
version:
|
||||||
|
@echo "Version: $(VERSION)"
|
||||||
|
|
||||||
|
# Clean build artifacts
|
||||||
|
clean:
|
||||||
|
rm -rf bin/
|
||||||
|
rm -f $(BINARY)
|
||||||
|
|
||||||
|
# Run tests
|
||||||
|
test:
|
||||||
|
go test -v ./...
|
||||||
|
|
||||||
|
# Run development server
|
||||||
|
run:
|
||||||
|
go run ./cmd/qfs
|
||||||
|
|
||||||
|
# Run with auto-restart (requires entr: brew install entr)
|
||||||
|
watch:
|
||||||
|
find . -name '*.go' | entr -r go run ./cmd/qfs
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
deps:
|
||||||
|
go mod download
|
||||||
|
go mod tidy
|
||||||
|
|
||||||
|
# Help
|
||||||
|
help:
|
||||||
|
@echo "QuoteForge Server (qfs) - Build Commands"
|
||||||
|
@echo ""
|
||||||
|
@echo "Usage: make [target]"
|
||||||
|
@echo ""
|
||||||
|
@echo "Targets:"
|
||||||
|
@echo " build Build for development (with debug info)"
|
||||||
|
@echo " build-release Build optimized release (default)"
|
||||||
|
@echo " build-linux Cross-compile for Linux"
|
||||||
|
@echo " build-macos Cross-compile for macOS (Intel + Apple Silicon)"
|
||||||
|
@echo " build-all Build for all platforms"
|
||||||
|
@echo " release Create release packages for all platforms"
|
||||||
|
@echo " version Show current version"
|
||||||
|
@echo " clean Remove build artifacts"
|
||||||
|
@echo " test Run tests"
|
||||||
|
@echo " run Run development server"
|
||||||
|
@echo " watch Run with auto-restart (requires entr)"
|
||||||
|
@echo " deps Install/update dependencies"
|
||||||
|
@echo " help Show this help"
|
||||||
|
@echo ""
|
||||||
|
@echo "Current version: $(VERSION)"
|
||||||
29
README.md
29
README.md
@@ -82,7 +82,7 @@ auth:
|
|||||||
### 3. Миграции базы данных
|
### 3. Миграции базы данных
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
go run ./cmd/server -migrate
|
go run ./cmd/qfs -migrate
|
||||||
```
|
```
|
||||||
|
|
||||||
### 4. Импорт метаданных компонентов
|
### 4. Импорт метаданных компонентов
|
||||||
@@ -95,11 +95,26 @@ go run ./cmd/importer
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Development
|
# Development
|
||||||
go run ./cmd/server
|
go run ./cmd/qfs
|
||||||
|
|
||||||
# Production
|
# Production (with Makefile - recommended)
|
||||||
CGO_ENABLED=0 go build -ldflags="-s -w" -o bin/quoteforge ./cmd/server
|
make build-release # Builds with version info
|
||||||
./bin/quoteforge
|
./bin/qfs -version # Check version
|
||||||
|
|
||||||
|
# Production (manual)
|
||||||
|
VERSION=$(git describe --tags --always --dirty)
|
||||||
|
CGO_ENABLED=0 go build -ldflags="-s -w -X main.Version=$VERSION" -o bin/qfs ./cmd/qfs
|
||||||
|
./bin/qfs -version
|
||||||
|
```
|
||||||
|
|
||||||
|
**Makefile команды:**
|
||||||
|
```bash
|
||||||
|
make build-release # Оптимизированная сборка с версией
|
||||||
|
make build-all # Сборка для всех платформ (Linux, macOS)
|
||||||
|
make run # Запуск dev сервера
|
||||||
|
make test # Запуск тестов
|
||||||
|
make clean # Очистка bin/
|
||||||
|
make help # Показать все команды
|
||||||
```
|
```
|
||||||
|
|
||||||
Приложение будет доступно по адресу: http://localhost:8080
|
Приложение будет доступно по адресу: http://localhost:8080
|
||||||
@@ -209,13 +224,13 @@ go run ./cmd/cron -job=update-popularity
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Запуск в режиме разработки (hot reload)
|
# Запуск в режиме разработки (hot reload)
|
||||||
go run ./cmd/server
|
go run ./cmd/qfs
|
||||||
|
|
||||||
# Запуск тестов
|
# Запуск тестов
|
||||||
go test ./...
|
go test ./...
|
||||||
|
|
||||||
# Сборка для Linux
|
# Сборка для Linux
|
||||||
CGO_ENABLED=0 go build -ldflags="-s -w" -o bin/quoteforge ./cmd/server
|
CGO_ENABLED=0 go build -ldflags="-s -w" -o bin/qfs ./cmd/qfs
|
||||||
```
|
```
|
||||||
|
|
||||||
## Переменные окружения
|
## Переменные окружения
|
||||||
|
|||||||
@@ -34,11 +34,21 @@ const (
|
|||||||
localDBPath = "./data/settings.db"
|
localDBPath = "./data/settings.db"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Version is set via ldflags during build
|
||||||
|
var Version = "dev"
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
configPath := flag.String("config", "config.yaml", "path to config file (optional, for server settings)")
|
configPath := flag.String("config", "config.yaml", "path to config file (optional, for server settings)")
|
||||||
migrate := flag.Bool("migrate", false, "run database migrations")
|
migrate := flag.Bool("migrate", false, "run database migrations")
|
||||||
|
version := flag.Bool("version", false, "show version information")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
|
// Show version if requested
|
||||||
|
if *version {
|
||||||
|
fmt.Printf("qfs version %s\n", Version)
|
||||||
|
os.Exit(0)
|
||||||
|
}
|
||||||
|
|
||||||
// Initialize local SQLite database (always used)
|
// Initialize local SQLite database (always used)
|
||||||
local, err := localdb.New(localDBPath)
|
local, err := localdb.New(localDBPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
92
scripts/release.sh
Executable file
92
scripts/release.sh
Executable file
@@ -0,0 +1,92 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# QuoteForge Release Build Script
|
||||||
|
# Creates binaries for all platforms and packages them for release
|
||||||
|
|
||||||
|
# Colors
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# Get version from git
|
||||||
|
VERSION=$(git describe --tags --always --dirty 2>/dev/null || echo "dev")
|
||||||
|
if [[ $VERSION == *"dirty"* ]]; then
|
||||||
|
echo -e "${RED}✗ Error: Working directory has uncommitted changes${NC}"
|
||||||
|
echo " Commit your changes first"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${GREEN}Building QuoteForge version: ${VERSION}${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Create release directory
|
||||||
|
RELEASE_DIR="releases/${VERSION}"
|
||||||
|
mkdir -p "${RELEASE_DIR}"
|
||||||
|
|
||||||
|
# Build for all platforms
|
||||||
|
echo -e "${YELLOW}→ Building binaries...${NC}"
|
||||||
|
make build-all
|
||||||
|
|
||||||
|
# Package binaries with checksums
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}→ Creating release packages...${NC}"
|
||||||
|
|
||||||
|
# Linux AMD64
|
||||||
|
if [ -f "bin/qfs-linux-amd64" ]; then
|
||||||
|
cd bin
|
||||||
|
tar -czf "../${RELEASE_DIR}/qfs-${VERSION}-linux-amd64.tar.gz" qfs-linux-amd64
|
||||||
|
cd ..
|
||||||
|
echo -e "${GREEN} ✓ qfs-${VERSION}-linux-amd64.tar.gz${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# macOS Intel
|
||||||
|
if [ -f "bin/qfs-darwin-amd64" ]; then
|
||||||
|
cd bin
|
||||||
|
tar -czf "../${RELEASE_DIR}/qfs-${VERSION}-darwin-amd64.tar.gz" qfs-darwin-amd64
|
||||||
|
cd ..
|
||||||
|
echo -e "${GREEN} ✓ qfs-${VERSION}-darwin-amd64.tar.gz${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# macOS Apple Silicon
|
||||||
|
if [ -f "bin/qfs-darwin-arm64" ]; then
|
||||||
|
cd bin
|
||||||
|
tar -czf "../${RELEASE_DIR}/qfs-${VERSION}-darwin-arm64.tar.gz" qfs-darwin-arm64
|
||||||
|
cd ..
|
||||||
|
echo -e "${GREEN} ✓ qfs-${VERSION}-darwin-arm64.tar.gz${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Generate checksums
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}→ Generating checksums...${NC}"
|
||||||
|
cd "${RELEASE_DIR}"
|
||||||
|
shasum -a 256 *.tar.gz > SHA256SUMS.txt
|
||||||
|
cd ../..
|
||||||
|
echo -e "${GREEN} ✓ SHA256SUMS.txt${NC}"
|
||||||
|
|
||||||
|
# List release files
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
||||||
|
echo -e "${GREEN}Release ${VERSION} built successfully!${NC}"
|
||||||
|
echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
||||||
|
echo ""
|
||||||
|
echo "Files in ${RELEASE_DIR}:"
|
||||||
|
ls -lh "${RELEASE_DIR}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Show next steps
|
||||||
|
echo -e "${YELLOW}Next steps:${NC}"
|
||||||
|
echo " 1. Create git tag:"
|
||||||
|
echo " git tag -a ${VERSION} -m \"Release ${VERSION}\""
|
||||||
|
echo ""
|
||||||
|
echo " 2. Push tag to remote:"
|
||||||
|
echo " git push origin ${VERSION}"
|
||||||
|
echo ""
|
||||||
|
echo " 3. Create release on git.mchus.pro:"
|
||||||
|
echo " - Go to: https://git.mchus.pro/mchus/QuoteForge/releases"
|
||||||
|
echo " - Click 'New Release'"
|
||||||
|
echo " - Select tag: ${VERSION}"
|
||||||
|
echo " - Upload files from: ${RELEASE_DIR}/"
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}Done!${NC}"
|
||||||
Reference in New Issue
Block a user