Files
coder/docs/about/contributing/templates.md
T
Mathias Fredriksson 61beb7bfa8 docs: rewrite dev containers documentation for GA (#21080)
docs: rewrite dev containers documentation for GA

Corrects inaccuracies in SSH examples (deprecated `--container` flag),
port forwarding (native sub-agent forwarding is primary), and
prerequisites (dev containers are on by default). Fixes template
descriptions: docker-devcontainer uses native Dev Containers while
AWS/Kubernetes templates use Envbuilder.

Renames admin docs folder from `devcontainers/` to `envbuilder/` to
reflect actual content. Adds customization guide documenting agent
naming, display apps, custom apps, and variable interpolation. Documents
multi-repo workspace support and adds note about Terraform module
limitations with sub-agents. Fixes module registry URLs.

Refs #18907
2025-12-05 19:42:16 +02:00

535 lines
14 KiB
Markdown

# 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 Envbuilder
- [Docker (Devcontainer)](https://registry.coder.com/templates/docker-devcontainer) - Docker-in-Docker with Dev Containers integration
- [Kubernetes (Devcontainer)](https://registry.coder.com/templates/kubernetes-devcontainer) - Kubernetes pods with Envbuilder
- [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! 🚀