mirror of
https://github.com/coder/coder.git
synced 2026-06-03 13:08:25 +00:00
61beb7bfa8
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
535 lines
14 KiB
Markdown
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! 🚀
|