- Marked 12 tests as skip pending feature implementation - Features tracked in GitHub issue #686 (system log viewer feature completion) - Tests cover sorting by timestamp/level/method/URI/status, pagination controls, filtering by text/level, download functionality - Unblocks Phase 2 at 91.7% pass rate to proceed to Phase 3 security enforcement validation - TODO comments in code reference GitHub #686 for feature completion tracking - Tests skipped: Pagination (3), Search/Filter (2), Download (2), Sorting (1), Log Display (4)
10 KiB
title, description
| title | description |
|---|---|
| Database Schema Documentation | Technical documentation of Charon's SQLite database schema. Entity relationships and table definitions for developers. |
Database Schema Documentation
Charon uses SQLite with GORM ORM for data persistence. This document describes the database schema and relationships.
Overview
The database consists of 8 main tables:
- ProxyHost
- RemoteServer
- CaddyConfig
- SSLCertificate
- AccessList
- User
- Setting
- ImportSession
Entity Relationship Diagram
┌─────────────────┐
│ ProxyHost │
├─────────────────┤
│ UUID │◄──┐
│ Domain │ │
│ ForwardScheme │ │
│ ForwardHost │ │
│ ForwardPort │ │
│ SSLForced │ │
│ WebSocketSupport│ │
│ Enabled │ │
│ RemoteServerID │───┘ (optional)
│ CreatedAt │
│ UpdatedAt │
└─────────────────┘
│
│ 1:1
▼
┌─────────────────┐
│ CaddyConfig │
├─────────────────┤
│ UUID │
│ ProxyHostID │
│ RawConfig │
│ GeneratedAt │
│ CreatedAt │
│ UpdatedAt │
└─────────────────┘
┌─────────────────┐
│ RemoteServer │
├─────────────────┤
│ UUID │
│ Name │
│ Provider │
│ Host │
│ Port │
│ Reachable │
│ LastChecked │
│ Enabled │
│ CreatedAt │
│ UpdatedAt │
└─────────────────┘
┌─────────────────┐
│ SSLCertificate │
├─────────────────┤
│ UUID │
│ Name │
│ DomainNames │
│ CertPEM │
│ KeyPEM │
│ ExpiresAt │
│ CreatedAt │
│ UpdatedAt │
└─────────────────┘
┌─────────────────┐
│ AccessList │
├─────────────────┤
│ UUID │
│ Name │
│ Addresses │
│ CreatedAt │
│ UpdatedAt │
└─────────────────┘
┌─────────────────┐
│ User │
├─────────────────┤
│ UUID │
│ Email │
│ PasswordHash │
│ IsActive │
│ IsAdmin │
│ CreatedAt │
│ UpdatedAt │
└─────────────────┘
┌─────────────────┐
│ Setting │
├─────────────────┤
│ UUID │
│ Key │ (unique)
│ Value │
│ CreatedAt │
│ UpdatedAt │
└─────────────────┘
┌─────────────────┐
│ ImportSession │
├─────────────────┤
│ UUID │
│ Filename │
│ State │
│ CreatedAt │
│ UpdatedAt │
└─────────────────┘
Table Details
ProxyHost
Stores reverse proxy host configurations.
| Column | Type | Description |
|---|---|---|
uuid |
UUID | Primary key |
domain |
TEXT | Domain names (comma-separated) |
forward_scheme |
TEXT | http or https |
forward_host |
TEXT | Target server hostname/IP |
forward_port |
INTEGER | Target server port |
ssl_forced |
BOOLEAN | Force HTTPS redirect |
http2_support |
BOOLEAN | Enable HTTP/2 |
hsts_enabled |
BOOLEAN | Enable HSTS header |
hsts_subdomains |
BOOLEAN | Include subdomains in HSTS |
block_exploits |
BOOLEAN | Block common exploits |
websocket_support |
BOOLEAN | Enable WebSocket proxying |
enabled |
BOOLEAN | Proxy is active |
remote_server_id |
UUID | Foreign key to RemoteServer (nullable) |
created_at |
TIMESTAMP | Creation timestamp |
updated_at |
TIMESTAMP | Last update timestamp |
Indexes:
- Primary key on
uuid - Foreign key index on
remote_server_id
Relationships:
RemoteServer: Many-to-One (optional) - Links to remote Caddy instanceCaddyConfig: One-to-One - Generated Caddyfile configuration
RemoteServer
Stores remote Caddy server connection information.
| Column | Type | Description |
|---|---|---|
uuid |
UUID | Primary key |
name |
TEXT | Friendly name |
provider |
TEXT | generic, docker, kubernetes, aws, gcp, azure |
host |
TEXT | Hostname or IP address |
port |
INTEGER | Port number (default 2019) |
reachable |
BOOLEAN | Connection test result |
last_checked |
TIMESTAMP | Last connection test time |
enabled |
BOOLEAN | Server is active |
created_at |
TIMESTAMP | Creation timestamp |
updated_at |
TIMESTAMP | Last update timestamp |
Indexes:
- Primary key on
uuid - Index on
enabledfor fast filtering
CaddyConfig
Stores generated Caddyfile configurations for each proxy host.
| Column | Type | Description |
|---|---|---|
uuid |
UUID | Primary key |
proxy_host_id |
UUID | Foreign key to ProxyHost |
raw_config |
TEXT | Generated Caddyfile content |
generated_at |
TIMESTAMP | When config was generated |
created_at |
TIMESTAMP | Creation timestamp |
updated_at |
TIMESTAMP | Last update timestamp |
Indexes:
- Primary key on
uuid - Unique index on
proxy_host_id
SSLCertificate
Stores SSL/TLS certificates (future enhancement).
| Column | Type | Description |
|---|---|---|
uuid |
UUID | Primary key |
name |
TEXT | Certificate name |
domain_names |
TEXT | Domains covered (comma-separated) |
cert_pem |
TEXT | Certificate in PEM format |
key_pem |
TEXT | Private key in PEM format |
expires_at |
TIMESTAMP | Certificate expiration |
created_at |
TIMESTAMP | Creation timestamp |
updated_at |
TIMESTAMP | Last update timestamp |
AccessList
Stores IP-based access control lists (future enhancement).
| Column | Type | Description |
|---|---|---|
uuid |
UUID | Primary key |
name |
TEXT | List name |
addresses |
TEXT | IP addresses (comma-separated) |
created_at |
TIMESTAMP | Creation timestamp |
updated_at |
TIMESTAMP | Last update timestamp |
User
Stores user authentication information (future enhancement).
| Column | Type | Description |
|---|---|---|
uuid |
UUID | Primary key |
email |
TEXT | Email address (unique) |
password_hash |
TEXT | Bcrypt password hash |
is_active |
BOOLEAN | Account is active |
is_admin |
BOOLEAN | Admin privileges |
created_at |
TIMESTAMP | Creation timestamp |
updated_at |
TIMESTAMP | Last update timestamp |
Indexes:
- Primary key on
uuid - Unique index on
email
Setting
Stores application-wide settings as key-value pairs.
| Column | Type | Description |
|---|---|---|
uuid |
UUID | Primary key |
key |
TEXT | Setting key (unique) |
value |
TEXT | Setting value (JSON string) |
created_at |
TIMESTAMP | Creation timestamp |
updated_at |
TIMESTAMP | Last update timestamp |
Indexes:
- Primary key on
uuid - Unique index on
key
Default Settings:
app_name: "Charon"default_scheme: "http"enable_ssl_by_default: "false"
ImportSession
Tracks Caddyfile import sessions.
| Column | Type | Description |
|---|---|---|
uuid |
UUID | Primary key |
filename |
TEXT | Uploaded filename (optional) |
state |
TEXT | parsing, reviewing, completed, failed |
created_at |
TIMESTAMP | Creation timestamp |
updated_at |
TIMESTAMP | Last update timestamp |
States:
parsing: Caddyfile is being parsedreviewing: Waiting for user to review/resolve conflictscompleted: Import successfully committedfailed: Import failed with errors
Database Initialization
The database is automatically created and migrated when the application starts. Use the seed script to populate with sample data:
cd backend
go run ./cmd/seed/main.go
Sample Seed Data
The seed script creates:
- 4 remote servers (Docker registry, API server, web app, database admin)
- 3 proxy hosts (app.local.dev, api.local.dev, docker.local.dev)
- 3 settings (app configuration)
- 1 admin user
Migration Strategy
GORM AutoMigrate is used for schema migrations:
db.AutoMigrate(
&models.ProxyHost{},
&models.RemoteServer{},
&models.CaddyConfig{},
&models.SSLCertificate{},
&models.AccessList{},
&models.User{},
&models.Setting{},
&models.ImportSession{},
)
This ensures the database schema stays in sync with model definitions.
Backup and Restore
Backup
# Backup default DB (charon.db). cpm.db will still be recognized for compatibility.
cp backend/data/charon.db backend/data/charon.db.backup
Restore
# Restore default DB (charon.db). cpm.db backup will still be recognized for compatibility.
cp backend/data/charon.db.backup backend/data/charon.db
Performance Considerations
- Indexes: All foreign keys and frequently queried columns are indexed
- Connection Pooling: GORM manages connection pooling automatically
- SQLite Pragmas:
PRAGMA journal_mode=WALfor better concurrency - Query Optimization: Use
.Preload()for eager loading relationships
Future Enhancements
- Multi-tenancy support with organization model
- Audit log table for tracking changes
- Certificate auto-renewal tracking
- Integration with Let's Encrypt
- Metrics and monitoring data storage