Bridge what Dokploy v0.30 added, and let the docs through
build / build (push) Failing after 11m22s
release / plugin (push) Failing after 31m35s
release / sdks (push) Has been skipped

Six new resources from terraform-provider-dokploy v0.2.0 -- Network,
DnsProvider, VaultProvider, Schedule, VolumeBackup and Libsql -- plus the new
properties on Domain (`enabled`), Compose (`serviceNetworks`, `createEnvFile`,
`icon`) and Application. Verified with `pulumi up` against a live v0.30.2
instance: create, preview-clean, and destroy.

The upstream provider also now refuses a volume Mount with no `volumeName`,
which Dokploy would otherwise turn into an anonymous Docker volume recreated
on every deploy. That surfaces here at preview time, before anything exists.

Two things made that fix nearly invisible to Pulumi users, so this commit
fixes the second one: the bridge resolves the upstream `docs/` through the Go
module cache, where a locally `replace`d dependency never lands, so tfgen was
emitting every resource with no description at all. UpstreamRepoPath now
points at the checkout and all 445 inputs carry documentation -- with names
rendered per language, so Python readers see `volume_name` where TypeScript
readers see `volumeName`.
This commit is contained in:
max-voitcov
2026-08-26 00:46:32 +03:00
parent ad3e908c98
commit 73386ba0ff
137 changed files with 19660 additions and 5183 deletions
+43
View File
@@ -10,6 +10,13 @@ using Pulumi;
namespace Maxvojtkov.Dokploy
{
/// <summary>
/// A Dokploy application: a single service built from a Git repository, a Docker image, or an uploaded artifact.
///
/// Dokploy's `application.create` endpoint accepts only a handful of fields, so this resource creates the application and then applies the rest of the configuration through `application.update`.
///
/// &gt; Creating this resource does **not** deploy the application. Trigger a deployment from the Dokploy UI, the CLI, or a `TerraformData` provisioner calling `application.deploy`.
/// </summary>
[DokployResourceType("dokploy:index/application:Application")]
public partial class Application : global::Pulumi.CustomResource
{
@@ -331,6 +338,12 @@ namespace Maxvojtkov.Dokploy
[Output("herokuVersion")]
public Output<string> HerokuVersion { get; private set; } = null!;
/// <summary>
/// Icon shown next to the service in the Dokploy UI.
/// </summary>
[Output("icon")]
public Output<string?> Icon { get; private set; } = null!;
/// <summary>
/// Build a preview deployment for each pull request.
/// </summary>
@@ -463,6 +476,12 @@ namespace Maxvojtkov.Dokploy
[Output("previewPort")]
public Output<int> PreviewPort { get; private set; } = null!;
/// <summary>
/// Only build previews for pull requests opened by users with repository collaborator permissions.
/// </summary>
[Output("previewRequireCollaboratorPermissions")]
public Output<bool> PreviewRequireCollaboratorPermissions { get; private set; } = null!;
/// <summary>
/// Wildcard domain used to expose preview deployments.
/// </summary>
@@ -964,6 +983,12 @@ namespace Maxvojtkov.Dokploy
[Input("herokuVersion")]
public Input<string>? HerokuVersion { get; set; }
/// <summary>
/// Icon shown next to the service in the Dokploy UI.
/// </summary>
[Input("icon")]
public Input<string>? Icon { get; set; }
/// <summary>
/// Build a preview deployment for each pull request.
/// </summary>
@@ -1128,6 +1153,12 @@ namespace Maxvojtkov.Dokploy
[Input("previewPort")]
public Input<int>? PreviewPort { get; set; }
/// <summary>
/// Only build previews for pull requests opened by users with repository collaborator permissions.
/// </summary>
[Input("previewRequireCollaboratorPermissions")]
public Input<bool>? PreviewRequireCollaboratorPermissions { get; set; }
/// <summary>
/// Wildcard domain used to expose preview deployments.
/// </summary>
@@ -1602,6 +1633,12 @@ namespace Maxvojtkov.Dokploy
[Input("herokuVersion")]
public Input<string>? HerokuVersion { get; set; }
/// <summary>
/// Icon shown next to the service in the Dokploy UI.
/// </summary>
[Input("icon")]
public Input<string>? Icon { get; set; }
/// <summary>
/// Build a preview deployment for each pull request.
/// </summary>
@@ -1766,6 +1803,12 @@ namespace Maxvojtkov.Dokploy
[Input("previewPort")]
public Input<int>? PreviewPort { get; set; }
/// <summary>
/// Only build previews for pull requests opened by users with repository collaborator permissions.
/// </summary>
[Input("previewRequireCollaboratorPermissions")]
public Input<bool>? PreviewRequireCollaboratorPermissions { get; set; }
/// <summary>
/// Wildcard domain used to expose preview deployments.
/// </summary>
+5
View File
@@ -10,6 +10,11 @@ using Pulumi;
namespace Maxvojtkov.Dokploy
{
/// <summary>
/// A TLS certificate uploaded to Dokploy, for domains that use `CertificateType = "custom"`.
///
/// &gt; The private key is stored in Terraform state. Use a state backend with encryption at rest.
/// </summary>
[DokployResourceType("dokploy:index/certificate:Certificate")]
public partial class Certificate : global::Pulumi.CustomResource
{
+61
View File
@@ -10,6 +10,13 @@ using Pulumi;
namespace Maxvojtkov.Dokploy
{
/// <summary>
/// A Docker Compose or Docker Swarm stack managed by Dokploy.
///
/// Set `ComposeFile` to manage the stack definition inline (with `SourceType = "raw"`), or point the stack at a Git repository and set `ComposePath`.
///
/// &gt; Creating this resource does **not** deploy the stack.
/// </summary>
[DokployResourceType("dokploy:index/compose:Compose")]
public partial class Compose : global::Pulumi.CustomResource
{
@@ -91,6 +98,12 @@ namespace Maxvojtkov.Dokploy
[Output("composeType")]
public Output<string> ComposeType { get; private set; } = null!;
/// <summary>
/// Write the environment variables to a `.env` file next to the Compose file.
/// </summary>
[Output("createEnvFile")]
public Output<bool> CreateEnvFile { get; private set; } = null!;
/// <summary>
/// RFC 3339 timestamp of when the stack was created.
/// </summary>
@@ -211,6 +224,12 @@ namespace Maxvojtkov.Dokploy
[Output("gitlabRepository")]
public Output<string?> GitlabRepository { get; private set; } = null!;
/// <summary>
/// Icon shown next to the stack in the Dokploy UI.
/// </summary>
[Output("icon")]
public Output<string?> Icon { get; private set; } = null!;
/// <summary>
/// Run the stack on its own isolated Docker network.
/// </summary>
@@ -253,6 +272,12 @@ namespace Maxvojtkov.Dokploy
[Output("serverId")]
public Output<string?> ServerId { get; private set; } = null!;
/// <summary>
/// Per-service Docker network attachments, as a JSON object mapping each service name in the stack to an array of network IDs.
/// </summary>
[Output("serviceNetworks")]
public Output<string?> ServiceNetworks { get; private set; } = null!;
/// <summary>
/// Where the Compose file comes from. Valid values: `Git`, `Github`, `Gitlab`, `Bitbucket`, `Gitea`, `Raw`.
/// </summary>
@@ -396,6 +421,12 @@ namespace Maxvojtkov.Dokploy
[Input("composeType")]
public Input<string>? ComposeType { get; set; }
/// <summary>
/// Write the environment variables to a `.env` file next to the Compose file.
/// </summary>
[Input("createEnvFile")]
public Input<bool>? CreateEnvFile { get; set; }
/// <summary>
/// Branch to deploy for a custom Git remote.
/// </summary>
@@ -510,6 +541,12 @@ namespace Maxvojtkov.Dokploy
[Input("gitlabRepository")]
public Input<string>? GitlabRepository { get; set; }
/// <summary>
/// Icon shown next to the stack in the Dokploy UI.
/// </summary>
[Input("icon")]
public Input<string>? Icon { get; set; }
/// <summary>
/// Run the stack on its own isolated Docker network.
/// </summary>
@@ -552,6 +589,12 @@ namespace Maxvojtkov.Dokploy
[Input("serverId")]
public Input<string>? ServerId { get; set; }
/// <summary>
/// Per-service Docker network attachments, as a JSON object mapping each service name in the stack to an array of network IDs.
/// </summary>
[Input("serviceNetworks")]
public Input<string>? ServiceNetworks { get; set; }
/// <summary>
/// Where the Compose file comes from. Valid values: `Git`, `Github`, `Gitlab`, `Bitbucket`, `Gitea`, `Raw`.
/// </summary>
@@ -668,6 +711,12 @@ namespace Maxvojtkov.Dokploy
[Input("composeType")]
public Input<string>? ComposeType { get; set; }
/// <summary>
/// Write the environment variables to a `.env` file next to the Compose file.
/// </summary>
[Input("createEnvFile")]
public Input<bool>? CreateEnvFile { get; set; }
/// <summary>
/// RFC 3339 timestamp of when the stack was created.
/// </summary>
@@ -788,6 +837,12 @@ namespace Maxvojtkov.Dokploy
[Input("gitlabRepository")]
public Input<string>? GitlabRepository { get; set; }
/// <summary>
/// Icon shown next to the stack in the Dokploy UI.
/// </summary>
[Input("icon")]
public Input<string>? Icon { get; set; }
/// <summary>
/// Run the stack on its own isolated Docker network.
/// </summary>
@@ -830,6 +885,12 @@ namespace Maxvojtkov.Dokploy
[Input("serverId")]
public Input<string>? ServerId { get; set; }
/// <summary>
/// Per-service Docker network attachments, as a JSON object mapping each service name in the stack to an array of network IDs.
/// </summary>
[Input("serviceNetworks")]
public Input<string>? ServiceNetworks { get; set; }
/// <summary>
/// Where the Compose file comes from. Valid values: `Git`, `Github`, `Gitlab`, `Bitbucket`, `Gitea`, `Raw`.
/// </summary>
+5
View File
@@ -10,6 +10,11 @@ using Pulumi;
namespace Maxvojtkov.Dokploy
{
/// <summary>
/// An S3-compatible bucket that Dokploy writes database and volume backups to.
///
/// &gt; The secret access key is stored in Terraform state. Use a state backend with encryption at rest.
/// </summary>
[DokployResourceType("dokploy:index/destination:Destination")]
public partial class Destination : global::Pulumi.CustomResource
{
+177
View File
@@ -0,0 +1,177 @@
// *** WARNING: this file was generated by pulumi-language-dotnet. ***
// *** Do not edit by hand unless you're certain you know what you are doing! ***
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Pulumi.Serialization;
using Pulumi;
namespace Maxvojtkov.Dokploy
{
/// <summary>
/// A DNS provider connection Dokploy uses to create records for domains automatically.
///
/// `Config` is a JSON object whose shape depends on `providerType`:
/// </summary>
[DokployResourceType("dokploy:index/dnsProvider:DnsProvider")]
public partial class DnsProvider : global::Pulumi.CustomResource
{
/// <summary>
/// Provider credentials as a JSON object, including the `providerType` discriminator.
/// </summary>
[Output("config")]
public Output<string> Config { get; private set; } = null!;
/// <summary>
/// RFC 3339 timestamp of when the connection was created.
/// </summary>
[Output("createdAt")]
public Output<string> CreatedAt { get; private set; } = null!;
/// <summary>
/// Name of the connection. Must be unique within the organization and may contain only letters, digits, `-` and `_`.
/// </summary>
[Output("name")]
public Output<string> Name { get; private set; } = null!;
/// <summary>
/// Organization that owns the connection.
/// </summary>
[Output("organizationId")]
public Output<string> OrganizationId { get; private set; } = null!;
/// <summary>
/// Provider kind derived from `Config`: `Cloudflare` or `Route53`.
/// </summary>
[Output("providerType")]
public Output<string> ProviderType { get; private set; } = null!;
/// <summary>
/// Create a DnsProvider resource with the given unique name, arguments, and options.
/// </summary>
///
/// <param name="name">The unique name of the resource</param>
/// <param name="args">The arguments used to populate this resource's properties</param>
/// <param name="options">A bag of options that control this resource's behavior</param>
public DnsProvider(string name, DnsProviderArgs args, CustomResourceOptions? options = null)
: base("dokploy:index/dnsProvider:DnsProvider", name, args ?? new DnsProviderArgs(), MakeResourceOptions(options, ""))
{
}
private DnsProvider(string name, Input<string> id, DnsProviderState? state = null, CustomResourceOptions? options = null)
: base("dokploy:index/dnsProvider:DnsProvider", name, state, MakeResourceOptions(options, id))
{
}
private static CustomResourceOptions MakeResourceOptions(CustomResourceOptions? options, Input<string>? id)
{
var defaultOptions = new CustomResourceOptions
{
Version = Utilities.Version,
PluginDownloadURL = "https://gitea.coolify.vojtkov.dev/usr_unknown/pulumi-dokploy/releases/download/v${VERSION}",
AdditionalSecretOutputs =
{
"config",
},
};
var merged = CustomResourceOptions.Merge(defaultOptions, options);
// Override the ID if one was specified for consistency with other language SDKs.
merged.Id = id ?? merged.Id;
return merged;
}
/// <summary>
/// Get an existing DnsProvider resource's state with the given name, ID, and optional extra
/// properties used to qualify the lookup.
/// </summary>
///
/// <param name="name">The unique name of the resulting resource.</param>
/// <param name="id">The unique provider ID of the resource to lookup.</param>
/// <param name="state">Any extra arguments used during the lookup.</param>
/// <param name="options">A bag of options that control this resource's behavior</param>
public static DnsProvider Get(string name, Input<string> id, DnsProviderState? state = null, CustomResourceOptions? options = null)
{
return new DnsProvider(name, id, state, options);
}
}
public sealed class DnsProviderArgs : global::Pulumi.ResourceArgs
{
[Input("config", required: true)]
private Input<string>? _config;
/// <summary>
/// Provider credentials as a JSON object, including the `providerType` discriminator.
/// </summary>
public Input<string>? Config
{
get => _config;
set
{
var emptySecret = Output.CreateSecret(0);
_config = Output.Tuple<Input<string>?, int>(value, emptySecret).Apply(t => t.Item1);
}
}
/// <summary>
/// Name of the connection. Must be unique within the organization and may contain only letters, digits, `-` and `_`.
/// </summary>
[Input("name")]
public Input<string>? Name { get; set; }
public DnsProviderArgs()
{
}
public static new DnsProviderArgs Empty => new DnsProviderArgs();
}
public sealed class DnsProviderState : global::Pulumi.ResourceArgs
{
[Input("config")]
private Input<string>? _config;
/// <summary>
/// Provider credentials as a JSON object, including the `providerType` discriminator.
/// </summary>
public Input<string>? Config
{
get => _config;
set
{
var emptySecret = Output.CreateSecret(0);
_config = Output.Tuple<Input<string>?, int>(value, emptySecret).Apply(t => t.Item1);
}
}
/// <summary>
/// RFC 3339 timestamp of when the connection was created.
/// </summary>
[Input("createdAt")]
public Input<string>? CreatedAt { get; set; }
/// <summary>
/// Name of the connection. Must be unique within the organization and may contain only letters, digits, `-` and `_`.
/// </summary>
[Input("name")]
public Input<string>? Name { get; set; }
/// <summary>
/// Organization that owns the connection.
/// </summary>
[Input("organizationId")]
public Input<string>? OrganizationId { get; set; }
/// <summary>
/// Provider kind derived from `Config`: `Cloudflare` or `Route53`.
/// </summary>
[Input("providerType")]
public Input<string>? ProviderType { get; set; }
public DnsProviderState()
{
}
public static new DnsProviderState Empty => new DnsProviderState();
}
}
+23
View File
@@ -10,6 +10,11 @@ using Pulumi;
namespace Maxvojtkov.Dokploy
{
/// <summary>
/// A domain routed to an application or a Compose service through Dokploy's Traefik instance.
///
/// Set exactly one of `ApplicationId` or `ComposeId`. When targeting a Compose stack, `ServiceName` selects which service in the stack receives the traffic.
/// </summary>
[DokployResourceType("dokploy:index/domain:Domain")]
public partial class Domain : global::Pulumi.CustomResource
{
@@ -55,6 +60,12 @@ namespace Maxvojtkov.Dokploy
[Output("domainType")]
public Output<string> DomainType { get; private set; } = null!;
/// <summary>
/// Whether the domain is served. Setting this to `False` removes the route from Traefik but keeps the certificate, path and middleware configuration intact, so the domain can be brought back without reconfiguring it.
/// </summary>
[Output("enabled")]
public Output<bool> Enabled { get; private set; } = null!;
/// <summary>
/// Protect this domain with Dokploy's forward auth.
/// </summary>
@@ -198,6 +209,12 @@ namespace Maxvojtkov.Dokploy
[Input("domainType")]
public Input<string>? DomainType { get; set; }
/// <summary>
/// Whether the domain is served. Setting this to `False` removes the route from Traefik but keeps the certificate, path and middleware configuration intact, so the domain can be brought back without reconfiguring it.
/// </summary>
[Input("enabled")]
public Input<bool>? Enabled { get; set; }
/// <summary>
/// Protect this domain with Dokploy's forward auth.
/// </summary>
@@ -314,6 +331,12 @@ namespace Maxvojtkov.Dokploy
[Input("domainType")]
public Input<string>? DomainType { get; set; }
/// <summary>
/// Whether the domain is served. Setting this to `False` removes the route from Traefik but keeps the certificate, path and middleware configuration intact, so the domain can be brought back without reconfiguring it.
/// </summary>
[Input("enabled")]
public Input<bool>? Enabled { get; set; }
/// <summary>
/// Protect this domain with Dokploy's forward auth.
/// </summary>
+5
View File
@@ -10,6 +10,11 @@ using Pulumi;
namespace Maxvojtkov.Dokploy
{
/// <summary>
/// An environment inside a Dokploy project, such as `Staging` or `Production`. Services belong to an environment rather than directly to a project.
///
/// Dokploy creates a default `Production` environment with every project; reference it via `dokploy_project.&lt;name&gt;.default_environment_id` instead of declaring it here.
/// </summary>
[DokployResourceType("dokploy:index/environment:Environment")]
public partial class Environment : global::Pulumi.CustomResource
{
+42
View File
@@ -12,12 +12,21 @@ namespace Maxvojtkov.Dokploy
{
public static class GetApplication
{
/// <summary>
/// Look up an existing application by ID.
/// </summary>
public static Task<GetApplicationResult> InvokeAsync(GetApplicationArgs args, InvokeOptions? options = null)
=> global::Pulumi.Deployment.Instance.InvokeAsync<GetApplicationResult>("dokploy:index/getApplication:getApplication", args ?? new GetApplicationArgs(), options.WithDefaults());
/// <summary>
/// Look up an existing application by ID.
/// </summary>
public static Output<GetApplicationResult> Invoke(GetApplicationInvokeArgs args, InvokeOptions? options = null)
=> global::Pulumi.Deployment.Instance.Invoke<GetApplicationResult>("dokploy:index/getApplication:getApplication", args ?? new GetApplicationInvokeArgs(), options.WithDefaults());
/// <summary>
/// Look up an existing application by ID.
/// </summary>
public static Output<GetApplicationResult> Invoke(GetApplicationInvokeArgs args, InvokeOutputOptions options)
=> global::Pulumi.Deployment.Instance.Invoke<GetApplicationResult>("dokploy:index/getApplication:getApplication", args ?? new GetApplicationInvokeArgs(), options.WithDefaults());
}
@@ -25,6 +34,9 @@ namespace Maxvojtkov.Dokploy
public sealed class GetApplicationArgs : global::Pulumi.InvokeArgs
{
/// <summary>
/// Application identifier.
/// </summary>
[Input("id", required: true)]
public string Id { get; set; } = null!;
@@ -36,6 +48,9 @@ namespace Maxvojtkov.Dokploy
public sealed class GetApplicationInvokeArgs : global::Pulumi.InvokeArgs
{
/// <summary>
/// Application identifier.
/// </summary>
[Input("id", required: true)]
public Input<string> Id { get; set; } = null!;
@@ -49,14 +64,41 @@ namespace Maxvojtkov.Dokploy
[OutputType]
public sealed class GetApplicationResult
{
/// <summary>
/// Docker service name.
/// </summary>
public readonly string AppName;
/// <summary>
/// Current status.
/// </summary>
public readonly string ApplicationStatus;
/// <summary>
/// Build strategy.
/// </summary>
public readonly string BuildType;
/// <summary>
/// Creation timestamp.
/// </summary>
public readonly string CreatedAt;
/// <summary>
/// Application description.
/// </summary>
public readonly string Description;
/// <summary>
/// Owning environment.
/// </summary>
public readonly string EnvironmentId;
/// <summary>
/// Application identifier.
/// </summary>
public readonly string Id;
/// <summary>
/// Application name.
/// </summary>
public readonly string Name;
/// <summary>
/// Source of the code or image.
/// </summary>
public readonly string SourceType;
[OutputConstructor]
+36
View File
@@ -12,12 +12,21 @@ namespace Maxvojtkov.Dokploy
{
public static class GetEnvironment
{
/// <summary>
/// Look up an existing environment by ID.
/// </summary>
public static Task<GetEnvironmentResult> InvokeAsync(GetEnvironmentArgs args, InvokeOptions? options = null)
=> global::Pulumi.Deployment.Instance.InvokeAsync<GetEnvironmentResult>("dokploy:index/getEnvironment:getEnvironment", args ?? new GetEnvironmentArgs(), options.WithDefaults());
/// <summary>
/// Look up an existing environment by ID.
/// </summary>
public static Output<GetEnvironmentResult> Invoke(GetEnvironmentInvokeArgs args, InvokeOptions? options = null)
=> global::Pulumi.Deployment.Instance.Invoke<GetEnvironmentResult>("dokploy:index/getEnvironment:getEnvironment", args ?? new GetEnvironmentInvokeArgs(), options.WithDefaults());
/// <summary>
/// Look up an existing environment by ID.
/// </summary>
public static Output<GetEnvironmentResult> Invoke(GetEnvironmentInvokeArgs args, InvokeOutputOptions options)
=> global::Pulumi.Deployment.Instance.Invoke<GetEnvironmentResult>("dokploy:index/getEnvironment:getEnvironment", args ?? new GetEnvironmentInvokeArgs(), options.WithDefaults());
}
@@ -25,6 +34,9 @@ namespace Maxvojtkov.Dokploy
public sealed class GetEnvironmentArgs : global::Pulumi.InvokeArgs
{
/// <summary>
/// Environment identifier.
/// </summary>
[Input("id", required: true)]
public string Id { get; set; } = null!;
@@ -36,6 +48,9 @@ namespace Maxvojtkov.Dokploy
public sealed class GetEnvironmentInvokeArgs : global::Pulumi.InvokeArgs
{
/// <summary>
/// Environment identifier.
/// </summary>
[Input("id", required: true)]
public Input<string> Id { get; set; } = null!;
@@ -49,12 +64,33 @@ namespace Maxvojtkov.Dokploy
[OutputType]
public sealed class GetEnvironmentResult
{
/// <summary>
/// Creation timestamp.
/// </summary>
public readonly string CreatedAt;
/// <summary>
/// Environment description.
/// </summary>
public readonly string Description;
/// <summary>
/// Environment-wide variables.
/// </summary>
public readonly string Env;
/// <summary>
/// Environment identifier.
/// </summary>
public readonly string Id;
/// <summary>
/// Whether this is the project's default environment.
/// </summary>
public readonly bool IsDefault;
/// <summary>
/// Environment name.
/// </summary>
public readonly string Name;
/// <summary>
/// Owning project.
/// </summary>
public readonly string ProjectId;
[OutputConstructor]
+39
View File
@@ -12,12 +12,21 @@ namespace Maxvojtkov.Dokploy
{
public static class GetProject
{
/// <summary>
/// Look up an existing Dokploy project by ID, including its environments.
/// </summary>
public static Task<GetProjectResult> InvokeAsync(GetProjectArgs args, InvokeOptions? options = null)
=> global::Pulumi.Deployment.Instance.InvokeAsync<GetProjectResult>("dokploy:index/getProject:getProject", args ?? new GetProjectArgs(), options.WithDefaults());
/// <summary>
/// Look up an existing Dokploy project by ID, including its environments.
/// </summary>
public static Output<GetProjectResult> Invoke(GetProjectInvokeArgs args, InvokeOptions? options = null)
=> global::Pulumi.Deployment.Instance.Invoke<GetProjectResult>("dokploy:index/getProject:getProject", args ?? new GetProjectInvokeArgs(), options.WithDefaults());
/// <summary>
/// Look up an existing Dokploy project by ID, including its environments.
/// </summary>
public static Output<GetProjectResult> Invoke(GetProjectInvokeArgs args, InvokeOutputOptions options)
=> global::Pulumi.Deployment.Instance.Invoke<GetProjectResult>("dokploy:index/getProject:getProject", args ?? new GetProjectInvokeArgs(), options.WithDefaults());
}
@@ -25,6 +34,9 @@ namespace Maxvojtkov.Dokploy
public sealed class GetProjectArgs : global::Pulumi.InvokeArgs
{
/// <summary>
/// Project identifier.
/// </summary>
[Input("id", required: true)]
public string Id { get; set; } = null!;
@@ -36,6 +48,9 @@ namespace Maxvojtkov.Dokploy
public sealed class GetProjectInvokeArgs : global::Pulumi.InvokeArgs
{
/// <summary>
/// Project identifier.
/// </summary>
[Input("id", required: true)]
public Input<string> Id { get; set; } = null!;
@@ -49,13 +64,37 @@ namespace Maxvojtkov.Dokploy
[OutputType]
public sealed class GetProjectResult
{
/// <summary>
/// Creation timestamp.
/// </summary>
public readonly string CreatedAt;
/// <summary>
/// ID of the project's default environment.
/// </summary>
public readonly string DefaultEnvironmentId;
/// <summary>
/// Project description.
/// </summary>
public readonly string Description;
/// <summary>
/// Project-wide environment variables.
/// </summary>
public readonly string Env;
/// <summary>
/// Every environment in the project.
/// </summary>
public readonly ImmutableArray<Outputs.GetProjectEnvironmentResult> Environments;
/// <summary>
/// Project identifier.
/// </summary>
public readonly string Id;
/// <summary>
/// Project name.
/// </summary>
public readonly string Name;
/// <summary>
/// Owning organization.
/// </summary>
public readonly string OrganizationId;
[OutputConstructor]
+12
View File
@@ -12,12 +12,21 @@ namespace Maxvojtkov.Dokploy
{
public static class GetProjects
{
/// <summary>
/// List every Dokploy project the API token can see.
/// </summary>
public static Task<GetProjectsResult> InvokeAsync(InvokeOptions? options = null)
=> global::Pulumi.Deployment.Instance.InvokeAsync<GetProjectsResult>("dokploy:index/getProjects:getProjects", InvokeArgs.Empty, options.WithDefaults());
/// <summary>
/// List every Dokploy project the API token can see.
/// </summary>
public static Output<GetProjectsResult> Invoke(InvokeOptions? options = null)
=> global::Pulumi.Deployment.Instance.Invoke<GetProjectsResult>("dokploy:index/getProjects:getProjects", InvokeArgs.Empty, options.WithDefaults());
/// <summary>
/// List every Dokploy project the API token can see.
/// </summary>
public static Output<GetProjectsResult> Invoke(InvokeOutputOptions options)
=> global::Pulumi.Deployment.Instance.Invoke<GetProjectsResult>("dokploy:index/getProjects:getProjects", InvokeArgs.Empty, options.WithDefaults());
}
@@ -26,6 +35,9 @@ namespace Maxvojtkov.Dokploy
[OutputType]
public sealed class GetProjectsResult
{
/// <summary>
/// All visible projects.
/// </summary>
public readonly ImmutableArray<Outputs.GetProjectsProjectResult> Projects;
[OutputConstructor]
+12
View File
@@ -12,12 +12,21 @@ namespace Maxvojtkov.Dokploy
{
public static class GetServers
{
/// <summary>
/// List the remote servers registered with Dokploy. Use a server's `Id` as the `ServerId` of an application, stack, or database to deploy it away from the Dokploy host.
/// </summary>
public static Task<GetServersResult> InvokeAsync(InvokeOptions? options = null)
=> global::Pulumi.Deployment.Instance.InvokeAsync<GetServersResult>("dokploy:index/getServers:getServers", InvokeArgs.Empty, options.WithDefaults());
/// <summary>
/// List the remote servers registered with Dokploy. Use a server's `Id` as the `ServerId` of an application, stack, or database to deploy it away from the Dokploy host.
/// </summary>
public static Output<GetServersResult> Invoke(InvokeOptions? options = null)
=> global::Pulumi.Deployment.Instance.Invoke<GetServersResult>("dokploy:index/getServers:getServers", InvokeArgs.Empty, options.WithDefaults());
/// <summary>
/// List the remote servers registered with Dokploy. Use a server's `Id` as the `ServerId` of an application, stack, or database to deploy it away from the Dokploy host.
/// </summary>
public static Output<GetServersResult> Invoke(InvokeOutputOptions options)
=> global::Pulumi.Deployment.Instance.Invoke<GetServersResult>("dokploy:index/getServers:getServers", InvokeArgs.Empty, options.WithDefaults());
}
@@ -26,6 +35,9 @@ namespace Maxvojtkov.Dokploy
[OutputType]
public sealed class GetServersResult
{
/// <summary>
/// All registered servers.
/// </summary>
public readonly ImmutableArray<Outputs.GetServersServerResult> Servers;
[OutputConstructor]
+739
View File
@@ -0,0 +1,739 @@
// *** WARNING: this file was generated by pulumi-language-dotnet. ***
// *** Do not edit by hand unless you're certain you know what you are doing! ***
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Pulumi.Serialization;
using Pulumi;
namespace Maxvojtkov.Dokploy
{
/// <summary>
/// A managed libSQL instance running on Dokploy.
///
/// &gt; Creating this resource provisions the service definition but does **not** start a deployment. Deploy it from the Dokploy UI or CLI.
///
/// &gt; Credentials are stored in Terraform state. Use a state backend with encryption at rest.
///
/// libSQL runs as a `Sqld` server. A `Primary` node owns the data; a `Replica` node follows a primary named by `SqldPrimaryUrl`.
/// </summary>
[DokployResourceType("dokploy:index/libsql:Libsql")]
public partial class Libsql : global::Pulumi.CustomResource
{
/// <summary>
/// Unique Docker service name. Generated from `Name` when omitted, because Dokploy's libSQL endpoint does not generate one. Changing it forces a new database.
/// </summary>
[Output("appName")]
public Output<string> AppName { get; private set; } = null!;
/// <summary>
/// Current status reported by Dokploy: `Idle`, `Running`, `Done` or `Error`.
/// </summary>
[Output("applicationStatus")]
public Output<string> ApplicationStatus { get; private set; } = null!;
/// <summary>
/// Override the container entrypoint command.
/// </summary>
[Output("command")]
public Output<string?> Command { get; private set; } = null!;
/// <summary>
/// Hard CPU limit, for example `1`.
/// </summary>
[Output("cpuLimit")]
public Output<string?> CpuLimit { get; private set; } = null!;
/// <summary>
/// Soft CPU reservation, for example `0.5`.
/// </summary>
[Output("cpuReservation")]
public Output<string?> CpuReservation { get; private set; } = null!;
/// <summary>
/// RFC 3339 timestamp of when the database was created.
/// </summary>
[Output("createdAt")]
public Output<string> CreatedAt { get; private set; } = null!;
/// <summary>
/// Password for the database user.
/// </summary>
[Output("databasePassword")]
public Output<string> DatabasePassword { get; private set; } = null!;
/// <summary>
/// Database user to create.
/// </summary>
[Output("databaseUser")]
public Output<string> DatabaseUser { get; private set; } = null!;
/// <summary>
/// Free-form description.
/// </summary>
[Output("description")]
public Output<string?> Description { get; private set; } = null!;
/// <summary>
/// Detach the service from the shared `dokploy-network`.
/// </summary>
[Output("detachDokployNetwork")]
public Output<bool> DetachDokployNetwork { get; private set; } = null!;
/// <summary>
/// libSQL server image to run, for example `ghcr.io/tursodatabase/libsql-server:latest`.
/// </summary>
[Output("dockerImage")]
public Output<string> DockerImage { get; private set; } = null!;
/// <summary>
/// Serve multiple logical databases from one instance through libSQL namespaces.
/// </summary>
[Output("enableNamespaces")]
public Output<bool> EnableNamespaces { get; private set; } = null!;
/// <summary>
/// Docker Swarm endpoint specification, as a JSON object.
/// </summary>
[Output("endpointSpecSwarm")]
public Output<string?> EndpointSpecSwarm { get; private set; } = null!;
/// <summary>
/// Environment variables in `KEY=value` format, one per line.
/// </summary>
[Output("env")]
public Output<string?> Env { get; private set; } = null!;
/// <summary>
/// Environment this database belongs to.
/// </summary>
[Output("environmentId")]
public Output<string> EnvironmentId { get; private set; } = null!;
/// <summary>
/// Host port exposing the admin API.
/// </summary>
[Output("externalAdminPort")]
public Output<int?> ExternalAdminPort { get; private set; } = null!;
/// <summary>
/// Host port exposing the gRPC replication endpoint.
/// </summary>
[Output("externalGrpcPort")]
public Output<int?> ExternalGrpcPort { get; private set; } = null!;
/// <summary>
/// Host port exposing the HTTP API.
/// </summary>
[Output("externalPort")]
public Output<int?> ExternalPort { get; private set; } = null!;
/// <summary>
/// Docker Swarm health check configuration, as a JSON object.
/// </summary>
[Output("healthCheckSwarm")]
public Output<string?> HealthCheckSwarm { get; private set; } = null!;
/// <summary>
/// Docker Swarm service labels, as a JSON object.
/// </summary>
[Output("labelsSwarm")]
public Output<string?> LabelsSwarm { get; private set; } = null!;
/// <summary>
/// Hard memory limit, for example `512m`.
/// </summary>
[Output("memoryLimit")]
public Output<string?> MemoryLimit { get; private set; } = null!;
/// <summary>
/// Soft memory reservation, for example `256m`.
/// </summary>
[Output("memoryReservation")]
public Output<string?> MemoryReservation { get; private set; } = null!;
/// <summary>
/// Docker Swarm service mode, as a JSON object.
/// </summary>
[Output("modeSwarm")]
public Output<string?> ModeSwarm { get; private set; } = null!;
/// <summary>
/// Display name of the database.
/// </summary>
[Output("name")]
public Output<string> Name { get; private set; } = null!;
/// <summary>
/// IDs of additional Docker networks to attach.
/// </summary>
[Output("networkIds")]
public Output<ImmutableArray<string>> NetworkIds { get; private set; } = null!;
/// <summary>
/// Docker Swarm network attachments, as a JSON array.
/// </summary>
[Output("networkSwarm")]
public Output<string?> NetworkSwarm { get; private set; } = null!;
/// <summary>
/// Docker Swarm placement constraints, as a JSON object.
/// </summary>
[Output("placementSwarm")]
public Output<string?> PlacementSwarm { get; private set; } = null!;
/// <summary>
/// Number of replicas to run.
/// </summary>
[Output("replicas")]
public Output<int> Replicas { get; private set; } = null!;
/// <summary>
/// Docker Swarm restart policy, as a JSON object.
/// </summary>
[Output("restartPolicySwarm")]
public Output<string?> RestartPolicySwarm { get; private set; } = null!;
/// <summary>
/// Docker Swarm rollback configuration, as a JSON object.
/// </summary>
[Output("rollbackConfigSwarm")]
public Output<string?> RollbackConfigSwarm { get; private set; } = null!;
/// <summary>
/// Remote server to deploy on. Omit to use the Dokploy host itself.
/// </summary>
[Output("serverId")]
public Output<string?> ServerId { get; private set; } = null!;
/// <summary>
/// Role this node plays in a libSQL cluster. Valid values: `Primary`, `Replica`. Defaults to `Primary`.
/// </summary>
[Output("sqldNode")]
public Output<string> SqldNode { get; private set; } = null!;
/// <summary>
/// URL of the primary node, when `SqldNode` is `Replica`.
/// </summary>
[Output("sqldPrimaryUrl")]
public Output<string?> SqldPrimaryUrl { get; private set; } = null!;
/// <summary>
/// Grace period in nanoseconds before a container is killed.
/// </summary>
[Output("stopGracePeriodSwarm")]
public Output<int?> StopGracePeriodSwarm { get; private set; } = null!;
/// <summary>
/// Docker Swarm rolling update configuration, as a JSON object.
/// </summary>
[Output("updateConfigSwarm")]
public Output<string?> UpdateConfigSwarm { get; private set; } = null!;
/// <summary>
/// Create a Libsql resource with the given unique name, arguments, and options.
/// </summary>
///
/// <param name="name">The unique name of the resource</param>
/// <param name="args">The arguments used to populate this resource's properties</param>
/// <param name="options">A bag of options that control this resource's behavior</param>
public Libsql(string name, LibsqlArgs args, CustomResourceOptions? options = null)
: base("dokploy:index/libsql:Libsql", name, args ?? new LibsqlArgs(), MakeResourceOptions(options, ""))
{
}
private Libsql(string name, Input<string> id, LibsqlState? state = null, CustomResourceOptions? options = null)
: base("dokploy:index/libsql:Libsql", name, state, MakeResourceOptions(options, id))
{
}
private static CustomResourceOptions MakeResourceOptions(CustomResourceOptions? options, Input<string>? id)
{
var defaultOptions = new CustomResourceOptions
{
Version = Utilities.Version,
PluginDownloadURL = "https://gitea.coolify.vojtkov.dev/usr_unknown/pulumi-dokploy/releases/download/v${VERSION}",
AdditionalSecretOutputs =
{
"databasePassword",
},
};
var merged = CustomResourceOptions.Merge(defaultOptions, options);
// Override the ID if one was specified for consistency with other language SDKs.
merged.Id = id ?? merged.Id;
return merged;
}
/// <summary>
/// Get an existing Libsql resource's state with the given name, ID, and optional extra
/// properties used to qualify the lookup.
/// </summary>
///
/// <param name="name">The unique name of the resulting resource.</param>
/// <param name="id">The unique provider ID of the resource to lookup.</param>
/// <param name="state">Any extra arguments used during the lookup.</param>
/// <param name="options">A bag of options that control this resource's behavior</param>
public static Libsql Get(string name, Input<string> id, LibsqlState? state = null, CustomResourceOptions? options = null)
{
return new Libsql(name, id, state, options);
}
}
public sealed class LibsqlArgs : global::Pulumi.ResourceArgs
{
/// <summary>
/// Unique Docker service name. Generated from `Name` when omitted, because Dokploy's libSQL endpoint does not generate one. Changing it forces a new database.
/// </summary>
[Input("appName")]
public Input<string>? AppName { get; set; }
/// <summary>
/// Override the container entrypoint command.
/// </summary>
[Input("command")]
public Input<string>? Command { get; set; }
/// <summary>
/// Hard CPU limit, for example `1`.
/// </summary>
[Input("cpuLimit")]
public Input<string>? CpuLimit { get; set; }
/// <summary>
/// Soft CPU reservation, for example `0.5`.
/// </summary>
[Input("cpuReservation")]
public Input<string>? CpuReservation { get; set; }
[Input("databasePassword", required: true)]
private Input<string>? _databasePassword;
/// <summary>
/// Password for the database user.
/// </summary>
public Input<string>? DatabasePassword
{
get => _databasePassword;
set
{
var emptySecret = Output.CreateSecret(0);
_databasePassword = Output.Tuple<Input<string>?, int>(value, emptySecret).Apply(t => t.Item1);
}
}
/// <summary>
/// Database user to create.
/// </summary>
[Input("databaseUser", required: true)]
public Input<string> DatabaseUser { get; set; } = null!;
/// <summary>
/// Free-form description.
/// </summary>
[Input("description")]
public Input<string>? Description { get; set; }
/// <summary>
/// Detach the service from the shared `dokploy-network`.
/// </summary>
[Input("detachDokployNetwork")]
public Input<bool>? DetachDokployNetwork { get; set; }
/// <summary>
/// libSQL server image to run, for example `ghcr.io/tursodatabase/libsql-server:latest`.
/// </summary>
[Input("dockerImage", required: true)]
public Input<string> DockerImage { get; set; } = null!;
/// <summary>
/// Serve multiple logical databases from one instance through libSQL namespaces.
/// </summary>
[Input("enableNamespaces")]
public Input<bool>? EnableNamespaces { get; set; }
/// <summary>
/// Docker Swarm endpoint specification, as a JSON object.
/// </summary>
[Input("endpointSpecSwarm")]
public Input<string>? EndpointSpecSwarm { get; set; }
/// <summary>
/// Environment variables in `KEY=value` format, one per line.
/// </summary>
[Input("env")]
public Input<string>? Env { get; set; }
/// <summary>
/// Environment this database belongs to.
/// </summary>
[Input("environmentId", required: true)]
public Input<string> EnvironmentId { get; set; } = null!;
/// <summary>
/// Host port exposing the admin API.
/// </summary>
[Input("externalAdminPort")]
public Input<int>? ExternalAdminPort { get; set; }
/// <summary>
/// Host port exposing the gRPC replication endpoint.
/// </summary>
[Input("externalGrpcPort")]
public Input<int>? ExternalGrpcPort { get; set; }
/// <summary>
/// Host port exposing the HTTP API.
/// </summary>
[Input("externalPort")]
public Input<int>? ExternalPort { get; set; }
/// <summary>
/// Docker Swarm health check configuration, as a JSON object.
/// </summary>
[Input("healthCheckSwarm")]
public Input<string>? HealthCheckSwarm { get; set; }
/// <summary>
/// Docker Swarm service labels, as a JSON object.
/// </summary>
[Input("labelsSwarm")]
public Input<string>? LabelsSwarm { get; set; }
/// <summary>
/// Hard memory limit, for example `512m`.
/// </summary>
[Input("memoryLimit")]
public Input<string>? MemoryLimit { get; set; }
/// <summary>
/// Soft memory reservation, for example `256m`.
/// </summary>
[Input("memoryReservation")]
public Input<string>? MemoryReservation { get; set; }
/// <summary>
/// Docker Swarm service mode, as a JSON object.
/// </summary>
[Input("modeSwarm")]
public Input<string>? ModeSwarm { get; set; }
/// <summary>
/// Display name of the database.
/// </summary>
[Input("name")]
public Input<string>? Name { get; set; }
[Input("networkIds")]
private InputList<string>? _networkIds;
/// <summary>
/// IDs of additional Docker networks to attach.
/// </summary>
public InputList<string> NetworkIds
{
get => _networkIds ?? (_networkIds = new InputList<string>());
set => _networkIds = value;
}
/// <summary>
/// Docker Swarm network attachments, as a JSON array.
/// </summary>
[Input("networkSwarm")]
public Input<string>? NetworkSwarm { get; set; }
/// <summary>
/// Docker Swarm placement constraints, as a JSON object.
/// </summary>
[Input("placementSwarm")]
public Input<string>? PlacementSwarm { get; set; }
/// <summary>
/// Number of replicas to run.
/// </summary>
[Input("replicas")]
public Input<int>? Replicas { get; set; }
/// <summary>
/// Docker Swarm restart policy, as a JSON object.
/// </summary>
[Input("restartPolicySwarm")]
public Input<string>? RestartPolicySwarm { get; set; }
/// <summary>
/// Docker Swarm rollback configuration, as a JSON object.
/// </summary>
[Input("rollbackConfigSwarm")]
public Input<string>? RollbackConfigSwarm { get; set; }
/// <summary>
/// Remote server to deploy on. Omit to use the Dokploy host itself.
/// </summary>
[Input("serverId")]
public Input<string>? ServerId { get; set; }
/// <summary>
/// Role this node plays in a libSQL cluster. Valid values: `Primary`, `Replica`. Defaults to `Primary`.
/// </summary>
[Input("sqldNode")]
public Input<string>? SqldNode { get; set; }
/// <summary>
/// URL of the primary node, when `SqldNode` is `Replica`.
/// </summary>
[Input("sqldPrimaryUrl")]
public Input<string>? SqldPrimaryUrl { get; set; }
/// <summary>
/// Grace period in nanoseconds before a container is killed.
/// </summary>
[Input("stopGracePeriodSwarm")]
public Input<int>? StopGracePeriodSwarm { get; set; }
/// <summary>
/// Docker Swarm rolling update configuration, as a JSON object.
/// </summary>
[Input("updateConfigSwarm")]
public Input<string>? UpdateConfigSwarm { get; set; }
public LibsqlArgs()
{
}
public static new LibsqlArgs Empty => new LibsqlArgs();
}
public sealed class LibsqlState : global::Pulumi.ResourceArgs
{
/// <summary>
/// Unique Docker service name. Generated from `Name` when omitted, because Dokploy's libSQL endpoint does not generate one. Changing it forces a new database.
/// </summary>
[Input("appName")]
public Input<string>? AppName { get; set; }
/// <summary>
/// Current status reported by Dokploy: `Idle`, `Running`, `Done` or `Error`.
/// </summary>
[Input("applicationStatus")]
public Input<string>? ApplicationStatus { get; set; }
/// <summary>
/// Override the container entrypoint command.
/// </summary>
[Input("command")]
public Input<string>? Command { get; set; }
/// <summary>
/// Hard CPU limit, for example `1`.
/// </summary>
[Input("cpuLimit")]
public Input<string>? CpuLimit { get; set; }
/// <summary>
/// Soft CPU reservation, for example `0.5`.
/// </summary>
[Input("cpuReservation")]
public Input<string>? CpuReservation { get; set; }
/// <summary>
/// RFC 3339 timestamp of when the database was created.
/// </summary>
[Input("createdAt")]
public Input<string>? CreatedAt { get; set; }
[Input("databasePassword")]
private Input<string>? _databasePassword;
/// <summary>
/// Password for the database user.
/// </summary>
public Input<string>? DatabasePassword
{
get => _databasePassword;
set
{
var emptySecret = Output.CreateSecret(0);
_databasePassword = Output.Tuple<Input<string>?, int>(value, emptySecret).Apply(t => t.Item1);
}
}
/// <summary>
/// Database user to create.
/// </summary>
[Input("databaseUser")]
public Input<string>? DatabaseUser { get; set; }
/// <summary>
/// Free-form description.
/// </summary>
[Input("description")]
public Input<string>? Description { get; set; }
/// <summary>
/// Detach the service from the shared `dokploy-network`.
/// </summary>
[Input("detachDokployNetwork")]
public Input<bool>? DetachDokployNetwork { get; set; }
/// <summary>
/// libSQL server image to run, for example `ghcr.io/tursodatabase/libsql-server:latest`.
/// </summary>
[Input("dockerImage")]
public Input<string>? DockerImage { get; set; }
/// <summary>
/// Serve multiple logical databases from one instance through libSQL namespaces.
/// </summary>
[Input("enableNamespaces")]
public Input<bool>? EnableNamespaces { get; set; }
/// <summary>
/// Docker Swarm endpoint specification, as a JSON object.
/// </summary>
[Input("endpointSpecSwarm")]
public Input<string>? EndpointSpecSwarm { get; set; }
/// <summary>
/// Environment variables in `KEY=value` format, one per line.
/// </summary>
[Input("env")]
public Input<string>? Env { get; set; }
/// <summary>
/// Environment this database belongs to.
/// </summary>
[Input("environmentId")]
public Input<string>? EnvironmentId { get; set; }
/// <summary>
/// Host port exposing the admin API.
/// </summary>
[Input("externalAdminPort")]
public Input<int>? ExternalAdminPort { get; set; }
/// <summary>
/// Host port exposing the gRPC replication endpoint.
/// </summary>
[Input("externalGrpcPort")]
public Input<int>? ExternalGrpcPort { get; set; }
/// <summary>
/// Host port exposing the HTTP API.
/// </summary>
[Input("externalPort")]
public Input<int>? ExternalPort { get; set; }
/// <summary>
/// Docker Swarm health check configuration, as a JSON object.
/// </summary>
[Input("healthCheckSwarm")]
public Input<string>? HealthCheckSwarm { get; set; }
/// <summary>
/// Docker Swarm service labels, as a JSON object.
/// </summary>
[Input("labelsSwarm")]
public Input<string>? LabelsSwarm { get; set; }
/// <summary>
/// Hard memory limit, for example `512m`.
/// </summary>
[Input("memoryLimit")]
public Input<string>? MemoryLimit { get; set; }
/// <summary>
/// Soft memory reservation, for example `256m`.
/// </summary>
[Input("memoryReservation")]
public Input<string>? MemoryReservation { get; set; }
/// <summary>
/// Docker Swarm service mode, as a JSON object.
/// </summary>
[Input("modeSwarm")]
public Input<string>? ModeSwarm { get; set; }
/// <summary>
/// Display name of the database.
/// </summary>
[Input("name")]
public Input<string>? Name { get; set; }
[Input("networkIds")]
private InputList<string>? _networkIds;
/// <summary>
/// IDs of additional Docker networks to attach.
/// </summary>
public InputList<string> NetworkIds
{
get => _networkIds ?? (_networkIds = new InputList<string>());
set => _networkIds = value;
}
/// <summary>
/// Docker Swarm network attachments, as a JSON array.
/// </summary>
[Input("networkSwarm")]
public Input<string>? NetworkSwarm { get; set; }
/// <summary>
/// Docker Swarm placement constraints, as a JSON object.
/// </summary>
[Input("placementSwarm")]
public Input<string>? PlacementSwarm { get; set; }
/// <summary>
/// Number of replicas to run.
/// </summary>
[Input("replicas")]
public Input<int>? Replicas { get; set; }
/// <summary>
/// Docker Swarm restart policy, as a JSON object.
/// </summary>
[Input("restartPolicySwarm")]
public Input<string>? RestartPolicySwarm { get; set; }
/// <summary>
/// Docker Swarm rollback configuration, as a JSON object.
/// </summary>
[Input("rollbackConfigSwarm")]
public Input<string>? RollbackConfigSwarm { get; set; }
/// <summary>
/// Remote server to deploy on. Omit to use the Dokploy host itself.
/// </summary>
[Input("serverId")]
public Input<string>? ServerId { get; set; }
/// <summary>
/// Role this node plays in a libSQL cluster. Valid values: `Primary`, `Replica`. Defaults to `Primary`.
/// </summary>
[Input("sqldNode")]
public Input<string>? SqldNode { get; set; }
/// <summary>
/// URL of the primary node, when `SqldNode` is `Replica`.
/// </summary>
[Input("sqldPrimaryUrl")]
public Input<string>? SqldPrimaryUrl { get; set; }
/// <summary>
/// Grace period in nanoseconds before a container is killed.
/// </summary>
[Input("stopGracePeriodSwarm")]
public Input<int>? StopGracePeriodSwarm { get; set; }
/// <summary>
/// Docker Swarm rolling update configuration, as a JSON object.
/// </summary>
[Input("updateConfigSwarm")]
public Input<string>? UpdateConfigSwarm { get; set; }
public LibsqlState()
{
}
public static new LibsqlState Empty => new LibsqlState();
}
}
+7
View File
@@ -10,6 +10,13 @@ using Pulumi;
namespace Maxvojtkov.Dokploy
{
/// <summary>
/// A managed MariaDB instance running on Dokploy.
///
/// &gt; Creating this resource provisions the service definition but does **not** start a deployment. Deploy it from the Dokploy UI or CLI.
///
/// &gt; Credentials are stored in Terraform state. Use a state backend with encryption at rest.
/// </summary>
[DokployResourceType("dokploy:index/mariaDb:MariaDb")]
public partial class MariaDb : global::Pulumi.CustomResource
{
+1 -1
View File
@@ -9,7 +9,7 @@
<PackageProjectUrl>https://gitea.coolify.vojtkov.dev/usr_unknown/pulumi-dokploy</PackageProjectUrl>
<RepositoryUrl>https://gitea.coolify.vojtkov.dev/usr_unknown/pulumi-dokploy</RepositoryUrl>
<PackageIcon>logo.png</PackageIcon>
<Version>0.1.0</Version>
<Version>0.2.0</Version>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
+7
View File
@@ -10,6 +10,13 @@ using Pulumi;
namespace Maxvojtkov.Dokploy
{
/// <summary>
/// A managed MongoDB instance running on Dokploy.
///
/// &gt; Creating this resource provisions the service definition but does **not** start a deployment. Deploy it from the Dokploy UI or CLI.
///
/// &gt; Credentials are stored in Terraform state. Use a state backend with encryption at rest.
/// </summary>
[DokployResourceType("dokploy:index/mongo:Mongo")]
public partial class Mongo : global::Pulumi.CustomResource
{
+12 -3
View File
@@ -10,6 +10,15 @@ using Pulumi;
namespace Maxvojtkov.Dokploy
{
/// <summary>
/// A volume, bind mount, or config file attached to a Dokploy service.
///
/// * `type = "volume"` — a named Docker volume; set `VolumeName`.
/// * `type = "bind"` — a path on the host; set `HostPath`.
/// * `type = "file"` — a file rendered from `Content`; set `FilePath`.
///
/// &gt; **A `Volume` mount must set `VolumeName`.** Dokploy hands an unset name to Docker as an empty source, which creates a fresh anonymous volume on every deploy and orphans the previous one — the data never survives a redeploy. The provider rejects that combination at plan time.
/// </summary>
[DokployResourceType("dokploy:index/mount:Mount")]
public partial class Mount : global::Pulumi.CustomResource
{
@@ -44,7 +53,7 @@ namespace Maxvojtkov.Dokploy
public Output<string> ServiceId { get; private set; } = null!;
/// <summary>
/// The kind of service this mount attaches to. Valid values: `Application`, `Postgres`, `Mysql`, `Mariadb`, `Mongo`, `Redis`, `Compose`.
/// The kind of service this mount attaches to. Valid values: `Application`, `Postgres`, `Mysql`, `Mariadb`, `Mongo`, `Redis`, `Compose`, `Libsql`.
/// </summary>
[Output("serviceType")]
public Output<string> ServiceType { get; private set; } = null!;
@@ -139,7 +148,7 @@ namespace Maxvojtkov.Dokploy
public Input<string> ServiceId { get; set; } = null!;
/// <summary>
/// The kind of service this mount attaches to. Valid values: `Application`, `Postgres`, `Mysql`, `Mariadb`, `Mongo`, `Redis`, `Compose`.
/// The kind of service this mount attaches to. Valid values: `Application`, `Postgres`, `Mysql`, `Mariadb`, `Mongo`, `Redis`, `Compose`, `Libsql`.
/// </summary>
[Input("serviceType", required: true)]
public Input<string> ServiceType { get; set; } = null!;
@@ -195,7 +204,7 @@ namespace Maxvojtkov.Dokploy
public Input<string>? ServiceId { get; set; }
/// <summary>
/// The kind of service this mount attaches to. Valid values: `Application`, `Postgres`, `Mysql`, `Mariadb`, `Mongo`, `Redis`, `Compose`.
/// The kind of service this mount attaches to. Valid values: `Application`, `Postgres`, `Mysql`, `Mariadb`, `Mongo`, `Redis`, `Compose`, `Libsql`.
/// </summary>
[Input("serviceType")]
public Input<string>? ServiceType { get; set; }
+7
View File
@@ -10,6 +10,13 @@ using Pulumi;
namespace Maxvojtkov.Dokploy
{
/// <summary>
/// A managed MySQL instance running on Dokploy.
///
/// &gt; Creating this resource provisions the service definition but does **not** start a deployment. Deploy it from the Dokploy UI or CLI.
///
/// &gt; Credentials are stored in Terraform state. Use a state backend with encryption at rest.
/// </summary>
[DokployResourceType("dokploy:index/mySql:MySql")]
public partial class MySql : global::Pulumi.CustomResource
{
+269
View File
@@ -0,0 +1,269 @@
// *** WARNING: this file was generated by pulumi-language-dotnet. ***
// *** Do not edit by hand unless you're certain you know what you are doing! ***
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Pulumi.Serialization;
using Pulumi;
namespace Maxvojtkov.Dokploy
{
/// <summary>
/// A Docker network managed by Dokploy.
///
/// Attach services to it with `NetworkIds` on `dokploy.Application`, `dokploy.Compose` and the database resources. Every service also joins the shared `dokploy-network` unless `DetachDokployNetwork` is set.
///
/// &gt; Docker networks are immutable. Dokploy has no update endpoint, so changing any attribute replaces the network — which detaches the services currently using it until they redeploy.
/// </summary>
[DokployResourceType("dokploy:index/network:Network")]
public partial class Network : global::Pulumi.CustomResource
{
/// <summary>
/// Allow standalone containers to attach to an overlay network.
/// </summary>
[Output("attachable")]
public Output<bool> Attachable { get; private set; } = null!;
/// <summary>
/// RFC 3339 timestamp of when the network was created.
/// </summary>
[Output("createdAt")]
public Output<string> CreatedAt { get; private set; } = null!;
/// <summary>
/// Network driver. Use `Overlay` for multi-node Swarm clusters and `Bridge` for a single host. Valid values: `Bridge`, `Overlay`.
/// </summary>
[Output("driver")]
public Output<string> Driver { get; private set; } = null!;
/// <summary>
/// Enable IPv4 address allocation.
/// </summary>
[Output("enableIpv4")]
public Output<bool> EnableIpv4 { get; private set; } = null!;
/// <summary>
/// Enable IPv6 address allocation.
/// </summary>
[Output("enableIpv6")]
public Output<bool> EnableIpv6 { get; private set; } = null!;
/// <summary>
/// Isolate the network from external access.
/// </summary>
[Output("internal")]
public Output<bool> Internal { get; private set; } = null!;
/// <summary>
/// Custom IP address management, as a JSON object with `Subnet`, `Gateway` and `ipRange` keys. Leave unset to let Docker choose a subnet.
/// </summary>
[Output("ipam")]
public Output<string?> Ipam { get; private set; } = null!;
/// <summary>
/// Maximum transmission unit for the network. Leave unset to use Docker's default.
/// </summary>
[Output("mtu")]
public Output<int?> Mtu { get; private set; } = null!;
/// <summary>
/// Name of the Docker network.
/// </summary>
[Output("name")]
public Output<string> Name { get; private set; } = null!;
/// <summary>
/// Organization that owns the network.
/// </summary>
[Output("organizationId")]
public Output<string> OrganizationId { get; private set; } = null!;
/// <summary>
/// Remote server to create the network on. Omit to use the Dokploy host itself.
/// </summary>
[Output("serverId")]
public Output<string?> ServerId { get; private set; } = null!;
/// <summary>
/// Create a Network resource with the given unique name, arguments, and options.
/// </summary>
///
/// <param name="name">The unique name of the resource</param>
/// <param name="args">The arguments used to populate this resource's properties</param>
/// <param name="options">A bag of options that control this resource's behavior</param>
public Network(string name, NetworkArgs? args = null, CustomResourceOptions? options = null)
: base("dokploy:index/network:Network", name, args ?? new NetworkArgs(), MakeResourceOptions(options, ""))
{
}
private Network(string name, Input<string> id, NetworkState? state = null, CustomResourceOptions? options = null)
: base("dokploy:index/network:Network", name, state, MakeResourceOptions(options, id))
{
}
private static CustomResourceOptions MakeResourceOptions(CustomResourceOptions? options, Input<string>? id)
{
var defaultOptions = new CustomResourceOptions
{
Version = Utilities.Version,
PluginDownloadURL = "https://gitea.coolify.vojtkov.dev/usr_unknown/pulumi-dokploy/releases/download/v${VERSION}",
};
var merged = CustomResourceOptions.Merge(defaultOptions, options);
// Override the ID if one was specified for consistency with other language SDKs.
merged.Id = id ?? merged.Id;
return merged;
}
/// <summary>
/// Get an existing Network resource's state with the given name, ID, and optional extra
/// properties used to qualify the lookup.
/// </summary>
///
/// <param name="name">The unique name of the resulting resource.</param>
/// <param name="id">The unique provider ID of the resource to lookup.</param>
/// <param name="state">Any extra arguments used during the lookup.</param>
/// <param name="options">A bag of options that control this resource's behavior</param>
public static Network Get(string name, Input<string> id, NetworkState? state = null, CustomResourceOptions? options = null)
{
return new Network(name, id, state, options);
}
}
public sealed class NetworkArgs : global::Pulumi.ResourceArgs
{
/// <summary>
/// Allow standalone containers to attach to an overlay network.
/// </summary>
[Input("attachable")]
public Input<bool>? Attachable { get; set; }
/// <summary>
/// Network driver. Use `Overlay` for multi-node Swarm clusters and `Bridge` for a single host. Valid values: `Bridge`, `Overlay`.
/// </summary>
[Input("driver")]
public Input<string>? Driver { get; set; }
/// <summary>
/// Enable IPv4 address allocation.
/// </summary>
[Input("enableIpv4")]
public Input<bool>? EnableIpv4 { get; set; }
/// <summary>
/// Enable IPv6 address allocation.
/// </summary>
[Input("enableIpv6")]
public Input<bool>? EnableIpv6 { get; set; }
/// <summary>
/// Isolate the network from external access.
/// </summary>
[Input("internal")]
public Input<bool>? Internal { get; set; }
/// <summary>
/// Custom IP address management, as a JSON object with `Subnet`, `Gateway` and `ipRange` keys. Leave unset to let Docker choose a subnet.
/// </summary>
[Input("ipam")]
public Input<string>? Ipam { get; set; }
/// <summary>
/// Maximum transmission unit for the network. Leave unset to use Docker's default.
/// </summary>
[Input("mtu")]
public Input<int>? Mtu { get; set; }
/// <summary>
/// Name of the Docker network.
/// </summary>
[Input("name")]
public Input<string>? Name { get; set; }
/// <summary>
/// Remote server to create the network on. Omit to use the Dokploy host itself.
/// </summary>
[Input("serverId")]
public Input<string>? ServerId { get; set; }
public NetworkArgs()
{
}
public static new NetworkArgs Empty => new NetworkArgs();
}
public sealed class NetworkState : global::Pulumi.ResourceArgs
{
/// <summary>
/// Allow standalone containers to attach to an overlay network.
/// </summary>
[Input("attachable")]
public Input<bool>? Attachable { get; set; }
/// <summary>
/// RFC 3339 timestamp of when the network was created.
/// </summary>
[Input("createdAt")]
public Input<string>? CreatedAt { get; set; }
/// <summary>
/// Network driver. Use `Overlay` for multi-node Swarm clusters and `Bridge` for a single host. Valid values: `Bridge`, `Overlay`.
/// </summary>
[Input("driver")]
public Input<string>? Driver { get; set; }
/// <summary>
/// Enable IPv4 address allocation.
/// </summary>
[Input("enableIpv4")]
public Input<bool>? EnableIpv4 { get; set; }
/// <summary>
/// Enable IPv6 address allocation.
/// </summary>
[Input("enableIpv6")]
public Input<bool>? EnableIpv6 { get; set; }
/// <summary>
/// Isolate the network from external access.
/// </summary>
[Input("internal")]
public Input<bool>? Internal { get; set; }
/// <summary>
/// Custom IP address management, as a JSON object with `Subnet`, `Gateway` and `ipRange` keys. Leave unset to let Docker choose a subnet.
/// </summary>
[Input("ipam")]
public Input<string>? Ipam { get; set; }
/// <summary>
/// Maximum transmission unit for the network. Leave unset to use Docker's default.
/// </summary>
[Input("mtu")]
public Input<int>? Mtu { get; set; }
/// <summary>
/// Name of the Docker network.
/// </summary>
[Input("name")]
public Input<string>? Name { get; set; }
/// <summary>
/// Organization that owns the network.
/// </summary>
[Input("organizationId")]
public Input<string>? OrganizationId { get; set; }
/// <summary>
/// Remote server to create the network on. Omit to use the Dokploy host itself.
/// </summary>
[Input("serverId")]
public Input<string>? ServerId { get; set; }
public NetworkState()
{
}
public static new NetworkState Empty => new NetworkState();
}
}
+3
View File
@@ -10,6 +10,9 @@ using Pulumi;
namespace Maxvojtkov.Dokploy
{
/// <summary>
/// A published port that exposes an application directly on the host, bypassing Traefik.
/// </summary>
[DokployResourceType("dokploy:index/port:Port")]
public partial class Port : global::Pulumi.CustomResource
{
+7
View File
@@ -10,6 +10,13 @@ using Pulumi;
namespace Maxvojtkov.Dokploy
{
/// <summary>
/// A managed PostgreSQL instance running on Dokploy.
///
/// &gt; Creating this resource provisions the service definition but does **not** start a deployment. Deploy it from the Dokploy UI or CLI.
///
/// &gt; Credentials are stored in Terraform state. Use a state backend with encryption at rest.
/// </summary>
[DokployResourceType("dokploy:index/postgres:Postgres")]
public partial class Postgres : global::Pulumi.CustomResource
{
+5
View File
@@ -10,6 +10,11 @@ using Pulumi;
namespace Maxvojtkov.Dokploy
{
/// <summary>
/// A Dokploy project: the top-level container for environments and services.
///
/// Creating a project automatically creates a default `Production` environment. Its ID is exposed as `DefaultEnvironmentId`, so services can be attached without declaring a separate `dokploy.Environment` resource.
/// </summary>
[DokployResourceType("dokploy:index/project:Project")]
public partial class Project : global::Pulumi.CustomResource
{
+3
View File
@@ -10,6 +10,9 @@ using Pulumi;
namespace Maxvojtkov.Dokploy
{
/// <summary>
/// A Traefik redirect rule attached to an application.
/// </summary>
[DokployResourceType("dokploy:index/redirect:Redirect")]
public partial class Redirect : global::Pulumi.CustomResource
{
+7
View File
@@ -10,6 +10,13 @@ using Pulumi;
namespace Maxvojtkov.Dokploy
{
/// <summary>
/// A managed Redis instance running on Dokploy.
///
/// &gt; Creating this resource provisions the service definition but does **not** start a deployment. Deploy it from the Dokploy UI or CLI.
///
/// &gt; Credentials are stored in Terraform state. Use a state backend with encryption at rest.
/// </summary>
[DokployResourceType("dokploy:index/redis:Redis")]
public partial class Redis : global::Pulumi.CustomResource
{
+3
View File
@@ -10,6 +10,9 @@ using Pulumi;
namespace Maxvojtkov.Dokploy
{
/// <summary>
/// A container registry that Dokploy pushes built images to and pulls them from.
/// </summary>
[DokployResourceType("dokploy:index/registry:Registry")]
public partial class Registry : global::Pulumi.CustomResource
{
+352
View File
@@ -0,0 +1,352 @@
// *** WARNING: this file was generated by pulumi-language-dotnet. ***
// *** Do not edit by hand unless you're certain you know what you are doing! ***
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Pulumi.Serialization;
using Pulumi;
namespace Maxvojtkov.Dokploy
{
/// <summary>
/// A cron job Dokploy runs on a schedule.
///
/// `ScheduleType` selects where the command runs:
///
/// * `Application` — inside a running application container; set `ApplicationId`.
/// * `Compose` — inside one service of a Compose stack; set `ComposeId` and `ServiceName`.
/// * `Server` — on a remote server; set `ServerId`.
/// * `dokploy-server` — on the Dokploy host itself.
///
/// &gt; A schedule targeting an application runs inside its container, so the container has to be running when the cron fires.
/// </summary>
[DokployResourceType("dokploy:index/schedule:Schedule")]
public partial class Schedule : global::Pulumi.CustomResource
{
/// <summary>
/// Docker service name the schedule targets. Derived by Dokploy when omitted.
/// </summary>
[Output("appName")]
public Output<string> AppName { get; private set; } = null!;
/// <summary>
/// Application this schedule belongs to.
/// </summary>
[Output("applicationId")]
public Output<string?> ApplicationId { get; private set; } = null!;
/// <summary>
/// Command to run.
/// </summary>
[Output("command")]
public Output<string> Command { get; private set; } = null!;
/// <summary>
/// Compose stack this schedule belongs to.
/// </summary>
[Output("composeId")]
public Output<string?> ComposeId { get; private set; } = null!;
/// <summary>
/// RFC 3339 timestamp of when the schedule was created.
/// </summary>
[Output("createdAt")]
public Output<string> CreatedAt { get; private set; } = null!;
/// <summary>
/// Standard five-field cron expression, for example `0 3 * * *`.
/// </summary>
[Output("cronExpression")]
public Output<string> CronExpression { get; private set; } = null!;
/// <summary>
/// Free-form description.
/// </summary>
[Output("description")]
public Output<string?> Description { get; private set; } = null!;
/// <summary>
/// Whether the schedule is active.
/// </summary>
[Output("enabled")]
public Output<bool> Enabled { get; private set; } = null!;
/// <summary>
/// Display name of the schedule.
/// </summary>
[Output("name")]
public Output<string> Name { get; private set; } = null!;
/// <summary>
/// Where the command runs. Valid values: `Application`, `Compose`, `Server`, `dokploy-server`. Defaults to `Application`.
/// </summary>
[Output("scheduleType")]
public Output<string> ScheduleType { get; private set; } = null!;
/// <summary>
/// Multi-line script to run instead of a single command.
/// </summary>
[Output("script")]
public Output<string?> Script { get; private set; } = null!;
/// <summary>
/// Server this schedule runs on.
/// </summary>
[Output("serverId")]
public Output<string?> ServerId { get; private set; } = null!;
/// <summary>
/// Service inside a Compose stack to run the command in.
/// </summary>
[Output("serviceName")]
public Output<string?> ServiceName { get; private set; } = null!;
/// <summary>
/// Shell used to interpret the command. Valid values: `Bash`, `Sh`. Defaults to `Bash`.
/// </summary>
[Output("shellType")]
public Output<string> ShellType { get; private set; } = null!;
/// <summary>
/// IANA timezone the cron expression is evaluated in, for example `Europe/Berlin`.
/// </summary>
[Output("timezone")]
public Output<string?> Timezone { get; private set; } = null!;
/// <summary>
/// Create a Schedule resource with the given unique name, arguments, and options.
/// </summary>
///
/// <param name="name">The unique name of the resource</param>
/// <param name="args">The arguments used to populate this resource's properties</param>
/// <param name="options">A bag of options that control this resource's behavior</param>
public Schedule(string name, ScheduleArgs args, CustomResourceOptions? options = null)
: base("dokploy:index/schedule:Schedule", name, args ?? new ScheduleArgs(), MakeResourceOptions(options, ""))
{
}
private Schedule(string name, Input<string> id, ScheduleState? state = null, CustomResourceOptions? options = null)
: base("dokploy:index/schedule:Schedule", name, state, MakeResourceOptions(options, id))
{
}
private static CustomResourceOptions MakeResourceOptions(CustomResourceOptions? options, Input<string>? id)
{
var defaultOptions = new CustomResourceOptions
{
Version = Utilities.Version,
PluginDownloadURL = "https://gitea.coolify.vojtkov.dev/usr_unknown/pulumi-dokploy/releases/download/v${VERSION}",
};
var merged = CustomResourceOptions.Merge(defaultOptions, options);
// Override the ID if one was specified for consistency with other language SDKs.
merged.Id = id ?? merged.Id;
return merged;
}
/// <summary>
/// Get an existing Schedule resource's state with the given name, ID, and optional extra
/// properties used to qualify the lookup.
/// </summary>
///
/// <param name="name">The unique name of the resulting resource.</param>
/// <param name="id">The unique provider ID of the resource to lookup.</param>
/// <param name="state">Any extra arguments used during the lookup.</param>
/// <param name="options">A bag of options that control this resource's behavior</param>
public static Schedule Get(string name, Input<string> id, ScheduleState? state = null, CustomResourceOptions? options = null)
{
return new Schedule(name, id, state, options);
}
}
public sealed class ScheduleArgs : global::Pulumi.ResourceArgs
{
/// <summary>
/// Docker service name the schedule targets. Derived by Dokploy when omitted.
/// </summary>
[Input("appName")]
public Input<string>? AppName { get; set; }
/// <summary>
/// Application this schedule belongs to.
/// </summary>
[Input("applicationId")]
public Input<string>? ApplicationId { get; set; }
/// <summary>
/// Command to run.
/// </summary>
[Input("command", required: true)]
public Input<string> Command { get; set; } = null!;
/// <summary>
/// Compose stack this schedule belongs to.
/// </summary>
[Input("composeId")]
public Input<string>? ComposeId { get; set; }
/// <summary>
/// Standard five-field cron expression, for example `0 3 * * *`.
/// </summary>
[Input("cronExpression", required: true)]
public Input<string> CronExpression { get; set; } = null!;
/// <summary>
/// Free-form description.
/// </summary>
[Input("description")]
public Input<string>? Description { get; set; }
/// <summary>
/// Whether the schedule is active.
/// </summary>
[Input("enabled")]
public Input<bool>? Enabled { get; set; }
/// <summary>
/// Display name of the schedule.
/// </summary>
[Input("name")]
public Input<string>? Name { get; set; }
/// <summary>
/// Where the command runs. Valid values: `Application`, `Compose`, `Server`, `dokploy-server`. Defaults to `Application`.
/// </summary>
[Input("scheduleType")]
public Input<string>? ScheduleType { get; set; }
/// <summary>
/// Multi-line script to run instead of a single command.
/// </summary>
[Input("script")]
public Input<string>? Script { get; set; }
/// <summary>
/// Server this schedule runs on.
/// </summary>
[Input("serverId")]
public Input<string>? ServerId { get; set; }
/// <summary>
/// Service inside a Compose stack to run the command in.
/// </summary>
[Input("serviceName")]
public Input<string>? ServiceName { get; set; }
/// <summary>
/// Shell used to interpret the command. Valid values: `Bash`, `Sh`. Defaults to `Bash`.
/// </summary>
[Input("shellType")]
public Input<string>? ShellType { get; set; }
/// <summary>
/// IANA timezone the cron expression is evaluated in, for example `Europe/Berlin`.
/// </summary>
[Input("timezone")]
public Input<string>? Timezone { get; set; }
public ScheduleArgs()
{
}
public static new ScheduleArgs Empty => new ScheduleArgs();
}
public sealed class ScheduleState : global::Pulumi.ResourceArgs
{
/// <summary>
/// Docker service name the schedule targets. Derived by Dokploy when omitted.
/// </summary>
[Input("appName")]
public Input<string>? AppName { get; set; }
/// <summary>
/// Application this schedule belongs to.
/// </summary>
[Input("applicationId")]
public Input<string>? ApplicationId { get; set; }
/// <summary>
/// Command to run.
/// </summary>
[Input("command")]
public Input<string>? Command { get; set; }
/// <summary>
/// Compose stack this schedule belongs to.
/// </summary>
[Input("composeId")]
public Input<string>? ComposeId { get; set; }
/// <summary>
/// RFC 3339 timestamp of when the schedule was created.
/// </summary>
[Input("createdAt")]
public Input<string>? CreatedAt { get; set; }
/// <summary>
/// Standard five-field cron expression, for example `0 3 * * *`.
/// </summary>
[Input("cronExpression")]
public Input<string>? CronExpression { get; set; }
/// <summary>
/// Free-form description.
/// </summary>
[Input("description")]
public Input<string>? Description { get; set; }
/// <summary>
/// Whether the schedule is active.
/// </summary>
[Input("enabled")]
public Input<bool>? Enabled { get; set; }
/// <summary>
/// Display name of the schedule.
/// </summary>
[Input("name")]
public Input<string>? Name { get; set; }
/// <summary>
/// Where the command runs. Valid values: `Application`, `Compose`, `Server`, `dokploy-server`. Defaults to `Application`.
/// </summary>
[Input("scheduleType")]
public Input<string>? ScheduleType { get; set; }
/// <summary>
/// Multi-line script to run instead of a single command.
/// </summary>
[Input("script")]
public Input<string>? Script { get; set; }
/// <summary>
/// Server this schedule runs on.
/// </summary>
[Input("serverId")]
public Input<string>? ServerId { get; set; }
/// <summary>
/// Service inside a Compose stack to run the command in.
/// </summary>
[Input("serviceName")]
public Input<string>? ServiceName { get; set; }
/// <summary>
/// Shell used to interpret the command. Valid values: `Bash`, `Sh`. Defaults to `Bash`.
/// </summary>
[Input("shellType")]
public Input<string>? ShellType { get; set; }
/// <summary>
/// IANA timezone the cron expression is evaluated in, for example `Europe/Berlin`.
/// </summary>
[Input("timezone")]
public Input<string>? Timezone { get; set; }
public ScheduleState()
{
}
public static new ScheduleState Empty => new ScheduleState();
}
}
+5
View File
@@ -10,6 +10,11 @@ using Pulumi;
namespace Maxvojtkov.Dokploy
{
/// <summary>
/// HTTP basic authentication credentials protecting an application's domains.
///
/// &gt; Dokploy stores the password hashed and does not return it. The value in Terraform state is the one you configured.
/// </summary>
[DokployResourceType("dokploy:index/security:Security")]
public partial class Security : global::Pulumi.CustomResource
{
+7
View File
@@ -10,6 +10,13 @@ using Pulumi;
namespace Maxvojtkov.Dokploy
{
/// <summary>
/// An SSH key pair Dokploy uses to clone private Git repositories and to reach remote servers.
///
/// &gt; The private key is stored in Terraform state. Use a state backend with encryption at rest.
///
/// &gt; Dokploy's update endpoint only accepts `Name` and `Description`. Changing either key forces a new resource.
/// </summary>
[DokployResourceType("dokploy:index/sshKey:SshKey")]
public partial class SshKey : global::Pulumi.CustomResource
{
+197
View File
@@ -0,0 +1,197 @@
// *** WARNING: this file was generated by pulumi-language-dotnet. ***
// *** Do not edit by hand unless you're certain you know what you are doing! ***
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Pulumi.Serialization;
using Pulumi;
namespace Maxvojtkov.Dokploy
{
/// <summary>
/// An external secret manager Dokploy resolves environment variables from at deploy time.
///
/// Reference a secret from any `Env` value with `${{vault.&lt;scope&gt;.&lt;key&gt;}}`. The value is fetched when the deployment runs and is never stored in Dokploy — so rotating it in the vault takes effect on the next deploy with no Terraform change.
///
/// Supported `providerType` values: `Hashicorp` (Vault/OpenBao), `Infisical`, `Aws` (Secrets Manager), `Doppler`, `Azure` (Key Vault) and `Scaleway`.
/// </summary>
[DokployResourceType("dokploy:index/vaultProvider:VaultProvider")]
public partial class VaultProvider : global::Pulumi.CustomResource
{
/// <summary>
/// JSON array scoping which projects or environments may resolve secrets from this provider. Pass `jsonencode([])` to leave it unscoped.
/// </summary>
[Output("assignments")]
public Output<string> Assignments { get; private set; } = null!;
/// <summary>
/// Provider credentials as a JSON object, including the `providerType` discriminator.
/// </summary>
[Output("config")]
public Output<string> Config { get; private set; } = null!;
/// <summary>
/// RFC 3339 timestamp of when the connection was created.
/// </summary>
[Output("createdAt")]
public Output<string> CreatedAt { get; private set; } = null!;
/// <summary>
/// Name of the connection, unique within the organization.
/// </summary>
[Output("name")]
public Output<string> Name { get; private set; } = null!;
/// <summary>
/// Organization that owns the connection.
/// </summary>
[Output("organizationId")]
public Output<string> OrganizationId { get; private set; } = null!;
/// <summary>
/// Provider kind derived from `Config`.
/// </summary>
[Output("providerType")]
public Output<string> ProviderType { get; private set; } = null!;
/// <summary>
/// Create a VaultProvider resource with the given unique name, arguments, and options.
/// </summary>
///
/// <param name="name">The unique name of the resource</param>
/// <param name="args">The arguments used to populate this resource's properties</param>
/// <param name="options">A bag of options that control this resource's behavior</param>
public VaultProvider(string name, VaultProviderArgs args, CustomResourceOptions? options = null)
: base("dokploy:index/vaultProvider:VaultProvider", name, args ?? new VaultProviderArgs(), MakeResourceOptions(options, ""))
{
}
private VaultProvider(string name, Input<string> id, VaultProviderState? state = null, CustomResourceOptions? options = null)
: base("dokploy:index/vaultProvider:VaultProvider", name, state, MakeResourceOptions(options, id))
{
}
private static CustomResourceOptions MakeResourceOptions(CustomResourceOptions? options, Input<string>? id)
{
var defaultOptions = new CustomResourceOptions
{
Version = Utilities.Version,
PluginDownloadURL = "https://gitea.coolify.vojtkov.dev/usr_unknown/pulumi-dokploy/releases/download/v${VERSION}",
AdditionalSecretOutputs =
{
"config",
},
};
var merged = CustomResourceOptions.Merge(defaultOptions, options);
// Override the ID if one was specified for consistency with other language SDKs.
merged.Id = id ?? merged.Id;
return merged;
}
/// <summary>
/// Get an existing VaultProvider resource's state with the given name, ID, and optional extra
/// properties used to qualify the lookup.
/// </summary>
///
/// <param name="name">The unique name of the resulting resource.</param>
/// <param name="id">The unique provider ID of the resource to lookup.</param>
/// <param name="state">Any extra arguments used during the lookup.</param>
/// <param name="options">A bag of options that control this resource's behavior</param>
public static VaultProvider Get(string name, Input<string> id, VaultProviderState? state = null, CustomResourceOptions? options = null)
{
return new VaultProvider(name, id, state, options);
}
}
public sealed class VaultProviderArgs : global::Pulumi.ResourceArgs
{
/// <summary>
/// JSON array scoping which projects or environments may resolve secrets from this provider. Pass `jsonencode([])` to leave it unscoped.
/// </summary>
[Input("assignments", required: true)]
public Input<string> Assignments { get; set; } = null!;
[Input("config", required: true)]
private Input<string>? _config;
/// <summary>
/// Provider credentials as a JSON object, including the `providerType` discriminator.
/// </summary>
public Input<string>? Config
{
get => _config;
set
{
var emptySecret = Output.CreateSecret(0);
_config = Output.Tuple<Input<string>?, int>(value, emptySecret).Apply(t => t.Item1);
}
}
/// <summary>
/// Name of the connection, unique within the organization.
/// </summary>
[Input("name")]
public Input<string>? Name { get; set; }
public VaultProviderArgs()
{
}
public static new VaultProviderArgs Empty => new VaultProviderArgs();
}
public sealed class VaultProviderState : global::Pulumi.ResourceArgs
{
/// <summary>
/// JSON array scoping which projects or environments may resolve secrets from this provider. Pass `jsonencode([])` to leave it unscoped.
/// </summary>
[Input("assignments")]
public Input<string>? Assignments { get; set; }
[Input("config")]
private Input<string>? _config;
/// <summary>
/// Provider credentials as a JSON object, including the `providerType` discriminator.
/// </summary>
public Input<string>? Config
{
get => _config;
set
{
var emptySecret = Output.CreateSecret(0);
_config = Output.Tuple<Input<string>?, int>(value, emptySecret).Apply(t => t.Item1);
}
}
/// <summary>
/// RFC 3339 timestamp of when the connection was created.
/// </summary>
[Input("createdAt")]
public Input<string>? CreatedAt { get; set; }
/// <summary>
/// Name of the connection, unique within the organization.
/// </summary>
[Input("name")]
public Input<string>? Name { get; set; }
/// <summary>
/// Organization that owns the connection.
/// </summary>
[Input("organizationId")]
public Input<string>? OrganizationId { get; set; }
/// <summary>
/// Provider kind derived from `Config`.
/// </summary>
[Input("providerType")]
public Input<string>? ProviderType { get; set; }
public VaultProviderState()
{
}
public static new VaultProviderState Empty => new VaultProviderState();
}
}
+437
View File
@@ -0,0 +1,437 @@
// *** WARNING: this file was generated by pulumi-language-dotnet. ***
// *** Do not edit by hand unless you're certain you know what you are doing! ***
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Pulumi.Serialization;
using Pulumi;
namespace Maxvojtkov.Dokploy
{
/// <summary>
/// A scheduled backup of a Docker volume to a configured `dokploy.Destination`.
///
/// 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.
///
/// Set exactly one of the `*_id` attributes to say which service owns the volume.
/// </summary>
[DokployResourceType("dokploy:index/volumeBackup:VolumeBackup")]
public partial class VolumeBackup : global::Pulumi.CustomResource
{
/// <summary>
/// Docker service name that owns the volume. Derived by Dokploy when omitted.
/// </summary>
[Output("appName")]
public Output<string> AppName { get; private set; } = null!;
/// <summary>
/// Application that owns the volume.
/// </summary>
[Output("applicationId")]
public Output<string?> ApplicationId { get; private set; } = null!;
/// <summary>
/// Compose stack that owns the volume.
/// </summary>
[Output("composeId")]
public Output<string?> ComposeId { get; private set; } = null!;
/// <summary>
/// RFC 3339 timestamp of when the backup job was created.
/// </summary>
[Output("createdAt")]
public Output<string> CreatedAt { get; private set; } = null!;
/// <summary>
/// Standard five-field cron expression, for example `0 4 * * *`.
/// </summary>
[Output("cronExpression")]
public Output<string> CronExpression { get; private set; } = null!;
/// <summary>
/// Backup destination (S3-compatible bucket) to upload to.
/// </summary>
[Output("destinationId")]
public Output<string> DestinationId { get; private set; } = null!;
/// <summary>
/// Whether the backup schedule is active.
/// </summary>
[Output("enabled")]
public Output<bool> Enabled { get; private set; } = null!;
/// <summary>
/// Number of backups to retain. Older ones are pruned.
/// </summary>
[Output("keepLatestCount")]
public Output<int> KeepLatestCount { get; private set; } = null!;
/// <summary>
/// libSQL instance that owns the volume.
/// </summary>
[Output("libsqlId")]
public Output<string?> LibsqlId { get; private set; } = null!;
/// <summary>
/// MariaDB instance that owns the volume.
/// </summary>
[Output("mariadbId")]
public Output<string?> MariadbId { get; private set; } = null!;
/// <summary>
/// MongoDB instance that owns the volume.
/// </summary>
[Output("mongoId")]
public Output<string?> MongoId { get; private set; } = null!;
/// <summary>
/// MySQL instance that owns the volume.
/// </summary>
[Output("mysqlId")]
public Output<string?> MysqlId { get; private set; } = null!;
/// <summary>
/// Display name of the backup job.
/// </summary>
[Output("name")]
public Output<string> Name { get; private set; } = null!;
/// <summary>
/// PostgreSQL instance that owns the volume.
/// </summary>
[Output("postgresId")]
public Output<string?> PostgresId { get; private set; } = null!;
/// <summary>
/// Path prefix inside the destination bucket, for example `backups/shop/`.
/// </summary>
[Output("prefix")]
public Output<string> Prefix { get; private set; } = null!;
/// <summary>
/// Redis instance that owns the volume.
/// </summary>
[Output("redisId")]
public Output<string?> RedisId { get; private set; } = null!;
/// <summary>
/// Service inside a Compose stack that owns the volume.
/// </summary>
[Output("serviceName")]
public Output<string?> ServiceName { get; private set; } = null!;
/// <summary>
/// The kind of service that owns the volume. Valid values: `Application`, `Postgres`, `Mysql`, `Mariadb`, `Mongo`, `Redis`, `Compose`, `Libsql`. Defaults to `Application`.
/// </summary>
[Output("serviceType")]
public Output<string> ServiceType { get; private set; } = null!;
/// <summary>
/// Stop the service while the backup runs. Slower, but guarantees a consistent copy of data that is being written to.
/// </summary>
[Output("turnOff")]
public Output<bool> TurnOff { get; private set; } = null!;
/// <summary>
/// Name of the Docker volume to back up.
/// </summary>
[Output("volumeName")]
public Output<string> VolumeName { get; private set; } = null!;
/// <summary>
/// Create a VolumeBackup resource with the given unique name, arguments, and options.
/// </summary>
///
/// <param name="name">The unique name of the resource</param>
/// <param name="args">The arguments used to populate this resource's properties</param>
/// <param name="options">A bag of options that control this resource's behavior</param>
public VolumeBackup(string name, VolumeBackupArgs args, CustomResourceOptions? options = null)
: base("dokploy:index/volumeBackup:VolumeBackup", name, args ?? new VolumeBackupArgs(), MakeResourceOptions(options, ""))
{
}
private VolumeBackup(string name, Input<string> id, VolumeBackupState? state = null, CustomResourceOptions? options = null)
: base("dokploy:index/volumeBackup:VolumeBackup", name, state, MakeResourceOptions(options, id))
{
}
private static CustomResourceOptions MakeResourceOptions(CustomResourceOptions? options, Input<string>? id)
{
var defaultOptions = new CustomResourceOptions
{
Version = Utilities.Version,
PluginDownloadURL = "https://gitea.coolify.vojtkov.dev/usr_unknown/pulumi-dokploy/releases/download/v${VERSION}",
};
var merged = CustomResourceOptions.Merge(defaultOptions, options);
// Override the ID if one was specified for consistency with other language SDKs.
merged.Id = id ?? merged.Id;
return merged;
}
/// <summary>
/// Get an existing VolumeBackup resource's state with the given name, ID, and optional extra
/// properties used to qualify the lookup.
/// </summary>
///
/// <param name="name">The unique name of the resulting resource.</param>
/// <param name="id">The unique provider ID of the resource to lookup.</param>
/// <param name="state">Any extra arguments used during the lookup.</param>
/// <param name="options">A bag of options that control this resource's behavior</param>
public static VolumeBackup Get(string name, Input<string> id, VolumeBackupState? state = null, CustomResourceOptions? options = null)
{
return new VolumeBackup(name, id, state, options);
}
}
public sealed class VolumeBackupArgs : global::Pulumi.ResourceArgs
{
/// <summary>
/// Docker service name that owns the volume. Derived by Dokploy when omitted.
/// </summary>
[Input("appName")]
public Input<string>? AppName { get; set; }
/// <summary>
/// Application that owns the volume.
/// </summary>
[Input("applicationId")]
public Input<string>? ApplicationId { get; set; }
/// <summary>
/// Compose stack that owns the volume.
/// </summary>
[Input("composeId")]
public Input<string>? ComposeId { get; set; }
/// <summary>
/// Standard five-field cron expression, for example `0 4 * * *`.
/// </summary>
[Input("cronExpression", required: true)]
public Input<string> CronExpression { get; set; } = null!;
/// <summary>
/// Backup destination (S3-compatible bucket) to upload to.
/// </summary>
[Input("destinationId", required: true)]
public Input<string> DestinationId { get; set; } = null!;
/// <summary>
/// Whether the backup schedule is active.
/// </summary>
[Input("enabled")]
public Input<bool>? Enabled { get; set; }
/// <summary>
/// Number of backups to retain. Older ones are pruned.
/// </summary>
[Input("keepLatestCount")]
public Input<int>? KeepLatestCount { get; set; }
/// <summary>
/// libSQL instance that owns the volume.
/// </summary>
[Input("libsqlId")]
public Input<string>? LibsqlId { get; set; }
/// <summary>
/// MariaDB instance that owns the volume.
/// </summary>
[Input("mariadbId")]
public Input<string>? MariadbId { get; set; }
/// <summary>
/// MongoDB instance that owns the volume.
/// </summary>
[Input("mongoId")]
public Input<string>? MongoId { get; set; }
/// <summary>
/// MySQL instance that owns the volume.
/// </summary>
[Input("mysqlId")]
public Input<string>? MysqlId { get; set; }
/// <summary>
/// Display name of the backup job.
/// </summary>
[Input("name")]
public Input<string>? Name { get; set; }
/// <summary>
/// PostgreSQL instance that owns the volume.
/// </summary>
[Input("postgresId")]
public Input<string>? PostgresId { get; set; }
/// <summary>
/// Path prefix inside the destination bucket, for example `backups/shop/`.
/// </summary>
[Input("prefix", required: true)]
public Input<string> Prefix { get; set; } = null!;
/// <summary>
/// Redis instance that owns the volume.
/// </summary>
[Input("redisId")]
public Input<string>? RedisId { get; set; }
/// <summary>
/// Service inside a Compose stack that owns the volume.
/// </summary>
[Input("serviceName")]
public Input<string>? ServiceName { get; set; }
/// <summary>
/// The kind of service that owns the volume. Valid values: `Application`, `Postgres`, `Mysql`, `Mariadb`, `Mongo`, `Redis`, `Compose`, `Libsql`. Defaults to `Application`.
/// </summary>
[Input("serviceType")]
public Input<string>? ServiceType { get; set; }
/// <summary>
/// Stop the service while the backup runs. Slower, but guarantees a consistent copy of data that is being written to.
/// </summary>
[Input("turnOff")]
public Input<bool>? TurnOff { get; set; }
/// <summary>
/// Name of the Docker volume to back up.
/// </summary>
[Input("volumeName", required: true)]
public Input<string> VolumeName { get; set; } = null!;
public VolumeBackupArgs()
{
}
public static new VolumeBackupArgs Empty => new VolumeBackupArgs();
}
public sealed class VolumeBackupState : global::Pulumi.ResourceArgs
{
/// <summary>
/// Docker service name that owns the volume. Derived by Dokploy when omitted.
/// </summary>
[Input("appName")]
public Input<string>? AppName { get; set; }
/// <summary>
/// Application that owns the volume.
/// </summary>
[Input("applicationId")]
public Input<string>? ApplicationId { get; set; }
/// <summary>
/// Compose stack that owns the volume.
/// </summary>
[Input("composeId")]
public Input<string>? ComposeId { get; set; }
/// <summary>
/// RFC 3339 timestamp of when the backup job was created.
/// </summary>
[Input("createdAt")]
public Input<string>? CreatedAt { get; set; }
/// <summary>
/// Standard five-field cron expression, for example `0 4 * * *`.
/// </summary>
[Input("cronExpression")]
public Input<string>? CronExpression { get; set; }
/// <summary>
/// Backup destination (S3-compatible bucket) to upload to.
/// </summary>
[Input("destinationId")]
public Input<string>? DestinationId { get; set; }
/// <summary>
/// Whether the backup schedule is active.
/// </summary>
[Input("enabled")]
public Input<bool>? Enabled { get; set; }
/// <summary>
/// Number of backups to retain. Older ones are pruned.
/// </summary>
[Input("keepLatestCount")]
public Input<int>? KeepLatestCount { get; set; }
/// <summary>
/// libSQL instance that owns the volume.
/// </summary>
[Input("libsqlId")]
public Input<string>? LibsqlId { get; set; }
/// <summary>
/// MariaDB instance that owns the volume.
/// </summary>
[Input("mariadbId")]
public Input<string>? MariadbId { get; set; }
/// <summary>
/// MongoDB instance that owns the volume.
/// </summary>
[Input("mongoId")]
public Input<string>? MongoId { get; set; }
/// <summary>
/// MySQL instance that owns the volume.
/// </summary>
[Input("mysqlId")]
public Input<string>? MysqlId { get; set; }
/// <summary>
/// Display name of the backup job.
/// </summary>
[Input("name")]
public Input<string>? Name { get; set; }
/// <summary>
/// PostgreSQL instance that owns the volume.
/// </summary>
[Input("postgresId")]
public Input<string>? PostgresId { get; set; }
/// <summary>
/// Path prefix inside the destination bucket, for example `backups/shop/`.
/// </summary>
[Input("prefix")]
public Input<string>? Prefix { get; set; }
/// <summary>
/// Redis instance that owns the volume.
/// </summary>
[Input("redisId")]
public Input<string>? RedisId { get; set; }
/// <summary>
/// Service inside a Compose stack that owns the volume.
/// </summary>
[Input("serviceName")]
public Input<string>? ServiceName { get; set; }
/// <summary>
/// The kind of service that owns the volume. Valid values: `Application`, `Postgres`, `Mysql`, `Mariadb`, `Mongo`, `Redis`, `Compose`, `Libsql`. Defaults to `Application`.
/// </summary>
[Input("serviceType")]
public Input<string>? ServiceType { get; set; }
/// <summary>
/// Stop the service while the backup runs. Slower, but guarantees a consistent copy of data that is being written to.
/// </summary>
[Input("turnOff")]
public Input<bool>? TurnOff { get; set; }
/// <summary>
/// Name of the Docker volume to back up.
/// </summary>
[Input("volumeName")]
public Input<string>? VolumeName { get; set; }
public VolumeBackupState()
{
}
public static new VolumeBackupState Empty => new VolumeBackupState();
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"resource": true,
"name": "dokploy",
"version": "0.1.0",
"version": "0.2.0",
"server": "https://gitea.coolify.vojtkov.dev/usr_unknown/pulumi-dokploy/releases/download/v${VERSION}"
}
+1 -1
View File
@@ -1 +1 @@
0.1.0
0.2.0