Core infrastructure: - Uber fx dependency injection - Chi router with middleware stack - SQLite database with embedded migrations - Embedded templates and static assets - Structured logging with slog Features implemented: - Authentication (login, logout, session management, argon2id hashing) - App management (create, edit, delete, list) - Deployment pipeline (clone, build, deploy, health check) - Webhook processing for Gitea - Notifications (ntfy, Slack) - Environment variables, labels, volumes per app - SSH key generation for deploy keys Server startup: - Server.Run() starts HTTP server on configured port - Server.Shutdown() for graceful shutdown - SetupRoutes() wires all handlers with chi router
95 lines
2.7 KiB
SQL
95 lines
2.7 KiB
SQL
-- Initial schema for upaas
|
|
|
|
-- Users table (single admin user)
|
|
CREATE TABLE users (
|
|
id INTEGER PRIMARY KEY,
|
|
username TEXT UNIQUE NOT NULL,
|
|
password_hash TEXT NOT NULL,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Apps table
|
|
CREATE TABLE apps (
|
|
id TEXT PRIMARY KEY,
|
|
name TEXT UNIQUE NOT NULL,
|
|
repo_url TEXT NOT NULL,
|
|
branch TEXT NOT NULL DEFAULT 'main',
|
|
dockerfile_path TEXT DEFAULT 'Dockerfile',
|
|
webhook_secret TEXT NOT NULL,
|
|
ssh_private_key TEXT NOT NULL,
|
|
ssh_public_key TEXT NOT NULL,
|
|
container_id TEXT,
|
|
image_id TEXT,
|
|
status TEXT DEFAULT 'pending',
|
|
docker_network TEXT,
|
|
ntfy_topic TEXT,
|
|
slack_webhook TEXT,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- App environment variables
|
|
CREATE TABLE app_env_vars (
|
|
id INTEGER PRIMARY KEY,
|
|
app_id TEXT NOT NULL REFERENCES apps(id) ON DELETE CASCADE,
|
|
key TEXT NOT NULL,
|
|
value TEXT NOT NULL,
|
|
UNIQUE(app_id, key)
|
|
);
|
|
|
|
-- App labels
|
|
CREATE TABLE app_labels (
|
|
id INTEGER PRIMARY KEY,
|
|
app_id TEXT NOT NULL REFERENCES apps(id) ON DELETE CASCADE,
|
|
key TEXT NOT NULL,
|
|
value TEXT NOT NULL,
|
|
UNIQUE(app_id, key)
|
|
);
|
|
|
|
-- App volume mounts
|
|
CREATE TABLE app_volumes (
|
|
id INTEGER PRIMARY KEY,
|
|
app_id TEXT NOT NULL REFERENCES apps(id) ON DELETE CASCADE,
|
|
host_path TEXT NOT NULL,
|
|
container_path TEXT NOT NULL,
|
|
readonly INTEGER DEFAULT 0
|
|
);
|
|
|
|
-- Webhook events log
|
|
CREATE TABLE webhook_events (
|
|
id INTEGER PRIMARY KEY,
|
|
app_id TEXT NOT NULL REFERENCES apps(id) ON DELETE CASCADE,
|
|
event_type TEXT NOT NULL,
|
|
branch TEXT NOT NULL,
|
|
commit_sha TEXT,
|
|
payload TEXT,
|
|
matched INTEGER NOT NULL,
|
|
processed INTEGER DEFAULT 0,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Deployments log
|
|
CREATE TABLE deployments (
|
|
id INTEGER PRIMARY KEY,
|
|
app_id TEXT NOT NULL REFERENCES apps(id) ON DELETE CASCADE,
|
|
webhook_event_id INTEGER REFERENCES webhook_events(id),
|
|
commit_sha TEXT,
|
|
image_id TEXT,
|
|
container_id TEXT,
|
|
status TEXT NOT NULL,
|
|
logs TEXT,
|
|
started_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
finished_at DATETIME
|
|
);
|
|
|
|
-- Indexes
|
|
CREATE INDEX idx_apps_status ON apps(status);
|
|
CREATE INDEX idx_apps_webhook_secret ON apps(webhook_secret);
|
|
CREATE INDEX idx_app_env_vars_app_id ON app_env_vars(app_id);
|
|
CREATE INDEX idx_app_labels_app_id ON app_labels(app_id);
|
|
CREATE INDEX idx_app_volumes_app_id ON app_volumes(app_id);
|
|
CREATE INDEX idx_webhook_events_app_id ON webhook_events(app_id);
|
|
CREATE INDEX idx_webhook_events_created_at ON webhook_events(created_at);
|
|
CREATE INDEX idx_deployments_app_id ON deployments(app_id);
|
|
CREATE INDEX idx_deployments_started_at ON deployments(started_at);
|