improve sqlite import
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2026-02-11 08:41:32 +11:00
parent 3e3d8c2eb0
commit a09d94a266
4 changed files with 31 additions and 2 deletions

View File

@@ -147,6 +147,8 @@ Connect to the new database and grant privileges required for migrations and run
```sql ```sql
\c vctp \c vctp
ALTER DATABASE vctp OWNER TO vctp_user;
ALTER SCHEMA public OWNER TO vctp_user;
GRANT CONNECT, TEMP ON DATABASE vctp TO vctp_user; GRANT CONNECT, TEMP ON DATABASE vctp TO vctp_user;
GRANT USAGE, CREATE ON SCHEMA public TO vctp_user; GRANT USAGE, CREATE ON SCHEMA public TO vctp_user;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO vctp_user; GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO vctp_user;
@@ -155,6 +157,12 @@ ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO vctp_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO vctp_user; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO vctp_user;
``` ```
Verify effective schema privileges (useful if migrations fail creating `goose_db_version`):
```sql
SELECT has_schema_privilege('vctp_user', 'public', 'USAGE,CREATE');
```
Recommended auth/network configuration: Recommended auth/network configuration:
- Ensure PostgreSQL is listening on the expected interface/port in `postgresql.conf` (for example, `listen_addresses` and `port`). - Ensure PostgreSQL is listening on the expected interface/port in `postgresql.conf` (for example, `listen_addresses` and `port`).
@@ -241,6 +249,9 @@ Database:
HTTP/TLS: HTTP/TLS:
- `settings.bind_ip`: IP address to bind the HTTP server - `settings.bind_ip`: IP address to bind the HTTP server
- `settings.bind_port`: TCP port to bind the HTTP server - `settings.bind_port`: TCP port to bind the HTTP server
- `settings.bind_port` below `1024` (for example `443`) requires privileged bind permissions.
The packaged systemd unit grants `CAP_NET_BIND_SERVICE` to the `vctp` user; if you run
vCTP outside that unit, grant equivalent capability or use a non-privileged port.
- `settings.bind_disable_tls`: `true` to serve plain HTTP (no TLS) - `settings.bind_disable_tls`: `true` to serve plain HTTP (no TLS)
- `settings.tls_cert_filename`: PEM certificate path (TLS mode) - `settings.tls_cert_filename`: PEM certificate path (TLS mode)
- `settings.tls_key_filename`: PEM private key path (TLS mode) - `settings.tls_key_filename`: PEM private key path (TLS mode)

View File

@@ -3096,6 +3096,21 @@ CREATE TABLE IF NOT EXISTS snapshot_runs (
return nil return nil
} }
// EnsureCronStatusTable creates a table to track cron job progress/status.
func EnsureCronStatusTable(ctx context.Context, dbConn *sqlx.DB) error {
ddl := `
CREATE TABLE IF NOT EXISTS cron_status (
job_name TEXT PRIMARY KEY,
started_at BIGINT NOT NULL,
ended_at BIGINT NOT NULL,
duration_ms BIGINT NOT NULL,
last_error TEXT,
in_progress BOOLEAN NOT NULL DEFAULT FALSE
);`
_, err := execLog(ctx, dbConn, ddl)
return err
}
// UpsertSnapshotRun updates or inserts snapshot run status. // UpsertSnapshotRun updates or inserts snapshot run status.
func UpsertSnapshotRun(ctx context.Context, dbConn *sqlx.DB, vcenter string, snapshotTime time.Time, success bool, errMsg string) error { func UpsertSnapshotRun(ctx context.Context, dbConn *sqlx.DB, vcenter string, snapshotTime time.Time, success bool, errMsg string) error {
if err := EnsureSnapshotRunTable(ctx, dbConn); err != nil { if err := EnsureSnapshotRunTable(ctx, dbConn); err != nil {

View File

@@ -164,6 +164,8 @@ func ensureDestinationImportTable(ctx context.Context, destination *sqlx.DB, tab
return EnsureSummaryTable(ctx, destination, tableName) return EnsureSummaryTable(ctx, destination, tableName)
case tableName == "snapshot_runs": case tableName == "snapshot_runs":
return EnsureSnapshotRunTable(ctx, destination) return EnsureSnapshotRunTable(ctx, destination)
case tableName == "cron_status":
return EnsureCronStatusTable(ctx, destination)
case tableName == "vm_hourly_stats": case tableName == "vm_hourly_stats":
return EnsureVmHourlyStats(ctx, destination) return EnsureVmHourlyStats(ctx, destination)
case tableName == "vm_lifecycle_cache": case tableName == "vm_lifecycle_cache":

View File

@@ -15,8 +15,9 @@ Restart=always
RestartSec=10s RestartSec=10s
#LimitNOFILE=65536 #LimitNOFILE=65536
SyslogIdentifier=vctp SyslogIdentifier=vctp
#CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_FOWNER CAP_DAC_OVERRIDE CAP_SETUID CAP_SETGID CAP_SYS_RESOURCE CAP_AUDIT_WRITE # Allow non-root service user to bind privileged ports (e.g., 443).
#AmbientCapabilities=CAP_NET_BIND_SERVICE CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target