diff --git a/internal/docker/container.go b/internal/docker/container.go new file mode 100644 index 0000000..bd21bf9 --- /dev/null +++ b/internal/docker/container.go @@ -0,0 +1,75 @@ +package docker + +import ( + "fmt" + + "github.com/pulumi/pulumi-docker/sdk/v3/go/docker" + "github.com/pulumi/pulumi/sdk/v3/go/pulumi" +) + +// DockerContainerConfig is the configuration +// used to create the Gitea docker container. +type DockerContainerConfig struct { + Image pulumi.StringInput + Ipv4Address pulumi.StringInput + EnvVars pulumi.StringArray + Name pulumi.StringInput + Network pulumi.StringInput + Volumes []DockerVolumeConfig +} + +// VolumeConfig is the configuration +// used for mounting a host directory +// to a directory inside a container. +type DockerVolumeConfig struct { + HostPath pulumi.StringInput + MountPath pulumi.StringInput +} + +func CreateDockerContainer(ctx *pulumi.Context, c DockerContainerConfig) error { + // all containers will mount the host's timezone and localtime files + // to ensure the correct time is synced. + volumes := []docker.ContainerVolumeInput{ + docker.ContainerVolumeArgs{ + ContainerPath: pulumi.String("/etc/timezone"), + HostPath: pulumi.String("/etc/timezone"), + ReadOnly: pulumi.BoolPtr(true), + }, + docker.ContainerVolumeArgs{ + ContainerPath: pulumi.String("/etc/localtime"), + HostPath: pulumi.String("/etc/localtime"), + ReadOnly: pulumi.BoolPtr(true), + }, + } + + // create additional (optional) container volumes. + for _, v := range c.Volumes { + vArg := docker.ContainerVolumeArgs{ + ContainerPath: v.MountPath, + HostPath: v.HostPath, + } + volumes = append(volumes, vArg) + } + + args := docker.ContainerArgs{ + Envs: c.EnvVars, + Image: c.Image, + Hostname: c.Name, + Name: c.Name, + NetworksAdvanced: docker.ContainerNetworksAdvancedArray{ + docker.ContainerNetworksAdvancedArgs{ + Name: c.Network, + Ipv4Address: c.Ipv4Address, + }, + }, + Restart: pulumi.String("unless-stopped"), + Volumes: docker.ContainerVolumeArray(volumes), + } + + _, err := docker.NewContainer(ctx, "gitea_container", &args) + if err != nil { + return fmt.Errorf("unable to create the Gitea docker container, %w", err) + } + + return nil +} diff --git a/internal/docker/image.go b/internal/docker/image.go new file mode 100644 index 0000000..cb94cbc --- /dev/null +++ b/internal/docker/image.go @@ -0,0 +1,34 @@ +package docker + +import ( + "fmt" + + "github.com/pulumi/pulumi-docker/sdk/v3/go/docker" + "github.com/pulumi/pulumi/sdk/v3/go/pulumi" +) + +// DockerImageConfig is the configuration +// used to create the local Gitea docker +// image. +type DockerImageConfig struct { + ImageName pulumi.StringInput + BuildContext pulumi.StringInput + Version pulumi.StringInput +} + +// CreateDockerImage creates a local Docker image. +func CreateDockerImage(ctx *pulumi.Context, c DockerImageConfig) error { + args := docker.ImageArgs{ + ImageName: c.ImageName, + SkipPush: pulumi.Bool(true), + Build: docker.DockerBuildArgs{ + Context: c.BuildContext, + }, + } + + _, err := docker.NewImage(ctx, "gitea_image", &args) + if err != nil { + return fmt.Errorf("unable to create the Gitea docker image, %w", err) + } + return nil +} diff --git a/internal/docker/network.go b/internal/docker/network.go new file mode 100644 index 0000000..2b2aa87 --- /dev/null +++ b/internal/docker/network.go @@ -0,0 +1,35 @@ +package docker + +import ( + "fmt" + "github.com/pulumi/pulumi-docker/sdk/v3/go/docker" + "github.com/pulumi/pulumi/sdk/v3/go/pulumi" +) + +// DockerNetworkConfig is the configuration +// used for creating a Docker network. +type DockerNetworkConfig struct { + Name pulumi.StringInput + Subnet pulumi.StringInput + Driver pulumi.StringInput +} + +// CreateNetwork creates the forge platform's Docker network. +func CreateNetwork(ctx *pulumi.Context, c DockerNetworkConfig, label string) error { + args := docker.NetworkArgs{ + Name: c.Name, + IpamDriver: c.Driver, + IpamConfigs: docker.NetworkIpamConfigArray{ + docker.NetworkIpamConfigArgs{ + Subnet: c.Subnet, + }, + }, + } + + _, err := docker.NewNetwork(ctx, label, &args) + if err != nil { + return fmt.Errorf("unable to create the docker network, %w", err) + } + + return nil +} diff --git a/internal/stacks/actions.go b/internal/stacks/actions.go new file mode 100644 index 0000000..e69de29