mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
docs: add contribution documentation for modules and templates (#18820)
draft: add contribution docs for modules and templates individually to be referenced in coder docs manifest. --------- Co-authored-by: Atif Ali <atif@coder.com>
This commit is contained in:
@@ -0,0 +1,386 @@
|
||||
# Contributing modules
|
||||
|
||||
Learn how to create and contribute Terraform modules to the Coder Registry. Modules provide reusable components that extend Coder workspaces with IDEs, development tools, login tools, and other features.
|
||||
|
||||
## What are Coder modules
|
||||
|
||||
Coder modules are Terraform modules that integrate with Coder workspaces to provide specific functionality. They are published to the Coder Registry at [registry.coder.com](https://registry.coder.com) and can be consumed in any Coder template using standard Terraform module syntax.
|
||||
|
||||
Examples of modules include:
|
||||
|
||||
- **Desktop IDEs**: [`jetbrains-fleet`](https://registry.coder.com/modules/coder/jetbrains-fleet), [`cursor`](https://registry.coder.com/modules/coder/cursor), [`windsurf`](https://registry.coder.com/modules/coder/windsurf), [`zed`](https://registry.coder.com/modules/coder/zed)
|
||||
- **Web IDEs**: [`code-server`](https://registry.coder.com/modules/coder/code-server), [`vscode-web`](https://registry.coder.com/modules/coder/vscode-web), [`jupyter-notebook`](https://registry.coder.com/modules/coder/jupyter-notebook), [`jupyter-lab`](https://registry.coder.com/modules/coder/jupyterlab)
|
||||
- **Integrations**: [`devcontainers-cli`](https://registry.coder.com/modules/coder/devcontainers-cli), [`vault-github`](https://registry.coder.com/modules/coder/vault-github), [`jfrog-oauth`](https://registry.coder.com/modules/coder/jfrog-oauth), [`jfrog-token`](https://registry.coder.com/modules/coder/jfrog-token)
|
||||
- **Workspace utilities**: [`git-clone`](https://registry.coder.com/modules/coder/git-clone), [`dotfiles`](https://registry.coder.com/modules/coder/dotfiles), [`filebrowser`](https://registry.coder.com/modules/coder/filebrowser), [`coder-login`](https://registry.coder.com/modules/coder/coder-login), [`personalize`](https://registry.coder.com/modules/coder/personalize)
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Before contributing modules, ensure you have:
|
||||
|
||||
- Basic Terraform knowledge
|
||||
- [Terraform installed](https://developer.hashicorp.com/terraform/install)
|
||||
- [Docker installed](https://docs.docker.com/get-docker/) (for running tests)
|
||||
- [Bun installed](https://bun.sh/docs/installation) (for running tests and tooling)
|
||||
|
||||
## Setup your development environment
|
||||
|
||||
1. **Fork and clone the repository**:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/your-username/registry.git
|
||||
cd registry
|
||||
```
|
||||
|
||||
2. **Install dependencies**:
|
||||
|
||||
```bash
|
||||
bun install
|
||||
```
|
||||
|
||||
3. **Understand the structure**:
|
||||
|
||||
```text
|
||||
registry/[namespace]/
|
||||
├── modules/ # Your modules
|
||||
├── .images/ # Namespace avatar and screenshots
|
||||
└── README.md # Namespace description
|
||||
```
|
||||
|
||||
## Create your first module
|
||||
|
||||
### 1. Set up your namespace
|
||||
|
||||
If you're a new contributor, create your namespace directory:
|
||||
|
||||
```bash
|
||||
mkdir -p registry/[your-username]
|
||||
mkdir -p registry/[your-username]/.images
|
||||
```
|
||||
|
||||
Add your namespace avatar by downloading your GitHub avatar and saving it as `avatar.png`:
|
||||
|
||||
```bash
|
||||
curl -o registry/[your-username]/.images/avatar.png https://github.com/[your-username].png
|
||||
```
|
||||
|
||||
Create your namespace README at `registry/[your-username]/README.md`:
|
||||
|
||||
```markdown
|
||||
---
|
||||
display_name: "Your Name"
|
||||
bio: "Brief description of what you do"
|
||||
github: "your-username"
|
||||
avatar: "./.images/avatar.png"
|
||||
linkedin: "https://www.linkedin.com/in/your-username"
|
||||
website: "https://your-website.com"
|
||||
support_email: "support@your-domain.com"
|
||||
status: "community"
|
||||
---
|
||||
|
||||
# Your Name
|
||||
|
||||
Brief description of who you are and what you do.
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> The `linkedin`, `website`, and `support_email` fields are optional and can be omitted or left empty if not applicable.
|
||||
|
||||
### 2. Generate module scaffolding
|
||||
|
||||
Use the provided script to generate your module structure:
|
||||
|
||||
```bash
|
||||
./scripts/new_module.sh [your-username]/[module-name]
|
||||
cd registry/[your-username]/modules/[module-name]
|
||||
```
|
||||
|
||||
This creates:
|
||||
|
||||
- `main.tf` - Terraform configuration template
|
||||
- `README.md` - Documentation template with frontmatter
|
||||
- `run.sh` - Optional execution script
|
||||
|
||||
### 3. Implement your module
|
||||
|
||||
Edit `main.tf` to build your module's features. Here's an example based on the `git-clone` module structure:
|
||||
|
||||
```terraform
|
||||
terraform {
|
||||
required_providers {
|
||||
coder = {
|
||||
source = "coder/coder"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Input variables
|
||||
variable "agent_id" {
|
||||
description = "The ID of a Coder agent"
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "url" {
|
||||
description = "Git repository URL to clone"
|
||||
type = string
|
||||
validation {
|
||||
condition = can(regex("^(https?://|git@)", var.url))
|
||||
error_message = "URL must be a valid git repository URL."
|
||||
}
|
||||
}
|
||||
|
||||
variable "base_dir" {
|
||||
description = "Directory to clone the repository into"
|
||||
type = string
|
||||
default = "~"
|
||||
}
|
||||
|
||||
# Resources
|
||||
resource "coder_script" "clone_repo" {
|
||||
agent_id = var.agent_id
|
||||
display_name = "Clone Repository"
|
||||
script = <<-EOT
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# Ensure git is installed
|
||||
if ! command -v git &> /dev/null; then
|
||||
echo "Installing git..."
|
||||
sudo apt-get update && sudo apt-get install -y git
|
||||
fi
|
||||
|
||||
# Clone repository if it doesn't exist
|
||||
if [ ! -d "${var.base_dir}/$(basename ${var.url} .git)" ]; then
|
||||
echo "Cloning ${var.url}..."
|
||||
git clone ${var.url} ${var.base_dir}/$(basename ${var.url} .git)
|
||||
fi
|
||||
EOT
|
||||
run_on_start = true
|
||||
}
|
||||
|
||||
# Outputs
|
||||
output "repo_dir" {
|
||||
description = "Path to the cloned repository"
|
||||
value = "${var.base_dir}/$(basename ${var.url} .git)"
|
||||
}
|
||||
```
|
||||
|
||||
### 4. Write complete tests
|
||||
|
||||
Create `main.test.ts` to test your module features:
|
||||
|
||||
```typescript
|
||||
import { runTerraformApply, runTerraformInit, testRequiredVariables } from "~test"
|
||||
|
||||
describe("git-clone", async () => {
|
||||
await testRequiredVariables("registry/[your-username]/modules/git-clone")
|
||||
|
||||
it("should clone repository successfully", async () => {
|
||||
await runTerraformInit("registry/[your-username]/modules/git-clone")
|
||||
await runTerraformApply("registry/[your-username]/modules/git-clone", {
|
||||
agent_id: "test-agent-id",
|
||||
url: "https://github.com/coder/coder.git",
|
||||
base_dir: "/tmp"
|
||||
})
|
||||
})
|
||||
|
||||
it("should work with SSH URLs", async () => {
|
||||
await runTerraformInit("registry/[your-username]/modules/git-clone")
|
||||
await runTerraformApply("registry/[your-username]/modules/git-clone", {
|
||||
agent_id: "test-agent-id",
|
||||
url: "git@github.com:coder/coder.git"
|
||||
})
|
||||
})
|
||||
})
|
||||
```
|
||||
|
||||
### 5. Document your module
|
||||
|
||||
Update `README.md` with complete documentation:
|
||||
|
||||
```markdown
|
||||
---
|
||||
display_name: "Git Clone"
|
||||
description: "Clone a Git repository into your Coder workspace"
|
||||
icon: "../../../../.icons/git.svg"
|
||||
verified: false
|
||||
tags: ["git", "development", "vcs"]
|
||||
---
|
||||
|
||||
# Git Clone
|
||||
|
||||
This module clones a Git repository into your Coder workspace and ensures Git is installed.
|
||||
|
||||
## Usage
|
||||
|
||||
```tf
|
||||
module "git_clone" {
|
||||
source = "registry.coder.com/[your-username]/git-clone/coder"
|
||||
version = "~> 1.0"
|
||||
|
||||
agent_id = coder_agent.main.id
|
||||
url = "https://github.com/coder/coder.git"
|
||||
base_dir = "/home/coder/projects"
|
||||
}
|
||||
```
|
||||
|
||||
## Module best practices
|
||||
|
||||
### Design principles
|
||||
|
||||
- **Single responsibility**: Each module should have one clear purpose
|
||||
- **Reusability**: Design for use across different workspace types
|
||||
- **Flexibility**: Provide sensible defaults but allow customization
|
||||
- **Safe to rerun**: Ensure modules can be applied multiple times safely
|
||||
|
||||
### Terraform conventions
|
||||
|
||||
- Use descriptive variable names and include descriptions
|
||||
- Provide default values for optional variables
|
||||
- Include helpful outputs for working with other modules
|
||||
- Use proper resource dependencies
|
||||
- Follow [Terraform style conventions](https://developer.hashicorp.com/terraform/language/syntax/style)
|
||||
|
||||
### Documentation standards
|
||||
|
||||
Your module README should include:
|
||||
|
||||
- **Frontmatter**: Required metadata for the registry
|
||||
- **Description**: Clear explanation of what the module does
|
||||
- **Usage example**: Working Terraform code snippet
|
||||
- **Additional context**: Setup requirements, known limitations, etc.
|
||||
|
||||
> [!NOTE]
|
||||
> Do not include variables tables in your README. The registry automatically generates variable documentation from your `main.tf` file.
|
||||
|
||||
## Test your module
|
||||
|
||||
Run tests to ensure your module works correctly:
|
||||
|
||||
```bash
|
||||
# Test your specific module
|
||||
bun test -t 'git-clone'
|
||||
|
||||
# Test all modules
|
||||
bun test
|
||||
|
||||
# Format code
|
||||
bun fmt
|
||||
```
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Tests require Docker with `--network=host` support, which typically requires Linux. macOS users can use [Colima](https://github.com/abiosoft/colima) or [OrbStack](https://orbstack.dev/) instead of Docker Desktop.
|
||||
|
||||
## Contribute to existing modules
|
||||
|
||||
### Types of contributions
|
||||
|
||||
**Bug fixes**:
|
||||
|
||||
- Fix installation or configuration issues
|
||||
- Resolve compatibility problems
|
||||
- Correct documentation errors
|
||||
|
||||
**Feature additions**:
|
||||
|
||||
- Add new configuration options
|
||||
- Support additional platforms or versions
|
||||
- Add new features
|
||||
|
||||
**Maintenance**:
|
||||
|
||||
- Update dependencies
|
||||
- Improve error handling
|
||||
- Optimize performance
|
||||
|
||||
### Making changes
|
||||
|
||||
1. **Identify the issue**: Reproduce the problem or identify the improvement needed
|
||||
2. **Make focused changes**: Keep modifications minimal and targeted
|
||||
3. **Maintain compatibility**: Ensure existing users aren't broken
|
||||
4. **Add tests**: Test new features and edge cases
|
||||
5. **Update documentation**: Reflect changes in the README
|
||||
|
||||
### Backward compatibility
|
||||
|
||||
When modifying existing modules:
|
||||
|
||||
- Add new variables with sensible defaults
|
||||
- Don't remove existing variables without a migration path
|
||||
- Don't change variable types or meanings
|
||||
- Test that basic configurations still work
|
||||
|
||||
## Versioning
|
||||
|
||||
When you modify a module, update its version following semantic versioning:
|
||||
|
||||
- **Patch** (1.0.0 → 1.0.1): Bug fixes, documentation updates
|
||||
- **Minor** (1.0.0 → 1.1.0): New features, new variables
|
||||
- **Major** (1.0.0 → 2.0.0): Breaking changes, removing variables
|
||||
|
||||
Use the version bump script to update versions:
|
||||
|
||||
```bash
|
||||
./.github/scripts/version-bump.sh patch|minor|major
|
||||
```
|
||||
|
||||
## Submit your contribution
|
||||
|
||||
1. **Create a feature branch**:
|
||||
|
||||
```bash
|
||||
git checkout -b feat/modify-git-clone-module
|
||||
```
|
||||
|
||||
2. **Test thoroughly**:
|
||||
|
||||
```bash
|
||||
bun test -t 'git-clone'
|
||||
bun fmt
|
||||
```
|
||||
|
||||
3. **Commit with clear messages**:
|
||||
|
||||
```bash
|
||||
git add .
|
||||
git commit -m "feat(git-clone):add git-clone module"
|
||||
```
|
||||
|
||||
4. **Open a pull request**:
|
||||
- Use a descriptive title
|
||||
- Explain what the module does and why it's useful
|
||||
- Reference any related issues
|
||||
|
||||
## Common issues and solutions
|
||||
|
||||
### Testing problems
|
||||
|
||||
**Issue**: Tests fail with network errors
|
||||
**Solution**: Ensure Docker is running with `--network=host` support
|
||||
|
||||
### Module development
|
||||
|
||||
**Issue**: Icon not displaying
|
||||
**Solution**: Verify icon path is correct and file exists in `.icons/` directory
|
||||
|
||||
### Documentation
|
||||
|
||||
**Issue**: Code blocks not syntax highlighted
|
||||
**Solution**: Use `tf` language identifier for Terraform code blocks
|
||||
|
||||
## Get help
|
||||
|
||||
- **Examples**: Review existing modules like [`code-server`](https://registry.coder.com/modules/coder/code-server), [`git-clone`](https://registry.coder.com/modules/coder/git-clone), and [`jetbrains-gateway`](https://registry.coder.com/modules/coder/jetbrains-gateway)
|
||||
- **Issues**: Open an issue at [github.com/coder/registry](https://github.com/coder/registry/issues)
|
||||
- **Community**: Join the [Coder Discord](https://discord.gg/coder) for questions
|
||||
- **Documentation**: Check the [Coder docs](https://coder.com/docs) for help on Coder.
|
||||
|
||||
## Next steps
|
||||
|
||||
After creating your first module:
|
||||
|
||||
1. **Share with the community**: Announce your module on Discord or social media
|
||||
2. **Iterate based on feedback**: Improve based on user suggestions
|
||||
3. **Create more modules**: Build a collection of related tools
|
||||
4. **Contribute to existing modules**: Help maintain and improve the ecosystem
|
||||
|
||||
Happy contributing! 🚀
|
||||
@@ -0,0 +1,534 @@
|
||||
# Contributing templates
|
||||
|
||||
Learn how to create and contribute complete Coder workspace templates to the Coder Registry. Templates provide ready-to-use workspace configurations that users can deploy directly to create development environments.
|
||||
|
||||
## What are Coder templates
|
||||
|
||||
Coder templates are complete Terraform configurations that define entire workspace environments. Unlike modules (which are reusable components), templates provide full infrastructure definitions that include:
|
||||
|
||||
- Infrastructure setup (containers, VMs, cloud resources)
|
||||
- Coder agent configuration
|
||||
- Development tools and IDE integrations
|
||||
- Networking and security settings
|
||||
- Complete startup automation
|
||||
|
||||
Templates appear on the Coder Registry and can be deployed directly by users.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Before contributing templates, ensure you have:
|
||||
|
||||
- Strong Terraform knowledge
|
||||
- [Terraform installed](https://developer.hashicorp.com/terraform/install)
|
||||
- [Coder CLI installed](https://coder.com/docs/install)
|
||||
- Access to your target infrastructure platform (Docker, AWS, GCP, etc.)
|
||||
- [Bun installed](https://bun.sh/docs/installation) (for tooling)
|
||||
|
||||
## Setup your development environment
|
||||
|
||||
1. **Fork and clone the repository**:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/your-username/registry.git
|
||||
cd registry
|
||||
```
|
||||
|
||||
2. **Install dependencies**:
|
||||
|
||||
```bash
|
||||
bun install
|
||||
```
|
||||
|
||||
3. **Understand the structure**:
|
||||
|
||||
```text
|
||||
registry/[namespace]/
|
||||
├── templates/ # Your templates
|
||||
├── .images/ # Namespace avatar and screenshots
|
||||
└── README.md # Namespace description
|
||||
```
|
||||
|
||||
## Create your first template
|
||||
|
||||
### 1. Set up your namespace
|
||||
|
||||
If you're a new contributor, create your namespace directory:
|
||||
|
||||
```bash
|
||||
mkdir -p registry/[your-username]
|
||||
mkdir -p registry/[your-username]/.images
|
||||
```
|
||||
|
||||
Add your namespace avatar by downloading your GitHub avatar and saving it as `avatar.png`:
|
||||
|
||||
```bash
|
||||
curl -o registry/[your-username]/.images/avatar.png https://github.com/[your-username].png
|
||||
```
|
||||
|
||||
Create your namespace README at `registry/[your-username]/README.md`:
|
||||
|
||||
```markdown
|
||||
---
|
||||
display_name: "Your Name"
|
||||
bio: "Brief description of what you do"
|
||||
github: "your-username"
|
||||
avatar: "./.images/avatar.png"
|
||||
linkedin: "https://www.linkedin.com/in/your-username"
|
||||
website: "https://your-website.com"
|
||||
support_email: "support@your-domain.com"
|
||||
status: "community"
|
||||
---
|
||||
|
||||
# Your Name
|
||||
|
||||
Brief description of who you are and what you do.
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> The `linkedin`, `website`, and `support_email` fields are optional and can be omitted or left empty if not applicable.
|
||||
|
||||
### 2. Create your template directory
|
||||
|
||||
Create a directory for your template:
|
||||
|
||||
```bash
|
||||
mkdir -p registry/[your-username]/templates/[template-name]
|
||||
cd registry/[your-username]/templates/[template-name]
|
||||
```
|
||||
|
||||
### 3. Build your template
|
||||
|
||||
Create `main.tf` with your complete Terraform configuration:
|
||||
|
||||
```terraform
|
||||
terraform {
|
||||
required_providers {
|
||||
coder = {
|
||||
source = "coder/coder"
|
||||
}
|
||||
docker = {
|
||||
source = "kreuzwerker/docker"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Coder data sources
|
||||
data "coder_workspace" "me" {}
|
||||
data "coder_workspace_owner" "me" {}
|
||||
|
||||
# Coder agent
|
||||
resource "coder_agent" "main" {
|
||||
arch = "amd64"
|
||||
os = "linux"
|
||||
startup_script_timeout = 180
|
||||
startup_script = <<-EOT
|
||||
set -e
|
||||
|
||||
# Install development tools
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y curl wget git
|
||||
|
||||
# Additional setup here
|
||||
EOT
|
||||
}
|
||||
|
||||
# Registry modules for IDEs and tools
|
||||
module "code-server" {
|
||||
source = "registry.coder.com/coder/code-server/coder"
|
||||
version = "~> 1.0"
|
||||
agent_id = coder_agent.main.id
|
||||
}
|
||||
|
||||
module "git-clone" {
|
||||
source = "registry.coder.com/coder/git-clone/coder"
|
||||
version = "~> 1.0"
|
||||
agent_id = coder_agent.main.id
|
||||
url = "https://github.com/example/repo.git"
|
||||
}
|
||||
|
||||
# Infrastructure resources
|
||||
resource "docker_image" "main" {
|
||||
name = "codercom/enterprise-base:ubuntu"
|
||||
}
|
||||
|
||||
resource "docker_container" "workspace" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
image = docker_image.main.name
|
||||
name = "coder-${data.coder_workspace_owner.me.name}-${data.coder_workspace.me.name}"
|
||||
|
||||
command = ["sh", "-c", coder_agent.main.init_script]
|
||||
env = ["CODER_AGENT_TOKEN=${coder_agent.main.token}"]
|
||||
|
||||
host {
|
||||
host = "host.docker.internal"
|
||||
ip = "host-gateway"
|
||||
}
|
||||
}
|
||||
|
||||
# Metadata
|
||||
resource "coder_metadata" "workspace_info" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
resource_id = docker_container.workspace[0].id
|
||||
|
||||
item {
|
||||
key = "memory"
|
||||
value = "4 GB"
|
||||
}
|
||||
|
||||
item {
|
||||
key = "cpu"
|
||||
value = "2 cores"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4. Document your template
|
||||
|
||||
Create `README.md` with comprehensive documentation:
|
||||
|
||||
```markdown
|
||||
---
|
||||
display_name: "Ubuntu Development Environment"
|
||||
description: "Complete Ubuntu workspace with VS Code, Git, and development tools"
|
||||
icon: "../../../../.icons/ubuntu.svg"
|
||||
verified: false
|
||||
tags: ["ubuntu", "docker", "vscode", "git"]
|
||||
---
|
||||
|
||||
# Ubuntu Development Environment
|
||||
|
||||
A complete Ubuntu-based development workspace with VS Code, Git, and essential development tools pre-installed.
|
||||
|
||||
## Features
|
||||
|
||||
- **Ubuntu 24.04 LTS** base image
|
||||
- **VS Code** with code-server for browser-based development
|
||||
- **Git** with automatic repository cloning
|
||||
- **Node.js** and **npm** for JavaScript development
|
||||
- **Python 3** with pip
|
||||
- **Docker** for containerized development
|
||||
|
||||
## Requirements
|
||||
|
||||
- Docker runtime
|
||||
- 4 GB RAM minimum
|
||||
- 2 CPU cores recommended
|
||||
|
||||
## Usage
|
||||
|
||||
1. Deploy this template in your Coder instance
|
||||
2. Create a new workspace from the template
|
||||
3. Access VS Code through the workspace dashboard
|
||||
4. Start developing in your fully configured environment
|
||||
|
||||
## Customization
|
||||
|
||||
You can customize this template by:
|
||||
|
||||
- Modifying the base image in `docker_image.main`
|
||||
- Adding additional registry modules
|
||||
- Adjusting resource allocations
|
||||
- Including additional development tools
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
**Issue**: Workspace fails to start
|
||||
**Solution**: Ensure Docker is running and accessible
|
||||
|
||||
**Issue**: VS Code not accessible
|
||||
**Solution**: Check agent logs and ensure code-server module is properly configured
|
||||
```
|
||||
|
||||
## Template best practices
|
||||
|
||||
### Design principles
|
||||
|
||||
- **Complete environments**: Templates should provide everything needed for development
|
||||
- **Platform-specific**: Focus on one platform or use case per template
|
||||
- **Production-ready**: Include proper error handling and resource management
|
||||
- **User-friendly**: Provide clear documentation and sensible defaults
|
||||
|
||||
### Infrastructure setup
|
||||
|
||||
- **Resource efficiency**: Use appropriate resource allocations
|
||||
- **Network configuration**: Ensure proper connectivity for development tools
|
||||
- **Security**: Follow security best practices for your platform
|
||||
- **Scalability**: Design for multiple concurrent users
|
||||
|
||||
### Module integration
|
||||
|
||||
Use registry modules for common features:
|
||||
|
||||
```terraform
|
||||
# VS Code in browser
|
||||
module "code-server" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "registry.coder.com/coder/code-server/coder"
|
||||
version = "1.3.0"
|
||||
agent_id = coder_agent.example.id
|
||||
}
|
||||
|
||||
# JetBrains IDEs
|
||||
module "jetbrains" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "registry.coder.com/coder/jetbrains/coder"
|
||||
version = "1.0.0"
|
||||
agent_id = coder_agent.example.id
|
||||
folder = "/home/coder/project"
|
||||
}
|
||||
|
||||
# Git repository cloning
|
||||
module "git-clone" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "registry.coder.com/coder/git-clone/coder"
|
||||
version = "1.1.0"
|
||||
agent_id = coder_agent.example.id
|
||||
url = "https://github.com/coder/coder"
|
||||
base_dir = "~/projects/coder"
|
||||
}
|
||||
|
||||
# File browser interface
|
||||
module "filebrowser" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "registry.coder.com/coder/filebrowser/coder"
|
||||
version = "1.1.1"
|
||||
agent_id = coder_agent.example.id
|
||||
}
|
||||
|
||||
# Dotfiles management
|
||||
module "dotfiles" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "registry.coder.com/coder/dotfiles/coder"
|
||||
version = "1.2.0"
|
||||
agent_id = coder_agent.example.id
|
||||
}
|
||||
```
|
||||
|
||||
### Variables
|
||||
|
||||
Provide meaningful customization options:
|
||||
|
||||
```terraform
|
||||
variable "git_repo_url" {
|
||||
description = "Git repository to clone"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "instance_type" {
|
||||
description = "Instance type for the workspace"
|
||||
type = string
|
||||
default = "t3.medium"
|
||||
}
|
||||
|
||||
variable "workspace_name" {
|
||||
description = "Name for the workspace"
|
||||
type = string
|
||||
default = "dev-workspace"
|
||||
}
|
||||
```
|
||||
|
||||
## Test your template
|
||||
|
||||
### Local testing
|
||||
|
||||
Test your template locally with Coder:
|
||||
|
||||
```bash
|
||||
# Navigate to your template directory
|
||||
cd registry/[your-username]/templates/[template-name]
|
||||
|
||||
# Push to Coder for testing
|
||||
coder templates push test-template -d .
|
||||
|
||||
# Create a test workspace
|
||||
coder create test-workspace --template test-template
|
||||
```
|
||||
|
||||
### Validation checklist
|
||||
|
||||
Before submitting your template, verify:
|
||||
|
||||
- [ ] Template provisions successfully
|
||||
- [ ] Agent connects properly
|
||||
- [ ] All registry modules work correctly
|
||||
- [ ] VS Code/IDEs are accessible
|
||||
- [ ] Networking functions properly
|
||||
- [ ] Resource metadata is accurate
|
||||
- [ ] Documentation is complete and accurate
|
||||
|
||||
## Contribute to existing templates
|
||||
|
||||
### Types of improvements
|
||||
|
||||
**Bug fixes**:
|
||||
|
||||
- Fix setup issues
|
||||
- Resolve agent connectivity problems
|
||||
- Correct resource configurations
|
||||
|
||||
**Feature additions**:
|
||||
|
||||
- Add new registry modules
|
||||
- Include additional development tools
|
||||
- Improve startup automation
|
||||
|
||||
**Platform updates**:
|
||||
|
||||
- Update base images or AMIs
|
||||
- Adapt to new platform features
|
||||
- Improve security configurations
|
||||
|
||||
**Documentation improvements**:
|
||||
|
||||
- Clarify setup requirements
|
||||
- Add troubleshooting guides
|
||||
- Improve usage examples
|
||||
|
||||
### Making changes
|
||||
|
||||
1. **Test thoroughly**: Always test template changes in a Coder instance
|
||||
2. **Maintain compatibility**: Ensure existing workspaces continue to function
|
||||
3. **Document changes**: Update the README with new features or requirements
|
||||
4. **Follow versioning**: Update version numbers for significant changes
|
||||
5. **Modernize**: Use latest provider versions, best practices, and current software versions
|
||||
|
||||
## Submit your contribution
|
||||
|
||||
1. **Create a feature branch**:
|
||||
|
||||
```bash
|
||||
git checkout -b feat/add-python-template
|
||||
```
|
||||
|
||||
2. **Test thoroughly**:
|
||||
|
||||
```bash
|
||||
# Test with Coder
|
||||
coder templates push test-python-template -d .
|
||||
coder create test-workspace --template test-python-template
|
||||
|
||||
# Format code
|
||||
bun fmt
|
||||
```
|
||||
|
||||
3. **Commit with clear messages**:
|
||||
|
||||
```bash
|
||||
git add .
|
||||
git commit -m "Add Python development template with FastAPI setup"
|
||||
```
|
||||
|
||||
4. **Open a pull request**:
|
||||
- Use a descriptive title
|
||||
- Explain what the template provides
|
||||
- Include testing instructions
|
||||
- Reference any related issues
|
||||
|
||||
## Template examples
|
||||
|
||||
### Docker-based template
|
||||
|
||||
```terraform
|
||||
# Simple Docker template
|
||||
resource "docker_container" "workspace" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
image = "ubuntu:24.04"
|
||||
name = "coder-${data.coder_workspace_owner.me.name}-${data.coder_workspace.me.name}"
|
||||
|
||||
command = ["sh", "-c", coder_agent.main.init_script]
|
||||
env = ["CODER_AGENT_TOKEN=${coder_agent.main.token}"]
|
||||
}
|
||||
```
|
||||
|
||||
### AWS EC2 template
|
||||
|
||||
```terraform
|
||||
# AWS EC2 template
|
||||
resource "aws_instance" "workspace" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
ami = data.aws_ami.ubuntu.id
|
||||
instance_type = var.instance_type
|
||||
|
||||
user_data = coder_agent.main.init_script
|
||||
|
||||
tags = {
|
||||
Name = "coder-${data.coder_workspace_owner.me.name}-${data.coder_workspace.me.name}"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Kubernetes template
|
||||
|
||||
```terraform
|
||||
# Kubernetes template
|
||||
resource "kubernetes_pod" "workspace" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
|
||||
metadata {
|
||||
name = "coder-${data.coder_workspace_owner.me.name}-${data.coder_workspace.me.name}"
|
||||
}
|
||||
|
||||
spec {
|
||||
container {
|
||||
name = "workspace"
|
||||
image = "ubuntu:24.04"
|
||||
|
||||
command = ["sh", "-c", coder_agent.main.init_script]
|
||||
env {
|
||||
name = "CODER_AGENT_TOKEN"
|
||||
value = coder_agent.main.token
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Common issues and solutions
|
||||
|
||||
### Template development
|
||||
|
||||
**Issue**: Template fails to create resources
|
||||
**Solution**: Check Terraform syntax and provider configuration
|
||||
|
||||
**Issue**: Agent doesn't connect
|
||||
**Solution**: Verify agent token and network connectivity
|
||||
|
||||
### Documentation
|
||||
|
||||
**Issue**: Icon not displaying
|
||||
**Solution**: Verify icon path and file existence
|
||||
|
||||
### Platform-specific
|
||||
|
||||
**Issue**: Docker containers not starting
|
||||
**Solution**: Verify Docker daemon is running and accessible
|
||||
|
||||
**Issue**: Cloud resources failing
|
||||
**Solution**: Check credentials and permissions
|
||||
|
||||
## Get help
|
||||
|
||||
- **Examples**: Review real-world examples from the [official Coder templates](https://registry.coder.com/contributors/coder?tab=templates):
|
||||
- [AWS EC2 (Devcontainer)](https://registry.coder.com/templates/aws-devcontainer) - AWS EC2 VMs with devcontainer support
|
||||
- [Docker (Devcontainer)](https://registry.coder.com/templates/docker-devcontainer) - Envbuilder containers with dev container support
|
||||
- [Kubernetes (Devcontainer)](https://registry.coder.com/templates/kubernetes-devcontainer) - Envbuilder pods on Kubernetes
|
||||
- [Docker Containers](https://registry.coder.com/templates/docker) - Basic Docker container workspaces
|
||||
- [AWS EC2 (Linux)](https://registry.coder.com/templates/aws-linux) - AWS EC2 VMs for Linux development
|
||||
- [Google Compute Engine (Linux)](https://registry.coder.com/templates/gcp-vm-container) - GCP VM instances
|
||||
- [Scratch](https://registry.coder.com/templates/scratch) - Minimal starter template
|
||||
- **Modules**: Browse available modules at [registry.coder.com/modules](https://registry.coder.com/modules)
|
||||
- **Issues**: Open an issue at [github.com/coder/registry](https://github.com/coder/registry/issues)
|
||||
- **Community**: Join the [Coder Discord](https://discord.gg/coder) for questions
|
||||
- **Documentation**: Check the [Coder docs](https://coder.com/docs) for template guidance
|
||||
|
||||
## Next steps
|
||||
|
||||
After creating your first template:
|
||||
|
||||
1. **Share with the community**: Announce your template on Discord or social media
|
||||
2. **Gather feedback**: Iterate based on user suggestions and issues
|
||||
3. **Create variations**: Build templates for different use cases or platforms
|
||||
4. **Contribute to existing templates**: Help maintain and improve the ecosystem
|
||||
|
||||
Your templates help developers get productive faster by providing ready-to-use development environments. Happy contributing! 🚀
|
||||
@@ -47,6 +47,18 @@
|
||||
"path": "./about/contributing/documentation.md",
|
||||
"icon_path": "./images/icons/document.svg"
|
||||
},
|
||||
{
|
||||
"title": "Modules",
|
||||
"description": "Learn how to contribute modules to Coder",
|
||||
"path": "./about/contributing/modules.md",
|
||||
"icon_path": "./images/icons/gear.svg"
|
||||
},
|
||||
{
|
||||
"title": "Templates",
|
||||
"description": "Learn how to contribute templates to Coder",
|
||||
"path": "./about/contributing/templates.md",
|
||||
"icon_path": "./images/icons/picture.svg"
|
||||
},
|
||||
{
|
||||
"title": "Backend",
|
||||
"description": "Our guide for backend development",
|
||||
|
||||
Reference in New Issue
Block a user