Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 5 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,10 @@ release set. Override individual selectors with
`runtime.sitectl.package_versions` when intentionally testing or promoting a
different compatible release set.

All non-ISLE presets use the coordinated sitectl v1.0.0 core/plugin release.
ISLE intentionally remains on its last released compatibility set—sitectl
v0.40.0, sitectl-drupal v0.12.0, and sitectl-isle v0.19.0—until its remaining
components are ready for a coordinated v1 release. Keep ISLE on that complete
set rather than mixing its pre-v1 plugin with v1 packages.
All presets use their coordinated sitectl v1.0.0 core/plugin release set. The
ISLE preset selects the `libops/isle` v1.1.0 template; every other application
preset remains on its v1.0.0 template contract. Keep each preset's complete
template and package set together when promoting an override.

GCP deployments have two Terraform ownership layers. Apply
[`modules/gcp-foundation`](modules/gcp-foundation/README.md) once per service
Expand Down Expand Up @@ -64,7 +63,7 @@ No resources.
| <a name="input_name"></a> [name](#input\_name) | Deployment name. | `string` | n/a | yes |
| <a name="input_cloud_provider"></a> [cloud\_provider](#input\_cloud\_provider) | Compatibility selector for the root GCP entrypoint. Use providers/do or providers/linode for other clouds. | `string` | `"gcp"` | no |
| <a name="input_gcp"></a> [gcp](#input\_gcp) | Google Cloud infrastructure settings. | <pre>object({<br/> project_id = optional(string, "")<br/> project_number = optional(string, "")<br/> region = optional(string, "us-east5")<br/> zone = optional(string, "us-east5-b")<br/><br/> identity = optional(object({<br/> vm_service_account_email = optional(string, "")<br/> app_service_account_email = optional(string, "")<br/> app_credentials_enabled = optional(bool, false)<br/> }), {})<br/><br/> instance = optional(object({<br/> machine_type = optional(string, "n4-standard-2")<br/> os = optional(string, "cos-125-19216-220-185")<br/> production = optional(bool, false)<br/> }), {})<br/><br/> disks = optional(object({<br/> type = optional(string, "hyperdisk-balanced")<br/> docker_volumes_size_gb = optional(number, 50)<br/> }), {})<br/><br/> network = optional(object({<br/> create = optional(bool, true)<br/> project_id = optional(string, "")<br/> name = optional(string, "")<br/> subnetwork = optional(string, "")<br/> ip_cidr_range = optional(string, "10.42.0.0/24")<br/> mtu = optional(number, 1460)<br/> power_button_allowed_ips = optional(list(string), [])<br/> power_button_ip_depth = optional(number)<br/> ssh_ipv4 = optional(list(string), [])<br/> ssh_ipv6 = optional(list(string), [])<br/> }), {})<br/><br/> snapshots = optional(object({<br/> enabled = optional(bool, false)<br/> }), {})<br/><br/> overlay = optional(object({<br/> source_instance = optional(string, "")<br/> volume_names = optional(list(string), [])<br/> }), {})<br/><br/> cloud_init = optional(object({<br/> initcmd = optional(list(string), [])<br/> runcmd = optional(list(string), [])<br/> }), {})<br/><br/> artifact_registry = optional(object({<br/> repository = optional(string, "")<br/> location = optional(string, "us")<br/> }), {})<br/><br/> power_management = optional(object({<br/> enabled = optional(bool, false)<br/> start_role = optional(string, "")<br/> suspend_role = optional(string, "")<br/> frontend = optional(object({<br/> image = string<br/> port = optional(number, 8080)<br/> cpu = optional(string, "1000m")<br/> memory = optional(string, "1Gi")<br/> }), null)<br/> }), {})<br/><br/> rollout = optional(object({<br/> enabled = optional(bool, false)<br/> release_url = optional(string, "")<br/> release_sha256 = optional(string, "")<br/> port = optional(number, 8081)<br/> jwks_uri = optional(string, "")<br/> jwt_audience = optional(string, "")<br/> custom_claims = optional(string, "")<br/> allowed_ipv4 = optional(list(string), ["10.0.0.0/8"])<br/> }), {})<br/> })</pre> | `{}` | no |
| <a name="input_runtime"></a> [runtime](#input\_runtime) | Provider-neutral compose/runtime settings. | <pre>object({<br/> rootfs = optional(string, "")<br/> rootfs_archive_url = optional(string, "")<br/> rootfs_archive_sha256 = optional(string, "")<br/> users = optional(map(list(string)), {})<br/><br/> compose = optional(object({<br/> primary = optional(string, "")<br/> ingress_port = optional(number, 80)<br/> ingress = optional(object({<br/> letsencrypt = optional(bool, false)<br/> bot_mitigation = optional(bool, false)<br/> mode = optional(string, "")<br/> domain = optional(string, "")<br/> acme_email = optional(string, "")<br/> trusted_ips = optional(list(string), [])<br/> max_upload_size = optional(string, "")<br/> upload_timeout = optional(string, "")<br/> }), {})<br/> repo = optional(string, "")<br/> branch = optional(string, "main")<br/> projects = optional(map(object({<br/> docker_compose_repo = string<br/> docker_compose_branch = optional(string)<br/> project_dir = optional(string)<br/> compose_project_name = optional(string)<br/> ingress_port = optional(number)<br/> ingress = optional(object({<br/> letsencrypt = optional(bool)<br/> bot_mitigation = optional(bool)<br/> mode = optional(string)<br/> domain = optional(string)<br/> acme_email = optional(string)<br/> trusted_ips = optional(list(string))<br/> max_upload_size = optional(string)<br/> upload_timeout = optional(string)<br/> }), {})<br/> sitectl_context_name = optional(string)<br/> sitectl_plugin = optional(string)<br/> sitectl_environment = optional(string)<br/> sitectl_packages = optional(list(string))<br/> sitectl_verify_args = optional(list(string))<br/> docker_compose_init = optional(list(string))<br/> docker_compose_up = optional(list(string))<br/> docker_compose_down = optional(list(string))<br/> docker_compose_rollout = optional(list(string))<br/> })), {})<br/> init = optional(list(string))<br/> up = optional(list(string))<br/> down = optional(list(string))<br/> rollout = optional(list(string))<br/> }), {})<br/><br/> sitectl = optional(object({<br/> packages = optional(list(string))<br/> version = optional(string, "latest")<br/> package_versions = optional(map(string), {})<br/> context_name = optional(string, "")<br/> plugin = optional(string, "core")<br/> environment = optional(string, "production")<br/> verify_args = optional(list(string), [])<br/> }), {})<br/><br/> docker = optional(object({<br/> # renovate: datasource=github-releases depName=docker-compose packageName=docker/compose versioning=semver<br/> compose_version = optional(string, "v5.3.1")<br/> # renovate: datasource=github-releases depName=docker-buildx packageName=docker/buildx versioning=semver<br/> buildx_version = optional(string, "v0.35.0")<br/> }), {})<br/><br/> managed_runtime = optional(object({<br/> enabled = optional(bool, true)<br/> internal_services_enabled = optional(bool, false)<br/> internal_services_auto_update = optional(bool, false)<br/> artifacts = optional(list(object({<br/> name = string<br/> url = string<br/> sha256 = string<br/> path = string<br/> mode = optional(string, "0755")<br/> owner = optional(string, "root")<br/> group = optional(string, "root")<br/> restart = optional(string, "")<br/> })), [])<br/> }), {})<br/><br/> vault = optional(object({<br/> addr = optional(string, "")<br/> namespace = optional(string, "")<br/> role = optional(string, "")<br/> agent_enabled = optional(bool, false)<br/> auth_method = optional(string, "auto")<br/> gcp_auth_mount_path = optional(string, "auth/gcp")<br/> agent_token_path = optional(string, "/mnt/disks/data/vault/token")<br/> agent_additional_config = optional(string, "")<br/> agent_templates = optional(list(object({<br/> destination = string<br/> contents = string<br/> perms = optional(string, "0640")<br/> command = optional(string, "")<br/> })), [])<br/> }), {})<br/><br/> extra_env = optional(map(string), {})<br/> })</pre> | `{}` | no |
| <a name="input_runtime"></a> [runtime](#input\_runtime) | Provider-neutral compose/runtime settings. | <pre>object({<br/> rootfs = optional(string, "")<br/> rootfs_archive_url = optional(string, "")<br/> rootfs_archive_sha256 = optional(string, "")<br/> users = optional(map(list(string)), {})<br/><br/> compose = optional(object({<br/> primary = optional(string, "")<br/> ingress_port = optional(number, 80)<br/> ingress = optional(object({<br/> letsencrypt = optional(bool, false)<br/> bot_mitigation = optional(bool, false)<br/> mode = optional(string, "")<br/> domain = optional(string, "")<br/> acme_email = optional(string, "")<br/> trusted_ips = optional(list(string), [])<br/> max_upload_size = optional(string, "")<br/> upload_timeout = optional(string, "")<br/> }), {})<br/> repo = optional(string, "")<br/> branch = optional(string, "")<br/> projects = optional(map(object({<br/> docker_compose_repo = string<br/> docker_compose_branch = optional(string)<br/> project_dir = optional(string)<br/> compose_project_name = optional(string)<br/> ingress_port = optional(number)<br/> ingress = optional(object({<br/> letsencrypt = optional(bool)<br/> bot_mitigation = optional(bool)<br/> mode = optional(string)<br/> domain = optional(string)<br/> acme_email = optional(string)<br/> trusted_ips = optional(list(string))<br/> max_upload_size = optional(string)<br/> upload_timeout = optional(string)<br/> }), {})<br/> sitectl_context_name = optional(string)<br/> sitectl_plugin = optional(string)<br/> sitectl_environment = optional(string)<br/> sitectl_packages = optional(list(string))<br/> sitectl_verify_args = optional(list(string))<br/> docker_compose_init = optional(list(string))<br/> docker_compose_up = optional(list(string))<br/> docker_compose_down = optional(list(string))<br/> docker_compose_rollout = optional(list(string))<br/> })), {})<br/> init = optional(list(string))<br/> up = optional(list(string))<br/> down = optional(list(string))<br/> rollout = optional(list(string))<br/> }), {})<br/><br/> sitectl = optional(object({<br/> packages = optional(list(string))<br/> version = optional(string, "latest")<br/> package_versions = optional(map(string), {})<br/> context_name = optional(string, "")<br/> plugin = optional(string, "core")<br/> environment = optional(string, "production")<br/> verify_args = optional(list(string), [])<br/> }), {})<br/><br/> docker = optional(object({<br/> # renovate: datasource=github-releases depName=docker-compose packageName=docker/compose versioning=semver<br/> compose_version = optional(string, "v5.3.1")<br/> # renovate: datasource=github-releases depName=docker-buildx packageName=docker/buildx versioning=semver<br/> buildx_version = optional(string, "v0.35.0")<br/> }), {})<br/><br/> managed_runtime = optional(object({<br/> enabled = optional(bool, true)<br/> internal_services_enabled = optional(bool, false)<br/> internal_services_auto_update = optional(bool, false)<br/> artifacts = optional(list(object({<br/> name = string<br/> url = string<br/> sha256 = string<br/> path = string<br/> mode = optional(string, "0755")<br/> owner = optional(string, "root")<br/> group = optional(string, "root")<br/> restart = optional(string, "")<br/> })), [])<br/> }), {})<br/><br/> vault = optional(object({<br/> addr = optional(string, "")<br/> namespace = optional(string, "")<br/> role = optional(string, "")<br/> agent_enabled = optional(bool, false)<br/> auth_method = optional(string, "auto")<br/> gcp_auth_mount_path = optional(string, "auth/gcp")<br/> agent_token_path = optional(string, "/mnt/disks/data/vault/token")<br/> agent_additional_config = optional(string, "")<br/> agent_templates = optional(list(object({<br/> destination = string<br/> contents = string<br/> perms = optional(string, "0640")<br/> command = optional(string, "")<br/> })), [])<br/> }), {})<br/><br/> extra_env = optional(map(string), {})<br/> })</pre> | `{}` | no |
| <a name="input_template"></a> [template](#input\_template) | Optional compose template preset. Supported values are archivesspace, ojs, isle, drupal, wp, omeka-s, and omeka-classic. Explicit runtime settings override preset defaults. | `string` | `""` | no |

## Outputs
Expand Down
2 changes: 1 addition & 1 deletion ansible/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ all:
sitectl:
environment: production
package_versions:
sitectl-isle: v0.19.0
sitectl-isle: v1.0.0
wp-prod.example.edu:
ansible_user: debian
cloud_compose_name: wp-prod
Expand Down
6 changes: 3 additions & 3 deletions ci/config-management-smoke-inner.sh
Original file line number Diff line number Diff line change
Expand Up @@ -262,9 +262,9 @@ assert env["DOCKER_COMPOSE_REPO"] == "https://github.com/libops/isle"
assert env["SITECTL_PLUGIN"] == "isle"
assert "sitectl-isle" in env["SITECTL_PACKAGES"].split()
assert json.loads(env["SITECTL_PACKAGE_VERSIONS"]) == {
"sitectl": "v0.40.0",
"sitectl-drupal": "v0.12.0",
"sitectl-isle": "v0.19.0",
"sitectl": "v1.0.0",
"sitectl-drupal": "v1.0.0",
"sitectl-isle": "v1.0.0",
}
assert project["docker_compose_repo"] == "https://github.com/libops/isle"
assert project["project_dir"] == "/mnt/disks/data/libops/isle/main"
Expand Down
4 changes: 2 additions & 2 deletions ci/terraform-validate.sh
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,10 @@ validate_public_provider_graph() {
expected_sources=$'hashicorp/cloudinit\nhashicorp/google\nhashicorp/time'
;;
providers/do)
expected_sources=$'digitalocean/digitalocean\nhashicorp/cloudinit'
expected_sources='digitalocean/digitalocean'
;;
providers/linode)
expected_sources=$'hashicorp/cloudinit\nlinode/linode'
expected_sources='linode/linode'
;;
*)
return 0
Expand Down
15 changes: 8 additions & 7 deletions docs/managed-runtime.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,11 @@ core and plugins independently. The provider-neutral
backward-compatible fallback only for an installed package with neither a
template selector nor an explicit per-package selector.

The ISLE preset is an intentional temporary exception to the v1 defaults. It
stays on sitectl v0.40.0, sitectl-drupal v0.12.0, and sitectl-isle v0.19.0 until
the remaining ISLE components can ship together as v1. Do not combine the
pre-v1 ISLE plugin with the v1 core or Drupal plugin.
All presets select coordinated sitectl v1 release packages. The ISLE preset
uses the `libops/isle` v1.1.0 template with sitectl, sitectl-drupal, and
sitectl-isle v1.0.0. Every other application preset remains on its v1.0.0
template contract. Override the template or package selectors only as one
reviewed, compatible release set.

Omitting `runtime.sitectl.packages` selects the template's package set. An
explicit list replaces that set; `packages = []` or `packages = ["sitectl"]`
Expand All @@ -50,9 +51,9 @@ runtime = {
"sitectl-isle",
]
package_versions = {
sitectl = "v0.40.0"
sitectl-drupal = "v0.12.0"
sitectl-isle = "v0.19.0"
sitectl = "v1.0.0"
sitectl-drupal = "v1.0.0"
sitectl-isle = "v1.0.0"
}
plugin = "isle"
}
Expand Down
4 changes: 3 additions & 1 deletion docs/runtime-contracts.md
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,9 @@ The generated app env file exports `COMPOSE_BIND_PORT` for that purpose.

`docker_compose_branch` (the `runtime.compose.branch` input at the public
module boundary) accepts either a branch/tag name or a full 40-character Git
commit. The source-preparation and `init` phases follow a configured moving ref.
commit. When the public input is omitted or empty, the selected template
preset supplies its reviewed branch; the no-preset registry default remains
`main`. The source-preparation and `init` phases follow a configured moving ref.
An ordinary `up` or service restart instead validates and preserves the commit
selected by the last successful init or rollout. This keeps a detached feature
or pull-request deployment operable until an explicit rollout selects another
Expand Down
Loading