diff --git a/.icons/rdp.svg b/.icons/rdp.svg new file mode 100644 index 00000000..a6722326 --- /dev/null +++ b/.icons/rdp.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MAINTAINER.md b/MAINTAINER.md index 69d1a657..2011b5aa 100644 --- a/MAINTAINER.md +++ b/MAINTAINER.md @@ -14,9 +14,7 @@ brew install go sudo apt install golang-go ``` -## Daily Tasks - -### Review PRs +## Reviewing a PR Check that PRs have: @@ -26,7 +24,7 @@ Check that PRs have: - [ ] Formatted code (`bun run fmt`) - [ ] Avatar image for new namespaces (`avatar.png` or `avatar.svg` in `.images/`) -#### Version Guidelines +### Version Guidelines When reviewing PRs, ensure the version change follows semantic versioning: @@ -42,7 +40,7 @@ PRs should clearly indicate the version change (e.g., `v1.2.3 → v1.2.4`). go build ./cmd/readmevalidation && ./readmevalidation ``` -## Releases +## Making a Release ### Create Release Tags @@ -99,5 +97,3 @@ status: "community" # or "partner", "official" - **Tests fail**: Ensure Docker with `--network=host`, check Terraform syntax - **Wrong file structure**: Use `./scripts/new_module.sh` for new modules - **Missing namespace avatar**: Must be `avatar.png` or `avatar.svg` in `.images/` directory - -That's it. Keep it simple. diff --git a/bun.lockb b/bun.lockb index 7f379c9d..2fde7ba2 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index 733230db..1f34a2d2 100644 --- a/package.json +++ b/package.json @@ -8,16 +8,16 @@ "update-version": "./update-version.sh" }, "devDependencies": { - "@types/bun": "^1.2.9", - "bun-types": "^1.1.23", + "@types/bun": "^1.2.18", + "bun-types": "^1.2.18", "gray-matter": "^4.0.3", - "marked": "^12.0.2", - "prettier": "^3.3.3", - "prettier-plugin-sh": "^0.13.1", + "marked": "^16.0.0", + "prettier": "^3.6.2", + "prettier-plugin-sh": "^0.18.0", "prettier-plugin-terraform-formatter": "^1.2.1" }, "peerDependencies": { - "typescript": "^5.5.4" + "typescript": "^5.8.3" }, "prettier": { "plugins": [ @@ -25,4 +25,4 @@ "prettier-plugin-terraform-formatter" ] } -} \ No newline at end of file +} diff --git a/registry/coder/modules/local-windows-rdp/README.md b/registry/coder/modules/local-windows-rdp/README.md index 4b447967..4ff726a1 100644 --- a/registry/coder/modules/local-windows-rdp/README.md +++ b/registry/coder/modules/local-windows-rdp/README.md @@ -1,24 +1,25 @@ --- -display_name: Windows RDP Desktop +display_name: RDP Desktop description: Enable RDP on Windows and add a one-click Coder Desktop button for seamless access -icon: ../../../../.icons/desktop.svg +icon: ../../../../.icons/rdp.svg maintainer_github: coder verified: true supported_os: [windows] -tags: [rdp, windows, desktop, remote] +tags: [rdp, windows, desktop, local] --- # Windows RDP Desktop This module enables Remote Desktop Protocol (RDP) on Windows workspaces and adds a one-click button to launch RDP sessions directly through [Coder Desktop](https://coder.com/docs/user-guides/desktop). It provides a complete, standalone solution for RDP access, eliminating the need for manual configuration or port forwarding through the Coder CLI. -> **Note**: [Coder Desktop](https://coder.com/docs/user-guides/desktop) is required on client devices to use the Local Windows RDP access feature. +> [!NOTE] +> [Coder Desktop](https://coder.com/docs/user-guides/desktop) is required on client devices to use the Local Windows RDP access feature. ```tf module "rdp_desktop" { count = data.coder_workspace.me.start_count source = "registry.coder.com/coder/local-windows-rdp/coder" - version = "1.0.0" + version = "1.0.1" agent_id = coder_agent.main.id agent_name = coder_agent.main.name } @@ -51,7 +52,7 @@ Uses default credentials (Username: `Administrator`, Password: `coderRDP!`): module "rdp_desktop" { count = data.coder_workspace.me.start_count source = "registry.coder.com/coder/local-windows-rdp/coder" - version = "1.0.0" + version = "1.0.1" agent_id = coder_agent.main.id agent_name = coder_agent.main.name } @@ -65,7 +66,7 @@ Specify a custom display name for the `coder_app` button: module "rdp_desktop" { count = data.coder_workspace.me.start_count source = "registry.coder.com/coder/local-windows-rdp/coder" - version = "1.0.0" + version = "1.0.1" agent_id = coder_agent.windows.id agent_name = "windows" display_name = "Windows Desktop" diff --git a/registry/coder/modules/local-windows-rdp/main.test.ts b/registry/coder/modules/local-windows-rdp/main.test.ts index 75b6dde0..9799b481 100644 --- a/registry/coder/modules/local-windows-rdp/main.test.ts +++ b/registry/coder/modules/local-windows-rdp/main.test.ts @@ -73,7 +73,7 @@ describe("local-windows-rdp", async () => { expect(app).not.toBeNull(); expect(app?.slug).toBe("rdp-desktop"); expect(app?.display_name).toBe("RDP Desktop"); - expect(app?.icon).toBe("/icon/desktop.svg"); + expect(app?.icon).toBe("/icon/rdp.svg"); expect(app?.external).toBe(true); // Verify the URI format @@ -95,7 +95,7 @@ describe("local-windows-rdp", async () => { // Verify the script was created expect(script).not.toBeNull(); expect(script?.display_name).toBe("Configure RDP"); - expect(script?.icon).toBe("/icon/desktop.svg"); + expect(script?.icon).toBe("/icon/rdp.svg"); expect(script?.run_on_start).toBe(true); expect(script?.run_on_stop).toBe(false); diff --git a/registry/coder/modules/local-windows-rdp/main.tf b/registry/coder/modules/local-windows-rdp/main.tf index b5f59445..0999c1ff 100644 --- a/registry/coder/modules/local-windows-rdp/main.tf +++ b/registry/coder/modules/local-windows-rdp/main.tf @@ -60,7 +60,7 @@ data "coder_workspace" "me" {} resource "coder_script" "rdp_setup" { agent_id = var.agent_id display_name = "Configure RDP" - icon = "/icon/desktop.svg" + icon = "/icon/rdp.svg" script = templatefile("${path.module}/configure-rdp.ps1", { username = var.username password = var.password @@ -73,9 +73,8 @@ resource "coder_app" "rdp_desktop" { slug = "rdp-desktop" display_name = var.display_name url = "coder://${local.server_name}/v0/open/ws/${data.coder_workspace.me.name}/agent/${var.agent_name}/rdp?username=${var.username}&password=${var.password}" - icon = "/icon/desktop.svg" + icon = "/icon/rdp.svg" external = true order = var.order group = var.group } - diff --git a/registry/coder/modules/windows-rdp/README.md b/registry/coder/modules/windows-rdp/README.md index 0899a79a..86248692 100644 --- a/registry/coder/modules/windows-rdp/README.md +++ b/registry/coder/modules/windows-rdp/README.md @@ -1,5 +1,5 @@ --- -display_name: Windows RDP +display_name: RDP Web description: RDP Server and Web Client, powered by Devolutions Gateway icon: ../../../../.icons/desktop.svg maintainer_github: coder @@ -14,11 +14,10 @@ Enable Remote Desktop + a web based client on Windows workspaces, powered by [de ```tf # AWS example. See below for examples of using this module with other providers module "windows_rdp" { - count = data.coder_workspace.me.start_count - source = "registry.coder.com/coder/windows-rdp/coder" - version = "1.2.1" - agent_id = resource.coder_agent.main.id - resource_id = resource.aws_instance.dev.id + count = data.coder_workspace.me.start_count + source = "registry.coder.com/coder/windows-rdp/coder" + version = "1.2.2" + agent_id = resource.coder_agent.main.id } ``` @@ -32,11 +31,10 @@ module "windows_rdp" { ```tf module "windows_rdp" { - count = data.coder_workspace.me.start_count - source = "registry.coder.com/coder/windows-rdp/coder" - version = "1.2.1" - agent_id = resource.coder_agent.main.id - resource_id = resource.aws_instance.dev.id + count = data.coder_workspace.me.start_count + source = "registry.coder.com/coder/windows-rdp/coder" + version = "1.2.2" + agent_id = resource.coder_agent.main.id } ``` @@ -44,11 +42,10 @@ module "windows_rdp" { ```tf module "windows_rdp" { - count = data.coder_workspace.me.start_count - source = "registry.coder.com/coder/windows-rdp/coder" - version = "1.2.1" - agent_id = resource.coder_agent.main.id - resource_id = resource.google_compute_instance.dev[0].id + count = data.coder_workspace.me.start_count + source = "registry.coder.com/coder/windows-rdp/coder" + version = "1.2.2" + agent_id = resource.coder_agent.main.id } ``` @@ -58,13 +55,8 @@ module "windows_rdp" { module "windows_rdp" { count = data.coder_workspace.me.start_count source = "registry.coder.com/coder/windows-rdp/coder" - version = "1.2.1" + version = "1.2.2" agent_id = resource.coder_agent.main.id - resource_id = resource.aws_instance.dev.id - devolutions_gateway_version = "2025.1.6" # Specify a specific version + devolutions_gateway_version = "2025.2.2" # Specify a specific version } ``` - -## Roadmap - -- [ ] Test on Microsoft Azure. diff --git a/registry/coder/modules/windows-rdp/main.test.ts b/registry/coder/modules/windows-rdp/main.test.ts index 01a7e46d..125b3b3b 100644 --- a/registry/coder/modules/windows-rdp/main.test.ts +++ b/registry/coder/modules/windows-rdp/main.test.ts @@ -8,7 +8,6 @@ import { type TestVariables = Readonly<{ agent_id: string; - resource_id: string; share?: string; admin_username?: string; admin_password?: string; @@ -45,13 +44,11 @@ describe("Web RDP", async () => { await runTerraformInit(import.meta.dir); testRequiredVariables(import.meta.dir, { agent_id: "foo", - resource_id: "bar", }); it("Has the PowerShell script install Devolutions Gateway", async () => { const state = await runTerraformApply(import.meta.dir, { agent_id: "foo", - resource_id: "bar", }); const lines = findWindowsRdpScript(state) @@ -96,7 +93,6 @@ describe("Web RDP", async () => { import.meta.dir, { agent_id: "foo", - resource_id: "bar", }, ); @@ -116,7 +112,6 @@ describe("Web RDP", async () => { import.meta.dir, { agent_id: "foo", - resource_id: "bar", admin_username: customAdminUsername, admin_password: customAdminPassword, }, diff --git a/registry/coder/modules/windows-rdp/main.tf b/registry/coder/modules/windows-rdp/main.tf index b610c52c..c1b996dd 100644 --- a/registry/coder/modules/windows-rdp/main.tf +++ b/registry/coder/modules/windows-rdp/main.tf @@ -4,7 +4,7 @@ terraform { required_providers { coder = { source = "coder/coder" - version = ">= 0.17" + version = ">= 2.5" } } } @@ -35,11 +35,6 @@ variable "agent_id" { description = "The ID of a Coder agent." } -variable "resource_id" { - type = string - description = "The ID of the primary Coder resource (e.g. VM)." -} - variable "admin_username" { type = string default = "Administrator" @@ -53,14 +48,14 @@ variable "admin_password" { variable "devolutions_gateway_version" { type = string - default = "2025.2.1" + default = "2025.2.2" description = "Version of Devolutions Gateway to install. Defaults to the latest available version." } resource "coder_script" "windows-rdp" { agent_id = var.agent_id display_name = "windows-rdp" - icon = "/icon/desktop.svg" + icon = "/icon/rdp.svg" script = templatefile("${path.module}/powershell-installation-script.tftpl", { admin_username = var.admin_username @@ -101,7 +96,7 @@ resource "coder_app" "rdp-docs" { agent_id = var.agent_id display_name = "Local RDP Docs" slug = "rdp-docs" - icon = "https://raw.githubusercontent.com/matifali/logos/main/windows.svg" - url = "https://coder.com/docs/ides/remote-desktops#rdp-desktop" + icon = "/icon/windows.svg" + url = "https://coder.com/docs/user-guides/workspace-access/remote-desktops#rdp" external = true } diff --git a/registry/coder/templates/digitalocean-linux/README.md b/registry/coder/templates/digitalocean-linux/README.md index 5e72b0bf..b92c29c4 100644 --- a/registry/coder/templates/digitalocean-linux/README.md +++ b/registry/coder/templates/digitalocean-linux/README.md @@ -20,16 +20,13 @@ To deploy workspaces as DigitalOcean Droplets, you'll need: - DigitalOcean [personal access token (PAT)](https://docs.digitalocean.com/reference/api/create-personal-access-token) - DigitalOcean project ID (you can get your project information via the `doctl` CLI by running `doctl projects list`) - - Remove the following sections from the `main.tf` file if you don't want to associate your workspaces with a project: - - `variable "project_uuid"` - `resource "digitalocean_project_resources" "project"` - **Optional:** DigitalOcean SSH key ID (obtain via the `doctl` CLI by running `doctl compute ssh-key list`) - - Note that this is only required for Fedora images to work. ### Authentication diff --git a/registry/coder/templates/gcp-devcontainer/README.md b/registry/coder/templates/gcp-devcontainer/README.md index 0be4a786..134640a1 100644 --- a/registry/coder/templates/gcp-devcontainer/README.md +++ b/registry/coder/templates/gcp-devcontainer/README.md @@ -34,7 +34,6 @@ a service account: 1. Click **Create and continue**, and choose the following IAM roles to grant to the service account: - - Compute Admin - Service Account User diff --git a/registry/coder/templates/gcp-linux/README.md b/registry/coder/templates/gcp-linux/README.md index 60191040..daeda00b 100644 --- a/registry/coder/templates/gcp-linux/README.md +++ b/registry/coder/templates/gcp-linux/README.md @@ -32,7 +32,6 @@ a service account: 1. Click **Create and continue**, and choose the following IAM roles to grant to the service account: - - Compute Admin - Service Account User diff --git a/registry/coder/templates/gcp-vm-container/README.md b/registry/coder/templates/gcp-vm-container/README.md index 83704ee2..d8e9c10e 100644 --- a/registry/coder/templates/gcp-vm-container/README.md +++ b/registry/coder/templates/gcp-vm-container/README.md @@ -32,7 +32,6 @@ a service account: 1. Click **Create and continue**, and choose the following IAM roles to grant to the service account: - - Compute Admin - Service Account User diff --git a/registry/coder/templates/gcp-windows/README.md b/registry/coder/templates/gcp-windows/README.md index ac717e41..933f2d6f 100644 --- a/registry/coder/templates/gcp-windows/README.md +++ b/registry/coder/templates/gcp-windows/README.md @@ -32,7 +32,6 @@ a service account: 1. Click **Create and continue**, and choose the following IAM roles to grant to the service account: - - Compute Admin - Service Account User diff --git a/registry/coder/templates/incus/README.md b/registry/coder/templates/incus/README.md index def594cd..2a6d54e0 100644 --- a/registry/coder/templates/incus/README.md +++ b/registry/coder/templates/incus/README.md @@ -15,7 +15,6 @@ Develop in an Incus System Container and run nested Docker containers using Incu 1. Install [Incus](https://linuxcontainers.org/incus/) on the same machine as Coder. 2. Allow Coder to access the Incus socket. - - If you're running Coder as system service, run `sudo usermod -aG incus-admin coder` and restart the Coder service. - If you're running Coder as a Docker Compose service, get the group ID of the `incus-admin` group by running `getent group incus-admin` and add the following to your `compose.yaml` file: