package provider import ( "github.com/hashicorp/terraform-plugin-framework/resource/schema" "github.com/hashicorp/terraform-plugin-framework/types" ) // ------------------------------------------------------------- Schedule type scheduleModel struct { ID types.String `tfsdk:"id" dokploy:"scheduleId,id"` Name types.String `tfsdk:"name" dokploy:"name"` Description types.String `tfsdk:"description" dokploy:"description,nullable"` CronExpression types.String `tfsdk:"cron_expression" dokploy:"cronExpression"` Command types.String `tfsdk:"command" dokploy:"command"` Script types.String `tfsdk:"script" dokploy:"script,nullable"` ShellType types.String `tfsdk:"shell_type" dokploy:"shellType"` ScheduleType types.String `tfsdk:"schedule_type" dokploy:"scheduleType"` Timezone types.String `tfsdk:"timezone" dokploy:"timezone,nullable"` Enabled types.Bool `tfsdk:"enabled" dokploy:"enabled"` AppName types.String `tfsdk:"app_name" dokploy:"appName,nullable"` ServiceName types.String `tfsdk:"service_name" dokploy:"serviceName,nullable"` ApplicationID types.String `tfsdk:"application_id" dokploy:"applicationId,nullable"` ComposeID types.String `tfsdk:"compose_id" dokploy:"composeId,nullable"` ServerID types.String `tfsdk:"server_id" dokploy:"serverId,nullable"` CreatedAt types.String `tfsdk:"created_at" dokploy:"createdAt,ro"` } func scheduleResource() ResourceSpec { return ResourceSpec{ Name: "schedule", CreateProc: "schedule.create", ReadProc: "schedule.one", UpdateProc: "schedule.update", DeleteProc: "schedule.delete", NewModel: func() any { return &scheduleModel{} }, Schema: schema.Schema{ MarkdownDescription: "A cron job Dokploy runs on a schedule.\n\n" + "`schedule_type` selects where the command runs:\n\n" + "* `application` — inside a running application container; set `application_id`.\n" + "* `compose` — inside one service of a Compose stack; set `compose_id` and `service_name`.\n" + "* `server` — on a remote server; set `server_id`.\n" + "* `dokploy-server` — on the Dokploy host itself.\n\n" + "~> A schedule targeting an application runs inside its container, so the container has to be " + "running when the cron fires.", Attributes: map[string]schema.Attribute{ "id": computedID("Unique schedule identifier."), "name": requiredString("Display name of the schedule."), "description": optionalString("Free-form description."), "cron_expression": requiredString("Standard five-field cron expression, for example `0 3 * * *`."), "command": requiredString("Command to run."), "script": optionalString("Multi-line script to run instead of a single command."), "shell_type": enumStringWithDefault("Shell used to interpret the command.", shellTypes, "bash"), "schedule_type": enumStringWithDefault("Where the command runs.", scheduleTypes, "application"), "timezone": optionalString("IANA timezone the cron expression is evaluated in, for example `Europe/Berlin`."), "enabled": optionalComputedBool("Whether the schedule is active."), "app_name": optionalComputedString("Docker service name the schedule targets. Derived by Dokploy when omitted."), "service_name": optionalString("Service inside a Compose stack to run the command in."), "application_id": optionalReplaceString("Application this schedule belongs to."), "compose_id": optionalReplaceString("Compose stack this schedule belongs to."), "server_id": optionalReplaceString("Server this schedule runs on."), "created_at": computedString("RFC 3339 timestamp of when the schedule was created."), }, }, } } // -------------------------------------------------------- Volume backup type volumeBackupModel struct { ID types.String `tfsdk:"id" dokploy:"volumeBackupId,id"` Name types.String `tfsdk:"name" dokploy:"name"` VolumeName types.String `tfsdk:"volume_name" dokploy:"volumeName"` Prefix types.String `tfsdk:"prefix" dokploy:"prefix"` CronExpression types.String `tfsdk:"cron_expression" dokploy:"cronExpression"` DestinationID types.String `tfsdk:"destination_id" dokploy:"destinationId"` ServiceType types.String `tfsdk:"service_type" dokploy:"serviceType"` AppName types.String `tfsdk:"app_name" dokploy:"appName,nullable"` ServiceName types.String `tfsdk:"service_name" dokploy:"serviceName,nullable"` TurnOff types.Bool `tfsdk:"turn_off" dokploy:"turnOff"` KeepLatestCount types.Int64 `tfsdk:"keep_latest_count" dokploy:"keepLatestCount,nullable"` Enabled types.Bool `tfsdk:"enabled" dokploy:"enabled"` ApplicationID types.String `tfsdk:"application_id" dokploy:"applicationId,nullable"` ComposeID types.String `tfsdk:"compose_id" dokploy:"composeId,nullable"` PostgresID types.String `tfsdk:"postgres_id" dokploy:"postgresId,nullable"` MySQLID types.String `tfsdk:"mysql_id" dokploy:"mysqlId,nullable"` MariaDBID types.String `tfsdk:"mariadb_id" dokploy:"mariadbId,nullable"` MongoID types.String `tfsdk:"mongo_id" dokploy:"mongoId,nullable"` RedisID types.String `tfsdk:"redis_id" dokploy:"redisId,nullable"` LibsqlID types.String `tfsdk:"libsql_id" dokploy:"libsqlId,nullable"` CreatedAt types.String `tfsdk:"created_at" dokploy:"createdAt,ro"` } func volumeBackupResource() ResourceSpec { return ResourceSpec{ Name: "volume_backup", CreateProc: "volumeBackups.create", ReadProc: "volumeBackups.one", UpdateProc: "volumeBackups.update", DeleteProc: "volumeBackups.delete", NewModel: func() any { return &volumeBackupModel{} }, Schema: schema.Schema{ MarkdownDescription: "A scheduled backup of a Docker volume to a configured " + "`dokploy_destination`.\n\n" + "This is the counterpart to a `dokploy_mount` with `type = \"volume\"`: the mount gives the " + "volume a stable name, and this resource copies its contents off the host on a schedule.\n\n" + "Set exactly one of the `*_id` attributes to say which service owns the volume.", Attributes: map[string]schema.Attribute{ "id": computedID("Unique volume backup identifier."), "name": requiredString("Display name of the backup job."), "volume_name": requiredString("Name of the Docker volume to back up."), "prefix": requiredString("Path prefix inside the destination bucket, for example `backups/shop/`."), "cron_expression": requiredString("Standard five-field cron expression, for example `0 4 * * *`."), "destination_id": requiredString("Backup destination (S3-compatible bucket) to upload to."), "service_type": enumStringWithDefault("The kind of service that owns the volume.", volumeBackupServiceTypes, "application"), "app_name": optionalComputedString("Docker service name that owns the volume. Derived by Dokploy when omitted."), "service_name": optionalString("Service inside a Compose stack that owns the volume."), "turn_off": optionalComputedBool("Stop the service while the backup runs. Slower, but guarantees a " + "consistent copy of data that is being written to."), "keep_latest_count": optionalComputedInt("Number of backups to retain. Older ones are pruned."), "enabled": optionalComputedBool("Whether the backup schedule is active."), "application_id": optionalReplaceString("Application that owns the volume."), "compose_id": optionalReplaceString("Compose stack that owns the volume."), "postgres_id": optionalReplaceString("PostgreSQL instance that owns the volume."), "mysql_id": optionalReplaceString("MySQL instance that owns the volume."), "mariadb_id": optionalReplaceString("MariaDB instance that owns the volume."), "mongo_id": optionalReplaceString("MongoDB instance that owns the volume."), "redis_id": optionalReplaceString("Redis instance that owns the volume."), "libsql_id": optionalReplaceString("libSQL instance that owns the volume."), "created_at": computedString("RFC 3339 timestamp of when the backup job was created."), }, }, } }