5.5 KiB
Verstak Sync Server
Standalone sync server for Verstak2 platform.
Overview
This server provides synchronization between devices running Verstak2. It handles:
- Device registration and authentication
- Operation log sync with server sequence numbers and conflict detection
- Blob storage for attachments
- User management with email confirmation
Quick Start
# Build (produces binary at build/bin/verstak-sync-server)
./scripts/build.sh
# Run
./build/bin/verstak-sync-server --port 47732 --data ./server-data
# First run with admin user
./build/bin/verstak-sync-server --admin-user admin --admin-pass secret
Configuration
| Flag | Default | Description |
|---|---|---|
--port |
47732 | HTTP port |
--data |
./server-data | Data directory |
--admin-user |
Create admin user (first run) | |
--admin-pass |
Admin password (first run) |
Production installs use:
- binary:
/opt/verstak-sync-server/verstak-sync-server; - data directory:
/var/lib/verstak-sync-server; - port environment file:
/etc/verstak-server/env; - service:
verstak-server.
Install from a built binary:
./scripts/build.sh
sudo ./scripts/install.sh \
--bin ./build/bin/verstak-sync-server \
--port 47732 \
--admin-user admin \
--admin-pass 'change-this-password'
The install script creates a locked-down system user, initializes the data
directory, writes /etc/verstak-server/env, installs the systemd unit, and
starts the service.
Deployment
Run the service behind HTTPS in production. The sync server itself listens on
plain HTTP; terminate TLS in a reverse proxy such as nginx, Caddy, or a platform
load balancer, then forward to 127.0.0.1:47732.
Basic service operations:
sudo systemctl status verstak-server
sudo journalctl -u verstak-server -f
curl http://127.0.0.1:47732/api/v1/health
Change the listen port:
echo 'VERSTAK_PORT=47733' | sudo tee /etc/verstak-server/env
sudo systemctl restart verstak-server
Upgrade the binary:
./scripts/build.sh
sudo systemctl stop verstak-server
sudo install -m 755 ./build/bin/verstak-sync-server /opt/verstak-sync-server/verstak-sync-server
sudo systemctl start verstak-server
Keep --data stable across upgrades. The data directory is the server's source
of truth.
Backup And Restore
Back up the full data directory while the service is stopped. It contains:
server.db- SQLite database with users, devices, operations, SMTP settings, and blob metadata;config.yml- admin user configuration;blobs/- content-addressed blob files.
Create a backup:
sudo systemctl stop verstak-server
sudo tar --xattrs --acls -czf verstak-sync-backup-$(date +%Y%m%d-%H%M%S).tar.gz \
-C /var/lib verstak-sync-server
sudo systemctl start verstak-server
Restore onto a fresh host or after data loss:
sudo systemctl stop verstak-server
sudo mv /var/lib/verstak-sync-server /var/lib/verstak-sync-server.broken.$(date +%Y%m%d-%H%M%S) 2>/dev/null || true
sudo tar --xattrs --acls -xzf verstak-sync-backup-YYYYMMDD-HHMMSS.tar.gz -C /var/lib
sudo chown -R verstak:verstak /var/lib/verstak-sync-server
sudo chmod 750 /var/lib/verstak-sync-server
sudo systemctl start verstak-server
curl http://127.0.0.1:${VERSTAK_PORT:-47732}/api/v1/health
After restore, connected desktop clients keep their existing device tokens. If a backup is older than some client changes, those clients may need to run sync again so unpushed local operations are re-sent.
Architecture
cmd/server/ - Entry point
internal/server/ - Server implementation
- server.go - Core server logic
- routes.go - HTTP routing
- handlers_api.go - Sync, client, health, and blob handlers
- handlers_auth.go - User auth API handlers
- handlers_admin.go - Admin web/API handlers
- schema.go - Database schema
API Endpoints
Desktop sync client:
POST /api/client/pair- Pair a desktop client with username/password and return a device tokenPOST /api/auth/test- Validate username/password from the desktop clientGET /api/client/me- Return current authenticated client/device detailsPOST /api/client/revoke-current- Revoke the current desktop device tokenPOST /api/client/revoke-device- Revoke another device owned by the same userPOST /api/v1/sync/push- Push local operations to the server operation logPOST /api/v1/sync/pull- Pull operations since a server sequence numberPOST /api/v1/blobs/- Store a multipartfileblob and return its SHA-256 hashGET /api/v1/blobs/{sha256}- Download a stored blob by SHA-256 hash
User API:
POST /api/v1/auth/register- Register a userGET /api/v1/auth/confirm?token=...- Confirm emailPOST /api/v1/auth/login- User loginPOST /api/v1/auth/forgot- Request password resetPOST /api/v1/auth/reset- Reset passwordGET /api/v1/user/devices- List devices for the current user session
Operational endpoints:
GET /api/v1/health- Server health and basic storage status/admin/...- Admin web UI and admin JSON endpoints/register,/login,/dashboard,/forgot,/reset,/logout- User web UI
Sync operations are generic records with entity_type, entity_id, op_type,
payload_json, device_id, and sequencing metadata. The server stores and
orders operations; Verstak desktop owns the v2 payload semantics.
Development
# Run tests
go test ./...
# Build for production
CGO_ENABLED=1 go build -o verstak-sync-server ./cmd/server
License
MIT