- Replace Tailwind CDN (~350KB) with purged local CSS (~22KB) - Replace htmx unpkg CDN with local static file - Add Gzip middleware (standard library, sync.Pool) for all responses - Add Cache-Control: public, max-age=3600 for /static/* assets - Reduce status polling interval from 5s to 30s - Add scripts/build-css.sh for CSS regeneration after template changes - Document in bible-local/operations.md and history.md Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3.9 KiB
3.9 KiB
Operations
Configuration (config.yaml)
server:
host: "127.0.0.1" # loopback-only
port: 8084
mode: "release" # debug | release
read_timeout: "30s"
write_timeout: "30s"
database:
host: "localhost"
port: 3306
name: "RFQ_LOG"
user: "priceforge"
password: "CHANGE_ME"
max_open_conns: 25
max_idle_conns: 5
conn_max_lifetime: "5m"
pricing:
default_method: "weighted_median"
default_period_days: 90
freshness_green_days: 30
freshness_yellow_days: 60
freshness_red_days: 90
min_quotes_for_median: 3
export:
temp_dir: "/tmp/priceforge-exports"
max_file_age: "1h"
alerts:
enabled: true
check_interval: "1h"
high_demand_threshold: 5
logging:
level: "info" # debug | info | warn | error
format: "json" # json | text
Quick Start
cp config.example.yaml config.yaml
# Edit config.yaml: database.host, database.name, database.user, database.password
make run
# Open: http://127.0.0.1:8084/admin/pricing
Commands
# Run
make run
go run ./cmd/pfs
# Build
make build # dev build
make build-release # optimized, version via ldflags
make build-all # cross-compile Linux/macOS/Windows
# Migrations
go run ./cmd/pfs -migrate
make backup-db
# Version
./bin/pfs -version
# Tests
make test
# Clean
make clean
Build System (Makefile)
| Target | Action |
|---|---|
run |
go run ./cmd/pfs |
backup-db |
Run go run ./cmd/dbbackup using current config.yaml |
build |
Dev build with debug info |
build-release |
-s -w stripped + version ldflags |
build-linux |
GOOS=linux GOARCH=amd64 |
build-macos |
GOOS=darwin GOARCH=arm64 |
build-windows |
GOOS=windows |
build-all |
All platforms |
release |
./scripts/release.sh |
test |
go test -v ./... |
clean |
Remove bin/ |
deps |
go mod download && go mod tidy |
watch |
Auto-restart with entr |
Build variables:
CGO_ENABLED=0— static binariesVERSION— fromgit describeor"dev"LDFLAGS—-s -w -X main.Version=$(VERSION)
Release
./scripts/release.sh
# Creates: releases/<version>/ with archives and SHA256SUMS.txt
Migrations
SQL migrations in migrations/ (25 files). Applied automatically on startup.
Manual run: go run ./cmd/pfs -migrate
Before any migration or DB repair:
make backup-db
Backup helper:
go run ./cmd/dbbackup
# optional:
go run ./cmd/dbbackup --config /path/to/config.yaml --out-dir /path/to/backups
Default output path:
<PriceForge state dir>/backups/
Example on macOS:
~/Library/Application Support/PriceForge/backups/
Migration runner: internal/models/sql_migrations.go
macOS Gatekeeper
After downloading the binary:
xattr -d com.apple.quarantine /path/to/pfs-darwin-arm64
Frontend Assets (Tailwind CSS)
Static assets are embedded into the binary from web/static/. CSS and JS are served locally —
no external CDN requests at runtime.
Regenerate Tailwind CSS
Run this after adding new Tailwind utility classes to any HTML template:
scripts/build-css.sh
# or directly:
node_modules/.bin/tailwindcss -i tw-input.css -o web/static/tailwind.min.css --minify
First-time setup (requires Node.js):
npm install
node_modules/ is excluded from git. web/static/tailwind.min.css is committed —
rebuilding is only needed when templates change.
Files involved
| File | Purpose |
|---|---|
tailwind.config.js |
Content paths for class scanning |
tw-input.css |
Tailwind input (base/components/utilities directives) |
web/static/tailwind.min.css |
Generated output — committed, embedded into binary |
web/static/js/htmx.min.js |
htmx — committed, embedded into binary |
scripts/build-css.sh |
Shortcut to regenerate CSS |
Requirements
- Go 1.22+
- MariaDB / MySQL (working database, e.g.
RFQ_LOG)