diff --git a/.gitattributes b/.gitattributes
index 8ce104016a6b2..ca878291fe0b5 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,7 +1,7 @@
# Generated files
coderd/apidoc/docs.go linguist-generated=true
-docs/api/*.md linguist-generated=true
-docs/cli/*.md linguist-generated=true
+docs/reference/api/*.md linguist-generated=true
+docs/reference/cli/*.md linguist-generated=true
coderd/apidoc/swagger.json linguist-generated=true
coderd/database/dump.sql linguist-generated=true
peerbroker/proto/*.go linguist-generated=true
diff --git a/.github/workflows/typos.toml b/.github/workflows/typos.toml
index 4de415b57de9d..a9748c2d19ea0 100644
--- a/.github/workflows/typos.toml
+++ b/.github/workflows/typos.toml
@@ -22,6 +22,7 @@ pn = "pn"
EDE = "EDE"
# HELO is an SMTP command
HELO = "HELO"
+LKE = "LKE"
[files]
extend-exclude = [
diff --git a/.prettierrc.yaml b/.prettierrc.yaml
index 189b2580f6244..f42aeede2f5b4 100644
--- a/.prettierrc.yaml
+++ b/.prettierrc.yaml
@@ -9,8 +9,8 @@ tabWidth: 2
overrides:
- files:
- README.md
- - docs/api/**/*.md
- - docs/cli/**/*.md
+ - docs/reference/api/**/*.md
+ - docs/reference/cli/**/*.md
- docs/changelogs/*.md
- .github/**/*.{yaml,yml,toml}
- scripts/**/*.{yaml,yml,toml}
diff --git a/.vscode/settings.json b/.vscode/settings.json
index c824ea4edb783..670a8c29f7a1b 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -196,7 +196,7 @@
"**/*.gen.json": true,
"**/testdata/*": true,
"coderd/apidoc/**": true,
- "docs/api/*.md": true,
+ "docs/reference/api/*.md": true,
"docs/templates/*.md": true,
"LICENSE": true,
"scripts/metricsdocgen/metrics": true,
diff --git a/Makefile b/Makefile
index 88165915240d2..181d60702a85e 100644
--- a/Makefile
+++ b/Makefile
@@ -488,9 +488,9 @@ gen: \
coderd/rbac/object_gen.go \
codersdk/rbacresources_gen.go \
site/src/api/rbacresources_gen.ts \
- docs/admin/prometheus.md \
- docs/cli.md \
- docs/admin/audit-logs.md \
+ docs/admin/integrations/prometheus.md \
+ docs/reference/cli/README.md \
+ docs/admin/security/audit-logs.md \
coderd/apidoc/swagger.json \
.prettierignore.include \
.prettierignore \
@@ -520,9 +520,9 @@ gen/mark-fresh:
coderd/rbac/object_gen.go \
codersdk/rbacresources_gen.go \
site/src/api/rbacresources_gen.ts \
- docs/admin/prometheus.md \
- docs/cli.md \
- docs/admin/audit-logs.md \
+ docs/admin/integrations/prometheus.md \
+ docs/reference/cli/README.md \
+ docs/admin/security/audit-logs.md \
coderd/apidoc/swagger.json \
.prettierignore.include \
.prettierignore \
@@ -624,29 +624,25 @@ coderd/rbac/object_gen.go: scripts/rbacgen/rbacobject.gotmpl scripts/rbacgen/mai
codersdk/rbacresources_gen.go: scripts/rbacgen/codersdk.gotmpl scripts/rbacgen/main.go coderd/rbac/object.go coderd/rbac/policy/policy.go
go run scripts/rbacgen/main.go codersdk > codersdk/rbacresources_gen.go
-site/src/api/rbacresources_gen.ts: scripts/rbacgen/codersdk.gotmpl scripts/rbacgen/main.go coderd/rbac/object.go coderd/rbac/policy/policy.go
- go run scripts/rbacgen/main.go typescript > site/src/api/rbacresources_gen.ts
-
-
-docs/admin/prometheus.md: scripts/metricsdocgen/main.go scripts/metricsdocgen/metrics
+docs/admin/integrations/prometheus.md: scripts/metricsdocgen/main.go scripts/metricsdocgen/metrics
go run scripts/metricsdocgen/main.go
./scripts/pnpm_install.sh
- pnpm exec prettier --write ./docs/admin/prometheus.md
+ pnpm exec prettier --write ./docs/admin/integrations/prometheus.md
-docs/cli.md: scripts/clidocgen/main.go examples/examples.gen.json $(GO_SRC_FILES)
+docs/reference/cli/README.md: scripts/clidocgen/main.go examples/examples.gen.json $(GO_SRC_FILES)
CI=true BASE_PATH="." go run ./scripts/clidocgen
./scripts/pnpm_install.sh
- pnpm exec prettier --write ./docs/cli.md ./docs/cli/*.md ./docs/manifest.json
+ pnpm exec prettier --write ./docs/reference/cli/README.md ./docs/reference/cli/*.md ./docs/manifest.json
-docs/admin/audit-logs.md: coderd/database/querier.go scripts/auditdocgen/main.go enterprise/audit/table.go coderd/rbac/object_gen.go
+docs/admin/security/audit-logs.md: coderd/database/querier.go scripts/auditdocgen/main.go enterprise/audit/table.go coderd/rbac/object_gen.go
go run scripts/auditdocgen/main.go
./scripts/pnpm_install.sh
- pnpm exec prettier --write ./docs/admin/audit-logs.md
+ pnpm exec prettier --write ./docs/admin/security/audit-logs.md
coderd/apidoc/swagger.json: $(shell find ./scripts/apidocgen $(FIND_EXCLUSIONS) -type f) $(wildcard coderd/*.go) $(wildcard enterprise/coderd/*.go) $(wildcard codersdk/*.go) $(wildcard enterprise/wsproxy/wsproxysdk/*.go) $(DB_GEN_FILES) .swaggo docs/manifest.json coderd/rbac/object_gen.go
./scripts/apidocgen/generate.sh
./scripts/pnpm_install.sh
- pnpm exec prettier --write ./docs/api ./docs/manifest.json ./coderd/apidoc/swagger.json
+ pnpm exec prettier --write ./docs/reference/api ./docs/manifest.json ./coderd/apidoc/swagger.json
update-golden-files: \
cli/testdata/.gen-golden \
diff --git a/docs/README.md b/docs/README.md
index a833100756b92..5cd477debc452 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -1,4 +1,12 @@
-# About Coder
+# Coder Docs Landing
+
+TODO: Make this a landing page with links to relevant docs, see
+
+- [Docker](https://docs.docker.com/)
+- [Vercel](https://vercel.com/docs)
+-
+
+
diff --git a/docs/admin/README.md b/docs/admin/README.md
index 9a7ca1bf45be9..c8df43033ec70 100644
--- a/docs/admin/README.md
+++ b/docs/admin/README.md
@@ -1,5 +1,40 @@
-Get started with Coder administration:
+# Administration
-
- This page is rendered on https://coder.com/docs/coder-oss/admin. Refer to the other documents in the `admin/` directory.
-
+Guides for day 2+ operations with Coder, including preparing for production and scaling to thousands of daily active users.
+
+## Prerequisites
+
+## Table of contents
+
+- Infrastructure & Scale
+ - Kubernetes Best Practices
+ - Reference Architectures (up to 3000 users)
+ - VM Best Practices
+ - Optimize networking & latency
+ - Add workspace regions
+ - Add Kubernetes clusters
+ - Scale testing your Coder deployment
+- User Management
+ - Set up OpenID Connect (SSO)
+ - Configure Group & Role Sync
+ - Configure Template Permissions
+- Workspace Management
+ - Keep workspaces up to date
+ - Clean up unused workspaces
+- Template & Image Management
+ - Building golden images
+ - Add Dev Container support (custom dependencies)
+ - Manage templates with Ci/Cd pipelines
+- Security
+ - Auditing Coder users
+ - Managing cloud secrets
+ - Manage workspace secrets
+ - Security flags
+- Monitoring
+ - Configure server logging
+ - Troubleshooting Templates
+ - Monitoring via Prometheus / Grafana
+- Analytics
+ - Measure user adoption (weekly active users)
+ - Identifying Coder power users
+ - Reading template usage metrics
diff --git a/docs/admin/app-logs.md b/docs/admin/app-logs.md
deleted file mode 100644
index 8235fda06eda8..0000000000000
--- a/docs/admin/app-logs.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# Application Logs
-
-In Coderd, application logs refer to the records of events, messages, and
-activities generated by the application during its execution. These logs provide
-valuable information about the application's behavior, performance, and any
-issues that may have occurred.
-
-Application logs include entries that capture events on different levels of
-severity:
-
-- Informational messages
-- Warnings
-- Errors
-- Debugging information
-
-By analyzing application logs, system administrators can gain insights into the
-application's behavior, identify and diagnose problems, track performance
-metrics, and make informed decisions to improve the application's stability and
-efficiency.
-
-## Error logs
-
-To ensure effective monitoring and timely response to critical events in the
-Coder application, it is recommended to configure log alerts that specifically
-watch for the following log entries:
-
-| Log Level | Module | Log message | Potential issues |
-| --------- | ---------------------------- | ----------------------- | ------------------------------------------------------------------------------------------------- |
-| `ERROR` | `coderd` | `workspace build error` | Workspace owner is unable to start their workspace. |
-| `ERROR` | `coderd.autobuild` | `workspace build error` | Autostart failed to initiate the workspace. |
-| `ERROR` | `coderd.provisionerd-` | | The provisioner job encounters issues importing the workspace template or building the workspace. |
-| `ERROR` | `coderd.userauth` | | Authentication problems, such as the inability of the workspace user to log in. |
-| `ERROR` | `coderd.prometheusmetrics` | | The metrics aggregator's queue is full, causing it to reject new metrics. |
diff --git a/docs/admin/appearance.md b/docs/admin/appearance.md
deleted file mode 100644
index edfd144834254..0000000000000
--- a/docs/admin/appearance.md
+++ /dev/null
@@ -1,99 +0,0 @@
-# Appearance (enterprise)
-
-Customize the look of your Coder deployment to meet your enterprise
-requirements.
-
-You can access the Appearance settings by navigating to
-`Deployment > Appearance`.
-
-
-
-## Application Name
-
-Specify a custom application name to be displayed on the login page. The default
-is Coder.
-
-## Logo URL
-
-Specify a custom URL for your enterprise's logo to be displayed on the sign in
-page and in the top left corner of the dashboard. The default is the Coder logo.
-
-## Announcement Banners
-
-
-
-Announcement Banners let admins post important messages to all site users. Only
-Site Owners may set the announcement banners.
-
-Example: Use multiple announcement banners for concurrent deployment-wide
-updates, such as maintenance or new feature rollout.
-
-
-
-Example: Adhere to government network classification requirements and notify
-users of which network their Coder deployment is on.
-
-
-
-## OIDC Login Button Customization
-
-[Use environment variables to customize](./auth.md#oidc-login-customization) the
-text and icon on the OIDC button on the Sign In page.
-
-## Support Links
-
-Support links let admins adjust the user dropdown menu to include links
-referring to internal company resources. The menu section replaces the original
-menu positions: documentation, report a bug to GitHub, or join the Discord
-server.
-
-
-
-### Icons
-
-The link icons are optional, and can be set to any url or
-[builtin icon](../templates/icons.md#bundled-icons), additionally `bug`, `chat`,
-and `docs` are available as three special icons.
-
-### Configuration
-
-#### Kubernetes
-
-To configure support links in your Coder Kubernetes deployment, update your Helm
-chart values as follows:
-
-```yaml
-coder:
- env:
- - name: CODER_SUPPORT_LINKS
- value: >
- [{"name": "Hello GitHub", "target": "https://github.com/coder/coder",
- "icon": "bug"},
- {"name": "Hello Slack", "target":
- "https://codercom.slack.com/archives/C014JH42DBJ", "icon":
- "/icon/slack.svg"},
- {"name": "Hello Discord", "target": "https://discord.gg/coder", "icon":
- "/icon/discord.svg"},
- {"name": "Hello Foobar", "target": "https://foo.com/bar", "icon":
- "/emojis/1f3e1.png"}]
-```
-
-#### System package
-
-if running as a system service, set an environment variable
-`CODER_SUPPORT_LINKS` in `/etc/coder.d/coder.env` as follows,
-
-```env
-CODER_SUPPORT_LINKS='[{"name": "Hello GitHub", "target": "https://github.com/coder/coder", "icon": "bug"}, {"name": "Hello Slack", "target": "https://codercom.slack.com/archives/C014JH42DBJ", "icon": "https://raw.githubusercontent.com/coder/coder/main/site/static/icon/slack.svg"}, {"name": "Hello Discord", "target": "https://discord.gg/coder", "icon": "https://raw.githubusercontent.com/coder/coder/main/site/static/icon/discord.svg"}, {"name": "Hello Foobar", "target": "https://discord.gg/coder", "icon": "/emojis/1f3e1.png"}]'
-```
-
-For CLI, use,
-
-```shell
-export CODER_SUPPORT_LINKS='[{"name": "Hello GitHub", "target": "https://github.com/coder/coder", "icon": "bug"}, {"name": "Hello Slack", "target": "https://codercom.slack.com/archives/C014JH42DBJ", "icon": "https://raw.githubusercontent.com/coder/coder/main/site/static/icon/slack.svg"}, {"name": "Hello Discord", "target": "https://discord.gg/coder", "icon": "https://raw.githubusercontent.com/coder/coder/main/site/static/icon/discord.svg"}, {"name": "Hello Foobar", "target": "https://discord.gg/coder", "icon": "/emojis/1f3e1.png"}]'
-coder-server
-```
-
-## Up next
-
-- [Enterprise](../enterprise.md)
diff --git a/docs/admin/automation.md b/docs/admin/automation.md
deleted file mode 100644
index c9fc78833033b..0000000000000
--- a/docs/admin/automation.md
+++ /dev/null
@@ -1,101 +0,0 @@
-# Automation
-
-All actions possible through the Coder dashboard can also be automated as it
-utilizes the same public REST API. There are several ways to extend/automate
-Coder:
-
-- [CLI](../cli.md)
-- [REST API](../api/)
-- [Coder SDK](https://pkg.go.dev/github.com/coder/coder/v2/codersdk)
-
-## Quickstart
-
-Generate a token on your Coder deployment by visiting:
-
-```shell
-https://coder.example.com/settings/tokens
-```
-
-List your workspaces
-
-```shell
-# CLI
-coder ls \
- --url https://coder.example.com \
- --token \
- --output json
-
-# REST API (with curl)
-curl https://coder.example.com/api/v2/workspaces?q=owner:me \
- -H "Coder-Session-Token: "
-```
-
-## Documentation
-
-We publish an [API reference](../api/index.md) in our documentation. You can
-also enable a [Swagger endpoint](../cli/server.md#--swagger-enable) on your
-Coder deployment.
-
-## Use cases
-
-We strive to keep the following use cases up to date, but please note that
-changes to API queries and routes can occur. For the most recent queries and
-payloads, we recommend checking the CLI and API documentation.
-
-### Templates
-
-- [Update templates in CI](../templates/change-management.md): Store all
- templates and git and update templates in CI/CD pipelines.
-
-### Workspace agents
-
-Workspace agents have a special token that can send logs, metrics, and workspace
-activity.
-
-- [Custom workspace logs](../api/agents.md#patch-workspace-agent-logs): Expose
- messages prior to the Coder init script running (e.g. pulling image, VM
- starting, restoring snapshot).
- [coder-logstream-kube](https://github.com/coder/coder-logstream-kube) uses
- this to show Kubernetes events, such as image pulls or ResourceQuota
- restrictions.
-
- ```shell
- curl -X PATCH https://coder.example.com/api/v2/workspaceagents/me/logs \
- -H "Coder-Session-Token: $CODER_AGENT_TOKEN" \
- -d "{
- \"logs\": [
- {
- \"created_at\": \"$(date -u +'%Y-%m-%dT%H:%M:%SZ')\",
- \"level\": \"info\",
- \"output\": \"Restoring workspace from snapshot: 05%...\"
- }
- ]
- }"
- ```
-
-- [Manually send workspace activity](../api/agents.md#submit-workspace-agent-stats):
- Keep a workspace "active," even if there is not an open connection (e.g. for a
- long-running machine learning job).
-
- ```shell
- #!/bin/bash
- # Send workspace activity as long as the job is still running
-
- while true
- do
- if pgrep -f "my_training_script.py" > /dev/null
- then
- curl -X POST "https://coder.example.com/api/v2/workspaceagents/me/report-stats" \
- -H "Coder-Session-Token: $CODER_AGENT_TOKEN" \
- -d '{
- "connection_count": 1
- }'
-
- # Sleep for 30 minutes (1800 seconds) if the job is running
- sleep 1800
- else
- # Sleep for 1 minute (60 seconds) if the job is not running
- sleep 60
- fi
- done
- ```
diff --git a/docs/admin/configure.md b/docs/admin/configure.md
index 8613658ea339d..306902373f0c7 100644
--- a/docs/admin/configure.md
+++ b/docs/admin/configure.md
@@ -1,3 +1,5 @@
+# Configure Control Plane Access
+
Coder server's primary configuration is done via environment variables. For a
full list of the options, run `coder server --help` or see our
[CLI documentation](../cli/server.md).
@@ -185,6 +187,263 @@ To configure Coder behind a corporate proxy, set the environment variables
`HTTP_PROXY` and `HTTPS_PROXY`. Be sure to restart the server. Lowercase values
(e.g. `http_proxy`) are also respected in this case.
+## External Authentication
+
+To add an external authentication provider, you'll need to create an OAuth
+application. The following providers are supported:
+
+- [GitHub](#github)
+- [GitLab](https://docs.gitlab.com/ee/integration/oauth_provider.html)
+- [BitBucket](https://support.atlassian.com/bitbucket-cloud/docs/use-oauth-on-bitbucket-cloud/)
+- [Azure DevOps](https://learn.microsoft.com/en-us/azure/devops/integrate/get-started/authentication/oauth?view=azure-devops)
+- [Azure DevOps (via Entra ID)](https://learn.microsoft.com/en-us/entra/architecture/auth-oauth2)
+
+The next step is to configure the Coder server to use the OAuth application by
+setting the following environment variables:
+
+```env
+CODER_EXTERNAL_AUTH_0_ID=""
+CODER_EXTERNAL_AUTH_0_TYPE=
+CODER_EXTERNAL_AUTH_0_CLIENT_ID=xxxxxx
+CODER_EXTERNAL_AUTH_0_CLIENT_SECRET=xxxxxxx
+
+# Optionally, configure a custom display name and icon
+CODER_EXTERNAL_AUTH_0_DISPLAY_NAME="Google Calendar"
+CODER_EXTERNAL_AUTH_0_DISPLAY_ICON="https://mycustomicon.com/google.svg"
+```
+
+The `CODER_EXTERNAL_AUTH_0_ID` environment variable is used for internal
+reference. Therefore, it can be set arbitrarily (e.g., `primary-github` for your
+GitHub provider).
+
+### GitHub
+
+> If you don't require fine-grained access control, it's easier to configure a
+> GitHub OAuth app!
+
+1. [Create a GitHub App](https://docs.github.com/en/apps/creating-github-apps/registering-a-github-app/registering-a-github-app)
+
+ - Set the callback URL to
+ `https://coder.example.com/external-auth/USER_DEFINED_ID/callback`.
+ - Deactivate Webhooks.
+ - Enable fine-grained access to specific repositories or a subset of
+ permissions for security.
+
+ 
+
+2. Adjust the GitHub App permissions. You can use more or less permissions than
+ are listed here, this is merely a suggestion that allows users to clone
+ repositories:
+
+ 
+
+ | Name | Permission | Description |
+ | ------------- | ------------ | ------------------------------------------------------ |
+ | Contents | Read & Write | Grants access to code and commit statuses. |
+ | Pull requests | Read & Write | Grants access to create and update pull requests. |
+ | Workflows | Read & Write | Grants access to update files in `.github/workflows/`. |
+ | Metadata | Read-only | Grants access to metadata written by GitHub Apps. |
+ | Members | Rad-only | Grabts access to organization members and teams. |
+
+3. Install the App for your organization. You may select a subset of
+ repositories to grant access to.
+
+ 
+
+```env
+CODER_EXTERNAL_AUTH_0_ID="USER_DEFINED_ID"
+CODER_EXTERNAL_AUTH_0_TYPE=github
+CODER_EXTERNAL_AUTH_0_CLIENT_ID=xxxxxx
+CODER_EXTERNAL_AUTH_0_CLIENT_SECRET=xxxxxxx
+```
+
+### GitHub Enterprise
+
+GitHub Enterprise requires the following environment variables:
+
+```env
+CODER_EXTERNAL_AUTH_0_ID="primary-github"
+CODER_EXTERNAL_AUTH_0_TYPE=github
+CODER_EXTERNAL_AUTH_0_CLIENT_ID=xxxxxx
+CODER_EXTERNAL_AUTH_0_CLIENT_SECRET=xxxxxxx
+CODER_EXTERNAL_AUTH_0_VALIDATE_URL="https://github.example.com/api/v3/user"
+CODER_EXTERNAL_AUTH_0_AUTH_URL="https://github.example.com/login/oauth/authorize"
+CODER_EXTERNAL_AUTH_0_TOKEN_URL="https://github.example.com/login/oauth/access_token"
+```
+
+### Bitbucket Server
+
+Bitbucket Server requires the following environment variables:
+
+```env
+CODER_EXTERNAL_AUTH_0_ID="primary-bitbucket-server"
+CODER_EXTERNAL_AUTH_0_TYPE=bitbucket-server
+CODER_EXTERNAL_AUTH_0_CLIENT_ID=xxx
+CODER_EXTERNAL_AUTH_0_CLIENT_SECRET=xxx
+CODER_EXTERNAL_AUTH_0_AUTH_URL=https://bitbucket.domain.com/rest/oauth2/latest/authorize
+```
+
+### Azure DevOps
+
+Azure DevOps requires the following environment variables:
+
+```env
+CODER_EXTERNAL_AUTH_0_ID="primary-azure-devops"
+CODER_EXTERNAL_AUTH_0_TYPE=azure-devops
+CODER_EXTERNAL_AUTH_0_CLIENT_ID=xxxxxx
+# Ensure this value is your "Client Secret", not "App Secret"
+CODER_EXTERNAL_AUTH_0_CLIENT_SECRET=xxxxxxx
+CODER_EXTERNAL_AUTH_0_AUTH_URL="https://app.vssps.visualstudio.com/oauth2/authorize"
+CODER_EXTERNAL_AUTH_0_TOKEN_URL="https://app.vssps.visualstudio.com/oauth2/token"
+```
+
+### Azure DevOps (via Entra ID)
+
+Azure DevOps (via Entra ID) requires the following environment variables:
+
+```env
+CODER_EXTERNAL_AUTH_0_ID="primary-azure-devops"
+CODER_EXTERNAL_AUTH_0_TYPE=azure-devops-entra
+CODER_EXTERNAL_AUTH_0_CLIENT_ID=xxxxxx
+CODER_EXTERNAL_AUTH_0_CLIENT_SECRET=xxxxxxx
+CODER_EXTERNAL_AUTH_0_AUTH_URL="https://login.microsoftonline.com//oauth2/authorize"
+```
+
+> Note: Your app registration in Entra ID requires the `vso.code_write` scope
+
+### GitLab self-managed
+
+GitLab self-managed requires the following environment variables:
+
+```env
+CODER_EXTERNAL_AUTH_0_ID="primary-gitlab"
+CODER_EXTERNAL_AUTH_0_TYPE=gitlab
+# This value is the "Application ID"
+CODER_EXTERNAL_AUTH_0_CLIENT_ID=xxxxxx
+CODER_EXTERNAL_AUTH_0_CLIENT_SECRET=xxxxxxx
+CODER_EXTERNAL_AUTH_0_VALIDATE_URL="https://gitlab.company.org/oauth/token/info"
+CODER_EXTERNAL_AUTH_0_AUTH_URL="https://gitlab.company.org/oauth/authorize"
+CODER_EXTERNAL_AUTH_0_TOKEN_URL="https://gitlab.company.org/oauth/token"
+CODER_EXTERNAL_AUTH_0_REGEX=gitlab\.company\.org
+```
+
+### Gitea
+
+```env
+CODER_EXTERNAL_AUTH_0_ID="gitea"
+CODER_EXTERNAL_AUTH_0_TYPE=gitea
+CODER_EXTERNAL_AUTH_0_CLIENT_ID=xxxxxxx
+CODER_EXTERNAL_AUTH_0_CLIENT_SECRET=xxxxxxx
+# If self managed, set the Auth URL to your Gitea instance
+CODER_EXTERNAL_AUTH_0_AUTH_URL="https://gitea.com/login/oauth/authorize"
+```
+
+The Redirect URI for Gitea should be
+https://coder.company.org/external-auth/gitea/callback
+
+### Self-managed git providers
+
+Custom authentication and token URLs should be used for self-managed Git
+provider deployments.
+
+```env
+CODER_EXTERNAL_AUTH_0_AUTH_URL="https://github.example.com/oauth/authorize"
+CODER_EXTERNAL_AUTH_0_TOKEN_URL="https://github.example.com/oauth/token"
+CODER_EXTERNAL_AUTH_0_VALIDATE_URL="https://your-domain.com/oauth/token/info"
+CODER_EXTERNAL_AUTH_0_REGEX=github\.company\.org
+```
+
+> Note: The `REGEX` variable must be set if using a custom git domain.
+
+### JFrog Artifactory
+
+See [this](../admin/integrations/jfrog-artifactory.md) guide on instructions on
+how to set up for JFrog Artifactory.
+
+### Custom scopes
+
+Optionally, you can request custom scopes:
+
+```env
+CODER_EXTERNAL_AUTH_0_SCOPES="repo:read repo:write write:gpg_key"
+```
+
+### Multiple External Providers (enterprise)
+
+Multiple providers are an Enterprise feature. [Learn more](../enterprise.md).
+Below is an example configuration with multiple providers.
+
+```env
+# Provider 1) github.com
+CODER_EXTERNAL_AUTH_0_ID=primary-github
+CODER_EXTERNAL_AUTH_0_TYPE=github
+CODER_EXTERNAL_AUTH_0_CLIENT_ID=xxxxxx
+CODER_EXTERNAL_AUTH_0_CLIENT_SECRET=xxxxxxx
+CODER_EXTERNAL_AUTH_0_REGEX=github.com/orgname
+
+# Provider 2) github.example.com
+CODER_EXTERNAL_AUTH_1_ID=secondary-github
+CODER_EXTERNAL_AUTH_1_TYPE=github
+CODER_EXTERNAL_AUTH_1_CLIENT_ID=xxxxxx
+CODER_EXTERNAL_AUTH_1_CLIENT_SECRET=xxxxxxx
+CODER_EXTERNAL_AUTH_1_REGEX=github.example.com
+CODER_EXTERNAL_AUTH_1_AUTH_URL="https://github.example.com/login/oauth/authorize"
+CODER_EXTERNAL_AUTH_1_TOKEN_URL="https://github.example.com/login/oauth/access_token"
+CODER_EXTERNAL_AUTH_1_VALIDATE_URL="https://github.example.com/api/v3/user"
+```
+
+To support regex matching for paths (e.g. github.com/orgname), you'll need to
+add this to the
+[Coder agent startup script](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/agent#startup_script):
+
+```shell
+git config --global credential.useHttpPath true
+```
+
+### Kubernetes environment variables
+
+If you deployed Coder with Kubernetes you can set the environment variables in
+your `values.yaml` file:
+
+```yaml
+coder:
+ env:
+ # […]
+ - name: CODER_EXTERNAL_AUTH_0_ID
+ value: USER_DEFINED_ID
+
+ - name: CODER_EXTERNAL_AUTH_0_TYPE
+ value: github
+
+ - name: CODER_EXTERNAL_AUTH_0_CLIENT_ID
+ valueFrom:
+ secretKeyRef:
+ name: github-primary-basic-auth
+ key: client-id
+
+ - name: CODER_EXTERNAL_AUTH_0_CLIENT_SECRET
+ valueFrom:
+ secretKeyRef:
+ name: github-primary-basic-auth
+ key: client-secret
+```
+
+You can set the secrets by creating a `github-primary-basic-auth.yaml` file and
+applying it.
+
+```yaml
+apiVersion: v1
+kind: Secret
+metadata:
+ name: github-primary-basic-auth
+type: Opaque
+stringData:
+ client-secret: xxxxxxxxx
+ client-id: xxxxxxxxx
+```
+
+Make sure to restart the affected pods for the change to take effect.
+
## Up Next
- [Learn how to upgrade Coder](./upgrade.md).
diff --git a/docs/admin/encryption.md b/docs/admin/encryption.md
deleted file mode 100644
index 38c321120e00e..0000000000000
--- a/docs/admin/encryption.md
+++ /dev/null
@@ -1,184 +0,0 @@
-# Database Encryption
-
-By default, Coder stores external user tokens in plaintext in the database.
-Database Encryption allows Coder administrators to encrypt these tokens at-rest,
-preventing attackers with database access from using them to impersonate users.
-
-## How it works
-
-Coder allows administrators to specify
-[external token encryption keys](../cli/server.md#external-token-encryption-keys).
-If configured, Coder will use these keys to encrypt external user tokens before
-storing them in the database. The encryption algorithm used is AES-256-GCM with
-a 32-byte key length.
-
-Coder will use the first key provided for both encryption and decryption. If
-additional keys are provided, Coder will use it for decryption only. This allows
-administrators to rotate encryption keys without invalidating existing tokens.
-
-The following database fields are currently encrypted:
-
-- `user_links.oauth_access_token`
-- `user_links.oauth_refresh_token`
-- `external_auth_links.oauth_access_token`
-- `external_auth_links.oauth_refresh_token`
-
-Additional database fields may be encrypted in the future.
-
-> Implementation notes: each encrypted database column `$C` has a corresponding
-> `$C_key_id` column. This column is used to determine which encryption key was
-> used to encrypt the data. This allows Coder to rotate encryption keys without
-> invalidating existing tokens, and provides referential integrity for encrypted
-> data.
->
-> The `$C_key_id` column stores the first 7 bytes of the SHA-256 hash of the
-> encryption key used to encrypt the data.
->
-> Encryption keys in use are stored in `dbcrypt_keys`. This table stores a
-> record of all encryption keys that have been used to encrypt data. Active keys
-> have a null `revoked_key_id` column, and revoked keys have a non-null
-> `revoked_key_id` column. You cannot revoke a key until you have rotated all
-> values using that key to a new key.
-
-## Enabling encryption
-
-> NOTE: Enabling encryption does not encrypt all existing data. To encrypt
-> existing data, see [rotating keys](#rotating-keys) below.
-
-- Ensure you have a valid backup of your database. **Do not skip this step.** If
- you are using the built-in PostgreSQL database, you can run
- [`coder server postgres-builtin-url`](../cli/server_postgres-builtin-url.md)
- to get the connection URL.
-
-- Generate a 32-byte random key and base64-encode it. For example:
-
-```shell
-dd if=/dev/urandom bs=32 count=1 | base64
-```
-
-- Store this key in a secure location (for example, a Kubernetes secret):
-
-```shell
-kubectl create secret generic coder-external-token-encryption-keys --from-literal=keys=
-```
-
-- In your Coder configuration set `CODER_EXTERNAL_TOKEN_ENCRYPTION_KEYS` to a
- comma-separated list of base64-encoded keys. For example, in your Helm
- `values.yaml`:
-
-```yaml
-coder:
- env:
- [...]
- - name: CODER_EXTERNAL_TOKEN_ENCRYPTION_KEYS
- valueFrom:
- secretKeyRef:
- name: coder-external-token-encryption-keys
- key: keys
-```
-
-- Restart the Coder server. The server will now encrypt all new data with the
- provided key.
-
-## Rotating keys
-
-We recommend only having one active encryption key at a time normally. However,
-if you need to rotate keys, you can perform the following procedure:
-
-- Ensure you have a valid backup of your database. **Do not skip this step.**
-
-- Generate a new encryption key following the same procedure as above.
-
-- Add the above key to the list of
- [external token encryption keys](../cli/server.md#--external-token-encryption-keys).
- **The new key must appear first in the list**. For example, in the Kubernetes
- secret created above:
-
-```yaml
-apiVersion: v1
-kind: Secret
-type: Opaque
-metadata:
- name: coder-external-token-encryption-keys
- namespace: coder-namespace
-data:
- keys: ,,,...
-```
-
-- After updating the configuration, restart the Coder server. The server will
- now encrypt all new data with the new key, but will be able to decrypt tokens
- encrypted with the old key(s).
-
-- To re-encrypt all encrypted database fields with the new key, run
- [`coder server dbcrypt rotate`](../cli/server_dbcrypt_rotate.md). This command
- will re-encrypt all tokens with the specified new encryption key. We recommend
- performing this action during a maintenance window.
-
- > Note: this command requires direct access to the database. If you are using
- > the built-in PostgreSQL database, you can run
- > [`coder server postgres-builtin-url`](../cli/server_postgres-builtin-url.md)
- > to get the connection URL.
-
-- Once the above command completes successfully, remove the old encryption key
- from Coder's configuration and restart Coder once more. You can now safely
- delete the old key from your secret store.
-
-## Disabling encryption
-
-To disable encryption, perform the following actions:
-
-- Ensure you have a valid backup of your database. **Do not skip this step.**
-
-- Stop all active coderd instances. This will prevent new encrypted data from
- being written, which may cause the next step to fail.
-
-- Run [`coder server dbcrypt decrypt`](../cli/server_dbcrypt_decrypt.md). This
- command will decrypt all encrypted user tokens and revoke all active
- encryption keys.
-
- > Note: for `decrypt` command, the equivalent environment variable for
- > `--keys` is `CODER_EXTERNAL_TOKEN_ENCRYPTION_DECRYPT_KEYS` and not
- > `CODER_EXTERNAL_TOKEN_ENCRYPTION_KEYS`. This is explicitly named differently
- > to help prevent accidentally decrypting data.
-
-- Remove all
- [external token encryption keys](../cli/server.md#--external-token-encryption-keys)
- from Coder's configuration.
-
-- Start coderd. You can now safely delete the encryption keys from your secret
- store.
-
-## Deleting Encrypted Data
-
-> NOTE: This is a destructive operation.
-
-To delete all encrypted data from your database, perform the following actions:
-
-- Ensure you have a valid backup of your database. **Do not skip this step.**
-
-- Stop all active coderd instances. This will prevent new encrypted data from
- being written.
-
-- Run [`coder server dbcrypt delete`](../cli/server_dbcrypt_delete.md). This
- command will delete all encrypted user tokens and revoke all active encryption
- keys.
-
-- Remove all
- [external token encryption keys](../cli/server.md#--external-token-encryption-keys)
- from Coder's configuration.
-
-- Start coderd. You can now safely delete the encryption keys from your secret
- store.
-
-## Troubleshooting
-
-- If Coder detects that the data stored in the database was not encrypted with
- any known keys, it will refuse to start. If you are seeing this behaviour,
- ensure that the encryption keys provided are correct.
-- If Coder detects that the data stored in the database was encrypted with a key
- that is no longer active, it will refuse to start. If you are seeing this
- behaviour, ensure that the encryption keys provided are correct and that you
- have not revoked any keys that are still in use.
-- Decryption may fail if newly encrypted data is written while decryption is in
- progress. If this happens, ensure that all active coder instances are stopped,
- and retry.
diff --git a/docs/admin/external-auth.md b/docs/admin/external-auth.md
deleted file mode 100644
index f98dfbf42a7cf..0000000000000
--- a/docs/admin/external-auth.md
+++ /dev/null
@@ -1,346 +0,0 @@
-# External Authentication
-
-Coder integrates with Git and OpenID Connect to automate away the need for
-developers to authenticate with external services within their workspace.
-
-## Git Providers
-
-When developers use `git` inside their workspace, they are prompted to
-authenticate. After that, Coder will store and refresh tokens for future
-operations.
-
-
-
-## Configuration
-
-To add an external authentication provider, you'll need to create an OAuth
-application. The following providers are supported:
-
-- [GitHub](#github)
-- [GitLab](https://docs.gitlab.com/ee/integration/oauth_provider.html)
-- [BitBucket](https://support.atlassian.com/bitbucket-cloud/docs/use-oauth-on-bitbucket-cloud/)
-- [Azure DevOps](https://learn.microsoft.com/en-us/azure/devops/integrate/get-started/authentication/oauth?view=azure-devops)
-- [Azure DevOps (via Entra ID)](https://learn.microsoft.com/en-us/entra/architecture/auth-oauth2)
-
-The next step is to [configure the Coder server](./configure.md) to use the
-OAuth application by setting the following environment variables:
-
-```env
-CODER_EXTERNAL_AUTH_0_ID=""
-CODER_EXTERNAL_AUTH_0_TYPE=
-CODER_EXTERNAL_AUTH_0_CLIENT_ID=xxxxxx
-CODER_EXTERNAL_AUTH_0_CLIENT_SECRET=xxxxxxx
-
-# Optionally, configure a custom display name and icon
-CODER_EXTERNAL_AUTH_0_DISPLAY_NAME="Google Calendar"
-CODER_EXTERNAL_AUTH_0_DISPLAY_ICON="https://mycustomicon.com/google.svg"
-```
-
-The `CODER_EXTERNAL_AUTH_0_ID` environment variable is used for internal
-reference. Therefore, it can be set arbitrarily (e.g., `primary-github` for your
-GitHub provider).
-
-### GitHub
-
-> If you don't require fine-grained access control, it's easier to configure a
-> GitHub OAuth app!
-
-1. [Create a GitHub App](https://docs.github.com/en/apps/creating-github-apps/registering-a-github-app/registering-a-github-app)
-
- - Set the callback URL to
- `https://coder.example.com/external-auth/USER_DEFINED_ID/callback`.
- - Deactivate Webhooks.
- - Enable fine-grained access to specific repositories or a subset of
- permissions for security.
-
- 
-
-2. Adjust the GitHub App permissions. You can use more or less permissions than
- are listed here, this is merely a suggestion that allows users to clone
- repositories:
-
- 
-
- | Name | Permission | Description |
- | ------------- | ------------ | ------------------------------------------------------ |
- | Contents | Read & Write | Grants access to code and commit statuses. |
- | Pull requests | Read & Write | Grants access to create and update pull requests. |
- | Workflows | Read & Write | Grants access to update files in `.github/workflows/`. |
- | Metadata | Read-only | Grants access to metadata written by GitHub Apps. |
- | Members | Rad-only | Grabts access to organization members and teams. |
-
-3. Install the App for your organization. You may select a subset of
- repositories to grant access to.
-
- 
-
-```env
-CODER_EXTERNAL_AUTH_0_ID="USER_DEFINED_ID"
-CODER_EXTERNAL_AUTH_0_TYPE=github
-CODER_EXTERNAL_AUTH_0_CLIENT_ID=xxxxxx
-CODER_EXTERNAL_AUTH_0_CLIENT_SECRET=xxxxxxx
-```
-
-### GitHub Enterprise
-
-GitHub Enterprise requires the following environment variables:
-
-```env
-CODER_EXTERNAL_AUTH_0_ID="primary-github"
-CODER_EXTERNAL_AUTH_0_TYPE=github
-CODER_EXTERNAL_AUTH_0_CLIENT_ID=xxxxxx
-CODER_EXTERNAL_AUTH_0_CLIENT_SECRET=xxxxxxx
-CODER_EXTERNAL_AUTH_0_VALIDATE_URL="https://github.example.com/api/v3/user"
-CODER_EXTERNAL_AUTH_0_AUTH_URL="https://github.example.com/login/oauth/authorize"
-CODER_EXTERNAL_AUTH_0_TOKEN_URL="https://github.example.com/login/oauth/access_token"
-```
-
-### Bitbucket Server
-
-Bitbucket Server requires the following environment variables:
-
-```env
-CODER_EXTERNAL_AUTH_0_ID="primary-bitbucket-server"
-CODER_EXTERNAL_AUTH_0_TYPE=bitbucket-server
-CODER_EXTERNAL_AUTH_0_CLIENT_ID=xxx
-CODER_EXTERNAL_AUTH_0_CLIENT_SECRET=xxx
-CODER_EXTERNAL_AUTH_0_AUTH_URL=https://bitbucket.domain.com/rest/oauth2/latest/authorize
-```
-
-### Azure DevOps
-
-Azure DevOps requires the following environment variables:
-
-```env
-CODER_EXTERNAL_AUTH_0_ID="primary-azure-devops"
-CODER_EXTERNAL_AUTH_0_TYPE=azure-devops
-CODER_EXTERNAL_AUTH_0_CLIENT_ID=xxxxxx
-# Ensure this value is your "Client Secret", not "App Secret"
-CODER_EXTERNAL_AUTH_0_CLIENT_SECRET=xxxxxxx
-CODER_EXTERNAL_AUTH_0_AUTH_URL="https://app.vssps.visualstudio.com/oauth2/authorize"
-CODER_EXTERNAL_AUTH_0_TOKEN_URL="https://app.vssps.visualstudio.com/oauth2/token"
-```
-
-### Azure DevOps (via Entra ID)
-
-Azure DevOps (via Entra ID) requires the following environment variables:
-
-```env
-CODER_EXTERNAL_AUTH_0_ID="primary-azure-devops"
-CODER_EXTERNAL_AUTH_0_TYPE=azure-devops-entra
-CODER_EXTERNAL_AUTH_0_CLIENT_ID=xxxxxx
-CODER_EXTERNAL_AUTH_0_CLIENT_SECRET=xxxxxxx
-CODER_EXTERNAL_AUTH_0_AUTH_URL="https://login.microsoftonline.com//oauth2/authorize"
-```
-
-> Note: Your app registration in Entra ID requires the `vso.code_write` scope
-
-### GitLab self-managed
-
-GitLab self-managed requires the following environment variables:
-
-```env
-CODER_EXTERNAL_AUTH_0_ID="primary-gitlab"
-CODER_EXTERNAL_AUTH_0_TYPE=gitlab
-# This value is the "Application ID"
-CODER_EXTERNAL_AUTH_0_CLIENT_ID=xxxxxx
-CODER_EXTERNAL_AUTH_0_CLIENT_SECRET=xxxxxxx
-CODER_EXTERNAL_AUTH_0_VALIDATE_URL="https://gitlab.company.org/oauth/token/info"
-CODER_EXTERNAL_AUTH_0_AUTH_URL="https://gitlab.company.org/oauth/authorize"
-CODER_EXTERNAL_AUTH_0_TOKEN_URL="https://gitlab.company.org/oauth/token"
-CODER_EXTERNAL_AUTH_0_REGEX=gitlab\.company\.org
-```
-
-### Gitea
-
-```env
-CODER_EXTERNAL_AUTH_0_ID="gitea"
-CODER_EXTERNAL_AUTH_0_TYPE=gitea
-CODER_EXTERNAL_AUTH_0_CLIENT_ID=xxxxxxx
-CODER_EXTERNAL_AUTH_0_CLIENT_SECRET=xxxxxxx
-# If self managed, set the Auth URL to your Gitea instance
-CODER_EXTERNAL_AUTH_0_AUTH_URL="https://gitea.com/login/oauth/authorize"
-```
-
-The Redirect URI for Gitea should be
-https://coder.company.org/external-auth/gitea/callback
-
-### Self-managed git providers
-
-Custom authentication and token URLs should be used for self-managed Git
-provider deployments.
-
-```env
-CODER_EXTERNAL_AUTH_0_AUTH_URL="https://github.example.com/oauth/authorize"
-CODER_EXTERNAL_AUTH_0_TOKEN_URL="https://github.example.com/oauth/token"
-CODER_EXTERNAL_AUTH_0_VALIDATE_URL="https://your-domain.com/oauth/token/info"
-CODER_EXTERNAL_AUTH_0_REGEX=github\.company\.org
-```
-
-> Note: The `REGEX` variable must be set if using a custom git domain.
-
-### JFrog Artifactory
-
-See [this](https://coder.com/docs/guides/artifactory-integration#jfrog-oauth)
-guide on instructions on how to set up for JFrog Artifactory.
-
-### Custom scopes
-
-Optionally, you can request custom scopes:
-
-```env
-CODER_EXTERNAL_AUTH_0_SCOPES="repo:read repo:write write:gpg_key"
-```
-
-### Multiple External Providers (enterprise)
-
-Multiple providers are an Enterprise feature. [Learn more](../enterprise.md).
-Below is an example configuration with multiple providers.
-
-```env
-# Provider 1) github.com
-CODER_EXTERNAL_AUTH_0_ID=primary-github
-CODER_EXTERNAL_AUTH_0_TYPE=github
-CODER_EXTERNAL_AUTH_0_CLIENT_ID=xxxxxx
-CODER_EXTERNAL_AUTH_0_CLIENT_SECRET=xxxxxxx
-CODER_EXTERNAL_AUTH_0_REGEX=github.com/orgname
-
-# Provider 2) github.example.com
-CODER_EXTERNAL_AUTH_1_ID=secondary-github
-CODER_EXTERNAL_AUTH_1_TYPE=github
-CODER_EXTERNAL_AUTH_1_CLIENT_ID=xxxxxx
-CODER_EXTERNAL_AUTH_1_CLIENT_SECRET=xxxxxxx
-CODER_EXTERNAL_AUTH_1_REGEX=github.example.com
-CODER_EXTERNAL_AUTH_1_AUTH_URL="https://github.example.com/login/oauth/authorize"
-CODER_EXTERNAL_AUTH_1_TOKEN_URL="https://github.example.com/login/oauth/access_token"
-CODER_EXTERNAL_AUTH_1_VALIDATE_URL="https://github.example.com/api/v3/user"
-```
-
-To support regex matching for paths (e.g. github.com/orgname), you'll need to
-add this to the
-[Coder agent startup script](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/agent#startup_script):
-
-```shell
-git config --global credential.useHttpPath true
-```
-
-### Kubernetes environment variables
-
-If you deployed Coder with Kubernetes you can set the environment variables in
-your `values.yaml` file:
-
-```yaml
-coder:
- env:
- # […]
- - name: CODER_EXTERNAL_AUTH_0_ID
- value: USER_DEFINED_ID
-
- - name: CODER_EXTERNAL_AUTH_0_TYPE
- value: github
-
- - name: CODER_EXTERNAL_AUTH_0_CLIENT_ID
- valueFrom:
- secretKeyRef:
- name: github-primary-basic-auth
- key: client-id
-
- - name: CODER_EXTERNAL_AUTH_0_CLIENT_SECRET
- valueFrom:
- secretKeyRef:
- name: github-primary-basic-auth
- key: client-secret
-```
-
-You can set the secrets by creating a `github-primary-basic-auth.yaml` file and
-applying it.
-
-```yaml
-apiVersion: v1
-kind: Secret
-metadata:
- name: github-primary-basic-auth
-type: Opaque
-stringData:
- client-secret: xxxxxxxxx
- client-id: xxxxxxxxx
-```
-
-Make sure to restart the affected pods for the change to take effect.
-
-## Require git authentication in templates
-
-If your template requires git authentication (e.g. running `git clone` in the
-[startup_script](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/agent#startup_script)),
-you can require users authenticate via git prior to creating a workspace:
-
-
-
-### Native git authentication will auto-refresh tokens
-
-
-
- This is the preferred authentication method.
-
-
-
-By default, the coder agent will configure native `git` authentication via the
-`GIT_ASKPASS` environment variable. Meaning, with no additional configuration,
-external authentication will work with native `git` commands.
-
-To check the auth token being used **from inside a running workspace**, run:
-
-```shell
-# If the exit code is non-zero, then the user is not authenticated with the
-# external provider.
-coder external-auth access-token
-```
-
-Note: Some IDE's override the `GIT_ASKPASS` environment variable and need to be
-configured.
-
-**VSCode**
-
-Use the
-[Coder](https://marketplace.visualstudio.com/items?itemName=coder.coder-remote)
-extension to automatically configure these settings for you!
-
-Otherwise, you can manually configure the following settings:
-
-- Set `git.terminalAuthentication` to `false`
-- Set `git.useIntegratedAskPass` to `false`
-
-### Hard coded tokens do not auto-refresh
-
-If the token is required to be inserted into the workspace, for example
-[GitHub cli](https://cli.github.com/), the auth token can be inserted from the
-template. This token will not auto-refresh. The following example will
-authenticate via GitHub and auto-clone a repo into the `~/coder` directory.
-
-```hcl
-data "coder_external_auth" "github" {
- # Matches the ID of the external auth provider in Coder.
- id = "github"
-}
-
-resource "coder_agent" "dev" {
- os = "linux"
- arch = "amd64"
- dir = "~/coder"
- env = {
- GITHUB_TOKEN : data.coder_external_auth.github.access_token
- }
- startup_script = < Coder and
-user <-> Coder connections.
-
-## Setup
-
-Coder automatically enters HA mode when multiple instances simultaneously
-connect to the same Postgres endpoint.
-
-HA brings one configuration variable to set in each Coderd node:
-`CODER_DERP_SERVER_RELAY_URL`. The HA nodes use these URLs to communicate with
-each other. Inter-node communication is only required while using the embedded
-relay (default). If you're using
-[custom relays](../networking/index.md#custom-relays), Coder ignores
-`CODER_DERP_SERVER_RELAY_URL` since Postgres is the sole rendezvous for the
-Coder nodes.
-
-`CODER_DERP_SERVER_RELAY_URL` will never be `CODER_ACCESS_URL` because
-`CODER_ACCESS_URL` is a load balancer to all Coder nodes.
-
-Here's an example 3-node network configuration setup:
-
-| Name | `CODER_HTTP_ADDRESS` | `CODER_DERP_SERVER_RELAY_URL` | `CODER_ACCESS_URL` |
-| --------- | -------------------- | ----------------------------- | ------------------------ |
-| `coder-1` | `*:80` | `http://10.0.0.1:80` | `https://coder.big.corp` |
-| `coder-2` | `*:80` | `http://10.0.0.2:80` | `https://coder.big.corp` |
-| `coder-3` | `*:80` | `http://10.0.0.3:80` | `https://coder.big.corp` |
-
-## Kubernetes
-
-If you installed Coder via
-[our Helm Chart](../install/kubernetes.md#install-coder-with-helm), just
-increase `coder.replicaCount` in `values.yaml`.
-
-If you installed Coder into Kubernetes by some other means, insert the relay URL
-via the environment like so:
-
-```yaml
-env:
- - name: POD_IP
- valueFrom:
- fieldRef:
- fieldPath: status.podIP
- - name: CODER_DERP_SERVER_RELAY_URL
- value: http://$(POD_IP)
-```
-
-Then, increase the number of pods.
-
-## Up next
-
-- [Networking](../networking/index.md)
-- [Kubernetes](../install/kubernetes.md)
-- [Enterprise](../enterprise.md)
diff --git a/docs/admin/infrastructure/README.md b/docs/admin/infrastructure/README.md
new file mode 100644
index 0000000000000..c7b1f4a521850
--- /dev/null
+++ b/docs/admin/infrastructure/README.md
@@ -0,0 +1,21 @@
+# Infrastructure
+
+Learn how to spin up & manage Coder infrastructure.
+
+## Architecture
+
+Coder is a self-hosted platform that runs on your own servers. For large deployments, we recommend running the control plane on Kubernetes. Workspaces can be run as VMs or Kubernetes pods. The control plane (`coderd`) runs in a single region. However, workspace proxies, provisioners, and workspaces can run across regions or even cloud providers for the optimal developer experience.
+
+Learn more about Coder's [architecture, concepts, and dependencies](./architecture.md).
+
+## Reference Architectures
+
+We publish [reference architectures](./validated-architectures/README.md) that include best practices around Coder configuration, infrastructure sizing, autoscaling, and operational readiness for different deployment sizes (e.g. `Up to 2000 users`).
+
+## Scale Tests
+
+Use our [scale test utility](../scaling/scale-utility.md) that can be run on your Coder deployment to simulate user activity and measure performance.
+
+## Monitoring
+
+See our dedicated [Monitoring](../monitoring/README.md) section for details around monitoring your Coder deployment via a bundled Grafana dashboard, health check, and/or within your own observability stack via Prometheus metrics.
diff --git a/docs/admin/infrastructure/architecture.md b/docs/admin/infrastructure/architecture.md
new file mode 100644
index 0000000000000..97e2baa4952c0
--- /dev/null
+++ b/docs/admin/infrastructure/architecture.md
@@ -0,0 +1,132 @@
+# Architecture
+
+The Coder deployment model is flexible and offers various components that
+platform administrators can deploy and scale depending on their use case. This
+page describes possible deployments, challenges, and risks associated with them.
+
+
+
+## Community Edition
+
+
+
+## Enterprise
+
+
+
+## Multi-Region Enterprise
+
+
+
+
+
+## Primary components
+
+### coderd
+
+_coderd_ is the service created by running `coder server`. It is a thin API that
+connects workspaces, provisioners and users. _coderd_ stores its state in
+Postgres and is the only service that communicates with Postgres.
+
+It offers:
+
+- Dashboard (UI)
+- HTTP API
+- Dev URLs (HTTP reverse proxy to workspaces)
+- Workspace Web Applications (e.g for easy access to `code-server`)
+- Agent registration
+
+### provisionerd
+
+_provisionerd_ is the execution context for infrastructure modifying providers.
+At the moment, the only provider is Terraform (running `terraform`).
+
+By default, the Coder server runs multiple provisioner daemons.
+[External provisioners](../admin/provisioners.md) can be added for security or
+scalability purposes.
+
+### Workspaces
+
+At the highest level, a workspace is a set of cloud resources. These resources
+can be VMs, Kubernetes clusters, storage buckets, or whatever else Terraform
+lets you dream up.
+
+The resources that run the agent are described as _computational resources_,
+while those that don't are called _peripheral resources_.
+
+Each resource may also be _persistent_ or _ephemeral_ depending on whether
+they're destroyed on workspace stop.
+
+### Agents
+
+An agent is the Coder service that runs within a user's remote workspace. It
+provides a consistent interface for coderd and clients to communicate with
+workspaces regardless of operating system, architecture, or cloud.
+
+It offers the following services along with much more:
+
+- SSH
+- Port forwarding
+- Liveness checks
+- `startup_script` automation
+
+Templates are responsible for
+[creating and running agents](../templates/index.md#coder-agent) within
+workspaces.
+
+## Service Bundling
+
+While _coderd_ and Postgres can be orchestrated independently, our default
+installation paths bundle them all together into one system service. It's
+perfectly fine to run a production deployment this way, but there are certain
+situations that necessitate decomposition:
+
+- Reducing global client latency (distribute coderd and centralize database)
+- Achieving greater availability and efficiency (horizontally scale individual
+ services)
+
+## Data Layer
+
+### PostgreSQL (Recommended)
+
+While `coderd` runs a bundled version of PostgreSQL, we recommend running an
+external PostgreSQL 13+ database for production deployments.
+
+A managed PostgreSQL database, with daily backups, is recommended:
+
+- For AWS: Amazon RDS for PostgreSQL
+- For Azure: Azure Database for PostgreSQL
+- Flexible Server For GCP: Cloud SQL for PostgreSQL
+
+Learn more about database requirements:
+[Database Health](./health-check.md#database)
+
+### Git Providers (Recommended)
+
+Users will likely need to pull source code and other artifacts from a git
+provider. The Coder control plane and workspaces will need network connectivity
+to the git provider.
+
+- [GitHub](#TODO)
+- [GitHub Enterprise](#TODO)
+- [GitLab](#TODO)
+- [BitBucket](#TODO)
+- [BitBucket](#TODO)
+- [Other Providers](#TODO)
+
+### Artifact Manager (Optional)
+
+Workspaces and templates can pull artifacts from an artifact manager, such as
+JFrog Artifactory. This can be configured on the infrastructure level, or in
+some cases within Coder:
+
+- Tutorial: [JFrog Artifactory and Coder](#TODO)
+
+### Container Registry (Optional)
+
+If you prefer not to pull container images for the control plane (`coderd`,
+`provisionerd`) and workspaces from public container registry (Docker Hub,
+GitHub Container Registry) you can run your own container registry with Coder.
+
+To shorten the provisioning time, it is recommended to deploy registry mirrors
+in the same region as the workspace nodes.
diff --git a/docs/admin/scaling/scale-testing.md b/docs/admin/infrastructure/scale-testing.md
similarity index 93%
rename from docs/admin/scaling/scale-testing.md
rename to docs/admin/infrastructure/scale-testing.md
index f107dc7f7f071..e41ef86e5f40f 100644
--- a/docs/admin/scaling/scale-testing.md
+++ b/docs/admin/infrastructure/scale-testing.md
@@ -90,11 +90,11 @@ Database:
## Available reference architectures
-[Up to 1,000 users](../../architecture/1k-users.md)
+[Up to 1,000 users](./validated-architectures/1k-users.md)
-[Up to 2,000 users](../../architecture/2k-users.md)
+[Up to 2,000 users](./validated-architectures/2k-users.md)
-[Up to 3,000 users](../../architecture/3k-users.md)
+[Up to 3,000 users](./validated-architectures/3k-users.md)
## Hardware recommendation
@@ -112,13 +112,14 @@ on the workload size to ensure deployment stability.
#### CPU and memory usage
-Enabling [agent stats collection](../../cli.md#--prometheus-collect-agent-stats)
+Enabling
+[agent stats collection](../../reference/cli/README.md#--prometheus-collect-agent-stats)
(optional) may increase memory consumption.
Enabling direct connections between users and workspace agents (apps or SSH
traffic) can help prevent an increase in CPU usage. It is recommended to keep
-[this option enabled](../../cli.md#--disable-direct-connections) unless there
-are compelling reasons to disable it.
+[this option enabled](../../reference/cli/README.md#--disable-direct-connections)
+unless there are compelling reasons to disable it.
Inactive users do not consume Coder resources.
@@ -148,18 +149,19 @@ Terminal (bidirectional), and Workspace events/logs (unidirectional).
If the Coder deployment expects traffic from developers spread across the globe,
be aware that customer-facing latency might be higher because of the distance
between users and the load balancer. Fortunately, the latency can be improved
-with a deployment of Coder [workspace proxies](../workspace-proxies.md).
+with a deployment of Coder
+[workspace proxies](../networking/workspace-proxies.md).
**Node Autoscaling**
We recommend disabling the autoscaling for `coderd` nodes. Autoscaling can cause
interruptions for user connections, see
-[Autoscaling](scale-utility.md#autoscaling) for more details.
+[Autoscaling](./scale-utility.md#autoscaling) for more details.
### Control plane: Workspace Proxies
-When scaling [workspace proxies](../workspace-proxies.md), follow the same
-guidelines as for `coderd` above:
+When scaling [workspace proxies](../networking/workspace-proxies.md), follow the
+same guidelines as for `coderd` above:
- `1 vCPU x 2 GB memory` for every 250 users.
- Disable autoscaling.
diff --git a/docs/admin/scaling/scale-utility.md b/docs/admin/infrastructure/scale-utility.md
similarity index 95%
rename from docs/admin/scaling/scale-utility.md
rename to docs/admin/infrastructure/scale-utility.md
index 0cc0316193724..717688d03adda 100644
--- a/docs/admin/scaling/scale-utility.md
+++ b/docs/admin/infrastructure/scale-utility.md
@@ -6,15 +6,15 @@ infrastructure. For scale-testing Kubernetes clusters we recommend to install
and use the dedicated Coder template,
[scaletest-runner](https://github.com/coder/coder/tree/main/scaletest/templates/scaletest-runner).
-Learn more about [Coder’s architecture](../../architecture/architecture.md) and
-our [scale-testing methodology](scale-testing.md).
+Learn more about [Coder’s architecture](./architecture/architecture.md) and our
+[scale-testing methodology](./scale-testing.md).
## Recent scale tests
> Note: the below information is for reference purposes only, and are not
> intended to be used as guidelines for infrastructure sizing. Review the
-> [Reference Architectures](../../architecture/validated-arch.md#node-sizing)
-> for hardware sizing recommendations.
+> [Reference Architectures](./validated-architectures/README.md#node-sizing) for
+> hardware sizing recommendations.
| Environment | Coder CPU | Coder RAM | Coder Replicas | Database | Users | Concurrent builds | Concurrent connections (Terminal/SSH) | Coder Version | Last tested |
| ---------------- | --------- | --------- | -------------- | ----------------- | ----- | ----------------- | ------------------------------------- | ------------- | ------------ |
@@ -249,6 +249,7 @@ an annotation on the coderd deployment.
## Troubleshooting
If a load test fails or if you are experiencing performance issues during
-day-to-day use, you can leverage Coder's [Prometheus metrics](../prometheus.md)
-to identify bottlenecks during scale tests. Additionally, you can use your
-existing cloud monitoring stack to measure load, view server logs, etc.
+day-to-day use, you can leverage Coder's
+[Prometheus metrics](../integrations/prometheus.md) to identify bottlenecks
+during scale tests. Additionally, you can use your existing cloud monitoring
+stack to measure load, view server logs, etc.
diff --git a/docs/admin/infrastructure/validated-architectures/1k-users.md b/docs/admin/infrastructure/validated-architectures/1k-users.md
new file mode 100644
index 0000000000000..158eb10392e79
--- /dev/null
+++ b/docs/admin/infrastructure/validated-architectures/1k-users.md
@@ -0,0 +1,51 @@
+# Reference Architecture: up to 1,000 users
+
+The 1,000 users architecture is designed to cover a wide range of workflows.
+Examples of subjects that might utilize this architecture include medium-sized
+tech startups, educational units, or small to mid-sized enterprises.
+
+**Target load**: API: up to 180 RPS
+
+**High Availability**: non-essential for small deployments
+
+## Hardware recommendations
+
+### Coderd nodes
+
+| Users | Node capacity | Replicas | GCP | AWS | Azure |
+| ----------- | ------------------- | ------------------- | --------------- | ---------- | ----------------- |
+| Up to 1,000 | 2 vCPU, 8 GB memory | 1-2 / 1 coderd each | `n1-standard-2` | `t3.large` | `Standard_D2s_v3` |
+
+**Footnotes**:
+
+- For small deployments (ca. 100 users, 10 concurrent workspace builds), it is
+ acceptable to deploy provisioners on `coderd` nodes.
+
+### Provisioner nodes
+
+| Users | Node capacity | Replicas | GCP | AWS | Azure |
+| ----------- | -------------------- | ------------------------------ | ---------------- | ------------ | ----------------- |
+| Up to 1,000 | 8 vCPU, 32 GB memory | 2 nodes / 30 provisioners each | `t2d-standard-8` | `t3.2xlarge` | `Standard_D8s_v3` |
+
+**Footnotes**:
+
+- An external provisioner is deployed as Kubernetes pod.
+
+### Workspace nodes
+
+| Users | Node capacity | Replicas | GCP | AWS | Azure |
+| ----------- | -------------------- | ----------------------- | ---------------- | ------------ | ----------------- |
+| Up to 1,000 | 8 vCPU, 32 GB memory | 64 / 16 workspaces each | `t2d-standard-8` | `t3.2xlarge` | `Standard_D8s_v3` |
+
+**Footnotes**:
+
+- Assumed that a workspace user needs at minimum 2 GB memory to perform. We
+ recommend against over-provisioning memory for developer workloads, as this my
+ lead to OOMKiller invocations.
+- Maximum number of Kubernetes workspace pods per node: 256
+
+### Database nodes
+
+| Users | Node capacity | Replicas | Storage | GCP | AWS | Azure |
+| ----------- | ------------------- | -------- | ------- | ------------------ | ------------- | ----------------- |
+| Up to 1,000 | 2 vCPU, 8 GB memory | 1 | 512 GB | `db-custom-2-7680` | `db.t3.large` | `Standard_D2s_v3` |
diff --git a/docs/admin/infrastructure/validated-architectures/2k-users.md b/docs/admin/infrastructure/validated-architectures/2k-users.md
new file mode 100644
index 0000000000000..04ff5bf4ec19a
--- /dev/null
+++ b/docs/admin/infrastructure/validated-architectures/2k-users.md
@@ -0,0 +1,59 @@
+# Reference Architecture: up to 2,000 users
+
+In the 2,000 users architecture, there is a moderate increase in traffic,
+suggesting a growing user base or expanding operations. This setup is
+well-suited for mid-sized companies experiencing growth or for universities
+seeking to accommodate their expanding user populations.
+
+Users can be evenly distributed between 2 regions or be attached to different
+clusters.
+
+**Target load**: API: up to 300 RPS
+
+**High Availability**: The mode is _enabled_; multiple replicas provide higher
+deployment reliability under load.
+
+## Hardware recommendations
+
+### Coderd nodes
+
+| Users | Node capacity | Replicas | GCP | AWS | Azure |
+| ----------- | -------------------- | ----------------------- | --------------- | ----------- | ----------------- |
+| Up to 2,000 | 4 vCPU, 16 GB memory | 2 nodes / 1 coderd each | `n1-standard-4` | `t3.xlarge` | `Standard_D4s_v3` |
+
+### Provisioner nodes
+
+| Users | Node capacity | Replicas | GCP | AWS | Azure |
+| ----------- | -------------------- | ------------------------------ | ---------------- | ------------ | ----------------- |
+| Up to 2,000 | 8 vCPU, 32 GB memory | 4 nodes / 30 provisioners each | `t2d-standard-8` | `t3.2xlarge` | `Standard_D8s_v3` |
+
+**Footnotes**:
+
+- An external provisioner is deployed as Kubernetes pod.
+- It is not recommended to run provisioner daemons on `coderd` nodes.
+- Consider separating provisioners into different namespaces in favor of
+ zero-trust or multi-cloud deployments.
+
+### Workspace nodes
+
+| Users | Node capacity | Replicas | GCP | AWS | Azure |
+| ----------- | -------------------- | ------------------------ | ---------------- | ------------ | ----------------- |
+| Up to 2,000 | 8 vCPU, 32 GB memory | 128 / 16 workspaces each | `t2d-standard-8` | `t3.2xlarge` | `Standard_D8s_v3` |
+
+**Footnotes**:
+
+- Assumed that a workspace user needs 2 GB memory to perform
+- Maximum number of Kubernetes workspace pods per node: 256
+- Nodes can be distributed in 2 regions, not necessarily evenly split, depending
+ on developer team sizes
+
+### Database nodes
+
+| Users | Node capacity | Replicas | Storage | GCP | AWS | Azure |
+| ----------- | -------------------- | -------- | ------- | ------------------- | -------------- | ----------------- |
+| Up to 2,000 | 4 vCPU, 16 GB memory | 1 | 1 TB | `db-custom-4-15360` | `db.t3.xlarge` | `Standard_D4s_v3` |
+
+**Footnotes**:
+
+- Consider adding more replicas if the workspace activity is higher than 500
+ workspace builds per day or to achieve higher RPS.
diff --git a/docs/admin/infrastructure/validated-architectures/3k-users.md b/docs/admin/infrastructure/validated-architectures/3k-users.md
new file mode 100644
index 0000000000000..093ec21c5c52c
--- /dev/null
+++ b/docs/admin/infrastructure/validated-architectures/3k-users.md
@@ -0,0 +1,62 @@
+# Reference Architecture: up to 3,000 users
+
+The 3,000 users architecture targets large-scale enterprises, possibly with
+on-premises network and cloud deployments.
+
+**Target load**: API: up to 550 RPS
+
+**High Availability**: Typically, such scale requires a fully-managed HA
+PostgreSQL service, and all Coder observability features enabled for operational
+purposes.
+
+**Observability**: Deploy monitoring solutions to gather Prometheus metrics and
+visualize them with Grafana to gain detailed insights into infrastructure and
+application behavior. This allows operators to respond quickly to incidents and
+continuously improve the reliability and performance of the platform.
+
+## Hardware recommendations
+
+### Coderd nodes
+
+| Users | Node capacity | Replicas | GCP | AWS | Azure |
+| ----------- | -------------------- | ----------------- | --------------- | ----------- | ----------------- |
+| Up to 3,000 | 8 vCPU, 32 GB memory | 4 / 1 coderd each | `n1-standard-4` | `t3.xlarge` | `Standard_D4s_v3` |
+
+### Provisioner nodes
+
+| Users | Node capacity | Replicas | GCP | AWS | Azure |
+| ----------- | -------------------- | ------------------------ | ---------------- | ------------ | ----------------- |
+| Up to 3,000 | 8 vCPU, 32 GB memory | 8 / 30 provisioners each | `t2d-standard-8` | `t3.2xlarge` | `Standard_D8s_v3` |
+
+**Footnotes**:
+
+- An external provisioner is deployed as Kubernetes pod.
+- It is strongly discouraged to run provisioner daemons on `coderd` nodes at
+ this level of scale.
+- Separate provisioners into different namespaces in favor of zero-trust or
+ multi-cloud deployments.
+
+### Workspace nodes
+
+| Users | Node capacity | Replicas | GCP | AWS | Azure |
+| ----------- | -------------------- | ------------------------------ | ---------------- | ------------ | ----------------- |
+| Up to 3,000 | 8 vCPU, 32 GB memory | 256 nodes / 12 workspaces each | `t2d-standard-8` | `t3.2xlarge` | `Standard_D8s_v3` |
+
+**Footnotes**:
+
+- Assumed that a workspace user needs 2 GB memory to perform
+- Maximum number of Kubernetes workspace pods per node: 256
+- As workspace nodes can be distributed between regions, on-premises networks
+ and cloud areas, consider different namespaces in favor of zero-trust or
+ multi-cloud deployments.
+
+### Database nodes
+
+| Users | Node capacity | Replicas | Storage | GCP | AWS | Azure |
+| ----------- | -------------------- | -------- | ------- | ------------------- | --------------- | ----------------- |
+| Up to 3,000 | 8 vCPU, 32 GB memory | 2 | 1.5 TB | `db-custom-8-30720` | `db.t3.2xlarge` | `Standard_D8s_v3` |
+
+**Footnotes**:
+
+- Consider adding more replicas if the workspace activity is higher than 1500
+ workspace builds per day or to achieve higher RPS.
diff --git a/docs/admin/infrastructure/validated-architectures/README.md b/docs/admin/infrastructure/validated-architectures/README.md
new file mode 100644
index 0000000000000..ffb5a1e919ad7
--- /dev/null
+++ b/docs/admin/infrastructure/validated-architectures/README.md
@@ -0,0 +1,363 @@
+# Coder Validated Architecture
+
+Many customers operate Coder in complex organizational environments, consisting
+of multiple business units, agencies, and/or subsidiaries. This can lead to
+numerous Coder deployments, due to discrepancies in regulatory compliance, data
+sovereignty, and level of funding across groups. The Coder Validated
+Architecture (CVA) prescribes a Kubernetes-based deployment approach, enabling
+your organization to deploy a stable Coder instance that is easier to maintain
+and troubleshoot.
+
+The following sections will detail the components of the Coder Validated
+Architecture, provide guidance on how to configure and deploy these components,
+and offer insights into how to maintain and troubleshoot your Coder environment.
+
+- [General concepts](#general-concepts)
+- [Kubernetes Infrastructure](#kubernetes-infrastructure)
+- [PostgreSQL Database](#postgresql-database)
+- [Operational readiness](#operational-readiness)
+
+## Who is this document for?
+
+This guide targets the following personas. It assumes a basic understanding of
+cloud/on-premise computing, containerization, and the Coder platform.
+
+| Role | Description |
+| ------------------------- | ------------------------------------------------------------------------------ |
+| Platform Engineers | Responsible for deploying, operating the Coder deployment and infrastructure |
+| Enterprise Architects | Responsible for architecting Coder deployments to meet enterprise requirements |
+| Managed Service Providers | Entities that deploy and run Coder software as a service for customers |
+
+## CVA Guidance
+
+| CVA provides: | CVA does not provide: |
+| ---------------------------------------------- | ---------------------------------------------------------------------------------------- |
+| Single and multi-region K8s deployment options | Prescribing OS, or cloud vs. on-premise |
+| Reference architectures for up to 3,000 users | An approval of your architecture; the CVA solely provides recommendations and guidelines |
+| Best practices for building a Coder deployment | Recommendations for every possible deployment scenario |
+
+> For higher level design principles and architectural best practices, see
+> Coder's
+> [Well-Architected Framework](https://coder.com/blog/coder-well-architected-framework).
+
+## General concepts
+
+This section outlines core concepts and terminology essential for understanding
+Coder's architecture and deployment strategies.
+
+### Administrator
+
+An administrator is a user role within the Coder platform with elevated
+privileges. Admins have access to administrative functions such as user
+management, template definitions, insights, and deployment configuration.
+
+### Coder control plane
+
+Coder's control plane, also known as _coderd_, is the main service recommended
+for deployment with multiple replicas to ensure high availability. It provides
+an API for managing workspaces and templates, and serves the dashboard UI. In
+addition, each _coderd_ replica hosts 3 Terraform [provisioners](#provisioner)
+by default.
+
+### User
+
+A [user](../users.md) is an individual who utilizes the Coder platform to
+develop, test, and deploy applications using workspaces. Users can select
+available templates to provision workspaces. They interact with Coder using the
+web interface, the CLI tool, or directly calling API methods.
+
+### Workspace
+
+A [workspace](../../workspaces.md) refers to an isolated development environment
+where users can write, build, and run code. Workspaces are fully configurable
+and can be tailored to specific project requirements, providing developers with
+a consistent and efficient development environment. Workspaces can be
+autostarted and autostopped, enabling efficient resource management.
+
+Users can connect to workspaces using SSH or via workspace applications like
+`code-server`, facilitating collaboration and remote access. Additionally,
+workspaces can be parameterized, allowing users to customize settings and
+configurations based on their unique needs. Workspaces are instantiated using
+Coder templates and deployed on resources created by provisioners.
+
+### Template
+
+A [template](../../templates/index.md) in Coder is a predefined configuration
+for creating workspaces. Templates streamline the process of workspace creation
+by providing pre-configured settings, tooling, and dependencies. They are built
+by template administrators on top of Terraform, allowing for efficient
+management of infrastructure resources. Additionally, templates can utilize
+Coder modules to leverage existing features shared with other templates,
+enhancing flexibility and consistency across deployments. Templates describe
+provisioning rules for infrastructure resources offered by Terraform providers.
+
+### Workspace Proxy
+
+A [workspace proxy](../workspace-proxies.md) serves as a relay connection option
+for developers connecting to their workspace over SSH, a workspace app, or
+through port forwarding. It helps reduce network latency for geo-distributed
+teams by minimizing the distance network traffic needs to travel. Notably,
+workspace proxies do not handle dashboard connections or API calls.
+
+### Provisioner
+
+Provisioners in Coder execute Terraform during workspace and template builds.
+While the platform includes built-in provisioner daemons by default, there are
+advantages to employing external provisioners. These external daemons provide
+secure build environments and reduce server load, improving performance and
+scalability. Each provisioner can handle a single concurrent workspace build,
+allowing for efficient resource allocation and workload management.
+
+### Registry
+
+The [Coder Registry](https://registry.coder.com) is a platform where you can
+find starter templates and _Modules_ for various cloud services and platforms.
+
+Templates help create self-service development environments using
+Terraform-defined infrastructure, while _Modules_ simplify template creation by
+providing common features like workspace applications, third-party integrations,
+or helper scripts.
+
+Please note that the Registry is a hosted service and isn't available for
+offline use.
+
+## Kubernetes Infrastructure
+
+Kubernetes is the recommended, and supported platform for deploying Coder in the
+enterprise. It is the hosting platform of choice for a large majority of Coder's
+Fortune 500 customers, and it is the platform in which we build and test against
+here at Coder.
+
+### General recommendations
+
+In general, it is recommended to deploy Coder into its own respective cluster,
+separate from production applications. Keep in mind that Coder runs development
+workloads, so the cluster should be deployed as such, without production-level
+configurations.
+
+### Compute
+
+Deploy your Kubernetes cluster with two node groups, one for Coder's control
+plane, and another for user workspaces (if you intend on leveraging K8s for
+end-user compute).
+
+#### Control plane nodes
+
+The Coder control plane node group must be static, to prevent scale down events
+from dropping pods, and thus dropping user connections to the dashboard UI and
+their workspaces.
+
+Coder's Helm Chart supports
+[defining nodeSelectors, affinities, and tolerations](https://github.com/coder/coder/blob/e96652ebbcdd7554977594286b32015115c3f5b6/helm/coder/values.yaml#L221-L249)
+to schedule the control plane pods on the appropriate node group.
+
+#### Workspace nodes
+
+Coder workspaces can be deployed either as Pods or Deployments in Kubernetes.
+See our
+[example Kubernetes workspace template](https://github.com/coder/coder/tree/main/examples/templates/kubernetes).
+Configure the workspace node group to be auto-scaling, to dynamically allocate
+compute as users start/stop workspaces at the beginning and end of their day.
+Set nodeSelectors, affinities, and tolerations in Coder templates to assign
+workspaces to the given node group:
+
+```hcl
+resource "kubernetes_deployment" "coder" {
+ spec {
+ template {
+ metadata {
+ labels = {
+ app = "coder-workspace"
+ }
+ }
+
+ spec {
+ affinity {
+ pod_anti_affinity {
+ preferred_during_scheduling_ignored_during_execution {
+ weight = 1
+ pod_affinity_term {
+ label_selector {
+ match_expressions {
+ key = "app.kubernetes.io/instance"
+ operator = "In"
+ values = ["coder-workspace"]
+ }
+ }
+ topology_key = # add your node group label here
+ }
+ }
+ }
+ }
+
+ tolerations {
+ # Add your tolerations here
+ }
+
+ node_selector {
+ # Add your node selectors here
+ }
+
+ container {
+ image = "coder-workspace:latest"
+ name = "dev"
+ }
+ }
+ }
+ }
+}
+```
+
+#### Node sizing
+
+For sizing recommendations, see the below reference architectures:
+
+- [Up to 1,000 users](1k-users.md)
+
+- [Up to 2,000 users](2k-users.md)
+
+- [Up to 3,000 users](3k-users.md)
+
+### Networking
+
+It is likely your enterprise deploys Kubernetes clusters with various networking
+restrictions. With this in mind, Coder requires the following connectivity:
+
+- Egress from workspace compute to the Coder control plane pods
+- Egress from control plane pods to Coder's PostgreSQL database
+- Egress from control plane pods to git and package repositories
+- Ingress from user devices to the control plane Load Balancer or Ingress
+ controller
+
+We recommend configuring your network policies in accordance with the above.
+Note that Coder workspaces do not require any ports to be open.
+
+### Storage
+
+If running Coder workspaces as Kubernetes Pods or Deployments, you will need to
+assign persistent storage. We recommend leveraging a
+[supported Container Storage Interface (CSI) driver](https://kubernetes-csi.github.io/docs/drivers.html)
+in your cluster, with Dynamic Provisioning and read/write, to provide on-demand
+storage to end-user workspaces.
+
+The following Kubernetes volume types have been validated by Coder internally,
+and/or by our customers:
+
+- [PersistentVolumeClaim](https://kubernetes.io/docs/concepts/storage/volumes/#persistentvolumeclaim)
+- [NFS](https://kubernetes.io/docs/concepts/storage/volumes/#nfs)
+- [subPath](https://kubernetes.io/docs/concepts/storage/volumes/#using-subpath)
+- [cephfs](https://kubernetes.io/docs/concepts/storage/volumes/#cephfs)
+
+Our
+[example Kubernetes workspace template](https://github.com/coder/coder/blob/5b9a65e5c137232351381fc337d9784bc9aeecfc/examples/templates/kubernetes/main.tf#L191-L219)
+provisions a PersistentVolumeClaim block storage device, attached to the
+Deployment.
+
+It is not recommended to mount volumes from the host node(s) into workspaces,
+for security and reliability purposes. The below volume types are _not_
+recommended for use with Coder:
+
+- [Local](https://kubernetes.io/docs/concepts/storage/volumes/#local)
+- [hostPath](https://kubernetes.io/docs/concepts/storage/volumes/#hostpath)
+
+Not that Coder's control plane filesystem is ephemeral, so no persistent storage
+is required.
+
+## PostgreSQL database
+
+Coder requires access to an external PostgreSQL database to store user data,
+workspace state, template files, and more. Depending on the scale of the
+user-base, workspace activity, and High Availability requirements, the amount of
+CPU and memory resources required by Coder's database may differ.
+
+### Disaster recovery
+
+Prepare internal scripts for dumping and restoring your database. We recommend
+scheduling regular database backups, especially before upgrading Coder to a new
+release. Coder does not support downgrades without initially restoring the
+database to the prior version.
+
+### Performance efficiency
+
+We highly recommend deploying the PostgreSQL instance in the same region (and if
+possible, same availability zone) as the Coder server to optimize for low
+latency connections. We recommend keeping latency under 10ms between the Coder
+server and database.
+
+When determining scaling requirements, take into account the following
+considerations:
+
+- `2 vCPU x 8 GB RAM x 512 GB storage`: A baseline for database requirements for
+ Coder deployment with less than 1000 users, and low activity level (30% active
+ users). This capacity should be sufficient to support 100 external
+ provisioners.
+- Storage size depends on user activity, workspace builds, log verbosity,
+ overhead on database encryption, etc.
+- Allocate two additional CPU core to the database instance for every 1000
+ active users.
+- Enable High Availability mode for database engine for large scale deployments.
+
+If you enable [database encryption](../encryption.md) in Coder, consider
+allocating an additional CPU core to every `coderd` replica.
+
+#### Resource utilization guidelines
+
+Below are general recommendations for sizing your PostgreSQL instance:
+
+- Increase number of vCPU if CPU utilization or database latency is high.
+- Allocate extra memory if database performance is poor, CPU utilization is low,
+ and memory utilization is high.
+- Utilize faster disk options (higher IOPS) such as SSDs or NVMe drives for
+ optimal performance enhancement and possibly reduce database load.
+
+## Operational readiness
+
+Operational readiness in Coder is about ensuring that everything is set up
+correctly before launching a platform into production. It involves making sure
+that the service is reliable, secure, and easily scales accordingly to user-base
+needs. Operational readiness is crucial because it helps prevent issues that
+could affect workspace users experience once the platform is live.
+
+### Helm Chart Configuration
+
+1. Reference our [Helm chart values file](../../../helm/coder/values.yaml) and
+ identify the required values for deployment.
+1. Create a `values.yaml` and add it to your version control system.
+1. Determine the necessary environment variables. Here is the
+ [full list of supported server environment variables](../../cli/server.md).
+1. Follow our documented
+ [steps for installing Coder via Helm](../../install/kubernetes.md).
+
+### Template configuration
+
+1. Establish dedicated accounts for users with the _Template Administrator_
+ role.
+1. Maintain Coder templates using
+ [version control](../../templates/change-management.md).
+1. Consider implementing a GitOps workflow to automatically push new template
+ versions into Coder from git. For example, on Github, you can use the
+ [Update Coder Template](https://github.com/marketplace/actions/update-coder-template)
+ action.
+1. Evaluate enabling
+ [automatic template updates](../../templates/general-settings.md#require-automatic-updates-enterprise)
+ upon workspace startup.
+
+### Observability
+
+1. Enable the Prometheus endpoint (environment variable:
+ `CODER_PROMETHEUS_ENABLE`).
+1. Deploy the
+ [Coder Observability bundle](https://github.com/coder/observability) to
+ leverage pre-configured dashboards, alerts, and runbooks for monitoring
+ Coder. This includes integrations between Prometheus, Grafana, Loki, and
+ Alertmanager.
+1. Review the [Prometheus response](../prometheus.md) and set up alarms on
+ selected metrics.
+
+### User support
+
+1. Incorporate [support links](../appearance.md#support-links) into internal
+ documentation accessible from the user context menu. Ensure that hyperlinks
+ are valid and lead to up-to-date materials.
+1. Encourage the use of `coder support bundle` to allow workspace users to
+ generate and provide network-related diagnostic data.
diff --git a/docs/admin/integrations/README.md b/docs/admin/integrations/README.md
new file mode 100644
index 0000000000000..5b0e3e2bbb136
--- /dev/null
+++ b/docs/admin/integrations/README.md
@@ -0,0 +1,23 @@
+# Integrations
+
+Coder is highly extensible and is not limited to the platforms outlined in these
+docs. The control plane can be provisioned on any VM or container compute, and
+workspaces can include any Terraform resource. See our
+[architecture diagram](../infrastructure/architecture.md) for more details.
+
+You can host your deployment on almost any infrastructure. To learn how, read our [installation guides](../../install/README.md).
+
+
+
+
+
+The following resources may help as you're deploying Coder.
+
+- [Coder packages: one-click install on cloud providers](https://github.com/coder/packages)
+- [Deploy Coder offline](../../install/offline.md)
+- [Supported resources (Terraform registry)](https://registry.terraform.io)
+- [Writing custom templates](../templates/README.md)
+
+
diff --git a/docs/guides/island-integration.md b/docs/admin/integrations/island.md
similarity index 100%
rename from docs/guides/island-integration.md
rename to docs/admin/integrations/island.md
diff --git a/docs/guides/artifactory-integration.md b/docs/admin/integrations/jfrog-artifactory.md
similarity index 100%
rename from docs/guides/artifactory-integration.md
rename to docs/admin/integrations/jfrog-artifactory.md
diff --git a/docs/admin/integrations/jfrog-xray.md b/docs/admin/integrations/jfrog-xray.md
new file mode 100644
index 0000000000000..3a178750b6e1f
--- /dev/null
+++ b/docs/admin/integrations/jfrog-xray.md
@@ -0,0 +1,72 @@
+# Integrating JFrog Xray with Coder Kubernetes Workspaces
+
+
+March 17, 2024
+
+---
+
+This guide will walk you through the process of adding
+[JFrog Xray](https://jfrog.com/xray/) integration to Coder Kubernetes workspaces
+using Coder's [JFrog Xray Integration](https://github.com/coder/coder-xray).
+
+## Prerequisites
+
+- A self-hosted JFrog Platform instance.
+- Kubernetes workspaces running on Coder.
+
+## Deploying the Coder - JFrog Xray Integration
+
+1. Create a JFrog Platform
+ [Access Token](https://jfrog.com/help/r/jfrog-platform-administration-documentation/access-tokens)
+ with a user that has the read
+ [permission](https://jfrog.com/help/r/jfrog-platform-administration-documentation/permissions)
+ for the repositories you want to scan.
+2. Create a Coder
+ [token](https://coder.com/docs/latest/reference/cli/tokens_create#tokens-create)
+ with a user that has the
+ [`owner`](https://coder.com/docs/latest/admin/users#roles) role.
+3. Create kubernetes secrets for the JFrog Xray and Coder tokens.
+
+```bash
+kubectl create secret generic coder-token --from-literal=coder-token=''
+kubectl create secret generic jfrog-token --from-literal=user='' --from-literal=token=''
+```
+
+4. Deploy the Coder - JFrog Xray integration.
+
+```bash
+helm repo add coder-xray https://helm.coder.com/coder-xray
+
+helm upgrade --install coder-xray coder-xray/coder-xray \
+ --namespace coder-xray \
+ --create-namespace \
+ --set namespace="" \ # Replace with your Coder workspaces namespace
+ --set coder.url="https://" \
+ --set coder.secretName="coder-token" \
+ --set artifactory.url="https://" \
+ --set artifactory.secretName="jfrog-token"
+```
+
+### Updating the Coder template
+
+[`coder-xray`](https://github.com/coder/coder-xray) will scan all kubernetes
+workspaces in the specified namespace. It depends on the `image` available in
+Artifactory and indexed by Xray. To ensure that the images are available in
+Artifactory, update the Coder template to use the Artifactory registry.
+
+```tf
+image = "//:"
+```
+
+> **Note**: To authenticate with the Artifactory registry, you may need to
+> create a
+> [Docker config](https://jfrog.com/help/r/jfrog-artifactory-documentation/docker-advanced-topics)
+> and use it in the `imagePullSecrets` field of the kubernetes pod. See this
+> [guide](./image-pull-secret.md) for more information.
+
+
diff --git a/docs/admin/integrations/kubernetes-logs.md b/docs/admin/integrations/kubernetes-logs.md
new file mode 100644
index 0000000000000..fc2481483ffed
--- /dev/null
+++ b/docs/admin/integrations/kubernetes-logs.md
@@ -0,0 +1,78 @@
+# Kubernetes event logs
+
+To stream Kubernetes events into your workspace startup logs, you can use
+Coder's [`coder-logstream-kube`](https://github.com/coder/coder-logstream-kube)
+tool. `coder-logstream-kube` provides useful information about the workspace pod
+or deployment, such as:
+
+- Causes of pod provisioning failures, or why a pod is stuck in a pending state.
+- Visibility into when pods are OOMKilled, or when they are evicted.
+
+## Prerequisites
+
+`coder-logstream-kube` works best with the
+[`kubernetes_deployment`](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/deployment)
+Terraform resource, which requires the `coder` service account to have
+permission to create deployments. For example, if you use
+[Helm](../../install/kubernetes.md#install-coder-with-helm) to install Coder,
+you should set `coder.serviceAccount.enableDeployments=true` in your
+`values.yaml`
+
+```diff
+coder:
+serviceAccount:
+ workspacePerms: true
+- enableDeployments: false
++ enableDeployments: true
+ annotations: {}
+ name: coder
+```
+
+> Note: This is only required for Coder versions < 0.28.0, as this will be the
+> default value for Coder versions >= 0.28.0
+
+## Installation
+
+Install the `coder-logstream-kube` helm chart on the cluster where the
+deployment is running.
+
+```shell
+helm repo add coder-logstream-kube https://helm.coder.com/logstream-kube
+helm install coder-logstream-kube coder-logstream-kube/coder-logstream-kube \
+ --namespace coder \
+ --set url=
+```
+
+## Example logs
+
+Here is an example of the logs you can expect to see in the workspace startup
+logs:
+
+### Normal pod deployment
+
+
+
+### Wrong image
+
+
+
+### Kubernetes quota exceeded
+
+
+
+### Pod crash loop
+
+
+
+## How it works
+
+Kubernetes provides an
+[informers](https://pkg.go.dev/k8s.io/client-go/informers) API that streams pod
+and event data from the API server.
+
+coder-logstream-kube listens for pod creation events with containers that have
+the CODER_AGENT_TOKEN environment variable set. All pod events are streamed as
+logs to the Coder API using the agent token for authentication. For more
+details, see the
+[coder-logstream-kube](https://github.com/coder/coder-logstream-kube)
+repository.
diff --git a/docs/admin/integrations/multiple-kube-clusters.md b/docs/admin/integrations/multiple-kube-clusters.md
new file mode 100644
index 0000000000000..0960e2acf833e
--- /dev/null
+++ b/docs/admin/integrations/multiple-kube-clusters.md
@@ -0,0 +1,236 @@
+# Additional clusters
+
+With Coder, you can deploy workspaces in additional Kubernetes clusters using
+different
+[authentication methods](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs#authentication)
+in the Terraform provider.
+
+
+
+## Option 1) Kubernetes contexts and kubeconfig
+
+First, create a kubeconfig file with
+[multiple contexts](https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/).
+
+```shell
+kubectl config get-contexts
+
+CURRENT NAME CLUSTER
+ workspaces-europe-west2-c workspaces-europe-west2-c
+* workspaces-us-central1-a workspaces-us-central1-a
+```
+
+### Kubernetes control plane
+
+If you deployed Coder on Kubernetes, you can attach a kubeconfig as a secret.
+
+This assumes Coder is deployed on the `coder` namespace and your kubeconfig file
+is in ~/.kube/config.
+
+```shell
+kubectl create secret generic kubeconfig-secret -n coder --from-file=~/.kube/config
+```
+
+Modify your helm values to mount the secret:
+
+```yaml
+coder:
+ # ...
+ volumes:
+ - name: "kubeconfig-mount"
+ secret:
+ secretName: "kubeconfig-secret"
+ volumeMounts:
+ - name: "kubeconfig-mount"
+ mountPath: "/mnt/secrets/kube"
+ readOnly: true
+```
+
+[Upgrade Coder](../../install/kubernetes.md#upgrading-coder-via-helm) with these
+new values.
+
+### VM control plane
+
+If you deployed Coder on a VM, copy the kubeconfig file to
+`/home/coder/.kube/config`.
+
+### Create a Coder template
+
+You can start from our
+[example template](https://github.com/coder/coder/tree/main/examples/templates/kubernetes).
+From there, add [template parameters](../../templates/concepts/parameters.md) to
+allow developers to pick their desired cluster.
+
+```hcl
+# main.tf
+
+data "coder_parameter" "kube_context" {
+ name = "kube_context"
+ display_name = "Cluster"
+ default = "workspaces-us-central1-a"
+ mutable = false
+ option {
+ name = "US Central"
+ icon = "/emojis/1f33d.png"
+ value = "workspaces-us-central1-a"
+ }
+ option {
+ name = "Europe West"
+ icon = "/emojis/1f482.png"
+ value = "workspaces-europe-west2-c"
+ }
+}
+
+provider "kubernetes" {
+ config_path = "~/.kube/config" # or /mnt/secrets/kube/config for Kubernetes
+ config_context = data.coder_parameter.kube_context.value
+}
+```
+
+## Option 2) Kubernetes ServiceAccounts
+
+Alternatively, you can authenticate with remote clusters with ServiceAccount
+tokens. Coder can store these secrets on your behalf with
+[managed Terraform variables](../templates/concepts/variables.md).
+
+Alternatively, these could also be fetched from Kubernetes secrets or even
+[Hashicorp Vault](https://registry.terraform.io/providers/hashicorp/vault/latest/docs/data-sources/generic_secret).
+
+This guide assumes you have a `coder-workspaces` namespace on your remote
+cluster. Change the namespace accordingly.
+
+### Create a ServiceAccount
+
+Run this command against your remote cluster to create a ServiceAccount, Role,
+RoleBinding, and token:
+
+```shell
+kubectl apply -n coder-workspaces -f - <
+
+> ⚠️ This guide is a work in progress. We do not officially support using custom
+> Terraform binaries in your Coder deployment. To track progress on the work,
+> see this related [Github Issue](https://github.com/coder/coder/issues/12009).
+
+Coder deployments support any custom Terraform binary, including
+[OpenTofu](https://opentofu.org/docs/) - an open source alternative to
+Terraform.
+
+> You can read more about OpenTofu and Hashicorp's licensing in our
+> [blog post](https://coder.com/blog/hashicorp-license) on the Terraform
+> licensing changes.
+
+## Using a custom Terraform binary
+
+You can change your deployment custom Terraform binary as long as it is in
+`PATH` and is within the
+[supported versions](https://github.com/coder/coder/blob/f57ce97b5aadd825ddb9a9a129bb823a3725252b/provisioner/terraform/install.go#L22-L25).
+The hardcoded version check ensures compatibility with our
+[example templates](https://github.com/coder/coder/tree/main/examples/templates).
diff --git a/docs/admin/prometheus.md b/docs/admin/integrations/prometheus.md
similarity index 99%
rename from docs/admin/prometheus.md
rename to docs/admin/integrations/prometheus.md
index 99d36b5b15e31..75922abe72702 100644
--- a/docs/admin/prometheus.md
+++ b/docs/admin/integrations/prometheus.md
@@ -96,7 +96,7 @@ spec:
## Available metrics
-
+
| Name | Type | Description | Labels |
| ------------------------------------------------------------- | --------- | -------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- |
@@ -176,4 +176,4 @@ spec:
| `promhttp_metric_handler_requests_in_flight` | gauge | Current number of scrapes being served. | |
| `promhttp_metric_handler_requests_total` | counter | Total number of scrapes by HTTP status code. | `code` |
-
+
diff --git a/docs/admin/integrations/vault.md b/docs/admin/integrations/vault.md
new file mode 100644
index 0000000000000..7f93a261b00f7
--- /dev/null
+++ b/docs/admin/integrations/vault.md
@@ -0,0 +1,48 @@
+# Integrating HashiCorp Vault with Coder
+
+
+August 05, 2024
+
+---
+
+This guide will walk you through the process of adding
+[HashiCorp Vault](https://www.vaultproject.io/) integration to Coder workspaces.
+
+Coder makes it easy to integrate HashiCorp Vault with your workspaces by
+providing official terraform modules to integrate Vault with Coder. This guide
+will show you how to use these modules to integrate HashiCorp Vault with Coder.
+
+## `vault-github`
+
+[`vault-github`](https://registry.coder.com/modules/vault-github) is a terraform
+module that allows you to authenticate with Vault using a GitHub token. This
+modules uses the existing GitHub [external authentication]() to get the token
+and authenticate with Vault. TODO: Add link to external auth
+
+To use this module, you need to add the following code to your terraform
+configuration:
+
+```tf
+module "vault" {
+ source = "registry.coder.com/modules/vault-github/coder"
+ version = "1.0.7"
+ agent_id = coder_agent.example.id
+ vault_addr = "https://vault.example.com"
+ coder_github_auth_id = "my-github-auth-id"
+}
+```
+
+This module will install and authenticate the `vault` CLI in your Coder
+workspace.
+
+Users then can use the `vault` CLI to interact with the vault, e.g., to het a kv
+secret,
+
+```shell
+vault kv get -namespace=YOUR_NAMESPACE -mount=MOUNT_NAME SECRET_NAME
+```
diff --git a/docs/admin/monitoring/README.md b/docs/admin/monitoring/README.md
new file mode 100644
index 0000000000000..1edccaf555077
--- /dev/null
+++ b/docs/admin/monitoring/README.md
@@ -0,0 +1,17 @@
+# Monitoring Coder
+
+Learn about our the tools, techniques, and best practices to monitor Coder your Coder deployment.
+
+## Quick Start: Observability Helm Chart
+
+Deploy Prometheus, Grafana, Alert Manager, and pre-built dashboards on your Kubernetes cluster to monitor the Coder control plane, provisioners, and workspaces.
+
+
+
+Learn how to install & read the docs on the [Observability Helm Chart GitHub](https://github.com/coder/observability)
+
+## Table of Contents
+
+- [Logs](./logs.md): Learn how to access to Coder server logs, agent logs, and even how to expose Kubernetes pod scheduling logs.
+- [Metrics](./metrics.md): Learn about the valuable metrics to measure on a Coder deployment, regardless of your monitoring stack.
+- [Health Check](./health-check.md): Learn about the periodic health check and error codes that run on Coder deployments.
diff --git a/docs/admin/healthcheck.md b/docs/admin/monitoring/health-check.md
similarity index 96%
rename from docs/admin/healthcheck.md
rename to docs/admin/monitoring/health-check.md
index 44d10dadc6862..99c13d504978a 100644
--- a/docs/admin/healthcheck.md
+++ b/docs/admin/monitoring/health-check.md
@@ -3,6 +3,8 @@
Coder includes an operator-friendly deployment health page that provides a
number of details about the health of your Coder deployment.
+
+
You can view it at `https://${CODER_URL}/health`, or you can alternatively view
the [JSON response directly](../api/debug.md#debug-info-deployment-health).
@@ -328,17 +330,6 @@ version of Coder.
> Note: This may be a transient issue if you are currently in the process of
> updating your deployment.
-### EIF01
-
-_Interface with Small MTU_
-
-**Problem:** One or more local interfaces have MTU smaller than 1378, which is
-the minimum MTU for Coder to establish direct connections without fragmentation.
-
-**Solution:** Since IP fragmentation can be a source of performance problems, we
-recommend you disable the interface when using Coder or
-[disable direct connections](../../cli#--disable-direct-connections)
-
## EUNKNOWN
_Unknown Error_
diff --git a/docs/admin/monitoring/logs.md b/docs/admin/monitoring/logs.md
new file mode 100644
index 0000000000000..d0e99596e7206
--- /dev/null
+++ b/docs/admin/monitoring/logs.md
@@ -0,0 +1,64 @@
+# Logs
+
+All Coder services log to standard output, which can be critical for identifying
+errors and monitoring Coder's deployment health. Like any service, logs can be
+captured via Splunk, Datadog, Grafana Loki, or other ingestion tools.
+
+## `coderd` Logs
+
+By default, the Coder server exports human-readable logs to standard output. You
+can access these logs via `kubectl logs deployment/coder -n `
+on Kubernetes or `journalctl -u coder` if you deployed Coder on a host
+machine/VM.
+
+- To change the log format/location, you can set
+ [`CODER_LOGGING_HUMAN`](../../reference/cli/server.md#--log-human) and
+ [`CODER_LOGGING_JSON](../../reference/cli/server.md#--log-json) server config.
+ options.
+- To only display certain types of logs, use
+ the[`CODER_LOG_FILTER`](../../reference/cli/server.md#-l---log-filter) server
+ config.
+
+Events such as server errors, audit logs, user activities, and SSO & OpenID
+Connect logs are all captured in the `coderd` logs.
+
+## `provisionerd` Logs
+
+Logs for [external provisioners](../provisioners.md) are structured
+[and configured](../../reference/cli/provisionerd_start.md#--log-human)
+similarly to `coderd` logs. Use these logs to troubleshoot and monitor the
+Terraform operations behind workspaces and templates.
+
+## Workspace Logs
+
+The [Coder agent](../infrastructure/architecture.md#agents) inside workspaces
+provides useful logs around workspace-to-server and client-to-workspace
+connections. For Kubernetes workspaces, these are typically the pod logs as the
+agent runs via the container entrypoint.
+
+Agent logs are also stored in the workspace filesystem by default:
+
+- macOS/Linux: `/tmp/coder-agent.log`
+- Windows: Refer to the template code (e.g.
+ [azure-windows](https://github.com/coder/coder/blob/2cfadad023cb7f4f85710cff0b21ac46bdb5a845/examples/templates/azure-windows/Initialize.ps1.tftpl#L64))
+ to see where logs are stored.
+
+> Note: Logs are truncated once they reach 5MB in size.
+
+Startup script logs are also stored in the temporary directory of macOS and
+Linux workspaces.
+
+## Kubernetes Event Logs
+
+Sometimes, a workspace may take a while to start or even fail to start due to
+underlying events on the Kubernetes cluster such as a node being out of
+resources or a missing image. You can install
+[coder-logstream-kube](../integrations/kubernetes-logs.md) to stream Kubernetes
+events to the Coder UI.
+
+
+
+## Support Bundle
+
+TODO. Unsure if this should go on a separate page, or the root since we have the
+tutorial.
diff --git a/docs/admin/monitoring/metrics.md b/docs/admin/monitoring/metrics.md
new file mode 100644
index 0000000000000..1333ed77b7e1e
--- /dev/null
+++ b/docs/admin/monitoring/metrics.md
@@ -0,0 +1 @@
+TODO
diff --git a/docs/networking/index.md b/docs/admin/networking/README.md
similarity index 99%
rename from docs/networking/index.md
rename to docs/admin/networking/README.md
index c1eb41869b3bf..b7cb74e7b4f6d 100644
--- a/docs/networking/index.md
+++ b/docs/admin/networking/README.md
@@ -1,5 +1,7 @@
# Networking
+
+
Coder's network topology has three types of nodes: workspaces, coder servers,
and users.
diff --git a/docs/networking/port-forwarding.md b/docs/admin/networking/port-forwarding.md
similarity index 99%
rename from docs/networking/port-forwarding.md
rename to docs/admin/networking/port-forwarding.md
index 89454b8258e3d..68b0bfcab2903 100644
--- a/docs/networking/port-forwarding.md
+++ b/docs/admin/networking/port-forwarding.md
@@ -99,7 +99,7 @@ to specify an arbitrary port. Coder will also detect if apps inside the
workspace are listening on ports, and list them below the port input (this is
only supported on Windows and Linux workspace agents).
-
+
### Sharing ports
diff --git a/docs/networking/stun.md b/docs/admin/networking/stun.md
similarity index 100%
rename from docs/networking/stun.md
rename to docs/admin/networking/stun.md
diff --git a/docs/admin/workspace-proxies.md b/docs/admin/networking/workspace-proxies.md
similarity index 91%
rename from docs/admin/workspace-proxies.md
rename to docs/admin/networking/workspace-proxies.md
index e9ab16dac6adb..024e09fd632e0 100644
--- a/docs/admin/workspace-proxies.md
+++ b/docs/admin/networking/workspace-proxies.md
@@ -4,15 +4,16 @@ Workspace proxies provide low-latency experiences for geo-distributed teams.
Coder's networking does a best effort to make direct connections to a workspace.
In situations where this is not possible, such as connections via the web
-terminal and [web IDEs](../ides/web-ides.md), workspace proxies are able to
-reduce the amount of distance the network traffic needs to travel.
+terminal and [web IDEs](../../user-guides/workspace-access/README.md#web-ides),
+workspace proxies are able to reduce the amount of distance the network traffic
+needs to travel.
A workspace proxy is a relay connection a developer can choose to use when
connecting with their workspace over SSH, a workspace app, port forwarding, etc.
Dashboard connections and API calls (e.g. the workspaces list) are not served
over workspace proxies.
-
+
# Deploy a workspace proxy
@@ -26,8 +27,8 @@ Workspace proxies can be used in the browser by navigating to the user
## Requirements
-- The [Coder CLI](../cli.md) must be installed and authenticated as a user with
- the Owner role.
+- The [Coder CLI](../../reference/cli/README.md) must be installed and
+ authenticated as a user with the Owner role.
## Step 1: Create the proxy
@@ -149,8 +150,8 @@ coder wsproxy server
### Running as a system service
-If you've installed Coder via a [system package](../install/index.md), you can
-configure the workspace proxy by settings in
+If you've installed Coder via a [system package](../../install/README.md), you
+can configure the workspace proxy by settings in
`/etc/coder.d/coder-workspace-proxy.env`
To run workspace proxy as a system service on the host:
@@ -205,9 +206,9 @@ dashboard. Workspace proxy preferences are cached by the web browser. If a proxy
goes offline, the session will fall back to the primary proxy. This could take
up to 60 seconds.
-
+
-## Step 3: Observability
+## Observability
Coder workspace proxy exports metrics via the HTTP endpoint, which can be
enabled using either the environment variable `CODER_PROMETHEUS_ENABLE` or the
diff --git a/docs/admin/provisioners.md b/docs/admin/provisioners.md
index ef94004106805..5a0084a6a71e4 100644
--- a/docs/admin/provisioners.md
+++ b/docs/admin/provisioners.md
@@ -1,4 +1,4 @@
-# External provisioners
+# Provisioners
By default, the Coder server runs
[built-in provisioner daemons](../cli/server.md#provisioner-daemons), which
@@ -67,13 +67,6 @@ There are two exceptions:
**Organization-scoped Provisioners** can pick up build jobs created by any user.
These provisioners always have the implicit tags `scope=organization owner=""`.
-```shell
-coder provisionerd start --org
-```
-
-If you omit the `--org` argument, the provisioner will be assigned to the
-default organization.
-
```shell
coder provisionerd start
```
diff --git a/docs/admin/quotas.md b/docs/admin/quotas.md
deleted file mode 100644
index 88ca4b27860dc..0000000000000
--- a/docs/admin/quotas.md
+++ /dev/null
@@ -1,106 +0,0 @@
-# Quotas
-
-Quotas are a mechanism for controlling spend by associating costs with workspace
-templates and assigning budgets to users. Users that exceed their budget will be
-blocked from launching more workspaces until they either delete their other
-workspaces or get their budget extended.
-
-For example: A template is configured with a cost of 5 credits per day, and the
-user is granted 15 credits, which can be consumed by both started and stopped
-workspaces. This budget limits the user to 3 concurrent workspaces.
-
-Quotas are licensed with [Groups](./groups.md).
-
-## Definitions
-
-- **Credits** is the fundamental unit representing cost in the quota system.
- This integer can be arbitrary, or it can map to your preferred currency.
-- **Budget** is the per-user, enforced, upper limit to credit spend.
-- **Allowance** is a grant of credits to the budget.
-
-## Establishing Costs
-
-Templates describe their cost through the `daily_cost` attribute in
-[`resource_metadata`](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/metadata).
-Since costs are associated with resources, an offline workspace may consume less
-quota than an online workspace.
-
-A common use case is separating costs for a persistent volume and ephemeral
-compute:
-
-```hcl
-resource "docker_volume" "home_volume" {
- name = "coder-${data.coder_workspace_owner.me.name}-${data.coder_workspace.me.name}-root"
-}
-
-resource "coder_metadata" "home_volume" {
- resource_id = docker_volume.home_volume.id
- daily_cost = 10
-}
-
-resource "docker_container" "workspace" {
- count = data.coder_workspace.me.start_count
- image = "codercom/code-server:latest"
- ...
- volumes {
- container_path = "/home/coder/"
- volume_name = docker_volume.home_volume.name
- read_only = false
- }
-}
-
-resource "coder_metadata" "workspace" {
- count = data.coder_workspace.me.start_count
- resource_id = docker_container.workspace.id
- daily_cost = 20
-}
-```
-
-When the workspace above is shut down, the `docker_container` and
-`coder_metadata` both get deleted. This reduces the cost from 30 credits to 10
-credits.
-
-Resources without a `daily_cost` value are considered to cost 0. If the cost was
-removed on the `docker_volume` above, the template would consume 0 credits when
-it's offline. This technique is good for incentivizing users to shut down their
-unused workspaces and freeing up compute in the cluster.
-
-## Establishing Budgets
-
-Each group has a configurable Quota Allowance. A user's budget is calculated as
-the sum of their allowances.
-
-
-
-For example:
-
-| Group Name | Quota Allowance |
-| ---------- | --------------- |
-| Frontend | 10 |
-| Backend | 20 |
-| Data | 30 |
-
-
-
-| Username | Groups | Effective Budget |
-| -------- | ----------------- | ---------------- |
-| jill | Frontend, Backend | 30 |
-| jack | Backend, Data | 50 |
-| sam | Data | 30 |
-| alex | Frontend | 10 |
-
-By default, groups are assumed to have a default allowance of 0.
-
-## Quota Enforcement
-
-Coder enforces Quota on workspace start and stop operations. The workspace build
-process dynamically calculates costs, so quota violation fails builds as opposed
-to failing the build-triggering operation. For example, the Workspace Create
-Form will never get held up by quota enforcement.
-
-
-
-## Up next
-
-- [Enterprise](../enterprise.md)
-- [Configuring](./configure.md)
diff --git a/docs/admin/rbac.md b/docs/admin/rbac.md
deleted file mode 100644
index 554650ea675b8..0000000000000
--- a/docs/admin/rbac.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# Role Based Access Control (RBAC)
-
-Use RBAC to define which users and [groups](./groups.md) can use specific
-templates in Coder. These can be defined in Coder or
-[synced from your identity provider](./auth.md)
-
-
-
-The "Everyone" group makes a template accessible to all users. This can be
-removed to make a template private.
-
-## Permissions
-
-You can set the following permissions:
-
-- **Admin**: Read, use, edit, push, and delete
-- **View**: Read, use
-
-## Enabling this feature
-
-This feature is only available with an enterprise license.
-[Learn more](../enterprise.md)
diff --git a/docs/admin/security/README.md b/docs/admin/security/README.md
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/docs/admin/audit-logs.md b/docs/admin/security/audit-logs.md
similarity index 99%
rename from docs/admin/audit-logs.md
rename to docs/admin/security/audit-logs.md
index 564a4f8594a0e..6747703989abc 100644
--- a/docs/admin/audit-logs.md
+++ b/docs/admin/security/audit-logs.md
@@ -6,7 +6,7 @@ Audit Logs allows **Auditors** to monitor user operations in their deployment.
We track the following resources:
-
+
| Resource | |
| -------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
@@ -30,7 +30,7 @@ We track the following resources:
| WorkspaceBuild start, stop |
+This article explains how to use secrets in a workspace. To authenticate the
+workspace provisioner, see this.
+
+
+Coder is open-minded about how you get your secrets into your workspaces.
+
+## Wait a minute...
+
+Your first stab at secrets with Coder should be your local method. You can do
+everything you can locally and more with your Coder workspace, so whatever
+workflow and tools you already use to manage secrets may be brought over.
+
+Often, this workflow is simply:
+
+1. Give your users their secrets in advance
+1. Your users write them to a persistent file after they've built their
+ workspace
+
+[Template parameters](./templates/parameters.md) are a dangerous way to accept
+secrets. We show parameters in cleartext around the product. Assume anyone with
+view access to a workspace can also see its parameters.
+
+## SSH Keys
+
+Coder generates SSH key pairs for each user. This can be used as an
+authentication mechanism for git providers or other tools. Within workspaces,
+git will attempt to use this key within workspaces via the `$GIT_SSH_COMMAND`
+environment variable.
+
+Users can view their public key in their account settings:
+
+
+
+> Note: SSH keys are never stored in Coder workspaces, and are fetched only when
+> SSH is invoked. The keys are held in-memory and never written to disk.
+
+## Dynamic Secrets
+
+Dynamic secrets are attached to the workspace lifecycle and automatically
+injected into the workspace. With a little bit of up front template work, they
+make life simpler for both the end user and the security team.
+
+This method is limited to
+[services with Terraform providers](https://registry.terraform.io/browse/providers),
+which excludes obscure API providers.
+
+Dynamic secrets can be implemented in your template code like so:
+
+```hcl
+resource "twilio_iam_api_key" "api_key" {
+ account_sid = "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+ friendly_name = "Test API Key"
+}
+
+resource "coder_agent" "main" {
+ # ...
+ env = {
+ # Let users access the secret via $TWILIO_API_SECRET
+ TWILIO_API_SECRET = "${twilio_iam_api_key.api_key.secret}"
+ }
+}
+```
+
+A catch-all variation of this approach is dynamically provisioning a cloud
+service account (e.g
+[GCP](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/google_service_account_key#private_key))
+for each workspace and then making the relevant secrets available via the
+cloud's secret management system.
+
+## Displaying Secrets
+
+While you can inject secrets into the workspace via environment variables, you
+can also show them in the Workspace UI with
+[`coder_metadata`](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/metadata).
+
+
+
+Can be produced with
+
+```hcl
+resource "twilio_iam_api_key" "api_key" {
+ account_sid = "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+ friendly_name = "Test API Key"
+}
+
+
+resource "coder_metadata" "twilio_key" {
+ resource_id = twilio_iam_api_key.api_key.id
+ item {
+ key = "secret"
+ value = twilio_iam_api_key.api_key.secret
+ sensitive = true
+ }
+}
+```
+
+## Secrets Management
+
+For more advanced secrets management, you can use a secrets management tool to
+store and retrieve secrets in your workspace. For example, you can use
+[HashiCorp Vault](https://www.vaultproject.io/) to inject secrets into your
+workspace.
+
+Refer to our [HashiCorp Vault Integration](./integrations/vault.md) guide for
+more information on how to integrate HashiCorp Vault with Coder.
diff --git a/docs/admin/telemetry.md b/docs/admin/telemetry.md
deleted file mode 100644
index 29ea709f31b11..0000000000000
--- a/docs/admin/telemetry.md
+++ /dev/null
@@ -1,44 +0,0 @@
-# Telemetry
-
-
-TL;DR: disable telemetry by setting CODER_TELEMETRY=false.
-
-
-Coder collects telemetry from all installations by default. We believe our users
-should have the right to know what we collect, why we collect it, and how we use
-the data.
-
-## What we collect
-
-You can find a full list of the data we collect in our source code
-[here](https://github.com/coder/coder/blob/main/coderd/telemetry/telemetry.go).
-In particular, look at the struct types such as `Template` or `Workspace`.
-
-As a rule, we **do not collect** the following types of information:
-
-- Any data that could make your installation less secure
-- Any data that could identify individual users
-
-For example, we do not collect parameters, environment variables, or user email
-addresses.
-
-## Why we collect
-
-Telemetry helps us understand which features are most valuable, what use cases
-to focus on, and which bugs to fix first.
-
-Most cloud-based software products collect far more data than we do. They often
-offer little transparency and configurability. It's hard to imagine our favorite
-SaaS products existing without their creators having a detailed understanding of
-user interactions. We want to wield some of that product development power to
-build self-hosted, open-source software.
-
-## Security
-
-In the event we discover a critical security issue with Coder, we will use
-telemetry to identify affected installations and notify their administrators.
-
-## Toggling
-
-You can turn telemetry on or off using either the `CODER_TELEMETRY=[true|false]`
-environment variable or the `--telemetry=[true|false]` command-line flag.
diff --git a/docs/admin/templates/README.md b/docs/admin/templates/README.md
new file mode 100644
index 0000000000000..406c2438ae9a1
--- /dev/null
+++ b/docs/admin/templates/README.md
@@ -0,0 +1,41 @@
+# Template
+
+Templates are written in [Terraform](https://developer.hashicorp.com/terraform/intro) and define the underlying infrastructure that all Coder workspaces run on.
+
+
+
+The "Starter Templates" page within the Coder dashboard.
+
+## Learn the concepts
+
+While templates are written in standard Terraform, it's important to learn the Coder-specific concepts behind templates. The best way to learn the concepts is by
+[creating a basic template from scratch](../../tutorials/template-from-scratch.md).
+
+
+
+## Starter templates
+
+After learning the basics, use starter templates to import a template with sensible defaults for popular platforms (e.g. AWS, Kubernetes, Docker, etc). Docs: [Create a template from a starter template](./creating-templates.md#from-a-starter-template).
+
+## Extending templates
+
+It's often necessary to extend the template to make it generally useful to end users. Common modifications are:
+
+- Your image(s) (e.g. a Docker image with languages and tools installed). Docs: [Image management](./extending-templates/image-management.md).
+- Additional parameters (e.g. disk size, instance type, or region). Docs: [Template parameters](./extending-templates/parameters.md).
+- Additional IDEs (e.g. JetBrains) or features (e.g. dotfiles, RDP). Docs: [Adding IDEs and features](./extending-templates/ides/README.md).
+
+Learn more about the various ways you can [extend your templates](./extending-templates.md).
+
+## Best Practices
+
+We recommend starting with a universal template that can be used for basic tasks. As your Coder deployment grows, you can create more templates to meet the needs of different teams.
+
+- [Image management](../../tutorials/image-management.md): Learn how to create and publish images for use within Coder workspaces & templates.
+- [Dev Container support](#): Enable dev containers to allow teams to bring their own tools into Coder workspaces.
+- [Template hardening](./): Configure your template to prevent certain resources from being destroyed (e.g. user disks).
+- [Manage templates with Ci/Cd pipelines](#): Learn how to source control your templates and use GitOps to ensure template changes are reviewed and tested.
+
+## Template permissions & policies (enterprise)
+
+TODO
diff --git a/docs/admin/templates/creating-templates.md b/docs/admin/templates/creating-templates.md
new file mode 100644
index 0000000000000..f24aaaf111a29
--- /dev/null
+++ b/docs/admin/templates/creating-templates.md
@@ -0,0 +1,134 @@
+# Creating Templates
+
+Users with the `Template Administrator` role or above can create templates
+within Coder.
+
+## From a starter template
+
+In most cases, it is best to start with a starter template.
+
+
+
+### Web UI
+
+After navigating to the Templates page in the Coder dashboard, choose
+`Create Template > Choose a starter template`.
+
+
+
+From there, select a starter template for desired underlying infrastructure for
+workspaces.
+
+
+
+Give your template a name, description, and icon and press `Create template`.
+
+
+
+> **⚠️ Note**: If template creation fails, Coder is likely not authorized to
+> deploy infrastructure in the given location. Learn how to configure
+> [provisioner authentication](#TODO).
+
+### CLI
+
+You can the [Coder CLI](../../install/cli.md) to manage templates for Coder.
+After [logging in](#TODO) to your deployment, create a folder to store your
+templates:
+
+```sh
+# This snippet applies to macOS and Linux only
+mkdir $HOME/coder-templates
+cd $HOME/coder-templates
+```
+
+Use the [`templates init`](../../reference/cli/templates_init.md) command to
+pull a starter template:
+
+```sh
+coder templates init
+```
+
+After pulling the template to your local machine (e.g. `aws-linux`), you can
+rename it:
+
+```sh
+# This snippet applies to macOS and Linux only
+mv aws-linux universal-template
+cd universal-template
+```
+
+Next, push it to Coder with the
+[`templates push`](../../reference/cli/templates_push.md) command:
+
+```sh
+coder templates push
+```
+
+> ⚠️ Note: If `template push` fails, Coder is likely not authorized to deploy
+> infrastructure in the given location. Learn how to configure
+> [provisioner authentication](#TODO).
+
+You can edit the metadata of the template such as the display name with the
+[`templates edit`](../../reference/cli/templates_edit.md) command:
+
+```sh
+coder templates edit universal-template \
+ --display-name "Universal Template" \
+ --description "Virtual machine configured with Java, Python, Typescript, IntelliJ IDEA, and Ruby. Use this for starter projects. " \
+ --icon "/emojis/2b50.png"
+```
+
+### CI/CD
+
+Follow the [change management](./managing-templates/change-management.md) guide to manage templates via GitOps.
+
+
+
+## From an existing template
+
+You can duplicate an existing template in your Coder deployment. This will copy
+the template code and metadata, allowing you to make changes without affecting
+the original template.
+
+
+
+### Web UI
+
+After navigating to the page for a template, use the dropdown menu on the right
+to `Duplicate`.
+
+
+
+Give the new template a name, icon, and description.
+
+
+
+Press `Create template`. After the build, you will be taken to the new template
+page.
+
+
+
+### CLI
+
+
+
+## From scratch (advanced)
+
+There may be cases where you want to create a template from scratch. You can use
+[any Terraform provider](https://registry.terraform.com) with Coder to create
+templates for additional clouds (e.g. Hetzner, Alibaba) or orchestrators
+(VMware, Proxmox) that we do not provide example templates for.
+
+Refer to the following resources:
+
+- [Tutorial: Create a template from scratch](../../tutorials/template-from-scratch.md)
+- [Extending templates](./editing-templates.md): Features and concepts around
+ templates (agents, parameters, variables, etc)
+- [Coder Registry](https://registry.coder.com/templates): Official and community
+ templates for Coder
+- [Coder Terraform Provider Reference](https://registry.terraform.io/providers/coder/coder)
+
+## Next steps
+
+- [Extending templates](#TODO)
+- [TODO](#TODO)
diff --git a/docs/admin/templates/extending-templates/README.md b/docs/admin/templates/extending-templates/README.md
new file mode 100644
index 0000000000000..322c6a6030317
--- /dev/null
+++ b/docs/admin/templates/extending-templates/README.md
@@ -0,0 +1,60 @@
+# Extending templates
+
+
+
+There are a variety of Coder-native features to extend the configuration of your development environments. Many of the following features are defined in your templates using the [Coder Terraform provider](https://registry.terraform.io/providers/coder/coder/latest/docs). The provider docs will provide code examples for usage; alternatively, you can view our [example templates](https://github.com/coder/coder/tree/main/examples/templates) to get started.
+
+## Workspace agents
+
+For users to connect to a workspace, the template must include a [`coder_agent`](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/agent). The associated agent will facilitate [workspace connections](../../../user-guides/workspace-access/README.md) via SSH, port forwarding, and IDEs. The agent may also display real-time [workspace metadata](./agent-metadata.md) like resource usage.
+
+```hcl
+resource "coder_agent" "dev" {
+ os = "linux"
+ arch = "amd64"
+ dir = "/workspace"
+ display_apps {
+ vscode = true
+ }
+}
+```
+
+You can also leverage [resource metadata](./resource-metadata.md) to display static resource information from your template.
+
+Templates must include some computational resource to start the agent. All processes on the workspace are then spawned from the agent. It also provides all information displayed in the dashboard's workspace view.
+
+
+
+Multiple agents may be used in a single template or even a single resource. Each agent may have it's own apps, startup script, and metadata. This can be used to associate multiple containers or VMs with a workspace.
+
+## Resource persistence
+
+The resources you define in a template may be _ephemeral_ or _persistent_. Persistent resources stay provisioned when workspaces are stopped, where as ephemeral resources are destroyed and recreated on restart. All resources are destroyed when a workspace is deleted.
+
+> You can read more about how resource behavior and workspace state in the [workspace lifecycle documentation](../../workspaces/lifecycle.md).
+
+Template resources follow the [behavior of Terraform resources](https://developer.hashicorp.com/terraform/language/resources/behavior#how-terraform-applies-a-configuration) and can be further configured using the [lifecycle argument](https://developer.hashicorp.com/terraform/language/meta-arguments/lifecycle).
+
+A common configuration is a template whose only persistent resource is the home directory. This allows the developer to retain their work while ensuring the rest of their environment is consistently up-to-date on each workspace restart.
+
+When a workspace is deleted, the Coder server essentially runs a
+[terraform destroy](https://www.terraform.io/cli/commands/destroy) to remove all
+resources associated with the workspace.
+
+> Terraform's
+> [prevent-destroy](https://www.terraform.io/language/meta-arguments/lifecycle#prevent_destroy)
+> and
+> [ignore-changes](https://www.terraform.io/language/meta-arguments/lifecycle#ignore_changes)
+> meta-arguments can be used to prevent accidental data loss.
+
+## Coder apps
+
+Additional IDEs, documentation, or services can be associated to your workspace using the [`coder_app`](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/app) resource.
+
+
+
+Note that some apps are associated to the agent by default as [`display_apps`](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/agent#nested-schema-for-display_apps) and can be hidden directly in the [`coder_agent`](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/agent) resource. You can arrange the display orientation of Coder apps in your template using [resource ordering](./resource-ordering.md).
+
+Check out our [module registry](https://registry.coder.com/modules) for additional Coder apps from the team and our OSS community.
+
+
diff --git a/docs/templates/agent-metadata.md b/docs/admin/templates/extending-templates/agent-metadata.md
similarity index 92%
rename from docs/templates/agent-metadata.md
rename to docs/admin/templates/extending-templates/agent-metadata.md
index 52d01d769e65a..238d23396847e 100644
--- a/docs/templates/agent-metadata.md
+++ b/docs/admin/templates/extending-templates/agent-metadata.md
@@ -1,6 +1,6 @@
# Agent metadata
-
+
You can show live operational metrics to workspace users with agent metadata. It
is the dynamic complement of [resource metadata](./resource-metadata.md).
@@ -15,10 +15,10 @@ All of these examples use
for the script declaration. With heredoc strings, you can script without messy
escape codes, just as if you were working in your terminal.
-Some of the examples use the [`coder stat`](../cli/stat.md) command. This is
-useful for determining CPU and memory usage of the VM or container that the
-workspace is running in, which is more accurate than resource usage about the
-workspace's host.
+Some of the examples use the [`coder stat`](../../../reference/cli/stat.md)
+command. This is useful for determining CPU and memory usage of the VM or
+container that the workspace is running in, which is more accurate than resource
+usage about the workspace's host.
Here's a standard set of metadata snippets for Linux agents:
diff --git a/docs/admin/templates/extending-templates/external-auth.md b/docs/admin/templates/extending-templates/external-auth.md
new file mode 100644
index 0000000000000..0b0803d6d9420
--- /dev/null
+++ b/docs/admin/templates/extending-templates/external-auth.md
@@ -0,0 +1,96 @@
+# External Authentication
+
+Coder integrates with any OpenID Connect provider to automate away the need for
+developers to authenticate with external services within their workspace. This
+can be used to authenticate with git providers, private registries, or any other
+service that requires authentication.
+
+## External Auth Providers
+
+External auth providers are configured using environment variables in the Coder
+Control Plane. See
+
+## Git Providers
+
+When developers use `git` inside their workspace, they are prompted to
+authenticate. After that, Coder will store and refresh tokens for future
+operations.
+
+
+
+### Require git authentication in templates
+
+If your template requires git authentication (e.g. running `git clone` in the
+[startup_script](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/agent#startup_script)),
+you can require users authenticate via git prior to creating a workspace:
+
+
+
+### Native git authentication will auto-refresh tokens
+
+
+
+ This is the preferred authentication method.
+
+
+
+By default, the coder agent will configure native `git` authentication via the
+`GIT_ASKPASS` environment variable. Meaning, with no additional configuration,
+external authentication will work with native `git` commands.
+
+To check the auth token being used **from inside a running workspace**, run:
+
+```shell
+# If the exit code is non-zero, then the user is not authenticated with the
+# external provider.
+coder external-auth access-token
+```
+
+Note: Some IDE's override the `GIT_ASKPASS` environment variable and need to be
+configured.
+
+**VSCode**
+
+Use the
+[Coder](https://marketplace.visualstudio.com/items?itemName=coder.coder-remote)
+extension to automatically configure these settings for you!
+
+Otherwise, you can manually configure the following settings:
+
+- Set `git.terminalAuthentication` to `false`
+- Set `git.useIntegratedAskPass` to `false`
+
+### Hard coded tokens do not auto-refresh
+
+If the token is required to be inserted into the workspace, for example
+[GitHub cli](https://cli.github.com/), the auth token can be inserted from the
+template. This token will not auto-refresh. The following example will
+authenticate via GitHub and auto-clone a repo into the `~/coder` directory.
+
+```hcl
+data "coder_external_auth" "github" {
+ # Matches the ID of the external auth provider in Coder.
+ id = "github"
+}
+
+resource "coder_agent" "dev" {
+ os = "linux"
+ arch = "amd64"
+ dir = "~/coder"
+ env = {
+ GITHUB_TOKEN : data.coder_external_auth.github.access_token
+ }
+ startup_script = <
Coder automatically generates the type metadata.
@@ -107,5 +107,5 @@ how to use the builtin icons [here](./icons.md).
## Up next
-- [Secrets](../secrets.md)
+- [Secrets](../../security/secrets.md)
- [Agent metadata](./agent-metadata.md)
diff --git a/docs/templates/resource-ordering.md b/docs/admin/templates/extending-templates/resource-ordering.md
similarity index 100%
rename from docs/templates/resource-ordering.md
rename to docs/admin/templates/extending-templates/resource-ordering.md
diff --git a/docs/templates/variables.md b/docs/admin/templates/extending-templates/variables.md
similarity index 100%
rename from docs/templates/variables.md
rename to docs/admin/templates/extending-templates/variables.md
diff --git a/docs/ides/web-ides.md b/docs/admin/templates/extending-templates/web-ides.md
similarity index 85%
rename from docs/ides/web-ides.md
rename to docs/admin/templates/extending-templates/web-ides.md
index 89a6b4ca26e79..2db879ab9b402 100644
--- a/docs/ides/web-ides.md
+++ b/docs/admin/templates/extending-templates/web-ides.md
@@ -1,16 +1,5 @@
# Web IDEs
-By default, Coder workspaces allow connections via:
-
-- Web terminal
-- SSH (plus any [SSH-compatible IDE](../ides.md))
-
-It's common to also let developers to connect via web IDEs for uses cases like
-zero trust networks, data science, contractors, and infrequent code
-contributors.
-
-
-
In Coder, web IDEs are defined as
[coder_app](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/app)
resources in the template. With our generic model, any web application can be
@@ -34,33 +23,6 @@ resource "coder_app" "portainer" {
}
```
-## External URLs
-
-Any URL external to the Coder deployment is accessible as a `coder_app`. e.g.,
-Dropbox, Slack, Discord, GitHub
-
-```hcl
-resource "coder_app" "pubslack" {
- agent_id = coder_agent.coder.id
- display_name = "Coder Public Slack"
- slug = "pubslack"
- url = "https://coder-com.slack.com/"
- icon = "/icon/slack.svg"
- external = true
-}
-
-resource "coder_app" "discord" {
- agent_id = coder_agent.coder.id
- display_name = "Coder Discord"
- slug = "discord"
- url = "https://discord.com/invite/coder"
- icon = "/icon/discord.svg"
- external = true
-}
-```
-
-
-
## code-server
[code-server](https://github.com/coder/coder) is our supported method of running
@@ -223,17 +185,24 @@ resource "coder_app" "jupyter" {
}
```
+Or Alternatively, you can use the Jypyter Lab module from the Coder registry:
+
+```tf
+module "jupyter" {
+ source = "registry.coder.com/modules/jupyter-lab/coder"
+ version = "1.0.0"
+ agent_id = coder_agent.main.id
+}
+```
+
If you cannot enable a
[wildcard subdomain](https://coder.com/docs/admin/configure#wildcard-access-url),
you can configure the template to run Jupyter on a path. There is however
-[security risk](https://coder.com/docs/cli/server#--dangerous-allow-path-app-sharing)
+[security risk](https://coder.com/docs/reference/cli/server#--dangerous-allow-path-app-sharing)
running an app on a path and the template code is more complicated with coder
value substitution to recreate the path structure.
-[This](https://github.com/sharkymark/v2-templates/tree/main/src/pod-with-jupyter-path)
-is a community template example.
-
-
+
## RStudio
@@ -252,7 +221,6 @@ resource "coder_agent" "coder" {
EOT
}
-# rstudio
resource "coder_app" "rstudio" {
agent_id = coder_agent.coder.id
slug = "rstudio"
@@ -274,14 +242,14 @@ If you cannot enable a
[wildcard subdomain](https://coder.com/docs/admin/configure#wildcard-access-url),
you can configure the template to run RStudio on a path using an NGINX reverse
proxy in the template. There is however
-[security risk](https://coder.com/docs/cli/server#--dangerous-allow-path-app-sharing)
+[security risk](https://coder.com/docs/reference/cli/server#--dangerous-allow-path-app-sharing)
running an app on a path and the template code is more complicated with coder
value substitution to recreate the path structure.
[This](https://github.com/sempie/coder-templates/tree/main/rstudio) is a
community template example.
-
+
## Airflow
@@ -318,10 +286,25 @@ resource "coder_app" "airflow" {
}
```
-
+or use the [Airflow module](https://registry.coder.com/modules/apache-airflow)
+from the Coder registry:
+
+```tf
+module "airflow" {
+ source = "registry.coder.com/modules/airflow/coder"
+ version = "1.0.13"
+ agent_id = coder_agent.main.id
+}
+```
+
+
## File Browser
+To access the contents of a workspace directory in a browser, you can use File
+Browser. File Browser is a lightweight file manager that allows you to view and
+manipulate files in a web browser.
+
Show and manipulate the contents of the `/home/coder` directory in a browser.
```hcl
@@ -355,6 +338,18 @@ resource "coder_app" "filebrowser" {
}
```
+Or alternatively, you can use the
+[`filebrowser`](https://registry.coder.com/modules/filebrowser) module from the
+Coder registry:
+
+```tf
+module "filebrowser" {
+ source = "registry.coder.com/modules/filebrowser/coder"
+ version = "1.0.8"
+ agent_id = coder_agent.main.id
+}
+```
+

## SSH Fallback
diff --git a/docs/templates/creating.md b/docs/admin/templates/managing-templates/README.md
similarity index 65%
rename from docs/templates/creating.md
rename to docs/admin/templates/managing-templates/README.md
index 4818ae989aa83..77fe2d94ea844 100644
--- a/docs/templates/creating.md
+++ b/docs/admin/templates/managing-templates/README.md
@@ -7,10 +7,9 @@ other services.
## Who creates templates?
The [Template Admin](../admin/users.md) role (and above) can create templates.
-End users, like developers, create workspaces from them.
-
-Templates can also be [managed with git](./change-management.md), allowing any
-developer to propose changes to a template.
+End users, like developers, create workspaces from them. Templates can also be
+[managed with git](./change-management.md), allowing any developer to propose
+changes to a template.
You can give different users and groups access to templates with
[role-based access control](../admin/rbac.md).
@@ -23,9 +22,9 @@ images, VPC, cloud credentials, and so on. Coder supports all Terraform
resources and properties, so fear not if your favorite cloud provider isn't
here!
-
+
-If you prefer to use Coder on the [command line](../cli.md), use
+If you prefer to use Coder on the [command line](../../reference/cli/README.md),
`coder templates init`.
> Coder starter templates are also available on our
@@ -42,7 +41,7 @@ by our users
Our starter templates are meant to be modified for your use cases. You can edit
any template's files directly in the Coder dashboard.
-
+
If you'd prefer to use the CLI, use `coder templates pull`, edit the template
files, then `coder templates push`.
@@ -57,7 +56,18 @@ When you publish a new version, developers are notified to get the latest
infrastructure, software, or security patches. Learn more about
[change management](./change-management.md).
-
+
+
+### Template update policies (enterprise)
+
+Enterprise template admins may want workspaces to always remain on the latest
+version of their parent template. To do so, enable **Template Update Policies**
+in the template's general settings. All non-admin users of the template will be
+forced to update their workspaces before starting them once the setting is
+applied. Workspaces which leverage autostart or start-on-connect will be
+automatically updated on the next startup.
+
+
## Delete templates
@@ -68,7 +78,7 @@ template must not have any running workspaces associated to it.
In the UI, navigate to the template you want to delete, and select the dropdown
in the right-hand corner of the page to delete the template.
-
+
Using the CLI, login to Coder and run the following command to delete a
template:
@@ -77,18 +87,10 @@ template:
coder templates delete
```
-### Delete workspaces
-
-When a workspace is deleted, the Coder server essentially runs a
-[terraform destroy](https://www.terraform.io/cli/commands/destroy) to remove all
-resources associated with the workspace.
-
-> Terraform's
-> [prevent-destroy](https://www.terraform.io/language/meta-arguments/lifecycle#prevent_destroy)
-> and
-> [ignore-changes](https://www.terraform.io/language/meta-arguments/lifecycle#ignore_changes)
-> meta-arguments can be used to prevent accidental data loss.
+
## Next steps
-- [Your first template](../templates/tutorial.md)
+- [Image management](./image-management.md)
+- [Devcontainer templates](./devcontainer-templates.md)
+- [Change management](./change-management.md)
diff --git a/docs/admin/templates/managing-templates/change-management.md b/docs/admin/templates/managing-templates/change-management.md
new file mode 100644
index 0000000000000..acb8ec7df51f3
--- /dev/null
+++ b/docs/admin/templates/managing-templates/change-management.md
@@ -0,0 +1,95 @@
+# Template Change Management
+
+We recommend source-controlling your templates as you would other any code, and
+automating the creation of new versions in CI/CD pipelines.
+
+These pipelines will require tokens for your deployment. To cap token lifetime
+on creation,
+[configure Coder server to set a shorter max token lifetime](../reference/cli/server.md#--max-token-lifetime).
+
+## coderd Terraform Provider
+
+The
+[coderd Terraform provider](https://registry.terraform.io/providers/coder/coderd/latest)
+can be used to push new template versions, either manually, or in CI/CD
+pipelines. To run the provider in a CI/CD pipeline, and to prevent drift, you'll
+need to store the Terraform state
+[remotely](https://developer.hashicorp.com/terraform/language/settings/backends/configuration).
+
+```hcl
+terraform {
+ required_providers {
+ coderd = {
+ source = "coder/coderd"
+ }
+ }
+ backend "gcs" {
+ bucket = "example-bucket"
+ prefix = "terraform/state"
+ }
+}
+
+provider "coderd" {
+ // Can be populated from environment variables
+ url = "https://coder.example.com"
+ token = "****"
+}
+
+// Get the commit SHA of the configuration's git repository
+variable "TFC_CONFIGURATION_VERSION_GIT_COMMIT_SHA" {
+ type = string
+}
+
+resource "coderd_template" "kubernetes" {
+ name = "kubernetes"
+ description = "Develop in Kubernetes!"
+ versions = [{
+ directory = ".coder/templates/kubernetes"
+ active = true
+ # Version name is optional
+ name = var.TFC_CONFIGURATION_VERSION_GIT_COMMIT_SHA
+ tf_vars = [{
+ name = "namespace"
+ value = "default4"
+ }]
+ }]
+ /* ... Additional template configuration */
+}
+```
+
+For an example, see how we push our development image and template
+[with GitHub actions](https://github.com/coder/coder/blob/main/.github/workflows/dogfood.yaml).
+
+## Coder CLI
+
+You can also [install Coder](../install/) to automate pushing new template
+versions in CI/CD pipelines.
+
+```console
+# Install the Coder CLI
+curl -L https://coder.com/install.sh | sh
+# curl -L https://coder.com/install.sh | sh -s -- --version=0.x
+
+# To create API tokens, use `coder tokens create`.
+# If no `--lifetime` flag is passed during creation, the default token lifetime
+# will be 30 days.
+# These variables are consumed by Coder
+export CODER_URL=https://coder.example.com
+export CODER_SESSION_TOKEN=*****
+
+# Template details
+export CODER_TEMPLATE_NAME=kubernetes
+export CODER_TEMPLATE_DIR=.coder/templates/kubernetes
+export CODER_TEMPLATE_VERSION=$(git rev-parse --short HEAD)
+
+# Push the new template version to Coder
+coder templates push --yes $CODER_TEMPLATE_NAME \
+ --directory $CODER_TEMPLATE_DIR \
+ --name=$CODER_TEMPLATE_VERSION # Version name is optional
+```
+
+## Next Steps
+
+- [Coder CLI Reference](../reference/cli/templates.md)
+- [Coderd Terraform Provider Reference](https://registry.terraform.io/providers/coder/coderd/latest/docs)
+- [Coderd API Reference](https://coder.com/docs/reference/api/README.md)
diff --git a/docs/templates/dev-containers.md b/docs/admin/templates/managing-templates/devcontainers.md
similarity index 100%
rename from docs/templates/dev-containers.md
rename to docs/admin/templates/managing-templates/devcontainers.md
diff --git a/docs/admin/templates/managing-templates/image-management.md b/docs/admin/templates/managing-templates/image-management.md
new file mode 100644
index 0000000000000..e1536be3f0adb
--- /dev/null
+++ b/docs/admin/templates/managing-templates/image-management.md
@@ -0,0 +1,73 @@
+# Image Management
+
+While Coder provides example
+[base container images](https://github.com/coder/enterprise-images) for
+workspaces, it's often best to create custom images that matches the needs of
+your users. This document serves a guide to operational maturity with some best
+practices around managing workspaces images for Coder.
+
+1. Create a minimal base image
+2. Create golden image(s) with standard tooling
+3. Allow developers to bring their own images and customizations with Dev
+ Containers
+
+> Note: An image is just one of the many properties defined within the template.
+> Templates can pull images from a public image registry (e.g. Docker Hub) or an
+> internal one., thanks to Terraform.
+
+## Create a minimal base image
+
+While you may not use this directly in Coder templates, it's useful to have a
+minimal base image is a small image that contains only the necessary
+dependencies to work in your network and work with Coder. Here are some things
+to consider:
+
+- `curl`, `wget`, or `busybox` is required to download and run
+ [the agent](https://github.com/coder/coder/blob/main/provisionersdk/scripts/bootstrap_linux.sh)
+- `git` is recommended so developers can clone repositories
+- If the Coder server is using a certificate from an internal certificate
+ authority (CA), you'll need to add or mount these into your image
+- Other generic utilities that will be required by all users, such as `ssh`,
+ `docker`, `bash`, `jq`, and/or internal tooling
+- Consider creating (and starting the container with) a non-root user
+
+> See Coder's
+> [example base image](https://github.com/coder/enterprise-images/tree/main/images/minimal)
+> for reference.
+
+## Create general-purpose golden image(s) with standard tooling
+
+It's often practical to have a few golden images that contain standard tooling
+for developers. These images should contain a number of languages (e.g. Python,
+Java, TypeScript), IDEs (VS Code, JetBrains, PyCharm), and other tools (e.g.
+`docker`). Unlike project-specific images (which are also important), general
+purpose images are great for:
+
+- **Scripting:** Developers may just want to hop in a Coder workspace to run
+ basic scripts or queries.
+- **Day 1 Onboarding:** New developers can quickly get started with a familiar
+ environment without having to browse through (or create) an image
+- **Basic Projects:** Developers can use these images for simple projects that
+ don't require any specific tooling outside of the standard libraries. As the
+ project gets more complex, its best to move to a project-specific image.
+- **"Golden Path" Projects:** If your developer platform offers specific tech
+ stacks and types of projects, the golden image can be a good starting point
+ for those projects.
+
+> This is often referred to as a "sandbox" or "kitchen sink" image. Since large
+> multi-purpose container images can quickly become difficult to maintain, it's
+> important to keep the number of general-purpose images to a minimum (2-3 in
+> most cases) with a well-defined scope.
+
+Examples:
+
+- [Universal Dev Containers Image](https://github.com/devcontainers/images/tree/main/src/universal)
+
+## Allow developers to bring their own images and customizations with Dev Containers
+
+While golden images are great for general use cases, developers will often need
+specific tooling for their projects. The [Dev Container](https://containers.dev)
+specification allows developers to define their projects dependencies within a
+`devcontainer.json` in their Git repository.
+
+- [Learn how to integrate Dev Containers with Coder](./devcontainers.md)
diff --git a/docs/templates/permissions.md b/docs/admin/templates/template-permissions.md
similarity index 83%
rename from docs/templates/permissions.md
rename to docs/admin/templates/template-permissions.md
index 958db34859508..f080daf121f1e 100644
--- a/docs/templates/permissions.md
+++ b/docs/admin/templates/template-permissions.md
@@ -1,6 +1,6 @@
# Permissions
-
+
Permissions allow you to control who can use and modify the template. Both
individual user and groups can be added to the access list for a template.
@@ -14,6 +14,6 @@ By default the `Everyone` group is assigned to each template meaning any Coder
user can use the template to create a workspace. To prevent this, disable the
`Allow everyone to use the template` setting when creating a template.
-
+
Permissions is an enterprise-only feature.
diff --git a/docs/admin/upgrade.md b/docs/admin/upgrade.md
deleted file mode 100644
index eb24e0f5d5e4f..0000000000000
--- a/docs/admin/upgrade.md
+++ /dev/null
@@ -1,59 +0,0 @@
-# Upgrade
-
-This article walks you through how to upgrade your Coder server.
-
-
-
- Prior to upgrading a production Coder deployment, take a database snapshot since
- Coder does not support rollbacks.
-
-
-
-To upgrade your Coder server, simply reinstall Coder using your original method
-of [install](../install).
-
-## Via install.sh
-
-If you installed Coder using the `install.sh` script, re-run the below command
-on the host:
-
-```shell
-curl -L https://coder.com/install.sh | sh
-```
-
-The script will unpack the new `coder` binary version over the one currently
-installed. Next, you can restart Coder with the following commands (if running
-it as a system service):
-
-```shell
-systemctl daemon-reload
-systemctl restart coder
-```
-
-## Via docker-compose
-
-If you installed using `docker-compose`, run the below command to upgrade the
-Coder container:
-
-```shell
-docker-compose pull coder && docker-compose up -d coder
-```
-
-## Via Kubernetes
-
-See
-[Upgrading Coder via Helm](../install/kubernetes.md#upgrading-coder-via-helm).
-
-## Via Windows
-
-Download the latest Windows installer or binary from
-[GitHub releases](https://github.com/coder/coder/releases/latest), or upgrade
-from Winget.
-
-```pwsh
-winget install Coder.Coder
-```
-
-## Up Next
-
-- [Learn how to enable Enterprise features](../enterprise.md).
diff --git a/docs/admin/users.md b/docs/admin/users/README.md
similarity index 72%
rename from docs/admin/users.md
rename to docs/admin/users/README.md
index 02832a7e22320..308b2b6aca430 100644
--- a/docs/admin/users.md
+++ b/docs/admin/users/README.md
@@ -1,38 +1,25 @@
# Users
-This article walks you through the user roles available in Coder and creating
-and managing users.
+By default, Coder is accessible via password authentication. For production deployments, we recommend using an SSO authentication provider with multi-factor authentication (MFA). It is your responsibility to ensure the auth provider enforces MFA correctly.
+
+## Configuring SSO
+
+- [OpenID Connect](./auth.md#openid-connect) (e.g. Okta, KeyCloak, PingFederate, Azure AD)
+- [GitHub](./auth.md#github) (or GitHub Enterprise)
+
+## Groups
+
+Multiple users can be organized into logical groups to control which templates they can use. While groups can be manually created in Coder, we recommend syncing them from your identity provider.
+
+- [Learn more about Groups](./groups.md)
+- [Group & Role Sync](./group-role-sync.md)
## Roles
-Coder offers these user roles in the community edition:
-
-| | Auditor | User Admin | Template Admin | Owner |
-| ----------------------------------------------------- | ------- | ---------- | -------------- | ----- |
-| Add and remove Users | | ✅ | | ✅ |
-| Manage groups (enterprise) | | ✅ | | ✅ |
-| Change User roles | | | | ✅ |
-| Manage **ALL** Templates | | | ✅ | ✅ |
-| View **ALL** Workspaces | | | ✅ | ✅ |
-| Update and delete **ALL** Workspaces | | | | ✅ |
-| Run [external provisioners](./provisioners.md) | | | ✅ | ✅ |
-| Execute and use **ALL** Workspaces | | | | ✅ |
-| View all user operation [Audit Logs](./audit-logs.md) | ✅ | | | ✅ |
-
-A user may have one or more roles. All users have an implicit Member role that
-may use personal workspaces.
-
-## Security notes
-
-A malicious Template Admin could write a template that executes commands on the
-host (or `coder server` container), which potentially escalates their privileges
-or shuts down the Coder server. To avoid this, run
-[external provisioners](./provisioners.md).
-
-In low-trust environments, we do not recommend giving users direct access to
-edit templates. Instead, use
-[CI/CD pipelines to update templates](../templates/change-management.md) with
-proper security scans and code reviews in place.
+Roles determine which actions users can take within the platform. Typically, most developers in your organization have the `Member` role, allowing them to create workspaces. Other roles have administrative capabilities such as auditing, managing users, and managing templates.
+
+- [Learn more about Roles](./roles.md)
+- [Group & Role Sync](./group-role-sync.md)
## User status
diff --git a/docs/admin/users/github-auth.md b/docs/admin/users/github-auth.md
new file mode 100644
index 0000000000000..155b6a3b4ed8d
--- /dev/null
+++ b/docs/admin/users/github-auth.md
@@ -0,0 +1,84 @@
+## GitHub
+
+### Step 1: Configure the OAuth application in GitHub
+
+First,
+[register a GitHub OAuth app](https://developer.github.com/apps/building-oauth-apps/creating-an-oauth-app/).
+GitHub will ask you for the following Coder parameters:
+
+- **Homepage URL**: Set to your Coder deployments
+ [`CODER_ACCESS_URL`](../cli/server.md#--access-url) (e.g.
+ `https://coder.domain.com`)
+- **User Authorization Callback URL**: Set to `https://coder.domain.com`
+
+> Note: If you want to allow multiple coder deployments hosted on subdomains
+> e.g. coder1.domain.com, coder2.domain.com, to be able to authenticate with the
+> same GitHub OAuth app, then you can set **User Authorization Callback URL** to
+> the `https://domain.com`
+
+Note the Client ID and Client Secret generated by GitHub. You will use these
+values in the next step.
+
+Coder will need permission to access user email addresses. Find the "Account
+Permissions" settings for your app and select "read-only" for "Email addresses".
+
+### Step 2: Configure Coder with the OAuth credentials
+
+Navigate to your Coder host and run the following command to start up the Coder
+server:
+
+```shell
+coder server --oauth2-github-allow-signups=true --oauth2-github-allowed-orgs="your-org" --oauth2-github-client-id="8d1...e05" --oauth2-github-client-secret="57ebc9...02c24c"
+```
+
+> For GitHub Enterprise support, specify the
+> `--oauth2-github-enterprise-base-url` flag.
+
+Alternatively, if you are running Coder as a system service, you can achieve the
+same result as the command above by adding the following environment variables
+to the `/etc/coder.d/coder.env` file:
+
+```env
+CODER_OAUTH2_GITHUB_ALLOW_SIGNUPS=true
+CODER_OAUTH2_GITHUB_ALLOWED_ORGS="your-org"
+CODER_OAUTH2_GITHUB_CLIENT_ID="8d1...e05"
+CODER_OAUTH2_GITHUB_CLIENT_SECRET="57ebc9...02c24c"
+```
+
+**Note:** To allow everyone to signup using GitHub, set:
+
+```env
+CODER_OAUTH2_GITHUB_ALLOW_EVERYONE=true
+```
+
+Once complete, run `sudo service coder restart` to reboot Coder.
+
+If deploying Coder via Helm, you can set the above environment variables in the
+`values.yaml` file as such:
+
+```yaml
+coder:
+ env:
+ - name: CODER_OAUTH2_GITHUB_ALLOW_SIGNUPS
+ value: "true"
+ - name: CODER_OAUTH2_GITHUB_CLIENT_ID
+ value: "533...des"
+ - name: CODER_OAUTH2_GITHUB_CLIENT_SECRET
+ value: "G0CSP...7qSM"
+ # If setting allowed orgs, comment out CODER_OAUTH2_GITHUB_ALLOW_EVERYONE and its value
+ - name: CODER_OAUTH2_GITHUB_ALLOWED_ORGS
+ value: "your-org"
+ # If allowing everyone, comment out CODER_OAUTH2_GITHUB_ALLOWED_ORGS and it's value
+ #- name: CODER_OAUTH2_GITHUB_ALLOW_EVERYONE
+ # value: "true"
+```
+
+To upgrade Coder, run:
+
+```shell
+helm upgrade coder-v2/coder -n -f values.yaml
+```
+
+> We recommend requiring and auditing MFA usage for all users in your GitHub
+> organizations. This can be enforced from the organization settings page in the
+> "Authentication security" sidebar tab.
diff --git a/docs/admin/users/group-sync.md b/docs/admin/users/group-sync.md
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/docs/admin/users/groups-roles.md b/docs/admin/users/groups-roles.md
new file mode 100644
index 0000000000000..1bacec179d706
--- /dev/null
+++ b/docs/admin/users/groups-roles.md
@@ -0,0 +1,47 @@
+# Groups and Roles
+
+Groups and roles can be manually assigned in Coder. For production deployments,
+these can also be
+[managed and synced by the identity provider](./oidc.md#group-sync).
+
+## Groups
+
+Groups are logical segmentations of users in Coder and can be used to control
+which templates developers can use. For example:
+
+- Users within the `devops` group can access the `AWS-VM` template
+- Users within the `data-science` group can access the `Jupyter-Kubernetes`
+ template
+
+## Roles
+
+Roles determine which actions users can take within the platform.
+
+| | Auditor | User Admin | Template Admin | Owner |
+| ----------------------------------------------------- | ------- | ---------- | -------------- | ----- |
+| Add and remove Users | | ✅ | | ✅ |
+| Manage groups (enterprise) | | ✅ | | ✅ |
+| Change User roles | | | | ✅ |
+| Manage **ALL** Templates | | | ✅ | ✅ |
+| View **ALL** Workspaces | | | ✅ | ✅ |
+| Update and delete **ALL** Workspaces | | | | ✅ |
+| Run [external provisioners](./provisioners.md) | | | ✅ | ✅ |
+| Execute and use **ALL** Workspaces | | | | ✅ |
+| View all user operation [Audit Logs](./audit-logs.md) | ✅ | | | ✅ |
+
+A user may have one or more roles. All users have an implicit Member role that
+may use personal workspaces.
+
+### Security notes
+
+A malicious Template Admin could write a template that executes commands on the
+host (or `coder server` container), which potentially escalates their privileges
+or shuts down the Coder server. To avoid this, run
+[external provisioners](./provisioners.md).
+
+In low-trust environments, we do not recommend giving users direct access to
+edit templates. Instead, use
+[CI/CD pipelines to update templates](../templates/change-management.md) with
+proper security scans and code reviews in place.
+
+### Groups
diff --git a/docs/admin/users/groups.md b/docs/admin/users/groups.md
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/docs/admin/users/headless-auth.md b/docs/admin/users/headless-auth.md
new file mode 100644
index 0000000000000..2a0403e5bf8ae
--- /dev/null
+++ b/docs/admin/users/headless-auth.md
@@ -0,0 +1,31 @@
+# Headless Authentication
+
+Headless user accounts that cannot use the web UI to log in to Coder. This is
+useful for creating accounts for automated systems, such as CI/CD pipelines or
+for users who only consume Coder via another client/API.
+
+> You must have the User Admin role or above to create headless users.
+
+## Create a headless user
+
+
+
+## CLI
+
+```sh
+coder users create \
+ --email="coder-bot@coder.com" \
+ --username="coder-bot" \
+ --login-type="none \
+```
+
+## UI
+
+Navigate to the `Users` > `Create user` in the topbar
+
+
+
+
+
+To make API or CLI requests on behalf of the headless user, learn how to
+[generate API tokens on behalf of a user](./sessions-tokens.md#generate-a-long-lived-api-token-on-behalf-of-another-user).
diff --git a/docs/admin/auth.md b/docs/admin/users/oidc-auth.md
similarity index 81%
rename from docs/admin/auth.md
rename to docs/admin/users/oidc-auth.md
index c0ac87c6511f2..812491de50886 100644
--- a/docs/admin/auth.md
+++ b/docs/admin/users/oidc-auth.md
@@ -1,101 +1,4 @@
-# Authentication
-
-.
-
-By default, Coder is accessible via password authentication. Coder does not
-recommend using password authentication in production, and recommends using an
-authentication provider with properly configured multi-factor authentication
-(MFA). It is your responsibility to ensure the auth provider enforces MFA
-correctly.
-
-The following steps explain how to set up GitHub OAuth or OpenID Connect.
-
-## GitHub
-
-### Step 1: Configure the OAuth application in GitHub
-
-First,
-[register a GitHub OAuth app](https://developer.github.com/apps/building-oauth-apps/creating-an-oauth-app/).
-GitHub will ask you for the following Coder parameters:
-
-- **Homepage URL**: Set to your Coder deployments
- [`CODER_ACCESS_URL`](../cli/server.md#--access-url) (e.g.
- `https://coder.domain.com`)
-- **User Authorization Callback URL**: Set to `https://coder.domain.com`
-
-> Note: If you want to allow multiple coder deployments hosted on subdomains
-> e.g. coder1.domain.com, coder2.domain.com, to be able to authenticate with the
-> same GitHub OAuth app, then you can set **User Authorization Callback URL** to
-> the `https://domain.com`
-
-Note the Client ID and Client Secret generated by GitHub. You will use these
-values in the next step.
-
-Coder will need permission to access user email addresses. Find the "Account
-Permissions" settings for your app and select "read-only" for "Email addresses".
-
-### Step 2: Configure Coder with the OAuth credentials
-
-Navigate to your Coder host and run the following command to start up the Coder
-server:
-
-```shell
-coder server --oauth2-github-allow-signups=true --oauth2-github-allowed-orgs="your-org" --oauth2-github-client-id="8d1...e05" --oauth2-github-client-secret="57ebc9...02c24c"
-```
-
-> For GitHub Enterprise support, specify the
-> `--oauth2-github-enterprise-base-url` flag.
-
-Alternatively, if you are running Coder as a system service, you can achieve the
-same result as the command above by adding the following environment variables
-to the `/etc/coder.d/coder.env` file:
-
-```env
-CODER_OAUTH2_GITHUB_ALLOW_SIGNUPS=true
-CODER_OAUTH2_GITHUB_ALLOWED_ORGS="your-org"
-CODER_OAUTH2_GITHUB_CLIENT_ID="8d1...e05"
-CODER_OAUTH2_GITHUB_CLIENT_SECRET="57ebc9...02c24c"
-```
-
-**Note:** To allow everyone to signup using GitHub, set:
-
-```env
-CODER_OAUTH2_GITHUB_ALLOW_EVERYONE=true
-```
-
-Once complete, run `sudo service coder restart` to reboot Coder.
-
-If deploying Coder via Helm, you can set the above environment variables in the
-`values.yaml` file as such:
-
-```yaml
-coder:
- env:
- - name: CODER_OAUTH2_GITHUB_ALLOW_SIGNUPS
- value: "true"
- - name: CODER_OAUTH2_GITHUB_CLIENT_ID
- value: "533...des"
- - name: CODER_OAUTH2_GITHUB_CLIENT_SECRET
- value: "G0CSP...7qSM"
- # If setting allowed orgs, comment out CODER_OAUTH2_GITHUB_ALLOW_EVERYONE and its value
- - name: CODER_OAUTH2_GITHUB_ALLOWED_ORGS
- value: "your-org"
- # If allowing everyone, comment out CODER_OAUTH2_GITHUB_ALLOWED_ORGS and it's value
- #- name: CODER_OAUTH2_GITHUB_ALLOW_EVERYONE
- # value: "true"
-```
-
-To upgrade Coder, run:
-
-```shell
-helm upgrade coder-v2/coder -n -f values.yaml
-```
-
-> We recommend requiring and auditing MFA usage for all users in your GitHub
-> organizations. This can be enforced from the organization settings page in the
-> "Authentication security" sidebar tab.
-
-## OpenID Connect
+# OpenID Connect
The following steps through how to integrate any OpenID Connect provider (Okta,
Active Directory, etc.) to Coder.
@@ -321,7 +224,7 @@ OIDC provider will be added to the `myCoderGroupName` group in Coder.
### Group allowlist
You can limit which groups from your identity provider can log in to Coder with
-[CODER_OIDC_ALLOWED_GROUPS](https://coder.com/docs/cli/server#--oidc-allowed-groups).
+[CODER_OIDC_ALLOWED_GROUPS](https://coder.com/docs/reference/cli/server#--oidc-allowed-groups).
Users who are not in a matching group will see the following error:

diff --git a/docs/admin/users/organizations.md b/docs/admin/users/organizations.md
new file mode 100644
index 0000000000000..dc77f197cb3e6
--- /dev/null
+++ b/docs/admin/users/organizations.md
@@ -0,0 +1,13 @@
+# Organizations (Premium)
+
+> **Note**: This feature is in alpha and only available under the Coder Premium
+> enterprise license, launched in August 2024.
+> [Contact your account team](https://coder.com/contact/sales) for more
+> information.
+
+Organizations are a logical bucket of users with unique administrators,
+templates, provisioners, and workspaces into the Coder platform.
+
+## Organizations vs Groups
+
+TODO
diff --git a/docs/admin/users/password-auth.md b/docs/admin/users/password-auth.md
new file mode 100644
index 0000000000000..6d58e54672f52
--- /dev/null
+++ b/docs/admin/users/password-auth.md
@@ -0,0 +1,27 @@
+# Password Authentication
+
+Coder has password authentication enabled by default. The account created during
+setup is a username/password account.
+
+## Disable password authentication
+
+To disable password authentication, use the
+[`CODER_DISABLE_PASSWORD_AUTH`](CODER_DISABLE_PASSWORD_AUTH) flag on the Coder
+server.
+
+## Restore the `Owner` user
+
+If you remove the admin user account (or forget the password), you can run the
+[`coder server create-admin-user`](https://coder.com/docs/reference/cli/server_create-admin-user)
+command on your server.
+
+> Note: You must run this command on the same machine running the Coder server.
+> If you are running Coder on Kubernetes, this means using
+> [kubectl exec](https://kubernetes.io/docs/reference/kubectl/generated/kubectl_exec/)
+> to exec into the pod.
+
+## Reset a user's password
+
+An admin must reset passwords on behalf of users. This can be done in the web UI
+in the Users page or CLI:
+[`coder reset-password`](https://coder.com/docs/cli/reset-password)
diff --git a/docs/admin/users/sessions-tokens.md b/docs/admin/users/sessions-tokens.md
new file mode 100644
index 0000000000000..b5fec637782f9
--- /dev/null
+++ b/docs/admin/users/sessions-tokens.md
@@ -0,0 +1,64 @@
+# API & Session Tokens
+
+Users can generate tokens to make API requests on behalf of themselves.
+
+## Short-Lived Tokens (Sessions)
+
+The [Coder CLI](../../install/cli.md) and [Backstage Plugin](#TODO) use
+short-lived token to authenticate. To generate a short-lived session token on
+behalf of your account, visit the following URL:
+`https://coder.example.com/cli-auth`
+
+### Session Durations
+
+By default, sessions last 24 hours and are automatically refreshed. You can
+configure
+[`CODER_SESSION_DURATION`](../../reference/cli/server.md#--session-duration) to
+change the duration and
+[`CODER_DISABLE_SESSION_EXPIRY_REFRESH`](../../reference/cli/server.md#--disable-session-expiry-refresh)
+to configure this behavior.
+
+## Long-Lived Tokens (API Tokens)
+
+Users can create long lived tokens. We refer to these as "API tokens" in the
+product.
+
+### Generate a long-lived API token on behalf of yourself
+
+
+
+#### UI
+
+Visit your account settings in the top right of the dashboard or by navigating
+to `https://coder.example.com/settings/account`
+
+Navigate to the tokens page in the sidebar and create a new token:
+
+
+
+#### CLI
+
+Use the following command:
+
+```sh
+coder tokens create --name=my-token --lifetime=720h
+```
+
+See the help docs for [`coder tokens create`](../../reference/cli/tokens_create)
+for more info.
+
+
+
+### Generate a long-lived API token on behalf of another user
+
+Today, you must use the REST API to generate a token on behalf of another user.
+You must have the `Owner` role to do this. Use our API reference for more
+information:
+[Create token API key](https://coder.com/docs/reference/api/users#create-token-api-key)
+
+### Set max token length
+
+You can use the
+[`CODER_MAX_TOKEN_LIFETIME`](https://coder.com/docs/reference/cli/server#--max-token-lifetime)
+server flag to set the maximum duration for long-lived tokens in your
+deployment.
diff --git a/docs/admin/workspaces/README.md b/docs/admin/workspaces/README.md
new file mode 100644
index 0000000000000..28d29319b09c1
--- /dev/null
+++ b/docs/admin/workspaces/README.md
@@ -0,0 +1,85 @@
+# Administering workspaces
+
+
+
+Coder manages Workspaces, which are user-facing virtualized development environments. Each workspace is defined by a [template](../templates/README.md), owned by a single user, and can be individually modified with parameters and scheduling.
+
+Coder allows workspaces to be hosted on either VMs or containers and is not opinionated on which compute you choose to maximize flexibility.
+
+
+
+> If you are an end-user of Coder looking to learn more about how to use and manage the workspaces you own, see our [user guides](../../user-guides/README.md).
+
+## Viewing and Filtering workspaces
+
+Admins have visibility for every workspace in a deployment under the **Workspaces** tab. The name, associated template, and status are shown for each workspace.
+
+
+
+You can filter these workspaces using pre-defined filters or
+Coder's filter query. For example, you can find the workspaces that you own or
+that are currently running.
+
+The following filters are supported:
+
+- `owner` - Represents the `username` of the owner. You can also use `me` as a
+ convenient alias for the logged-in user.
+- `template` - Specifies the name of the template.
+- `status` - Indicates the status of the workspace. For a list of supported
+ statuses, see
+ [WorkspaceStatus documentation](https://pkg.go.dev/github.com/coder/coder/codersdk#WorkspaceStatus).
+
+## Updating workspaces
+
+After updating the default version of the template that a workspace was created
+from, you can update the workspace.
+
+
+
+
+
+If the workspace is running, Coder stops it, updates it, then starts the workspace again.
+
+### Updating via the CLI
+
+Update a workspace through the command line:
+
+```shell
+coder update
+```
+
+### Automatic updates
+
+It can be tedious to manually update a workspace every time an update is pushed
+to a template. Users can choose to opt-in to automatic updates to update to the
+active template version whenever the workspace is started.
+
+Note: If a template is updated such that new parameter inputs are required from
+the user, autostart will be disabled for the workspace until the user has
+manually updated the workspace.
+
+
+
+### Update policies
+
+Template admins can require workspaces be on the latest version before starting. When this is enabled, you will be presented with an "Update and Start" button in the UI. Workspaces that start on connect will automatically update on the first out-of-date connection.
+
+
+
+## Bulk operations (enterprise)
+
+Enterprise admins may apply bulk operations (update, delete, start, stop) in the **Workspaces** tab. Select the workspaces you'd like to modify with the checkboxes on the left, then use the top-right **Actions** dropdown to apply the operation.
+
+The start and stop operations can only be applied to a set of workspaces which are all in the same state. For update and delete, the user will be prompted for confirmation before any action is taken.
+
+
+
+
diff --git a/docs/admin/workspaces/lifecycle.md b/docs/admin/workspaces/lifecycle.md
new file mode 100644
index 0000000000000..7e601096b2143
--- /dev/null
+++ b/docs/admin/workspaces/lifecycle.md
@@ -0,0 +1,129 @@
+# Workspace lifecycle
+
+
+
+Workspaces are flexible, reproducible, and isolated units of compute. Workspaces
+are created via Terraform, managed through the Coder control plane, accessed
+through the Coder agent, then stopped and deleted again by Terraform.
+
+This page covers how workspaces move through this lifecycle. To learn about
+automating workspace schedules for cost control, read the
+[workspace scheduling docs](../../user-guides/workspace-scheduling.md).
+
+## Workspace ephemerality
+
+Workspaces are composed of resources which may be _ephemeral_ or _persistent_.
+Persistent resources stay provisioned when the workspace is stopped, where as
+ephemeral resources are destroyed and recreated on restart. All resources are
+destroyed when a workspace is deleted.
+
+> Template administrators can learn more about resource configuration in the
+> [extending templates docs](../templates/concepts.md).
+
+## Workspace States
+
+Generally, there are 3 states that a workspace may fall into:
+
+- Running: Started and ready for connections
+- Stopped: Ephemeral resources destroyed, persistent resources idle
+- Deleted: All resources destroyed, workspace records removed from database
+
+If some error occurs during the above, a workspace may fall into one of the
+following broken states:
+
+- Failed: Failure during provisioning, no resource consumption
+- Unhealthy: Resources have been provisioned, but the agent can't facilitate
+ connections
+
+## Workspace creation
+
+Workspaces are created from [templates](../templates/README.md) via the CLI,
+API, or dashboard. To learn how, read our
+[user guides](../../user-guides/README.md).
+
+By default, there is no limit on the number of workspaces a user may create,
+regardless of the template's resource demands. Enterprise administrators may
+limit the number of workspaces per template or group using quotas to prevent
+over provisioning and control costs.
+
+
+
+When a user creates a workspace, they're sending a build request to the control
+plane. Coder takes this and uses [Terraform](https://www.terraform.io/) to
+provision a workspace defined by your [template](../templates/README.md).
+Generally, templates define the resources and environment of a workspace.
+
+The resources that run the agent are described as _computational resources_,
+while those that don't are called _peripheral resources_. A workspace must
+contain some computational resource to run the Coder agent process.
+
+The provisioned workspace's computational resources start the agent process,
+which opens connections to your workspace via SSH, the terminal, and IDES such
+as [JetBrains](../../user-guides/workspace-access/jetbrains.md) or
+[VSCode](../../user-guides/workspace-access/vscode.md).
+
+Once started, the Coder agent is responsible for running your workspace startup
+scripts. These may configure tools, service connections, or personalization with
+[dotfiles](../../user-guides/workspace-dotfiles.md).
+
+Once these steps have completed, your workspace will now be in the `Running`
+state. You can access it via any of the
+[supported methods](../../user-guides/workspace-access/README.md), stop it when
+you're away, or delete it once it's no longer in use.
+
+## Stopping workspaces
+
+Workspaces may be stopped manually by users and admins in the dashboard, CLI, or
+API. Workspaces may be automatically stopped due to template updates or
+inactivity by
+[scheduling configuration](../../user-guides/workspace-scheduling.md).
+
+Once stopped, a workspace may resume running by starting it manually, or via
+user connection if automatic start is enabled.
+
+
+
+## Deleting workspaces
+
+Similarly to stopping, workspaces may be deleted manually or automatically by
+Coder through workspace dormancy.
+
+A delete workspace build runs `terraform destroy`, destroying both persistent
+and ephemeral resources. This action can not be reverted.
+
+When enabled on enterprise deployments, workspaces will become dormant after a
+specified duration of inactivity. Then, if left dormant, the workspaces will be
+queued for deletion. Learn about configuraing workspace dormancy in the template
+scheduling docs.
+
+### Orphan resources
+
+Typically, when a workspace is deleted, all of the workspace's resources are
+deleted along with it. Rarely, one may wish to delete a workspace without
+deleting its resources, e.g. a workspace in a broken state. Users with the
+Template Admin role have the option to do so both in the UI, and also in the CLI
+by running the delete command with the `--orphan` flag. This option should be
+considered cautiously as orphaning may lead to unaccounted cloud resources.
+
+## Broken workspace states
+
+During a workspace start or stop build, one of two errors may lead to a broken
+state. If the call to `terraform apply` fails to correctly provision resources,
+a workspace build has **failed**. If the computational resources fail to connect
+the agent, a workspace becomes **unhealthy**.
+
+A failed workspace is most often caused by misalignment from the definition in
+your template's Terraform file and the target resources on your infrastructure.
+Unhealthy workspaces are usually caused by a misconfiguration in the agent or
+workspace startup scripts.
+
+
+
+## Next steps
+
+
diff --git a/docs/templates/workspace-tags.md b/docs/admin/workspaces/workspace-tags.md
similarity index 100%
rename from docs/templates/workspace-tags.md
rename to docs/admin/workspaces/workspace-tags.md
diff --git a/docs/changelogs/v2.1.5.md b/docs/changelogs/v2.1.5.md
index 508bfc68fd0d2..476ab59081be8 100644
--- a/docs/changelogs/v2.1.5.md
+++ b/docs/changelogs/v2.1.5.md
@@ -52,7 +52,7 @@
### Documentation
- Add
- [JetBrains Gateway Offline Mode](https://coder.com/docs/ides/gateway#jetbrains-gateway-in-an-offline-environment)
+ [JetBrains Gateway Offline Mode](https://coder.com/docs/ides/gateway#JetBrains-gateway-in-an-offline-environment)
config steps (#9388) (@ericpaulsen)
- Describe
[dynamic options and locals for parameters](https://github.com/coder/coder/tree/main/examples/parameters-dynamic-options)
diff --git a/docs/changelogs/v2.4.0.md b/docs/changelogs/v2.4.0.md
index ccf94d714ade1..15e65ddbe47fc 100644
--- a/docs/changelogs/v2.4.0.md
+++ b/docs/changelogs/v2.4.0.md
@@ -6,7 +6,7 @@

- > Light mode is coming soon!
+ > Light mode is TODO: Make this page!
- Workspace activity is only bumped by 1 hour if the user is still active after the default autostop duration (#10704) (@Emyrk)
diff --git a/docs/changelogs/v2.5.1.md b/docs/changelogs/v2.5.1.md
index c488d6f2ab116..db47d0666c984 100644
--- a/docs/changelogs/v2.5.1.md
+++ b/docs/changelogs/v2.5.1.md
@@ -5,7 +5,7 @@
- Add metrics for workspace agent scripts (#11132) (@Emyrk)
- Add a user-configurable theme picker (#11140) (@aslilac)

- > A [light theme](https://github.com/coder/coder/issues/8396) is coming soon
+ > A [light theme](https://github.com/coder/coder/issues/8396) is TODO: Make this page
- Various improvements to bulk delete flow (#11093) (@aslilac)
### Bug fixes
diff --git a/docs/changelogs/v2.9.0.md b/docs/changelogs/v2.9.0.md
index 4c3a5b3fe42d3..3c6f27b841bcc 100644
--- a/docs/changelogs/v2.9.0.md
+++ b/docs/changelogs/v2.9.0.md
@@ -133,7 +133,7 @@ The following features are hidden or disabled by default as we don't guarantee s
### Documentation
- Fix /audit & /insights params (#12043) (@ericpaulsen)
-- Fix jetbrains reconnect faq (#12073) (@ericpaulsen)
+- Fix JetBrains reconnect faq (#12073) (@ericpaulsen)
- Update modules documentation (#11911) (@matifali)
- Add kubevirt coder template in list of community templates (#12113) (@sulo1337)
- Describe resource ordering in UI (#12185) (@mtojek)
diff --git a/docs/faqs.md b/docs/faqs.md
index addd698f17a38..c579308c9649e 100644
--- a/docs/faqs.md
+++ b/docs/faqs.md
@@ -486,7 +486,7 @@ No internet connection. Changes in the document might be lost. Trying to reconne
To resolve this, add this entry to your SSH config file on your local machine:
```console
-Host coder-jetbrains--*
+Host coder-JetBrains--*
ServerAliveInterval 5
```
diff --git a/docs/ides/fleet.md b/docs/ides/fleet.md
deleted file mode 100644
index a248b581a2fe2..0000000000000
--- a/docs/ides/fleet.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# JetBrains Fleet
-
-JetBrains Fleet is a code editor and lightweight IDE designed to support various
-programming languages and development environments.
-
-[See JetBrains' website to learn about Fleet](https://www.jetbrains.com/fleet/)
-
-Fleet can connect to a Coder workspace by following these steps.
-
-1. [Install Fleet](https://www.jetbrains.com/fleet/download)
-2. Install Coder CLI
- ```shell
- curl -L https://coder.com/install.sh | sh
- ```
-3. Login and configure Coder SSH.
- ```shell
- coder login coder.example.com
- coder config-ssh
- ```
-4. Connect via SSH with the Host set to `coder.workspace-name`
- 
-
-> If you experience problems, please
-> [create a GitHub issue](https://github.com/coder/coder/issues) or share in
-> [our Discord channel](https://discord.gg/coder).
diff --git a/docs/images/admin/integrations/coder-logstream-kube-logs-normal.png b/docs/images/admin/integrations/coder-logstream-kube-logs-normal.png
new file mode 100644
index 0000000000000..5947baca1919d
Binary files /dev/null and b/docs/images/admin/integrations/coder-logstream-kube-logs-normal.png differ
diff --git a/docs/images/admin/integrations/coder-logstream-kube-logs-pod-crashed.png b/docs/images/admin/integrations/coder-logstream-kube-logs-pod-crashed.png
new file mode 100644
index 0000000000000..4a5a5e183b6b5
Binary files /dev/null and b/docs/images/admin/integrations/coder-logstream-kube-logs-pod-crashed.png differ
diff --git a/docs/images/admin/integrations/coder-logstream-kube-logs-quota-exceeded.png b/docs/images/admin/integrations/coder-logstream-kube-logs-quota-exceeded.png
new file mode 100644
index 0000000000000..f95506028d156
Binary files /dev/null and b/docs/images/admin/integrations/coder-logstream-kube-logs-quota-exceeded.png differ
diff --git a/docs/images/admin/integrations/coder-logstream-kube-logs-wrong-image.png b/docs/images/admin/integrations/coder-logstream-kube-logs-wrong-image.png
new file mode 100644
index 0000000000000..5947baca1919d
Binary files /dev/null and b/docs/images/admin/integrations/coder-logstream-kube-logs-wrong-image.png differ
diff --git a/docs/images/admin/integrations/kube-region-picker.png b/docs/images/admin/integrations/kube-region-picker.png
new file mode 100644
index 0000000000000..f40a3379010d7
Binary files /dev/null and b/docs/images/admin/integrations/kube-region-picker.png differ
diff --git a/docs/images/admin/monitoring/grafana-dashboard.png b/docs/images/admin/monitoring/grafana-dashboard.png
new file mode 100644
index 0000000000000..2775165305472
Binary files /dev/null and b/docs/images/admin/monitoring/grafana-dashboard.png differ
diff --git a/docs/images/admin/monitoring/health-check.png b/docs/images/admin/monitoring/health-check.png
new file mode 100644
index 0000000000000..6c5a09aec207b
Binary files /dev/null and b/docs/images/admin/monitoring/health-check.png differ
diff --git a/docs/images/admin/monitoring/logstream-kube.png b/docs/images/admin/monitoring/logstream-kube.png
new file mode 100644
index 0000000000000..cffced3808eed
Binary files /dev/null and b/docs/images/admin/monitoring/logstream-kube.png differ
diff --git a/docs/images/admin/templates/agent-metadata-ui.png b/docs/images/admin/templates/agent-metadata-ui.png
new file mode 100644
index 0000000000000..9835f9dc1f212
Binary files /dev/null and b/docs/images/admin/templates/agent-metadata-ui.png differ
diff --git a/docs/images/admin/templates/coder-apps-ui.png b/docs/images/admin/templates/coder-apps-ui.png
new file mode 100644
index 0000000000000..82a9ae106d06c
Binary files /dev/null and b/docs/images/admin/templates/coder-apps-ui.png differ
diff --git a/docs/images/admin/templates/coder-metadata-ui.png b/docs/images/admin/templates/coder-metadata-ui.png
new file mode 100644
index 0000000000000..303324e1bddcd
Binary files /dev/null and b/docs/images/admin/templates/coder-metadata-ui.png differ
diff --git a/docs/images/admin/templates/create-template.png b/docs/images/admin/templates/create-template.png
new file mode 100644
index 0000000000000..d9cbd8ff615d8
Binary files /dev/null and b/docs/images/admin/templates/create-template.png differ
diff --git a/docs/images/admin/templates/duplicate-menu.png b/docs/images/admin/templates/duplicate-menu.png
new file mode 100644
index 0000000000000..bb134b0a7d742
Binary files /dev/null and b/docs/images/admin/templates/duplicate-menu.png differ
diff --git a/docs/images/admin/templates/duplicate-page.png b/docs/images/admin/templates/duplicate-page.png
new file mode 100644
index 0000000000000..d6ad32bb39221
Binary files /dev/null and b/docs/images/admin/templates/duplicate-page.png differ
diff --git a/docs/images/admin/templates/import-template.png b/docs/images/admin/templates/import-template.png
new file mode 100644
index 0000000000000..3378709562592
Binary files /dev/null and b/docs/images/admin/templates/import-template.png differ
diff --git a/docs/images/admin/templates/new-duplicate-template.png b/docs/images/admin/templates/new-duplicate-template.png
new file mode 100644
index 0000000000000..c4ca652b93843
Binary files /dev/null and b/docs/images/admin/templates/new-duplicate-template.png differ
diff --git a/docs/images/admin/templates/starter-templates.png b/docs/images/admin/templates/starter-templates.png
new file mode 100644
index 0000000000000..02bbe2c9ca3e9
Binary files /dev/null and b/docs/images/admin/templates/starter-templates.png differ
diff --git a/docs/images/admin/users/create-token.png b/docs/images/admin/users/create-token.png
new file mode 100644
index 0000000000000..df23bb8cf55ef
Binary files /dev/null and b/docs/images/admin/users/create-token.png differ
diff --git a/docs/images/admin/users/headless-user.png b/docs/images/admin/users/headless-user.png
new file mode 100644
index 0000000000000..9ca3d5195cd74
Binary files /dev/null and b/docs/images/admin/users/headless-user.png differ
diff --git a/docs/images/architecture-diagram.png b/docs/images/architecture-diagram.png
new file mode 100644
index 0000000000000..c35d0e22a797e
Binary files /dev/null and b/docs/images/architecture-diagram.png differ
diff --git a/docs/images/start/blank-workspaces.png b/docs/images/start/blank-workspaces.png
new file mode 100644
index 0000000000000..3dcc74020e4b8
Binary files /dev/null and b/docs/images/start/blank-workspaces.png differ
diff --git a/docs/images/start/build-template.png b/docs/images/start/build-template.png
new file mode 100644
index 0000000000000..b20d761acf0ab
Binary files /dev/null and b/docs/images/start/build-template.png differ
diff --git a/docs/images/start/create-template.png b/docs/images/start/create-template.png
new file mode 100644
index 0000000000000..4e078a0c5a451
Binary files /dev/null and b/docs/images/start/create-template.png differ
diff --git a/docs/images/start/create-workspace.png b/docs/images/start/create-workspace.png
new file mode 100644
index 0000000000000..c9e765bc1a107
Binary files /dev/null and b/docs/images/start/create-workspace.png differ
diff --git a/docs/images/start/first-template.png b/docs/images/start/first-template.png
new file mode 100644
index 0000000000000..f71a15a1ec9c3
Binary files /dev/null and b/docs/images/start/first-template.png differ
diff --git a/docs/images/start/setup-page.png b/docs/images/start/setup-page.png
new file mode 100644
index 0000000000000..b668ccde964f5
Binary files /dev/null and b/docs/images/start/setup-page.png differ
diff --git a/docs/images/start/starter-templates-annotated.png b/docs/images/start/starter-templates-annotated.png
new file mode 100644
index 0000000000000..e29dfde7e616f
Binary files /dev/null and b/docs/images/start/starter-templates-annotated.png differ
diff --git a/docs/images/start/starter-templates.png b/docs/images/start/starter-templates.png
new file mode 100644
index 0000000000000..2fb98b37e0011
Binary files /dev/null and b/docs/images/start/starter-templates.png differ
diff --git a/docs/images/start/template-edit-source-code.png b/docs/images/start/template-edit-source-code.png
new file mode 100644
index 0000000000000..592df11ca0c4b
Binary files /dev/null and b/docs/images/start/template-edit-source-code.png differ
diff --git a/docs/images/start/template-preview.png b/docs/images/start/template-preview.png
new file mode 100644
index 0000000000000..ea02b75fc05c4
Binary files /dev/null and b/docs/images/start/template-preview.png differ
diff --git a/docs/images/start/template-publish.png b/docs/images/start/template-publish.png
new file mode 100644
index 0000000000000..3bd5c3972ec51
Binary files /dev/null and b/docs/images/start/template-publish.png differ
diff --git a/docs/images/start/template-source-code.png b/docs/images/start/template-source-code.png
new file mode 100644
index 0000000000000..78fa366062c77
Binary files /dev/null and b/docs/images/start/template-source-code.png differ
diff --git a/docs/images/start/workspace-ready.png b/docs/images/start/workspace-ready.png
new file mode 100644
index 0000000000000..5e8fe2b0bb3e7
Binary files /dev/null and b/docs/images/start/workspace-ready.png differ
diff --git a/docs/images/start/workspace-schedule-settings.png b/docs/images/start/workspace-schedule-settings.png
new file mode 100644
index 0000000000000..83d5af46d678a
Binary files /dev/null and b/docs/images/start/workspace-schedule-settings.png differ
diff --git a/docs/images/templates/healthy-workspace-agent.png b/docs/images/templates/healthy-workspace-agent.png
new file mode 100644
index 0000000000000..c6a215a7e586a
Binary files /dev/null and b/docs/images/templates/healthy-workspace-agent.png differ
diff --git a/docs/images/templates/update-policies.png b/docs/images/templates/update-policies.png
new file mode 100644
index 0000000000000..ec43e26438c9d
Binary files /dev/null and b/docs/images/templates/update-policies.png differ
diff --git a/docs/images/user-guides/create-workspace-ui.png b/docs/images/user-guides/create-workspace-ui.png
new file mode 100644
index 0000000000000..c9e765bc1a107
Binary files /dev/null and b/docs/images/user-guides/create-workspace-ui.png differ
diff --git a/docs/images/user-guides/dotfiles-module.png b/docs/images/user-guides/dotfiles-module.png
new file mode 100644
index 0000000000000..d5161e85394ce
Binary files /dev/null and b/docs/images/user-guides/dotfiles-module.png differ
diff --git a/docs/images/user-guides/schedule-settings-workspace.png b/docs/images/user-guides/schedule-settings-workspace.png
new file mode 100644
index 0000000000000..e4255b297ddd6
Binary files /dev/null and b/docs/images/user-guides/schedule-settings-workspace.png differ
diff --git a/docs/images/user-guides/web-rdp-demo.png b/docs/images/user-guides/web-rdp-demo.png
new file mode 100644
index 0000000000000..4aece0ae698e3
Binary files /dev/null and b/docs/images/user-guides/web-rdp-demo.png differ
diff --git a/docs/images/user-guides/workspace-bulk-actions.png b/docs/images/user-guides/workspace-bulk-actions.png
new file mode 100644
index 0000000000000..7e4d45ba41f3d
Binary files /dev/null and b/docs/images/user-guides/workspace-bulk-actions.png differ
diff --git a/docs/images/user-guides/workspace-list-ui.png b/docs/images/user-guides/workspace-list-ui.png
new file mode 100644
index 0000000000000..9ac13675ed09e
Binary files /dev/null and b/docs/images/user-guides/workspace-list-ui.png differ
diff --git a/docs/images/user-guides/workspace-settings-location.png b/docs/images/user-guides/workspace-settings-location.png
new file mode 100644
index 0000000000000..fdafae225040a
Binary files /dev/null and b/docs/images/user-guides/workspace-settings-location.png differ
diff --git a/docs/images/user-guides/workspace-view-connection-annotated.png b/docs/images/user-guides/workspace-view-connection-annotated.png
new file mode 100644
index 0000000000000..af044f0cb4296
Binary files /dev/null and b/docs/images/user-guides/workspace-view-connection-annotated.png differ
diff --git a/docs/images/workspaceproxy/ws-proxy-picker.png b/docs/images/workspaceproxy/ws-proxy-picker.png
new file mode 100644
index 0000000000000..9271551564018
Binary files /dev/null and b/docs/images/workspaceproxy/ws-proxy-picker.png differ
diff --git a/docs/install/1-click.md b/docs/install/1-click.md
deleted file mode 100644
index dce07e904e029..0000000000000
--- a/docs/install/1-click.md
+++ /dev/null
@@ -1,12 +0,0 @@
-Coder can be installed on many cloud providers using our
-[one-click install packages](https://github.com/coder/packages)
-
-| Platform Name | Status | Documentation | Deploy |
-| --------------------- | ----------- | -------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
-| AWS EC2 | Live ✅ | [Guide: AWS](https://coder.com/docs/platforms/aws) | [Deploy from AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-5gxjyur2vc7rg?sr=0-2&ref_=beagle&applicationId=AWSMPContessa) |
-| AWS EKS | In progress | [Docs: Coder on Kubernetes](https://coder.com/docs/install/kubernetes) | [Deploy from AWS Marketplace](https://example.com) |
-| Google Compute Engine | Live ✅ | [Guide: Google Compute Engine](https://coder.com/docs/platforms/gcp) | [Deploy from GCP Marketplace](https://console.cloud.google.com/marketplace/product/coder-enterprise-market-public/coder-v2) |
-| Fly.io | Live ✅ | [Blog: Run Coder on Fly.io](https://coder.com/blog/remote-developer-environments-on-fly-io) | [Deploy Coder on Fly.io](https://coder.com/blog/remote-developer-environments-on-fly-io) |
-| Railway.app | Live ✅ | [Blog: Run Coder on Railway.app](https://coder.com/blog/deploy-coder-on-railway-app) | [](https://railway.app/template/coder?referralCode=tfH8Uw) |
-| Heroku | Live ✅ | [Docs: Deploy Coder on Heroku](https://github.com/coder/packages/blob/main/heroku/README.md) | [](https://heroku.com/deploy?template=https://github.com/coder/packages) |
-| Render | Live ✅ | [Docs: Deploy Coder on Render](https://github.com/coder/packages/blob/main/render/README.md) | [](https://render.com/deploy?repo=https://github.com/coder/packages) |
diff --git a/docs/install/README.md b/docs/install/README.md
new file mode 100644
index 0000000000000..a12311ac14bf0
--- /dev/null
+++ b/docs/install/README.md
@@ -0,0 +1,5 @@
+# Installing Coder
+
+TODO: Make this look great
+
+
diff --git a/docs/install/index.md b/docs/install/cli.md
similarity index 85%
rename from docs/install/index.md
rename to docs/install/cli.md
index a60409924b1b2..c8a86187de41b 100644
--- a/docs/install/index.md
+++ b/docs/install/cli.md
@@ -5,10 +5,6 @@ A single CLI (`coder`) is used for both the Coder server and the client.
We support two release channels: mainline and stable - read the
[Releases](./releases.md) page to learn more about which best suits your team.
-There are several ways to install Coder. For production deployments with 50+
-users, we recommend [installing on Kubernetes](./kubernetes.md). Otherwise, you
-can install Coder on your local machine or on a VM:
-
## Linux/macOS
@@ -42,15 +38,11 @@ package manager to install Coder:
winget install Coder.Coder
```
-## Other
-
-
-
To start the Coder server:
-```sh
+````sh
coder server
```
@@ -60,7 +52,7 @@ To log in to an existing Coder deployment:
```sh
coder login https://coder.example.com
-```
+````
## Next up
diff --git a/docs/install/cloud/README.md b/docs/install/cloud/README.md
new file mode 100644
index 0000000000000..0721a89197ea8
--- /dev/null
+++ b/docs/install/cloud/README.md
@@ -0,0 +1,35 @@
+# Cloud Platforms
+
+We provide install guides and example templates for deploying Coder to your cloud of choice.
+
+
+
+## AWS
+
+We publish an EC2 image with Coder pre-installed. Follow the tutorial here:
+
+- [Install Coder on AWS EC2](./ec2.md)
+
+Alternatively, install the [CLI binary](../cli.md) on any Linux machine or follow our [Kubernetes](../kubernetes.md) documentation to install Coder on an existing EKS cluster.
+
+## GCP
+
+We publish a GCP Marketplace listing with Coder pre-installed. Follow the tutorial here:
+
+- [Install Coder on GCP Compute Engine](./compute-engine.md)
+
+Alternatively, install the [CLI binary](../cli.md) on any Linux machine or follow our [Kubernetes](../kubernetes.md) documentation to install Coder on an existing GKE cluster.
+
+## Azure
+
+Use the following guide to run Coder on an Azure VM:
+
+- [Install Coder on an Azure VM](./azure-vm.md)
+
+Alternatively, install the [CLI binary](../cli.md) on any Linux machine or follow our [Kubernetes](../kubernetes.md) documentation to install Coder on an existing GKE cluster.
+
+## Other
+
+Is your cloud missing? Check [unofficial](../other/README.md) install methods or install the [standalone binary](../cli.md).
+
+
diff --git a/docs/platforms/azure.md b/docs/install/cloud/azure-vm.md
similarity index 88%
rename from docs/platforms/azure.md
rename to docs/install/cloud/azure-vm.md
index df5bb64a5b5fb..751d204b321b4 100644
--- a/docs/platforms/azure.md
+++ b/docs/install/cloud/azure-vm.md
@@ -12,7 +12,7 @@ This guide assumes you have full administrator privileges on Azure.
From the Azure Portal, navigate to the Virtual Machines Dashboard. Click Create,
and select creating a new Azure Virtual machine .
-
+
This will bring you to the `Create a virtual machine` page. Select the
subscription group of your choice, or create one if necessary.
@@ -22,14 +22,14 @@ of your choice. Change the region to something more appropriate for your current
location. For this tutorial, we will use the base selection of the Ubuntu Gen2
Image and keep the rest of the base settings for this image the same.
-
+
-
+
Up next, under `Inbound port rules` modify the Select `inbound ports` to also
take in `HTTPS` and `HTTP`.
-
+
The set up for the image is complete at this stage. Click `Review and Create` -
review the information and click `Create`. A popup will appear asking you to
@@ -37,11 +37,11 @@ download the key pair for the server. Click
`Download private key and create resource` and place it into a folder of your
choice on your local system.
-
+
Click `Return to create a virtual machine`. Your VM will start up!
-
+
Click `Go to resource` in the virtual machine and copy the public IP address.
You will need it to SSH into the virtual machine via your local machine.
@@ -100,12 +100,12 @@ First, run `coder template init` to create your first template. You’ll be give
a list of possible templates to use. This tutorial will show you how to set up
your Coder instance to create a Linux based machine on Azure.
-
+
Press `enter` to select `Develop in Linux on Azure` template. This will return
the following:
-
+
To get started using the Azure template, install the Azure CLI by following the
instructions
@@ -133,9 +133,3 @@ coder templates push
Congrats! You can now navigate to your Coder dashboard and use this Linux on
Azure template to create a new workspace!
-
-## Next Steps
-
-- [Port-forward](../networking/port-forwarding.md)
-- [Learn more about template configuration](../templates/index.md)
-- [Configure more IDEs](../ides/web-ides.md)
diff --git a/docs/platforms/gcp.md b/docs/install/cloud/compute-engine.md
similarity index 91%
rename from docs/platforms/gcp.md
rename to docs/install/cloud/compute-engine.md
index c8c4203314c77..5c1997a21f110 100644
--- a/docs/platforms/gcp.md
+++ b/docs/install/cloud/compute-engine.md
@@ -14,7 +14,7 @@ We publish an Ubuntu 22.04 VM image with Coder and Docker pre-installed. Search
for `Coder v2` in the GCP Marketplace or
[use direct link](https://console.cloud.google.com/marketplace/product/coder-enterprise-market-public/coder-v2).
-
+
Be sure to keep the default firewall options checked so you can connect over
HTTP, HTTPS, and SSH.
@@ -31,18 +31,18 @@ Your browser does not support the video tag.
Be sure to add a keypair so that you can connect over SSH to further
-[configure Coder](../admin/configure.md).
+[configure Coder](../../admin/configure.md).
After launching the instance, wait 30 seconds and navigate to the public IPv4
address. You should be redirected to a public tunnel URL.
-
+
That's all! Use the UI to create your first user, template, and workspace. We
recommend starting with a Docker template since the instance has Docker
pre-installed.
-
+
## Configuring Coder server
diff --git a/docs/install/cloud/ec2.md b/docs/install/cloud/ec2.md
new file mode 100644
index 0000000000000..f9bdf9ff30e36
--- /dev/null
+++ b/docs/install/cloud/ec2.md
@@ -0,0 +1,90 @@
+# Amazon Web Services
+
+This guide is designed to get you up and running with a Coder proof-of-concept
+VM on AWS EC2 using a [Coder-provided AMI](https://github.com/coder/packages).
+If you are familiar with EC2 however, you can use our
+[install script](../cli.md) to run Coder on any popular Linux distribution.
+
+## Requirements
+
+This guide assumes your AWS account has `AmazonEC2FullAccess` permissions.
+
+## Launch a Coder instance from the from AWS Marketplace
+
+We publish an Ubuntu 22.04 AMI with Coder and Docker pre-installed. Search for
+`Coder` in the EC2 "Launch an Instance" screen or
+[launch directly from the marketplace](https://aws.amazon.com/marketplace/pp/prodview-5gxjyur2vc7rg).
+
+
+
+Be sure to keep the default firewall (SecurityGroup) options checked so you can
+connect over HTTP, HTTPS, and SSH.
+
+
+
+We recommend keeping the default instance type (`t2.xlarge`, 4 cores and 16 GB
+memory) if you plan on provisioning Docker containers as workspaces on this EC2
+instance. Keep in mind this platforms is intended for proof-of-concept
+deployments and you should adjust your infrastructure when preparing for
+production use. See: [Scaling Coder](../../admin/scale.md)
+
+Be sure to add a keypair so that you can connect over SSH to further
+[configure Coder](../../admin/configure.md).
+
+After launching the instance, wait 30 seconds and navigate to the public IPv4
+address. You should be redirected to a public tunnel URL.
+
+
+
+That's all! Use the UI to create your first user, template, and workspace. We
+recommend starting with a Docker template since the instance has Docker
+pre-installed.
+
+
+
+## Configuring Coder server
+
+Coder is primarily configured by server-side flags and environment variables.
+Given you created or added key-pairs when launching the instance, you can
+[configure your Coder deployment](../../admin/configure.md) by logging in via
+SSH or using the console:
+
+
+
+```sh
+ssh ubuntu@
+sudo vim /etc/coder.d/coder.env # edit config
+sudo systemctl daemon-reload
+sudo systemctl restart coder # restart Coder
+```
+
+## Give developers EC2 workspaces (optional)
+
+Instead of running containers on the Coder instance, you can offer developers
+full EC2 instances with the
+[aws-linux](https://github.com/coder/coder/tree/main/examples/templates/aws-linux)
+template.
+
+Before you add the AWS template from the dashboard or CLI, you'll need to modify
+the instance IAM role.
+
+
+
+You must create or select a role that has `EC2FullAccess` permissions or a
+limited
+[Coder-specific permissions policy](https://github.com/coder/coder/tree/main/examples/templates/aws-linux#required-permissions--policy).
+
+From there, you can import the AWS starter template in the dashboard and begin
+creating VM-based workspaces.
+
+
+
+## Next steps
+
+- [IDEs with Coder](../../ides.md)
+- [Writing custom templates for Coder](../../templates/index.md)
+- [Configure the Coder server](../../admin/configure.md)
+- [Use your own domain + TLS](../../admin/configure.md#tls--reverse-proxy)
diff --git a/docs/install/docker.md b/docs/install/docker.md
index 2681f3b3d03cc..61bfe2e48c2f9 100644
--- a/docs/install/docker.md
+++ b/docs/install/docker.md
@@ -1,19 +1,23 @@
+# Install Coder via Docker
+
You can install and run Coder using the official Docker images published on
[GitHub Container Registry](https://github.com/coder/coder/pkgs/container/coder).
## Requirements
-Docker is required. See the
-[official installation documentation](https://docs.docker.com/install/).
+- Docker. See the
+ [official installation documentation](https://docs.docker.com/install/).
+
+- A Linux machine. For macOS devices, start Coder using the
+ [standalone binary](./cli.md).
-> Note that the below steps are only supported on a Linux distribution. If on
-> macOS, please [run Coder via the standalone binary](./index.md#manual).
+- 2 CPU cores and 4 GB memory free on your machine.
-
+
-## docker run
+## Install Coder via `docker run`
-**Built-in database (quick)**
+### Built-in database (quick)
For proof-of-concept deployments, you can run a complete Coder instance with the
following command.
@@ -29,7 +33,7 @@ docker run --rm -it \
ghcr.io/coder/coder:latest
```
-**External database**
+### External database (recommended)
For production deployments, we recommend using an external PostgreSQL database
(version 13 or higher). Set `CODER_ACCESS_URL` to the external URL that users
@@ -45,7 +49,7 @@ docker run --rm -it \
ghcr.io/coder/coder:latest
```
-## docker compose
+## Install Coder via `docker compose`
Coder's publishes a
[docker-compose example](https://github.com/coder/coder/blob/main/docker-compose.yaml)
@@ -67,31 +71,14 @@ which includes an PostgreSQL container and volume.
4. Start Coder with `docker compose up`
-5. Visit the web ui via the configured url.
+5. Visit the web UI via the configured url.
6. Follow the on-screen instructions log in and create your first template and
workspace
-
-
Coder configuration is defined via environment variables. Learn more about
Coder's [configuration options](../admin/configure.md).
-> **Note:** In order to use cloud-based templates (e.g. Kubernetes, AWS), you
-> must have an external URL that users and workspaces will use to connect to
-> Coder.
->
-> > For proof-of-concept deployments, you can use
-> > [Coder's tunnel](../admin/configure.md#tunnel).
-> >
-> > For production deployments, we recommend setting an
-> > [access URL](../admin/configure.md#access-url)
-
-> **Note:** Coder runs as a non-root user, we use `--group-add` to ensure Coder
-> has permissions to manage Docker via `docker.sock`. If the host systems
-> `/var/run/docker.sock` is not group writeable or does not belong to the
-> `docker` group, the above may not work as-is.
-
## Troubleshooting
### Docker-based workspace is stuck in "Connecting..."
@@ -105,7 +92,17 @@ more steps.
See Docker's official documentation to
[Manage Docker as a non-root user](https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user)
-## Next steps
+### I cannot add Docker templates
+
+Coder runs as a non-root user, we use `--group-add` to ensure Coder has
+permissions to manage Docker via `docker.sock`. If the host systems
+`/var/run/docker.sock` is not group writeable or does not belong to the `docker`
+group, the above may not work as-is.
+
+### I cannot add cloud-based templates
-- [Configuring Coder](../admin/configure.md)
-- [Templates](../templates/index.md)
+In order to use cloud-based templates (e.g. Kubernetes, AWS), you must have an
+external URL that users and workspaces will use to connect to Coder. For
+proof-of-concept deployments, you can use
+[Coder's tunnel](../admin/configure.md#tunnel). For production deployments, we
+recommend setting an [access URL](../admin/configure.md#access-url)
diff --git a/docs/install/kubernetes.md b/docs/install/kubernetes.md
index 72d8d43061e65..b28738015ec73 100644
--- a/docs/install/kubernetes.md
+++ b/docs/install/kubernetes.md
@@ -1,164 +1,159 @@
+# Install Coder on Kubernetes
+
+You can install Coder on Kubernetes using Helm. We run on most Kubernetes
+distributions, including [OpenShift](./other/openshift.md).
+
## Requirements
-Before proceeding, please ensure that you have a Kubernetes cluster running K8s
-1.19+ and have Helm 3.5+ installed.
-
-You'll also want to install the
-[latest version of Coder](https://github.com/coder/coder/releases/latest)
-locally in order to log in and manage templates.
-
-> Coder supports two release channels: mainline for the true latest version of
-> Coder, and stable for large enterprise deployments. Before installing your
-> control plane via Helm, please read the [Releases](./releases.md) document to
-> identify the best-suited release for your team, then specify the version using
-> Helm's `--version` flag.
-
-> The version flags for both stable and mainline are automatically filled in
-> this page.
-
-> If you need help setting up k8s, we have a
-> [repo with Terraform configuration](https://github.com/ElliotG/coder-oss-tf)
-> to provision Coder on Google GKE, Azure AKS, AWS EKS, DigitalOcean DOKS,
-> IBMCloud K8s, OVHCloud K8s, and Scaleway K8s Kapsule.
-
-## Install Coder with Helm
-
-1. Create a namespace for Coder, such as `coder`:
-
- ```console
- kubectl create namespace coder
- ```
-
-1. Create a PostgreSQL deployment. Coder does not manage a database server for
- you.
-
- If you're in a public cloud such as
- [Google Cloud](https://cloud.google.com/sql/docs/postgres/),
- [AWS](https://aws.amazon.com/rds/postgresql/),
- [Azure](https://docs.microsoft.com/en-us/azure/postgresql/), or
- [DigitalOcean](https://www.digitalocean.com/products/managed-databases-postgresql),
- you can use the managed PostgreSQL offerings they provide. Make sure that the
- PostgreSQL service is running and accessible from your cluster. It should be
- in the same network, same project, etc.
-
- You can install Postgres manually on your cluster using the
- [Bitnami PostgreSQL Helm chart](https://github.com/bitnami/charts/tree/master/bitnami/postgresql#readme).
- There are some
- [helpful guides](https://phoenixnap.com/kb/postgresql-kubernetes) on the
- internet that explain sensible configurations for this chart. Example:
-
- ```console
- # Install PostgreSQL
- helm repo add bitnami https://charts.bitnami.com/bitnami
- helm install coder-db bitnami/postgresql \
- --namespace coder \
- --set auth.username=coder \
- --set auth.password=coder \
- --set auth.database=coder \
- --set persistence.size=10Gi
- ```
-
- The cluster-internal DB URL for the above database is:
-
- ```shell
- postgres://coder:coder@coder-db-postgresql.coder.svc.cluster.local:5432/coder?sslmode=disable
- ```
-
- > Ensure you set up periodic backups so you don't lose data.
-
- You can use [Postgres operator](https://github.com/zalando/postgres-operator)
- to manage PostgreSQL deployments on your Kubernetes cluster.
-
-1. Create a secret with the database URL:
-
- ```shell
- # Uses Bitnami PostgreSQL example. If you have another database,
- # change to the proper URL.
- kubectl create secret generic coder-db-url -n coder \
- --from-literal=url="postgres://coder:coder@coder-db-postgresql.coder.svc.cluster.local:5432/coder?sslmode=disable"
- ```
-
-1. Add the Coder Helm repo:
-
- ```shell
- helm repo add coder-v2 https://helm.coder.com/v2
- ```
-
-1. Create a `values.yaml` with the configuration settings you'd like for your
- deployment. For example:
-
- ```yaml
- coder:
- # You can specify any environment variables you'd like to pass to Coder
- # here. Coder consumes environment variables listed in
- # `coder server --help`, and these environment variables are also passed
- # to the workspace provisioner (so you can consume them in your Terraform
- # templates for auth keys etc.).
- #
- # Please keep in mind that you should not set `CODER_HTTP_ADDRESS`,
- # `CODER_TLS_ENABLE`, `CODER_TLS_CERT_FILE` or `CODER_TLS_KEY_FILE` as
- # they are already set by the Helm chart and will cause conflicts.
- env:
- - name: CODER_PG_CONNECTION_URL
- valueFrom:
- secretKeyRef:
- # You'll need to create a secret called coder-db-url with your
- # Postgres connection URL like:
- # postgres://coder:password@postgres:5432/coder?sslmode=disable
- name: coder-db-url
- key: url
-
- # (Optional) For production deployments the access URL should be set.
- # If you're just trying Coder, access the dashboard via the service IP.
- - name: CODER_ACCESS_URL
- value: "https://coder.example.com"
-
- #tls:
- # secretNames:
- # - my-tls-secret-name
- ```
-
- > You can view our
- > [Helm README](https://github.com/coder/coder/blob/main/helm#readme) for
- > details on the values that are available, or you can view the
- > [values.yaml](https://github.com/coder/coder/blob/main/helm/coder/values.yaml)
- > file directly.
-
-1. Run the following command to install the chart in your cluster.
-
- For the **mainline** Coder release:
+- Kubernetes cluster running K8s 1.19+
+- [Helm](https://helm.sh/docs/intro/install/) 3.5+ installed on your local
+ machine
+
+## 1. Create a namespace
+
+Create a namespace for the Coder control plane. In this tutorial, we'll call it
+`coder`.
+
+```sh
+kubectl create namespace coder
+```
+
+## 2. Create a PostgreSQL instance
+
+Coder does not manage a database server for you. This is required for storing
+data about your Coder deployment and resources.
+
+### Managed PostgreSQL (recommended)
+
+If you're in a public cloud such as
+[Google Cloud](https://cloud.google.com/sql/docs/postgres/),
+[AWS](https://aws.amazon.com/rds/postgresql/),
+[Azure](https://docs.microsoft.com/en-us/azure/postgresql/), or
+[DigitalOcean](https://www.digitalocean.com/products/managed-databases-postgresql),
+you can use the managed PostgreSQL offerings they provide. Make sure that the
+PostgreSQL service is running and accessible from your cluster. It should be in
+the same network, same project, etc.
+
+### In-Cluster PostgreSQL (for proof of concepts)
+
+You can install Postgres manually on your cluster using the
+[Bitnami PostgreSQL Helm chart](https://github.com/bitnami/charts/tree/master/bitnami/postgresql#readme).
+There are some [helpful guides](https://phoenixnap.com/kb/postgresql-kubernetes)
+on the internet that explain sensible configurations for this chart. Example:
+
+```console
+# Install PostgreSQL
+helm repo add bitnami https://charts.bitnami.com/bitnami
+helm install coder-db bitnami/postgresql \
+ --namespace coder \
+ --set auth.username=coder \
+ --set auth.password=coder \
+ --set auth.database=coder \
+ --set persistence.size=10Gi
+```
+
+The cluster-internal DB URL for the above database is:
+
+```shell
+postgres://coder:coder@coder-db-postgresql.coder.svc.cluster.local:5432/coder?sslmode=disable
+```
+
+You can optionally use the
+[Postgres operator](https://github.com/zalando/postgres-operator) to manage
+PostgreSQL deployments on your Kubernetes cluster.
+
+## 3. Create the PostgreSQL secret
+
+Create a secret with the PostgreSQL database URL string. In the case of the
+self-managed PostgreSQL, the address will be:
+
+```sh
+kubectl create secret generic coder-db-url -n coder \
+ --from-literal=url="postgres://coder:coder@coder-db-postgresql.coder.svc.cluster.local:5432/coder?sslmode=disable"
+```
+
+## 4. Install Coder with Helm
+
+```shell
+helm repo add coder-v2 https://helm.coder.com/v2
+```
+
+Create a `values.yaml` with the configuration settings you'd like for your
+deployment. For example:
+
+```yaml
+coder:
+ # You can specify any environment variables you'd like to pass to Coder
+ # here. Coder consumes environment variables listed in
+ # `coder server --help`, and these environment variables are also passed
+ # to the workspace provisioner (so you can consume them in your Terraform
+ # templates for auth keys etc.).
+ #
+ # Please keep in mind that you should not set `CODER_HTTP_ADDRESS`,
+ # `CODER_TLS_ENABLE`, `CODER_TLS_CERT_FILE` or `CODER_TLS_KEY_FILE` as
+ # they are already set by the Helm chart and will cause conflicts.
+ env:
+ - name: CODER_PG_CONNECTION_URL
+ valueFrom:
+ secretKeyRef:
+ # You'll need to create a secret called coder-db-url with your
+ # Postgres connection URL like:
+ # postgres://coder:password@postgres:5432/coder?sslmode=disable
+ name: coder-db-url
+ key: url
+
+ # (Optional) For production deployments the access URL should be set.
+ # If you're just trying Coder, access the dashboard via the service IP.
+ - name: CODER_ACCESS_URL
+ value: "https://coder.example.com"
+
+ #tls:
+ # secretNames:
+ # - my-tls-secret-name
+```
+
+> You can view our
+> [Helm README](https://github.com/coder/coder/blob/main/helm#readme) for
+> details on the values that are available, or you can view the
+> [values.yaml](https://github.com/coder/coder/blob/main/helm/coder/values.yaml)
+> file directly.
+
+We support two release channels: mainline and stable - read the
+[Releases](./releases.md) page to learn more about which best suits your team.
+
+For the **mainline** Coder release:
- ```shell
- helm install coder coder-v2/coder \
- --namespace coder \
- --values values.yaml \
- --version 2.14.0
- ```
+```shell
+helm install coder coder-v2/coder \
+ --namespace coder \
+ --values values.yaml \
+ --version 2.14.0
+```
- For the **stable** Coder release:
+For the **stable** Coder release:
- ```shell
- helm install coder coder-v2/coder \
- --namespace coder \
- --values values.yaml \
- --version 2.13.4
- ```
+```shell
+helm install coder coder-v2/coder \
+ --namespace coder \
+ --values values.yaml \
+ --version 2.13.4
+```
- You can watch Coder start up by running `kubectl get pods -n coder`. Once
- Coder has started, the `coder-*` pods should enter the `Running` state.
+You can watch Coder start up by running `kubectl get pods -n coder`. Once Coder
+has started, the `coder-*` pods should enter the `Running` state.
-1. Log in to Coder
+## 5. Log in to Coder 🎉
- Use `kubectl get svc -n coder` to get the IP address of the LoadBalancer.
- Visit this in the browser to set up your first account.
+Use `kubectl get svc -n coder` to get the IP address of the LoadBalancer. Visit
+this in the browser to set up your first account.
- If you do not have a domain, you should set `CODER_ACCESS_URL` to this URL in
- the Helm chart and upgrade Coder (see below). This allows workspaces to
- connect to the proper Coder URL.
+If you do not have a domain, you should set `CODER_ACCESS_URL` to this URL in
+the Helm chart and upgrade Coder (see below). This allows workspaces to connect
+to the proper Coder URL.
## Upgrading Coder via Helm
@@ -294,8 +289,3 @@ Coder's LoadBalancer (`kubectl get svc -n coder`).
See [troubleshooting templates](../templates/index.md#troubleshooting-templates)
for more steps.
-
-## Next steps
-
-- [Configuring Coder](../admin/configure.md)
-- [Templates](../templates/index.md)
diff --git a/docs/install/openshift.md b/docs/install/openshift.md
index cb8bb779ea3f4..57ca8b8a86a63 100644
--- a/docs/install/openshift.md
+++ b/docs/install/openshift.md
@@ -1,13 +1,9 @@
## Requirements
-Before proceeding, please ensure that you have an OpenShift cluster running K8s
-1.19+ (OpenShift 4.7+) and have Helm 3.5+ installed. In addition, you'll need to
-install the OpenShift CLI (`oc`) to authenticate to your cluster and create
-OpenShift resources.
-
-You'll also want to install the
-[latest version of Coder](https://github.com/coder/coder/releases/latest)
-locally in order to log in and manage templates.
+- OpenShift cluster running K8s 1.19+ (OpenShift 4.7+)
+- Helm 3.5+ installed
+- OpenShift CLI (`oc`) installed
+- [Coder CLI](./cli.md) installed
## Install Coder with OpenShift
diff --git a/docs/install/other/README.md b/docs/install/other/README.md
new file mode 100644
index 0000000000000..b3bc83345cb37
--- /dev/null
+++ b/docs/install/other/README.md
@@ -0,0 +1,16 @@
+# Alternate install methods
+
+Coder has a number of alternate unofficial install methods. Contributions are welcome!
+
+| Platform Name | Status | Documentation |
+| --------------------------------------------------------------------------------- | ---------- | -------------------------------------------------------------------------------------------- |
+| AWS EC2 | Official | [Guide: AWS](https://coder.com/docs/platforms/aws) |
+| Google Compute Engine | Official | [Guide: Google Compute Engine](https://coder.com/docs/platforms/gcp) |
+| Azure AKS | Unofficial | [GitHub: coder-aks](https://github.com/ericpaulsen/coder-aks) |
+| Terraform (GKE, AKS, LKE, DOKS, IBMCloud K8s, OVHCloud K8s, Scaleway K8s Kapsule) | Unofficial | [GitHub: coder-oss-terraform](https://github.com/ElliotG/coder-oss-tf) |
+| Fly.io | Unofficial | [Blog: Run Coder on Fly.io](https://coder.com/blog/remote-developer-environments-on-fly-io) |
+| Garden.io | Unofficial | [GitHub: garden-coder-example](https://github.com/garden-io/garden-coder-example) |
+| Railway.app | Unofficial | [Blog: Run Coder on Railway.app](https://coder.com/blog/deploy-coder-on-railway-app) |
+| Heroku | Unofficial | [Docs: Deploy Coder on Heroku](https://github.com/coder/packages/blob/main/heroku/README.md) |
+| Render | Unofficial | [Docs: Deploy Coder on Render](https://github.com/coder/packages/blob/main/render/README.md) |
+| Snapcraft | Unofficial | [Get it from the Snap Store](https://snapcraft.io/coder) |
diff --git a/docs/install/other/openshift.md b/docs/install/other/openshift.md
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/docs/manifest.json b/docs/manifest.json
index 4b686ed9598b6..5564aff7bc543 100644
--- a/docs/manifest.json
+++ b/docs/manifest.json
@@ -3,1171 +3,1059 @@
"routes": [
{
"title": "About",
- "description": "About Coder",
+ "description": "Landing Page",
"path": "./README.md",
- "icon_path": "./images/icons/home.svg",
- "children": [
- {
- "title": "Screenshots",
- "description": "Browse screenshots of the Coder platform",
- "path": "./about/screenshots.md"
- }
- ]
+ "icon_path": "./images/icons/home.svg"
},
{
- "title": "Architecture",
- "description": "Learn about validated and reference architectures for Coder",
- "path": "./architecture/architecture.md",
- "icon_path": "./images/icons/container.svg",
+ "title": "Getting Started",
+ "description": "Tour Coder by setting up your first deployment",
+ "path": "./start/README.md",
+ "icon_path": "./images/icons/star.svg",
"children": [
{
- "title": "Validated Architecture",
- "path": "./architecture/validated-arch.md"
- },
- {
- "title": "Up to 1,000 users",
- "path": "./architecture/1k-users.md"
+ "title": "Tour Coder",
+ "description": "Tour Coder by creating a deployment with Docker",
+ "path": "./start/coder-tour.md"
},
{
- "title": "Up to 2,000 users",
- "path": "./architecture/2k-users.md"
- },
- {
- "title": "Up to 3,000 users",
- "path": "./architecture/3k-users.md"
+ "title": "Screenshots",
+ "description": "View screenshots of the Coder platform",
+ "path": "./start/screenshots.md"
}
]
},
{
- "title": "Installation",
- "description": "How to install and deploy Coder",
- "path": "./install/index.md",
+ "title": "Install",
+ "description": "Installing Coder",
+ "path": "./install/README.md",
"icon_path": "./images/icons/download.svg",
"children": [
{
- "title": "Kubernetes",
- "description": "Install Coder with Kubernetes via Helm",
- "path": "./install/kubernetes.md"
+ "title": "Coder CLI",
+ "description": "Install the standalone binary",
+ "path": "./install/cli.md"
},
{
"title": "Docker",
- "description": "Install Coder with Docker / docker-compose",
+ "description": "Install Coder using Docker",
"path": "./install/docker.md"
},
+ {
+ "title": "Kubernetes",
+ "description": "Install Coder on Kubernetes",
+ "path": "./install/kubernetes.md"
+ },
{
"title": "OpenShift",
"description": "Install Coder on OpenShift",
"path": "./install/openshift.md"
},
{
- "title": "Offline deployments",
- "description": "Run Coder in offline / air-gapped environments",
- "path": "./install/offline.md"
- },
- {
- "title": "External database",
- "description": "Use external PostgreSQL database",
- "path": "./install/database.md"
- },
- {
- "title": "Uninstall",
- "description": "Learn how to uninstall Coder",
- "path": "./install/uninstall.md"
- },
- {
- "title": "1-click install",
- "description": "Install Coder on a cloud provider with a single click",
- "path": "./install/1-click.md"
+ "title": "Cloud Providers",
+ "description": "Install Coder on cloud providers",
+ "path": "./install/cloud/README.md",
+ "children": [
+ {
+ "title": "AWS EC2",
+ "description": "Install Coder on AWS EC2",
+ "path": "./install/cloud/ec2.md"
+ },
+ {
+ "title": "GCP Compute Engine",
+ "description": "Install Coder on GCP Compute Engine",
+ "path": "./install/cloud/compute-engine.md"
+ },
+ {
+ "title": "Azure VM",
+ "description": "Install Coder on an Azure VM",
+ "path": "./install/cloud/azure-vm.md"
+ }
+ ]
},
{
- "title": "Releases",
- "description": "Coder Release Channels and Cadence",
- "path": "./install/releases.md"
+ "title": "Unofficial Install Methods",
+ "description": "Other installation methods",
+ "path": "./install/other/README.md"
}
]
},
{
- "title": "Platforms",
- "description": "Platform-specific guides using Coder",
- "path": "./platforms/README.md",
- "icon_path": "./images/icons/star.svg",
+ "title": "User Guides",
+ "description": "Guides for end-users of Coder",
+ "path": "./user-guides/README.md",
+ "icon_path": "./images/icons/users.svg",
"children": [
{
- "title": "AWS",
- "description": "Set up Coder on an AWS EC2 VM",
- "path": "./platforms/aws.md",
- "icon_path": "./images/aws.svg"
- },
- {
- "title": "Azure",
- "description": "Set up Coder on an Azure VM",
- "path": "./platforms/azure.md",
- "icon_path": "./images/azure.svg"
- },
- {
- "title": "Docker",
- "description": "Set up Coder with Docker",
- "path": "./platforms/docker.md",
- "icon_path": "./images/icons/docker.svg"
- },
- {
- "title": "GCP",
- "description": "Set up Coder on a GCP Compute Engine VM",
- "path": "./platforms/gcp.md",
- "icon_path": "./images/google-cloud.svg"
- },
- {
- "title": "Kubernetes",
- "description": "Set up Coder on Kubernetes",
- "path": "./platforms/kubernetes/index.md",
+ "title": "Access Workspaces",
+ "description": "Connect to your Coder workspaces",
+ "path": "./user-guides/workspace-access/README.md",
"children": [
{
- "title": "Additional clusters",
- "description": "Deploy workspaces on additional Kubernetes clusters",
- "path": "./platforms/kubernetes/additional-clusters.md"
+ "title": "Visual Studio Code",
+ "description": "Use VSCode with Coder in the desktop or browser",
+ "path": "./user-guides/workspace-access/vscode.md"
},
{
- "title": "Deployment logs",
- "description": "Stream K8s event logs on workspace startup",
- "path": "./platforms/kubernetes/deployment-logs.md"
+ "title": "JetBrains IDEs",
+ "description": "Use JetBrains IDEs with Gateway",
+ "path": "./user-guides/workspace-access/jetbrains.md"
+ },
+ {
+ "title": "Remote desktop",
+ "description": "Use RDP in Coder",
+ "path": "./user-guides/workspace-access/remote-desktops.md"
+ },
+ {
+ "title": "Emacs TRAMP",
+ "description": "Use Emacs TRAMP in Coder",
+ "path": "./user-guides/workspace-access/emacs-tramp.md"
+ },
+ {
+ "title": "Port Forwarding",
+ "description": "Access ports on your workspace",
+ "path": "./user-guides/workspace-access/port-forwarding.md"
+ },
+ {
+ "title": "Filebrowser",
+ "description": "Access your workspace files",
+ "path": "./user-guides/workspace-access/filebrowser.md"
}
]
},
{
- "title": "Other platforms",
- "description": "Set up Coder on an another provider",
- "path": "./platforms/other.md"
+ "title": "Workspace Scheduling",
+ "description": "Cost control with workspace schedules",
+ "path": "./user-guides/workspace-scheduling.md"
+ },
+ {
+ "title": "Dotfiles",
+ "description": "Personalize your environment with dotfiles",
+ "path": "./user-guides/workspace-dotfiles.md"
}
]
},
{
- "title": "Templates",
- "description": "Templates define the infrastructure for workspaces",
- "path": "./templates/index.md",
- "icon_path": "./images/icons/picture.svg",
+ "title": "Administration",
+ "description": "Guides for template and deployment administrators",
+ "path": "./admin/README.md",
+ "icon_path": "./images/icons/wrench.svg",
"children": [
{
- "title": "Working with templates",
- "description": "Creating, editing, and updating templates",
- "path": "./templates/creating.md"
- },
- {
- "title": "Your first template",
- "description": "A tutorial for creating and editing your first template",
- "path": "./templates/tutorial.md"
+ "title": "Control Plane Configuration",
+ "description": "Configure user access to your control plane.",
+ "path": "./admin/configure.md"
},
{
- "title": "Guided tour",
- "description": "Create a template from scratch",
- "path": "./templates/tour.md"
+ "title": "Infrastructure",
+ "description": "How to integrate Coder with your organization's compute",
+ "path": "./admin/infrastructure/README.md",
+ "children": [
+ {
+ "title": "Architecture",
+ "description": "Learn about Coder's architecture",
+ "path": "./admin/infrastructure/architecture.md"
+ },
+ {
+ "title": "Validated Architectures",
+ "description": "Architectures for large Coder deployments",
+ "path": "./admin/infrastructure/validated-architectures/README.md",
+ "children": [
+ {
+ "title": "Up to 1,000 Users",
+ "path": "./admin/infrastructure/validated-architectures/1k-users.md"
+ },
+ {
+ "title": "Up to 2,000 Users",
+ "path": "./admin/infrastructure/validated-architectures/2k-users.md"
+ },
+ {
+ "title": "Up to 3,000 Users",
+ "path": "./admin/infrastructure/validated-architectures/3k-users.md"
+ }
+ ]
+ },
+ {
+ "title": "Scale Testing",
+ "description": "Ensure your deployment can handle your organization's needs",
+ "path": "./admin/infrastructure/scale-testing.md"
+ },
+ {
+ "title": "Scaling Utilities",
+ "description": "Tools to help you scale your deployment",
+ "path": "./admin/infrastructure/scale-utility.md"
+ }
+ ]
},
{
- "title": "Setting up templates",
- "description": "Best practices for writing templates",
- "path": "./templates/best-practices.md",
+ "title": "Users",
+ "description": "Learn how to manage and audit users",
+ "path": "./admin/users/README.md",
"children": [
{
- "title": "Template Dependencies",
- "description": "Manage dependencies of your templates",
- "path": "./templates/dependencies.md",
- "icon_path": "./images/icons/dependency.svg"
+ "title": "OIDC Authentication",
+ "path": "./admin/users/oidc-auth.md"
+ },
+ {
+ "title": "GitHub Authentication",
+ "path": "./admin/users/github-auth.md"
},
{
- "title": "Change management",
- "description": "Versioning templates with git and CI",
- "path": "./templates/change-management.md",
- "icon_path": "./images/icons/git.svg"
+ "title": "Password Authentication",
+ "path": "./admin/users/password-auth.md"
},
{
- "title": "Provider authentication",
- "description": "Authenticate the provisioner",
- "path": "./templates/authentication.md",
- "icon_path": "./images/icons/key.svg"
+ "title": "Headless Authentication",
+ "path": "./admin/users/headless-auth.md"
},
{
- "title": "Resource persistence",
- "description": "How resource persistence works in Coder",
- "path": "./templates/resource-persistence.md",
- "icon_path": "./images/icons/infinity.svg"
+ "title": "Groups \u0026 Roles",
+ "path": "./admin/users/groups-roles.md"
},
{
- "title": "Terraform modules",
- "description": "Reuse code across Coder templates",
- "path": "./templates/modules.md"
+ "title": "Organizations",
+ "path": "./admin/users/organizations.md",
+ "state": "enterprise"
+ },
+ {
+ "title": "Sessions \u0026 API Tokens",
+ "path": "./admin/users/sessions-tokens.md"
}
]
},
{
- "title": "Customizing templates",
- "description": "Give information and options to workspace users",
- "path": "./templates/customizing.md",
+ "title": "Templates",
+ "description": "Learn how to author and maintain Coder templates",
+ "path": "./admin/templates/README.md",
"children": [
{
- "title": "Agent metadata",
- "description": "Show operational metrics in the workspace",
- "path": "./templates/agent-metadata.md"
+ "title": "Creating Templates",
+ "description": "Learn how to create templates with Terraform",
+ "path": "./admin/templates/creating-templates.md"
+ },
+ {
+ "title": "Managing Templates",
+ "description": "Learn how to manage templates and best practices",
+ "path": "./admin/templates/managing-templates/README.md",
+ "children": [
+ {
+ "title": "Image Management",
+ "description": "Learn about template image management",
+ "path": "./admin/templates/managing-templates/image-management.md"
+ },
+ {
+ "title": "Change Management",
+ "description": "Learn about template change management and versioning",
+ "path": "./admin/templates/managing-templates/change-management.md"
+ },
+ {
+ "title": "Devcontainers",
+ "description": "Learn about using devcontainers in templates",
+ "path": "./admin/templates/managing-templates/devcontainers.md"
+ }
+ ]
},
{
- "title": "Resource metadata",
- "description": "Show information in the workspace about template resources",
- "path": "./templates/resource-metadata.md"
+ "title": "Extending Templates",
+ "description": "Learn best practices in extending templates",
+ "path": "./admin/templates/extending-templates/README.md",
+ "children": [
+ {
+ "title": "Agent Metadata",
+ "description": "Retrieve real-time stats from the workspace agent",
+ "path": "./admin/templates/extending-templates/agent-metadata.md"
+ },
+ {
+ "title": "Build Parameters",
+ "description": "Use parameters to customize workspaces at build",
+ "path": "./admin/templates/extending-templates/parameters.md"
+ },
+ {
+ "title": "Icons",
+ "description": "Customize your template with built-in icons",
+ "path": "./admin/templates/extending-templates/icons.md"
+ },
+ {
+ "title": "Resource Metadata",
+ "description": "Display resource state in the workspace dashboard",
+ "path": "./admin/templates/extending-templates/resource-metadata.md"
+ },
+ {
+ "title": "Resource Ordering",
+ "description": "Design the UI of workspaces in Terraform",
+ "path": "./admin/templates/extending-templates/resource-ordering.md"
+ },
+ {
+ "title": "Terraform Variables",
+ "description": "Use variables to manage template state",
+ "path": "./admin/templates/extending-templates/variables.md"
+ },
+ {
+ "title": "Terraform Modules",
+ "description": "Reuse terraform code across templates",
+ "path": "./admin/templates/extending-templates/modules.md"
+ },
+ {
+ "title": "Web IDEs and Coder Apps",
+ "description": "Add and configure Web IDEs in your templates as coder apps",
+ "path": "./admin/templates/extending-templates/web-ides.md"
+ }
+ ]
},
{
- "title": "UI Resource Ordering",
- "description": "Learn how to manage the order of Terraform resources in UI",
- "path": "./templates/resource-ordering.md"
+ "title": "Permissions \u0026 Policies",
+ "description": "Learn how to create templates with Terraform",
+ "path": "./admin/templates/template-permissions.md"
}
]
},
{
- "title": "Parameters",
- "description": "Prompt the user for additional information about a workspace",
- "path": "./templates/parameters.md"
- },
- {
- "title": "Variables",
- "description": "Prompt the template administrator for additional information about a template",
- "path": "./templates/variables.md"
- },
- {
- "title": "Workspace Tags",
- "description": "Control provisioning using Workspace Tags and Parameters",
- "path": "./templates/workspace-tags.md"
+ "title": "Provisioners",
+ "description": "Learn how to run external provisioners with Coder",
+ "path": "./admin/provisioners.md"
},
{
- "title": "Administering templates",
- "description": "Configuration settings for template admins",
- "path": "./templates/configuration.md",
+ "title": "Integrations",
+ "description": "Use integrations to extend Coder",
+ "path": "./admin/integrations/README.md",
"children": [
{
- "title": "General settings",
- "description": "Configure name, display info, and update polices",
- "path": "./templates/general-settings.md"
+ "title": "Prometheus",
+ "description": "Collect deployment metrics with Prometheus",
+ "path": "./admin/integrations/prometheus.md"
+ },
+ {
+ "title": "Kubernetes Logging",
+ "description": "Stream K8s event logs on workspace startup",
+ "path": "./admin/integrations/kubernetes-logs.md"
+ },
+ {
+ "title": "Additional Kubernetes Clusters",
+ "description": "Deploy workspaces on additional Kubernetes clusters",
+ "path": "./admin/integrations/multiple-kube-clusters.md"
+ },
+ {
+ "title": "JFrog Artifactory",
+ "description": "Integrate Coder with JFrog Artifactory",
+ "path": "./admin/integrations/jfrog-artifactory.md"
+ },
+ {
+ "title": "JFrog Xray",
+ "description": "Integrate Coder with JFrog Xray",
+ "path": "./admin/integrations/jfrog-xray.md"
},
{
- "title": "Permissions",
- "description": "Configure who can access a template",
- "path": "./templates/permissions.md"
+ "title": "Island Secure Browser",
+ "description": "Integrate Coder with Island's Secure Browser",
+ "path": "./admin/integrations/island.md"
},
{
- "title": "Workspace Scheduling",
- "description": "Configure when workspaces start, stop, and delete",
- "path": "./templates/schedule.md"
+ "title": "Hashicorp Vault",
+ "description": "Integrate Coder with Hashicorp Vault",
+ "path": "./admin/integrations/vault.md"
}
]
},
{
- "title": "Open in Coder",
- "description": "Add an \"Open in Coder\" button to your repos",
- "path": "./templates/open-in-coder.md",
- "icon_path": "./images/icons/key.svg"
- },
- {
- "title": "Docker in workspaces",
- "description": "Use Docker inside containerized templates",
- "path": "./templates/docker-in-workspaces.md",
- "icon_path": "./images/icons/docker.svg"
- },
- {
- "title": "Dev Containers",
- "description": "Use Dev Containers in workspaces",
- "path": "./templates/dev-containers.md",
- "state": "alpha"
- },
- {
- "title": "Troubleshooting templates",
- "description": "Fix common template problems",
- "path": "./templates/troubleshooting.md"
- },
- {
- "title": "Process Logging",
- "description": "Audit commands in workspaces with exectrace",
- "path": "./templates/process-logging.md",
- "state": "enterprise"
- },
- {
- "title": "Icons",
- "description": "Coder includes icons for popular cloud providers and programming languages for you to use",
- "path": "./templates/icons.md"
- }
- ]
- },
- {
- "title": "Workspaces",
- "description": "Learn about Coder workspaces.",
- "path": "./workspaces.md",
- "icon_path": "./images/icons/layers.svg"
- },
- {
- "title": "IDEs",
- "description": "Learn how to use your IDE of choice with Coder",
- "path": "./ides.md",
- "icon_path": "./images/icons/code.svg",
- "children": [
- {
- "title": "Web IDEs",
- "description": "Learn how to configure web IDEs in your templates",
- "path": "./ides/web-ides.md"
- },
- {
- "title": "JetBrains Gateway",
- "description": "Learn how to configure JetBrains Gateway for your workspaces",
- "path": "./ides/gateway.md"
- },
- {
- "title": "JetBrains Fleet",
- "description": "Learn how to configure JetBrains Fleet for your workspaces",
- "path": "./ides/fleet.md"
- },
- {
- "title": "Emacs",
- "description": "Learn how to configure Emacs with TRAMP in Coder",
- "path": "./ides/emacs-tramp.md"
- },
- {
- "title": "Remote Desktops",
- "description": "Learn how to use Remote Desktops with Coder",
- "path": "./ides/remote-desktops.md"
- }
- ]
- },
- {
- "title": "Networking",
- "description": "Learn about networking in Coder",
- "path": "./networking/index.md",
- "icon_path": "./images/icons/networking.svg",
- "children": [
- {
- "title": "Port Forwarding",
- "description": "Learn how to forward ports in Coder",
- "path": "./networking/port-forwarding.md"
- },
- {
- "title": "STUN and NAT",
- "description": "Learn how Coder establishes direct connections",
- "path": "./networking/stun.md"
- }
- ]
- },
- {
- "title": "Dotfiles",
- "description": "Learn how to personalize your workspace",
- "path": "./dotfiles.md",
- "icon_path": "./images/icons/art-pad.svg"
- },
- {
- "title": "Secrets",
- "description": "Learn how to use secrets in your workspace",
- "path": "./secrets.md",
- "icon_path": "./images/icons/secrets.svg"
- },
- {
- "title": "Administration",
- "description": "How to install and deploy Coder",
- "path": "./admin/README.md",
- "icon_path": "./images/icons/wrench.svg",
- "children": [
- {
- "title": "Authentication",
- "description": "Learn how to set up authentication using GitHub or OpenID Connect",
- "path": "./admin/auth.md",
- "icon_path": "./images/icons/key.svg"
- },
- {
- "title": "Users",
- "description": "Learn about user roles available in Coder and how to create and manage users",
- "path": "./admin/users.md",
- "icon_path": "./images/icons/users.svg"
- },
- {
- "title": "Groups",
- "description": "Learn how to manage user groups",
- "path": "./admin/groups.md",
- "icon_path": "./images/icons/group.svg",
- "state": "enterprise"
- },
- {
- "title": "RBAC",
- "description": "Learn how to use the role based access control",
- "path": "./admin/rbac.md",
- "icon_path": "./images/icons/rbac.svg",
- "state": "enterprise"
- },
- {
- "title": "Configuration",
- "description": "Learn how to configure Coder",
- "path": "./admin/configure.md",
- "icon_path": "./images/icons/toggle_on.svg"
- },
- {
- "title": "External Auth",
- "description": "Learn how connect Coder with external auth providers",
- "path": "./admin/external-auth.md",
- "icon_path": "./images/icons/git.svg"
- },
- {
- "title": "Upgrading",
- "description": "Learn how to upgrade Coder",
- "path": "./admin/upgrade.md",
- "icon_path": "./images/icons/upgrade.svg"
- },
- {
- "title": "Automation",
- "description": "Learn how to automate Coder with the CLI and API",
- "path": "./admin/automation.md",
- "icon_path": "./images/icons/plug.svg"
- },
- {
- "title": "Scaling Coder",
- "description": "Learn how to use load testing tools",
- "path": "./admin/scaling/scale-testing.md",
- "icon_path": "./images/icons/scale.svg",
+ "title": "Workspaces",
+ "description": "Learn how to manage \u0026 audit workspaces",
+ "path": "./admin/workspaces/README.md",
"children": [
{
- "title": "Scaling Utility",
- "path": "./admin/scaling/scale-utility.md"
+ "title": "Workspace Tags",
+ "description": "Control provisioning using Workspace Tags and Parameters",
+ "path": "./admin/workspaces/workspace-tags.md"
+ },
+ {
+ "title": "Workspace Lifecycle",
+ "description": "Understand the lifecycle of a workspace",
+ "path": "./admin/workspaces/lifecycle.md"
}
]
},
{
- "title": "External Provisioners",
- "description": "Run provisioners isolated from the Coder server",
- "path": "./admin/provisioners.md",
- "icon_path": "./images/icons/queue.svg",
- "state": "enterprise"
- },
- {
- "title": "Workspace Proxies",
- "description": "Run geo distributed workspace proxies",
- "path": "./admin/workspace-proxies.md",
- "icon_path": "./images/icons/networking.svg",
- "state": "enterprise"
- },
- {
- "title": "Application Logs",
- "description": "Learn how to use Application Logs in your Coder deployment",
- "path": "./admin/app-logs.md",
- "icon_path": "./images/icons/notes.svg"
- },
- {
- "title": "Audit Logs",
- "description": "Learn how to use Audit Logs in your Coder deployment",
- "path": "./admin/audit-logs.md",
- "icon_path": "./images/icons/radar.svg",
- "state": "enterprise"
- },
- {
- "title": "Quotas",
- "description": "Learn how to use Workspace Quotas in Coder",
- "path": "./admin/quotas.md",
- "icon_path": "./images/icons/dollar.svg",
- "state": "enterprise"
- },
- {
- "title": "High Availability",
- "description": "Learn how to configure Coder for High Availability",
- "path": "./admin/high-availability.md",
- "icon_path": "./images/icons/hydra.svg",
- "state": "enterprise"
- },
- {
- "title": "Prometheus",
- "description": "Learn how to collect Prometheus metrics",
- "path": "./admin/prometheus.md",
- "icon_path": "./images/icons/speed.svg"
- },
- {
- "title": "Appearance",
- "description": "Learn how to configure the appearance of Coder",
- "path": "./admin/appearance.md",
- "icon_path": "./images/icons/info.svg",
- "state": "enterprise"
- },
- {
- "title": "Telemetry",
- "description": "Learn what usage telemetry Coder collects",
- "path": "./admin/telemetry.md",
- "icon_path": "./images/icons/science.svg"
- },
- {
- "title": "Database Encryption",
- "description": "Learn how to encrypt sensitive data at rest in Coder",
- "path": "./admin/encryption.md",
- "icon_path": "./images/icons/lock.svg",
- "state": "enterprise"
- },
- {
- "title": "Deployment Health",
- "description": "Learn how to monitor the health of your Coder deployment",
- "path": "./admin/healthcheck.md",
- "icon_path": "./images/icons/health.svg"
- }
- ]
- },
- {
- "title": "Enterprise",
- "description": "Learn how to enable Enterprise features",
- "path": "./enterprise.md",
- "icon_path": "./images/icons/group.svg"
- },
- {
- "title": "Contributing",
- "description": "Learn how to contribute to Coder",
- "path": "./CONTRIBUTING.md",
- "icon_path": "./images/icons/contributing.svg",
- "children": [
- {
- "title": "Code of Conduct",
- "description": "See the code of conduct for contributing to Coder",
- "path": "./contributing/CODE_OF_CONDUCT.md"
- },
- {
- "title": "Feature stages",
- "description": "Policies for Alpha and Experimental features.",
- "path": "./contributing/feature-stages.md"
+ "title": "Networking",
+ "description": "Understand Coder's networking layer",
+ "path": "./admin/networking/README.md",
+ "children": [
+ {
+ "title": "Port Forwarding",
+ "description": "Learn how to forward ports in Coder",
+ "path": "./admin/networking/port-forwarding.md"
+ },
+ {
+ "title": "STUN and NAT",
+ "description": "Learn how to forward ports in Coder",
+ "path": "./admin/networking/stun.md"
+ }
+ ]
},
{
- "title": "Documentation",
- "description": "Our style guide for use when authoring documentation",
- "path": "./contributing/documentation.md"
+ "title": "Monitoring",
+ "description": "Configure security policy and audit your deployment",
+ "path": "./admin/monitoring/README.md",
+ "children": [
+ {
+ "title": "Logs",
+ "description": "Learn about Coder's logs",
+ "path": "./admin/monitoring/logs.md"
+ },
+ {
+ "title": "Metrics",
+ "description": "Learn about Coder's logs",
+ "path": "./admin/monitoring/metrics.md"
+ },
+ {
+ "title": "Health Check",
+ "description": "Learn about Coder's automated health checks",
+ "path": "./admin/monitoring/health-check.md"
+ }
+ ]
},
{
"title": "Security",
- "description": "How to report vulnerabilities in Coder",
- "path": "./contributing/SECURITY.md"
- },
- {
- "title": "Frontend",
- "description": "Our guide for frontend development",
- "path": "./contributing/frontend.md"
+ "description": "Configure security policy and audit your deployment",
+ "path": "./admin/security/README.md",
+ "children": [
+ {
+ "title": "Audit Logs",
+ "description": "Audit actions taken inside Coder",
+ "path": "./admin/security/audit-logs.md"
+ },
+ {
+ "title": "Secrets",
+ "description": "Use sensitive variables in your workspaces",
+ "path": "./admin/security/secrets.md"
+ }
+ ]
}
]
},
{
- "title": "API",
- "description": "Learn how to use Coderd API",
- "path": "./api/index.md",
- "icon_path": "./images/icons/api.svg",
+ "title": "Tutorials",
+ "description": "Coder knowledgebase for administrating your deployment",
+ "path": "./tutorials/README.md",
+ "icon_path": "./images/icons/generic.svg",
"children": [
{
- "title": "General",
- "path": "./api/general.md"
- },
- {
- "title": "Agents",
- "path": "./api/agents.md"
- },
- {
- "title": "Applications",
- "path": "./api/applications.md"
- },
- {
- "title": "Audit",
- "path": "./api/audit.md"
- },
- {
- "title": "Authentication",
- "path": "./api/authentication.md"
- },
- {
- "title": "Authorization",
- "path": "./api/authorization.md"
- },
- {
- "title": "Builds",
- "path": "./api/builds.md"
- },
- {
- "title": "Debug",
- "path": "./api/debug.md"
+ "title": "Write a Template from Scratch",
+ "description": "Learn how to author Coder templates",
+ "path": "./tutorials/template-from-scratch.md"
},
{
- "title": "Enterprise",
- "path": "./api/enterprise.md"
+ "title": "Image Management",
+ "description": "Learn about image management with Coder",
+ "path": "./tutorials/image-management.md"
},
{
- "title": "Files",
- "path": "./api/files.md"
- },
- {
- "title": "Git",
- "path": "./api/git.md"
- },
- {
- "title": "Insights",
- "path": "./api/insights.md"
+ "title": "Generate a Support Bundle",
+ "description": "Generate and upload a Support Bundle to Coder Support",
+ "path": "./tutorials/support-bundle.md"
},
{
- "title": "Members",
- "path": "./api/members.md"
+ "title": "Configuring Okta",
+ "description": "Custom claims/scopes with Okta for group/role sync",
+ "path": "./tutorials/configuring-okta.md"
},
{
- "title": "Notifications",
- "path": "./api/notifications.md"
+ "title": "Google to AWS Federation",
+ "description": "Federating a Google Cloud service account to AWS",
+ "path": "./tutorials/gcp-to-aws.md"
},
{
- "title": "Organizations",
- "path": "./api/organizations.md"
+ "title": "JFrog Artifactory Integration",
+ "description": "Integrate Coder with JFrog Artifactory",
+ "path": "./tutorials/artifactory-integration.md"
},
{
- "title": "PortSharing",
- "path": "./api/portsharing.md"
+ "title": "Island Secure Browser Integration",
+ "description": "Integrate Coder with Island's Secure Browser",
+ "path": "./tutorials/island-integration.md"
},
{
- "title": "Schemas",
- "path": "./api/schemas.md"
+ "title": "Template ImagePullSecrets",
+ "description": "Creating ImagePullSecrets for private registries",
+ "path": "./tutorials/image-pull-secret.md"
},
{
- "title": "Templates",
- "path": "./api/templates.md"
+ "title": "Postgres SSL",
+ "description": "Configure Coder to connect to Postgres over SSL",
+ "path": "./tutorials/postgres-ssl.md"
},
{
- "title": "Users",
- "path": "./api/users.md"
+ "title": "Azure Federation",
+ "description": "Federating Coder to Azure",
+ "path": "./tutorials/azure-federation.md"
},
{
- "title": "WorkspaceProxies",
- "path": "./api/workspaceproxies.md"
+ "title": "Scanning Workspaces with JFrog Xray",
+ "description": "Integrate Coder with JFrog Xray",
+ "path": "./tutorials/xray-integration.md"
},
{
- "title": "Workspaces",
- "path": "./api/workspaces.md"
+ "title": "FAQs",
+ "description": "Miscellaneous FAQs from our community",
+ "path": "./tutorials/faqs.md"
}
]
},
{
- "title": "Command Line",
- "description": "Learn how to use Coder CLI",
- "path": "./cli.md",
- "icon_path": "./images/icons/terminal.svg",
+ "title": "Reference",
+ "description": "Reference",
+ "path": "./reference/README.md",
+ "icon_path": "./images/icons/notes.svg",
"children": [
{
- "title": "autoupdate",
- "description": "Toggle auto-update policy for a workspace",
- "path": "cli/autoupdate.md"
- },
- {
- "title": "coder",
- "path": "cli.md"
- },
- {
- "title": "config-ssh",
- "description": "Add an SSH Host entry for your workspaces \"ssh coder.workspace\"",
- "path": "cli/config-ssh.md"
- },
- {
- "title": "create",
- "description": "Create a workspace",
- "path": "cli/create.md"
- },
- {
- "title": "delete",
- "description": "Delete a workspace",
- "path": "cli/delete.md"
- },
- {
- "title": "dotfiles",
- "description": "Personalize your workspace by applying a canonical dotfiles repository",
- "path": "cli/dotfiles.md"
- },
- {
- "title": "external-auth",
- "description": "Manage external authentication",
- "path": "cli/external-auth.md"
- },
- {
- "title": "external-auth access-token",
- "description": "Print auth for an external provider",
- "path": "cli/external-auth_access-token.md"
- },
- {
- "title": "favorite",
- "description": "Add a workspace to your favorites",
- "path": "cli/favorite.md"
- },
- {
- "title": "features",
- "description": "List Enterprise features",
- "path": "cli/features.md"
- },
- {
- "title": "features list",
- "path": "cli/features_list.md"
- },
- {
- "title": "groups",
- "description": "Manage groups",
- "path": "cli/groups.md"
- },
- {
- "title": "groups create",
- "description": "Create a user group",
- "path": "cli/groups_create.md"
- },
- {
- "title": "groups delete",
- "description": "Delete a user group",
- "path": "cli/groups_delete.md"
- },
- {
- "title": "groups edit",
- "description": "Edit a user group",
- "path": "cli/groups_edit.md"
- },
- {
- "title": "groups list",
- "description": "List user groups",
- "path": "cli/groups_list.md"
- },
- {
- "title": "licenses",
- "description": "Add, delete, and list licenses",
- "path": "cli/licenses.md"
- },
- {
- "title": "licenses add",
- "description": "Add license to Coder deployment",
- "path": "cli/licenses_add.md"
- },
- {
- "title": "licenses delete",
- "description": "Delete license by ID",
- "path": "cli/licenses_delete.md"
- },
- {
- "title": "licenses list",
- "description": "List licenses (including expired)",
- "path": "cli/licenses_list.md"
- },
- {
- "title": "list",
- "description": "List workspaces",
- "path": "cli/list.md"
- },
- {
- "title": "login",
- "description": "Authenticate with Coder deployment",
- "path": "cli/login.md"
- },
- {
- "title": "logout",
- "description": "Unauthenticate your local session",
- "path": "cli/logout.md"
- },
- {
- "title": "netcheck",
- "description": "Print network debug information for DERP and STUN",
- "path": "cli/netcheck.md"
- },
- {
- "title": "notifications",
- "description": "Manage Coder notifications",
- "path": "cli/notifications.md"
- },
- {
- "title": "notifications pause",
- "description": "Pause notifications",
- "path": "cli/notifications_pause.md"
- },
- {
- "title": "notifications resume",
- "description": "Resume notifications",
- "path": "cli/notifications_resume.md"
- },
- {
- "title": "open",
- "description": "Open a workspace",
- "path": "cli/open.md"
- },
- {
- "title": "open vscode",
- "description": "Open a workspace in VS Code Desktop",
- "path": "cli/open_vscode.md"
- },
- {
- "title": "ping",
- "description": "Ping a workspace",
- "path": "cli/ping.md"
- },
- {
- "title": "port-forward",
- "description": "Forward ports from a workspace to the local machine. For reverse port forwarding, use \"coder ssh -R\".",
- "path": "cli/port-forward.md"
- },
- {
- "title": "provisionerd",
- "description": "Manage provisioner daemons",
- "path": "cli/provisionerd.md"
- },
- {
- "title": "provisionerd start",
- "description": "Run a provisioner daemon",
- "path": "cli/provisionerd_start.md"
- },
- {
- "title": "publickey",
- "description": "Output your Coder public key used for Git operations",
- "path": "cli/publickey.md"
- },
- {
- "title": "rename",
- "description": "Rename a workspace",
- "path": "cli/rename.md"
- },
- {
- "title": "reset-password",
- "description": "Directly connect to the database to reset a user's password",
- "path": "cli/reset-password.md"
- },
- {
- "title": "restart",
- "description": "Restart a workspace",
- "path": "cli/restart.md"
- },
- {
- "title": "schedule",
- "description": "Schedule automated start and stop times for workspaces",
- "path": "cli/schedule.md"
- },
- {
- "title": "schedule override-stop",
- "description": "Override the stop time of a currently running workspace instance.",
- "path": "cli/schedule_override-stop.md"
- },
- {
- "title": "schedule show",
- "description": "Show workspace schedules",
- "path": "cli/schedule_show.md"
- },
- {
- "title": "schedule start",
- "description": "Edit workspace start schedule",
- "path": "cli/schedule_start.md"
- },
- {
- "title": "schedule stop",
- "description": "Edit workspace stop schedule",
- "path": "cli/schedule_stop.md"
- },
- {
- "title": "server",
- "description": "Start a Coder server",
- "path": "cli/server.md"
- },
- {
- "title": "server create-admin-user",
- "description": "Create a new admin user with the given username, email and password and adds it to every organization.",
- "path": "cli/server_create-admin-user.md"
- },
- {
- "title": "server dbcrypt",
- "description": "Manage database encryption.",
- "path": "cli/server_dbcrypt.md"
- },
- {
- "title": "server dbcrypt decrypt",
- "description": "Decrypt a previously encrypted database.",
- "path": "cli/server_dbcrypt_decrypt.md"
- },
- {
- "title": "server dbcrypt delete",
- "description": "Delete all encrypted data from the database. THIS IS A DESTRUCTIVE OPERATION.",
- "path": "cli/server_dbcrypt_delete.md"
- },
- {
- "title": "server dbcrypt rotate",
- "description": "Rotate database encryption keys.",
- "path": "cli/server_dbcrypt_rotate.md"
- },
- {
- "title": "server postgres-builtin-serve",
- "description": "Run the built-in PostgreSQL deployment.",
- "path": "cli/server_postgres-builtin-serve.md"
- },
- {
- "title": "server postgres-builtin-url",
- "description": "Output the connection URL for the built-in PostgreSQL deployment.",
- "path": "cli/server_postgres-builtin-url.md"
- },
- {
- "title": "show",
- "description": "Display details of a workspace's resources and agents",
- "path": "cli/show.md"
- },
- {
- "title": "speedtest",
- "description": "Run upload and download tests from your machine to a workspace",
- "path": "cli/speedtest.md"
- },
- {
- "title": "ssh",
- "description": "Start a shell into a workspace",
- "path": "cli/ssh.md"
- },
- {
- "title": "start",
- "description": "Start a workspace",
- "path": "cli/start.md"
- },
- {
- "title": "stat",
- "description": "Show resource usage for the current workspace.",
- "path": "cli/stat.md"
- },
- {
- "title": "stat cpu",
- "description": "Show CPU usage, in cores.",
- "path": "cli/stat_cpu.md"
- },
- {
- "title": "stat disk",
- "description": "Show disk usage, in gigabytes.",
- "path": "cli/stat_disk.md"
- },
- {
- "title": "stat mem",
- "description": "Show memory usage, in gigabytes.",
- "path": "cli/stat_mem.md"
- },
- {
- "title": "state",
- "description": "Manually manage Terraform state to fix broken workspaces",
- "path": "cli/state.md"
- },
- {
- "title": "state pull",
- "description": "Pull a Terraform state file from a workspace.",
- "path": "cli/state_pull.md"
- },
- {
- "title": "state push",
- "description": "Push a Terraform state file to a workspace.",
- "path": "cli/state_push.md"
- },
- {
- "title": "stop",
- "description": "Stop a workspace",
- "path": "cli/stop.md"
- },
- {
- "title": "support",
- "description": "Commands for troubleshooting issues with a Coder deployment.",
- "path": "cli/support.md"
- },
- {
- "title": "support bundle",
- "description": "Generate a support bundle to troubleshoot issues connecting to a workspace.",
- "path": "cli/support_bundle.md"
- },
- {
- "title": "templates",
- "description": "Manage templates",
- "path": "cli/templates.md"
- },
- {
- "title": "templates archive",
- "description": "Archive unused or failed template versions from a given template(s)",
- "path": "cli/templates_archive.md"
- },
- {
- "title": "templates create",
- "description": "DEPRECATED: Create a template from the current directory or as specified by flag",
- "path": "cli/templates_create.md"
- },
- {
- "title": "templates delete",
- "description": "Delete templates",
- "path": "cli/templates_delete.md"
- },
- {
- "title": "templates edit",
- "description": "Edit the metadata of a template by name.",
- "path": "cli/templates_edit.md"
- },
- {
- "title": "templates init",
- "description": "Get started with a templated template.",
- "path": "cli/templates_init.md"
- },
- {
- "title": "templates list",
- "description": "List all the templates available for the organization",
- "path": "cli/templates_list.md"
- },
- {
- "title": "templates pull",
- "description": "Download the active, latest, or specified version of a template to a path.",
- "path": "cli/templates_pull.md"
- },
- {
- "title": "templates push",
- "description": "Create or update a template from the current directory or as specified by flag",
- "path": "cli/templates_push.md"
- },
- {
- "title": "templates versions",
- "description": "Manage different versions of the specified template",
- "path": "cli/templates_versions.md"
- },
- {
- "title": "templates versions archive",
- "description": "Archive a template version(s).",
- "path": "cli/templates_versions_archive.md"
- },
- {
- "title": "templates versions list",
- "description": "List all the versions of the specified template",
- "path": "cli/templates_versions_list.md"
- },
- {
- "title": "templates versions unarchive",
- "description": "Unarchive a template version(s).",
- "path": "cli/templates_versions_unarchive.md"
- },
- {
- "title": "tokens",
- "description": "Manage personal access tokens",
- "path": "cli/tokens.md"
- },
- {
- "title": "tokens create",
- "description": "Create a token",
- "path": "cli/tokens_create.md"
- },
- {
- "title": "tokens list",
- "description": "List tokens",
- "path": "cli/tokens_list.md"
- },
- {
- "title": "tokens remove",
- "description": "Delete a token",
- "path": "cli/tokens_remove.md"
- },
- {
- "title": "unfavorite",
- "description": "Remove a workspace from your favorites",
- "path": "cli/unfavorite.md"
- },
- {
- "title": "update",
- "description": "Will update and start a given workspace if it is out of date",
- "path": "cli/update.md"
- },
- {
- "title": "users",
- "description": "Manage users",
- "path": "cli/users.md"
- },
- {
- "title": "users activate",
- "description": "Update a user's status to 'active'. Active users can fully interact with the platform",
- "path": "cli/users_activate.md"
- },
- {
- "title": "users create",
- "path": "cli/users_create.md"
- },
- {
- "title": "users delete",
- "description": "Delete a user by username or user_id.",
- "path": "cli/users_delete.md"
- },
- {
- "title": "users list",
- "path": "cli/users_list.md"
- },
- {
- "title": "users show",
- "description": "Show a single user. Use 'me' to indicate the currently authenticated user.",
- "path": "cli/users_show.md"
- },
- {
- "title": "users suspend",
- "description": "Update a user's status to 'suspended'. A suspended user cannot log into the platform",
- "path": "cli/users_suspend.md"
- },
- {
- "title": "version",
- "description": "Show coder version",
- "path": "cli/version.md"
- },
- {
- "title": "whoami",
- "description": "Fetch authenticated user info for Coder deployment",
- "path": "cli/whoami.md"
- }
- ]
- },
- {
- "title": "Security",
- "description": "Security advisories",
- "path": "./security/index.md",
- "icon_path": "./images/icons/security.svg",
- "children": [
- {
- "title": "API tokens of deleted users not invalidated",
- "description": "Fixed in v0.23.0 (Apr 25, 2023)",
- "path": "./security/0001_user_apikeys_invalidation.md"
- }
- ]
- },
- {
- "title": "FAQs",
- "description": "Frequently asked questions",
- "path": "./faqs.md",
- "icon_path": "./images/icons/info.svg"
- },
- {
- "title": "Guides",
- "description": "Employee-authored tutorials",
- "path": "./guides/index.md",
- "icon_path": "./images/icons/notes.svg",
- "children": [
- {
- "title": "Generate a Support Bundle",
- "description": "Generate and upload a Support Bundle to Coder Support",
- "path": "./guides/support-bundle.md"
- },
- {
- "title": "Configuring Okta",
- "description": "Custom claims/scopes with Okta for group/role sync",
- "path": "./guides/configuring-okta.md"
- },
- {
- "title": "Google to AWS Federation",
- "description": "Federating a Google Cloud service account to AWS",
- "path": "./guides/gcp-to-aws.md"
- },
- {
- "title": "JFrog Artifactory Integration",
- "description": "Integrate Coder with JFrog Artifactory",
- "path": "./guides/artifactory-integration.md"
- },
- {
- "title": "Island Enterprise Browser Integration",
- "description": "Integrate Coder with Island's Enterprise Browser",
- "path": "./guides/island-integration.md"
- },
- {
- "title": "Template ImagePullSecrets",
- "description": "Creating ImagePullSecrets for private registries",
- "path": "./guides/image-pull-secret.md"
- },
- {
- "title": "Postgres SSL",
- "description": "Configure Coder to connect to Postgres over SSL",
- "path": "./guides/postgres-ssl.md"
- },
- {
- "title": "Azure Federation",
- "description": "Federating Coder to Azure",
- "path": "./guides/azure-federation.md"
+ "title": "REST API",
+ "description": "Learn how to use Coderd API",
+ "path": "./reference/api/README.md",
+ "icon_path": "./images/icons/api.svg",
+ "children": [
+ {
+ "title": "General",
+ "path": "./reference/api/general.md"
+ },
+ {
+ "title": "Agents",
+ "path": "./reference/api/agents.md"
+ },
+ {
+ "title": "Applications",
+ "path": "./reference/api/applications.md"
+ },
+ {
+ "title": "Audit",
+ "path": "./reference/api/audit.md"
+ },
+ {
+ "title": "Authentication",
+ "path": "./reference/api/authentication.md"
+ },
+ {
+ "title": "Authorization",
+ "path": "./reference/api/authorization.md"
+ },
+ {
+ "title": "Builds",
+ "path": "./reference/api/builds.md"
+ },
+ {
+ "title": "Debug",
+ "path": "./reference/api/debug.md"
+ },
+ {
+ "title": "Enterprise",
+ "path": "./reference/api/enterprise.md"
+ },
+ {
+ "title": "Files",
+ "path": "./reference/api/files.md"
+ },
+ {
+ "title": "Git",
+ "path": "./reference/api/git.md"
+ },
+ {
+ "title": "Insights",
+ "path": "./reference/api/insights.md"
+ },
+ {
+ "title": "Members",
+ "path": "./reference/api/members.md"
+ },
+ {
+ "title": "Organizations",
+ "path": "./reference/api/organizations.md"
+ },
+ {
+ "title": "PortSharing",
+ "path": "./reference/api/portsharing.md"
+ },
+ {
+ "title": "Schemas",
+ "path": "./reference/api/schemas.md"
+ },
+ {
+ "title": "Templates",
+ "path": "./reference/api/templates.md"
+ },
+ {
+ "title": "Users",
+ "path": "./reference/api/users.md"
+ },
+ {
+ "title": "WorkspaceProxies",
+ "path": "./reference/api/workspaceproxies.md"
+ },
+ {
+ "title": "Workspaces",
+ "path": "./reference/api/workspaces.md"
+ }
+ ]
},
{
- "title": "Scanning Coder Workspaces with JFrog Xray",
- "description": "Integrate Coder with JFrog Xray",
- "path": "./guides/xray-integration.md"
+ "title": "Command Line",
+ "description": "Learn how to use Coder CLI",
+ "path": "./reference/cli/README.md",
+ "icon_path": "./images/icons/terminal.svg",
+ "children": [
+ {
+ "title": "autoupdate",
+ "description": "Toggle auto-update policy for a workspace",
+ "path": "reference/cli/autoupdate.md"
+ },
+ {
+ "title": "coder",
+ "path": "reference/cli/README.md"
+ },
+ {
+ "title": "config-ssh",
+ "description": "Add an SSH Host entry for your workspaces \"ssh coder.workspace\"",
+ "path": "reference/cli/config-ssh.md"
+ },
+ {
+ "title": "create",
+ "description": "Create a workspace",
+ "path": "reference/cli/create.md"
+ },
+ {
+ "title": "delete",
+ "description": "Delete a workspace",
+ "path": "reference/cli/delete.md"
+ },
+ {
+ "title": "dotfiles",
+ "description": "Personalize your workspace by applying a canonical dotfiles repository",
+ "path": "reference/cli/dotfiles.md"
+ },
+ {
+ "title": "external-auth",
+ "description": "Manage external authentication",
+ "path": "reference/cli/external-auth.md"
+ },
+ {
+ "title": "external-auth access-token",
+ "description": "Print auth for an external provider",
+ "path": "reference/cli/external-auth_access-token.md"
+ },
+ {
+ "title": "favorite",
+ "description": "Add a workspace to your favorites",
+ "path": "reference/cli/favorite.md"
+ },
+ {
+ "title": "features",
+ "description": "List Enterprise features",
+ "path": "reference/cli/features.md"
+ },
+ {
+ "title": "features list",
+ "path": "reference/cli/features_list.md"
+ },
+ {
+ "title": "groups",
+ "description": "Manage groups",
+ "path": "reference/cli/groups.md"
+ },
+ {
+ "title": "groups create",
+ "description": "Create a user group",
+ "path": "reference/cli/groups_create.md"
+ },
+ {
+ "title": "groups delete",
+ "description": "Delete a user group",
+ "path": "reference/cli/groups_delete.md"
+ },
+ {
+ "title": "groups edit",
+ "description": "Edit a user group",
+ "path": "reference/cli/groups_edit.md"
+ },
+ {
+ "title": "groups list",
+ "description": "List user groups",
+ "path": "reference/cli/groups_list.md"
+ },
+ {
+ "title": "licenses",
+ "description": "Add, delete, and list licenses",
+ "path": "reference/cli/licenses.md"
+ },
+ {
+ "title": "licenses add",
+ "description": "Add license to Coder deployment",
+ "path": "reference/cli/licenses_add.md"
+ },
+ {
+ "title": "licenses delete",
+ "description": "Delete license by ID",
+ "path": "reference/cli/licenses_delete.md"
+ },
+ {
+ "title": "licenses list",
+ "description": "List licenses (including expired)",
+ "path": "reference/cli/licenses_list.md"
+ },
+ {
+ "title": "list",
+ "description": "List workspaces",
+ "path": "reference/cli/list.md"
+ },
+ {
+ "title": "login",
+ "description": "Authenticate with Coder deployment",
+ "path": "reference/cli/login.md"
+ },
+ {
+ "title": "logout",
+ "description": "Unauthenticate your local session",
+ "path": "reference/cli/logout.md"
+ },
+ {
+ "title": "netcheck",
+ "description": "Print network debug information for DERP and STUN",
+ "path": "reference/cli/netcheck.md"
+ },
+ {
+ "title": "notifications",
+ "description": "Manage Coder notifications",
+ "path": "reference/cli/notifications.md"
+ },
+ {
+ "title": "notifications pause",
+ "description": "Pause notifications",
+ "path": "reference/cli/notifications_pause.md"
+ },
+ {
+ "title": "notifications resume",
+ "description": "Resume notifications",
+ "path": "reference/cli/notifications_resume.md"
+ },
+ {
+ "title": "open",
+ "description": "Open a workspace",
+ "path": "reference/cli/open.md"
+ },
+ {
+ "title": "open vscode",
+ "description": "Open a workspace in VS Code Desktop",
+ "path": "reference/cli/open_vscode.md"
+ },
+ {
+ "title": "ping",
+ "description": "Ping a workspace",
+ "path": "reference/cli/ping.md"
+ },
+ {
+ "title": "port-forward",
+ "description": "Forward ports from a workspace to the local machine. For reverse port forwarding, use \"coder ssh -R\".",
+ "path": "reference/cli/port-forward.md"
+ },
+ {
+ "title": "provisionerd",
+ "description": "Manage provisioner daemons",
+ "path": "reference/cli/provisionerd.md"
+ },
+ {
+ "title": "provisionerd start",
+ "description": "Run a provisioner daemon",
+ "path": "reference/cli/provisionerd_start.md"
+ },
+ {
+ "title": "publickey",
+ "description": "Output your Coder public key used for Git operations",
+ "path": "reference/cli/publickey.md"
+ },
+ {
+ "title": "rename",
+ "description": "Rename a workspace",
+ "path": "reference/cli/rename.md"
+ },
+ {
+ "title": "reset-password",
+ "description": "Directly connect to the database to reset a user's password",
+ "path": "reference/cli/reset-password.md"
+ },
+ {
+ "title": "restart",
+ "description": "Restart a workspace",
+ "path": "reference/cli/restart.md"
+ },
+ {
+ "title": "schedule",
+ "description": "Schedule automated start and stop times for workspaces",
+ "path": "reference/cli/schedule.md"
+ },
+ {
+ "title": "schedule override-stop",
+ "description": "Override the stop time of a currently running workspace instance.",
+ "path": "reference/cli/schedule_override-stop.md"
+ },
+ {
+ "title": "schedule show",
+ "description": "Show workspace schedules",
+ "path": "reference/cli/schedule_show.md"
+ },
+ {
+ "title": "schedule start",
+ "description": "Edit workspace start schedule",
+ "path": "reference/cli/schedule_start.md"
+ },
+ {
+ "title": "schedule stop",
+ "description": "Edit workspace stop schedule",
+ "path": "reference/cli/schedule_stop.md"
+ },
+ {
+ "title": "server",
+ "description": "Start a Coder server",
+ "path": "reference/cli/server.md"
+ },
+ {
+ "title": "server create-admin-user",
+ "description": "Create a new admin user with the given username, email and password and adds it to every organization.",
+ "path": "reference/cli/server_create-admin-user.md"
+ },
+ {
+ "title": "server dbcrypt",
+ "description": "Manage database encryption.",
+ "path": "reference/cli/server_dbcrypt.md"
+ },
+ {
+ "title": "server dbcrypt decrypt",
+ "description": "Decrypt a previously encrypted database.",
+ "path": "reference/cli/server_dbcrypt_decrypt.md"
+ },
+ {
+ "title": "server dbcrypt delete",
+ "description": "Delete all encrypted data from the database. THIS IS A DESTRUCTIVE OPERATION.",
+ "path": "reference/cli/server_dbcrypt_delete.md"
+ },
+ {
+ "title": "server dbcrypt rotate",
+ "description": "Rotate database encryption keys.",
+ "path": "reference/cli/server_dbcrypt_rotate.md"
+ },
+ {
+ "title": "server postgres-builtin-serve",
+ "description": "Run the built-in PostgreSQL deployment.",
+ "path": "reference/cli/server_postgres-builtin-serve.md"
+ },
+ {
+ "title": "server postgres-builtin-url",
+ "description": "Output the connection URL for the built-in PostgreSQL deployment.",
+ "path": "reference/cli/server_postgres-builtin-url.md"
+ },
+ {
+ "title": "show",
+ "description": "Display details of a workspace's resources and agents",
+ "path": "reference/cli/show.md"
+ },
+ {
+ "title": "speedtest",
+ "description": "Run upload and download tests from your machine to a workspace",
+ "path": "reference/cli/speedtest.md"
+ },
+ {
+ "title": "ssh",
+ "description": "Start a shell into a workspace",
+ "path": "reference/cli/ssh.md"
+ },
+ {
+ "title": "start",
+ "description": "Start a workspace",
+ "path": "reference/cli/start.md"
+ },
+ {
+ "title": "stat",
+ "description": "Show resource usage for the current workspace.",
+ "path": "reference/cli/stat.md"
+ },
+ {
+ "title": "stat cpu",
+ "description": "Show CPU usage, in cores.",
+ "path": "reference/cli/stat_cpu.md"
+ },
+ {
+ "title": "stat disk",
+ "description": "Show disk usage, in gigabytes.",
+ "path": "reference/cli/stat_disk.md"
+ },
+ {
+ "title": "stat mem",
+ "description": "Show memory usage, in gigabytes.",
+ "path": "reference/cli/stat_mem.md"
+ },
+ {
+ "title": "state",
+ "description": "Manually manage Terraform state to fix broken workspaces",
+ "path": "reference/cli/state.md"
+ },
+ {
+ "title": "state pull",
+ "description": "Pull a Terraform state file from a workspace.",
+ "path": "reference/cli/state_pull.md"
+ },
+ {
+ "title": "state push",
+ "description": "Push a Terraform state file to a workspace.",
+ "path": "reference/cli/state_push.md"
+ },
+ {
+ "title": "stop",
+ "description": "Stop a workspace",
+ "path": "reference/cli/stop.md"
+ },
+ {
+ "title": "support",
+ "description": "Commands for troubleshooting issues with a Coder deployment.",
+ "path": "reference/cli/support.md"
+ },
+ {
+ "title": "support bundle",
+ "description": "Generate a support bundle to troubleshoot issues connecting to a workspace.",
+ "path": "reference/cli/support_bundle.md"
+ },
+ {
+ "title": "templates",
+ "description": "Manage templates",
+ "path": "reference/cli/templates.md"
+ },
+ {
+ "title": "templates archive",
+ "description": "Archive unused or failed template versions from a given template(s)",
+ "path": "reference/cli/templates_archive.md"
+ },
+ {
+ "title": "templates create",
+ "description": "DEPRECATED: Create a template from the current directory or as specified by flag",
+ "path": "reference/cli/templates_create.md"
+ },
+ {
+ "title": "templates delete",
+ "description": "Delete templates",
+ "path": "reference/cli/templates_delete.md"
+ },
+ {
+ "title": "templates edit",
+ "description": "Edit the metadata of a template by name.",
+ "path": "reference/cli/templates_edit.md"
+ },
+ {
+ "title": "templates init",
+ "description": "Get started with a templated template.",
+ "path": "reference/cli/templates_init.md"
+ },
+ {
+ "title": "templates list",
+ "description": "List all the templates available for the organization",
+ "path": "reference/cli/templates_list.md"
+ },
+ {
+ "title": "templates pull",
+ "description": "Download the active, latest, or specified version of a template to a path.",
+ "path": "reference/cli/templates_pull.md"
+ },
+ {
+ "title": "templates push",
+ "description": "Create or update a template from the current directory or as specified by flag",
+ "path": "reference/cli/templates_push.md"
+ },
+ {
+ "title": "templates versions",
+ "description": "Manage different versions of the specified template",
+ "path": "reference/cli/templates_versions.md"
+ },
+ {
+ "title": "templates versions archive",
+ "description": "Archive a template version(s).",
+ "path": "reference/cli/templates_versions_archive.md"
+ },
+ {
+ "title": "templates versions list",
+ "description": "List all the versions of the specified template",
+ "path": "reference/cli/templates_versions_list.md"
+ },
+ {
+ "title": "templates versions unarchive",
+ "description": "Unarchive a template version(s).",
+ "path": "reference/cli/templates_versions_unarchive.md"
+ },
+ {
+ "title": "tokens",
+ "description": "Manage personal access tokens",
+ "path": "reference/cli/tokens.md"
+ },
+ {
+ "title": "tokens create",
+ "description": "Create a token",
+ "path": "reference/cli/tokens_create.md"
+ },
+ {
+ "title": "tokens list",
+ "description": "List tokens",
+ "path": "reference/cli/tokens_list.md"
+ },
+ {
+ "title": "tokens remove",
+ "description": "Delete a token",
+ "path": "reference/cli/tokens_remove.md"
+ },
+ {
+ "title": "unfavorite",
+ "description": "Remove a workspace from your favorites",
+ "path": "reference/cli/unfavorite.md"
+ },
+ {
+ "title": "update",
+ "description": "Will update and start a given workspace if it is out of date",
+ "path": "reference/cli/update.md"
+ },
+ {
+ "title": "users",
+ "description": "Manage users",
+ "path": "reference/cli/users.md"
+ },
+ {
+ "title": "users activate",
+ "description": "Update a user's status to 'active'. Active users can fully interact with the platform",
+ "path": "reference/cli/users_activate.md"
+ },
+ {
+ "title": "users create",
+ "path": "reference/cli/users_create.md"
+ },
+ {
+ "title": "users delete",
+ "description": "Delete a user by username or user_id.",
+ "path": "reference/cli/users_delete.md"
+ },
+ {
+ "title": "users list",
+ "path": "reference/cli/users_list.md"
+ },
+ {
+ "title": "users show",
+ "description": "Show a single user. Use 'me' to indicate the currently authenticated user.",
+ "path": "reference/cli/users_show.md"
+ },
+ {
+ "title": "users suspend",
+ "description": "Update a user's status to 'suspended'. A suspended user cannot log into the platform",
+ "path": "reference/cli/users_suspend.md"
+ },
+ {
+ "title": "version",
+ "description": "Show coder version",
+ "path": "reference/cli/version.md"
+ },
+ {
+ "title": "whoami",
+ "description": "Fetch authenticated user info for Coder deployment",
+ "path": "reference/cli/whoami.md"
+ }
+ ]
}
]
}
diff --git a/docs/manifest.old.json b/docs/manifest.old.json
new file mode 100644
index 0000000000000..6df5f622f2dae
--- /dev/null
+++ b/docs/manifest.old.json
@@ -0,0 +1,1126 @@
+{
+ "versions": ["main"],
+ "routes": [
+ {
+ "title": "About",
+ "description": "About Coder",
+ "path": "./README.md",
+ "icon_path": "./images/icons/home.svg",
+ "children": [
+ {
+ "title": "Architecture",
+ "description": "Learn how Coder works",
+ "path": "./about/architecture.md",
+ "icon_path": "./images/icons/protractor.svg"
+ }
+ ]
+ },
+ {
+ "title": "Installation",
+ "description": "How to install and deploy Coder",
+ "path": "./install/index.md",
+ "icon_path": "./images/icons/download.svg",
+ "children": [
+ {
+ "title": "Kubernetes",
+ "description": "Install Coder with Kubernetes via Helm",
+ "path": "./install/kubernetes.md"
+ },
+ {
+ "title": "Docker",
+ "description": "Install Coder with Docker / docker-compose",
+ "path": "./install/docker.md"
+ },
+ {
+ "title": "OpenShift",
+ "description": "Install Coder on OpenShift",
+ "path": "./install/openshift.md"
+ },
+ {
+ "title": "Offline deployments",
+ "description": "Run Coder in offline / air-gapped environments",
+ "path": "./install/offline.md"
+ },
+ {
+ "title": "External database",
+ "description": "Use external PostgreSQL database",
+ "path": "./install/database.md"
+ },
+ {
+ "title": "Uninstall",
+ "description": "Learn how to uninstall Coder",
+ "path": "./install/uninstall.md"
+ },
+ {
+ "title": "1-click install",
+ "description": "Install Coder on a cloud provider with a single click",
+ "path": "./install/1-click.md"
+ },
+ {
+ "title": "Releases",
+ "description": "Coder Release Channels and Cadence",
+ "path": "./install/releases.md"
+ }
+ ]
+ },
+ {
+ "title": "Platforms",
+ "description": "Platform-specific guides using Coder",
+ "path": "./platforms/README.md",
+ "icon_path": "./images/icons/star.svg",
+ "children": [
+ {
+ "title": "AWS",
+ "description": "Set up Coder on an AWS EC2 VM",
+ "path": "./platforms/aws.md",
+ "icon_path": "./images/aws.svg"
+ },
+ {
+ "title": "Azure",
+ "description": "Set up Coder on an Azure VM",
+ "path": "./platforms/azure.md",
+ "icon_path": "./images/azure.svg"
+ },
+ {
+ "title": "Docker",
+ "description": "Set up Coder with Docker",
+ "path": "./platforms/docker.md",
+ "icon_path": "./images/icons/docker.svg"
+ },
+ {
+ "title": "GCP",
+ "description": "Set up Coder on a GCP Compute Engine VM",
+ "path": "./platforms/gcp.md",
+ "icon_path": "./images/google-cloud.svg"
+ },
+ {
+ "title": "Kubernetes",
+ "description": "Set up Coder on Kubernetes",
+ "path": "./platforms/kubernetes/index.md",
+ "children": [
+ {
+ "title": "Additional clusters",
+ "description": "Deploy workspaces on additional Kubernetes clusters",
+ "path": "./platforms/kubernetes/additional-clusters.md"
+ },
+ {
+ "title": "Deployment logs",
+ "description": "Stream K8s event logs on workspace startup",
+ "path": "./platforms/kubernetes/deployment-logs.md"
+ }
+ ]
+ },
+ {
+ "title": "Other platforms",
+ "description": "Set up Coder on an another provider",
+ "path": "./platforms/other.md"
+ }
+ ]
+ },
+ {
+ "title": "Templates",
+ "description": "Templates define the infrastructure for workspaces",
+ "path": "./templates/index.md",
+ "icon_path": "./images/icons/picture.svg",
+ "children": [
+ {
+ "title": "Working with templates",
+ "description": "Creating, editing, and updating templates",
+ "path": "./templates/creating.md"
+ },
+ {
+ "title": "Your first template",
+ "description": "A tutorial for creating and editing your first template",
+ "path": "./templates/tutorial.md"
+ },
+ {
+ "title": "Guided tour",
+ "description": "Create a template from scratch",
+ "path": "./templates/tour.md"
+ },
+ {
+ "title": "Setting up templates",
+ "description": "Best practices for writing templates",
+ "path": "./templates/best-practices.md",
+ "children": [
+ {
+ "title": "Change management",
+ "description": "Versioning templates with git and CI",
+ "path": "./templates/change-management.md",
+ "icon_path": "./images/icons/git.svg"
+ },
+ {
+ "title": "Provider authentication",
+ "description": "Authenticate the provisioner",
+ "path": "./templates/authentication.md",
+ "icon_path": "./images/icons/key.svg"
+ },
+ {
+ "title": "Resource persistence",
+ "description": "How resource persistence works in Coder",
+ "path": "./templates/resource-persistence.md",
+ "icon_path": "./images/icons/infinity.svg"
+ },
+ {
+ "title": "Terraform modules",
+ "description": "Reuse code across Coder templates",
+ "path": "./templates/modules.md"
+ }
+ ]
+ },
+ {
+ "title": "Customizing templates",
+ "description": "Give information and options to workspace users",
+ "path": "./templates/customizing.md",
+ "children": [
+ {
+ "title": "Agent metadata",
+ "description": "Show operational metrics in the workspace",
+ "path": "./templates/agent-metadata.md"
+ },
+ {
+ "title": "Resource metadata",
+ "description": "Show information in the workspace about template resources",
+ "path": "./templates/resource-metadata.md"
+ },
+ {
+ "title": "UI Resource Ordering",
+ "description": "Learn how to manage the order of Terraform resources in UI",
+ "path": "./templates/resource-ordering.md"
+ }
+ ]
+ },
+ {
+ "title": "Parameters",
+ "description": "Prompt the user for additional information about a workspace",
+ "path": "./templates/parameters.md"
+ },
+ {
+ "title": "Variables",
+ "description": "Prompt the template administrator for additional information about a template",
+ "path": "./templates/variables.md"
+ },
+ {
+ "title": "Administering templates",
+ "description": "Configuration settings for template admins",
+ "path": "./templates/configuration.md",
+ "children": [
+ {
+ "title": "General settings",
+ "description": "Configure name, display info, and update polices",
+ "path": "./templates/general-settings.md"
+ },
+ {
+ "title": "Permissions",
+ "description": "Configure who can access a template",
+ "path": "./templates/permissions.md"
+ },
+ {
+ "title": "Workspace Scheduling",
+ "description": "Configure when workspaces start, stop, and delete",
+ "path": "./templates/schedule.md"
+ }
+ ]
+ },
+ {
+ "title": "Open in Coder",
+ "description": "Add an \"Open in Coder\" button to your repos",
+ "path": "./templates/open-in-coder.md",
+ "icon_path": "./images/icons/key.svg"
+ },
+ {
+ "title": "Docker in workspaces",
+ "description": "Use Docker inside containerized templates",
+ "path": "./templates/docker-in-workspaces.md",
+ "icon_path": "./images/icons/docker.svg"
+ },
+ {
+ "title": "Dev Containers",
+ "description": "Use Dev Containers in workspaces",
+ "path": "./templates/dev-containers.md",
+ "state": "alpha"
+ },
+ {
+ "title": "Troubleshooting templates",
+ "description": "Fix common template problems",
+ "path": "./templates/troubleshooting.md"
+ },
+ {
+ "title": "Process Logging",
+ "description": "Audit commands in workspaces with exectrace",
+ "path": "./templates/process-logging.md",
+ "state": "enterprise"
+ },
+ {
+ "title": "Icons",
+ "description": "Coder includes icons for popular cloud providers and programming languages for you to use",
+ "path": "./templates/icons.md"
+ }
+ ]
+ },
+ {
+ "title": "Workspaces",
+ "description": "Learn about Coder workspaces.",
+ "path": "./workspaces.md",
+ "icon_path": "./images/icons/layers.svg"
+ },
+ {
+ "title": "IDEs",
+ "description": "Learn how to use your IDE of choice with Coder",
+ "path": "./ides.md",
+ "icon_path": "./images/icons/code.svg",
+ "children": [
+ {
+ "title": "Web IDEs",
+ "description": "Learn how to configure web IDEs in your templates",
+ "path": "./ides/web-ides.md"
+ },
+ {
+ "title": "JetBrains Gateway",
+ "description": "Learn how to configure JetBrains Gateway for your workspaces",
+ "path": "./ides/gateway.md"
+ },
+ {
+ "title": "Emacs",
+ "description": "Learn how to configure Emacs with TRAMP in Coder",
+ "path": "./ides/emacs-tramp.md"
+ },
+ {
+ "title": "Remote Desktops",
+ "description": "Learn how to use Remote Desktops with Coder",
+ "path": "./ides/remote-desktops.md"
+ }
+ ]
+ },
+ {
+ "title": "Networking",
+ "description": "Learn about networking in Coder",
+ "path": "./networking/index.md",
+ "icon_path": "./images/icons/networking.svg",
+ "children": [
+ {
+ "title": "Port Forwarding",
+ "description": "Learn how to forward ports in Coder",
+ "path": "./networking/port-forwarding.md"
+ },
+ {
+ "title": "STUN and NAT",
+ "description": "Learn how Coder establishes direct connections",
+ "path": "./networking/stun.md"
+ }
+ ]
+ },
+ {
+ "title": "Dotfiles",
+ "description": "Learn how to personalize your workspace",
+ "path": "./dotfiles.md",
+ "icon_path": "./images/icons/art-pad.svg"
+ },
+ {
+ "title": "Secrets",
+ "description": "Learn how to use secrets in your workspace",
+ "path": "./secrets.md",
+ "icon_path": "./images/icons/secrets.svg"
+ },
+ {
+ "title": "Administration",
+ "description": "How to install and deploy Coder",
+ "path": "./admin/README.md",
+ "icon_path": "./images/icons/wrench.svg",
+ "children": [
+ {
+ "title": "Authentication",
+ "description": "Learn how to set up authentication using GitHub or OpenID Connect",
+ "path": "./admin/auth.md",
+ "icon_path": "./images/icons/key.svg"
+ },
+ {
+ "title": "Users",
+ "description": "Learn about user roles available in Coder and how to create and manage users",
+ "path": "./admin/users.md",
+ "icon_path": "./images/icons/users.svg"
+ },
+ {
+ "title": "Groups",
+ "description": "Learn how to manage user groups",
+ "path": "./admin/groups.md",
+ "icon_path": "./images/icons/group.svg",
+ "state": "enterprise"
+ },
+ {
+ "title": "RBAC",
+ "description": "Learn how to use the role based access control",
+ "path": "./admin/rbac.md",
+ "icon_path": "./images/icons/rbac.svg",
+ "state": "enterprise"
+ },
+ {
+ "title": "Configuration",
+ "description": "Learn how to configure Coder",
+ "path": "./admin/configure.md",
+ "icon_path": "./images/icons/toggle_on.svg"
+ },
+ {
+ "title": "External Auth",
+ "description": "Learn how connect Coder with external auth providers",
+ "path": "./admin/external-auth.md",
+ "icon_path": "./images/icons/git.svg"
+ },
+ {
+ "title": "Upgrading",
+ "description": "Learn how to upgrade Coder",
+ "path": "./admin/upgrade.md",
+ "icon_path": "./images/icons/upgrade.svg"
+ },
+ {
+ "title": "Automation",
+ "description": "Learn how to automate Coder with the CLI and API",
+ "path": "./admin/automation.md",
+ "icon_path": "./images/icons/plug.svg"
+ },
+ {
+ "title": "Scaling Coder",
+ "description": "Learn how to use load testing tools",
+ "path": "./admin/scale.md",
+ "icon_path": "./images/icons/scale.svg"
+ },
+ {
+ "title": "Reference Architectures",
+ "description": "Learn about reference architectures for Coder",
+ "path": "./admin/architectures/index.md",
+ "icon_path": "./images/icons/scale.svg",
+ "children": [
+ {
+ "title": "Up to 1,000 users",
+ "path": "./admin/architectures/1k-users.md"
+ },
+ {
+ "title": "Up to 2,000 users",
+ "path": "./admin/architectures/2k-users.md"
+ },
+ {
+ "title": "Up to 3,000 users",
+ "path": "./admin/architectures/3k-users.md"
+ }
+ ]
+ },
+ {
+ "title": "External Provisioners",
+ "description": "Run provisioners isolated from the Coder server",
+ "path": "./admin/provisioners.md",
+ "icon_path": "./images/icons/queue.svg",
+ "state": "enterprise"
+ },
+ {
+ "title": "Workspace Proxies",
+ "description": "Run geo distributed workspace proxies",
+ "path": "./admin/workspace-proxies.md",
+ "icon_path": "./images/icons/networking.svg",
+ "state": "enterprise"
+ },
+ {
+ "title": "Application Logs",
+ "description": "Learn how to use Application Logs in your Coder deployment",
+ "path": "./admin/app-logs.md",
+ "icon_path": "./images/icons/notes.svg"
+ },
+ {
+ "title": "Audit Logs",
+ "description": "Learn how to use Audit Logs in your Coder deployment",
+ "path": "./admin/audit-logs.md",
+ "icon_path": "./images/icons/radar.svg",
+ "state": "enterprise"
+ },
+ {
+ "title": "Quotas",
+ "description": "Learn how to use Workspace Quotas in Coder",
+ "path": "./admin/quotas.md",
+ "icon_path": "./images/icons/dollar.svg",
+ "state": "enterprise"
+ },
+ {
+ "title": "High Availability",
+ "description": "Learn how to configure Coder for High Availability",
+ "path": "./admin/high-availability.md",
+ "icon_path": "./images/icons/hydra.svg",
+ "state": "enterprise"
+ },
+ {
+ "title": "Prometheus",
+ "description": "Learn how to collect Prometheus metrics",
+ "path": "./admin/prometheus.md",
+ "icon_path": "./images/icons/speed.svg"
+ },
+ {
+ "title": "Appearance",
+ "description": "Learn how to configure the appearance of Coder",
+ "path": "./admin/appearance.md",
+ "icon_path": "./images/icons/info.svg",
+ "state": "enterprise"
+ },
+ {
+ "title": "Telemetry",
+ "description": "Learn what usage telemetry Coder collects",
+ "path": "./admin/telemetry.md",
+ "icon_path": "./images/icons/science.svg"
+ },
+ {
+ "title": "Database Encryption",
+ "description": "Learn how to encrypt sensitive data at rest in Coder",
+ "path": "./admin/encryption.md",
+ "icon_path": "./images/icons/lock.svg",
+ "state": "enterprise"
+ },
+ {
+ "title": "Deployment Health",
+ "description": "Learn how to monitor the health of your Coder deployment",
+ "path": "./admin/healthcheck.md",
+ "icon_path": "./images/icons/health.svg"
+ }
+ ]
+ },
+ {
+ "title": "Enterprise",
+ "description": "Learn how to enable Enterprise features",
+ "path": "./enterprise.md",
+ "icon_path": "./images/icons/group.svg"
+ },
+ {
+ "title": "Contributing",
+ "description": "Learn how to contribute to Coder",
+ "path": "./CONTRIBUTING.md",
+ "icon_path": "./images/icons/contributing.svg",
+ "children": [
+ {
+ "title": "Code of Conduct",
+ "description": "See the code of conduct for contributing to Coder",
+ "path": "./contributing/CODE_OF_CONDUCT.md"
+ },
+ {
+ "title": "Feature stages",
+ "description": "Policies for Alpha and Experimental features.",
+ "path": "./contributing/feature-stages.md"
+ },
+ {
+ "title": "Documentation",
+ "description": "Our style guide for use when authoring documentation",
+ "path": "./contributing/documentation.md"
+ },
+ {
+ "title": "Security",
+ "description": "How to report vulnerabilities in Coder",
+ "path": "./contributing/SECURITY.md"
+ },
+ {
+ "title": "Frontend",
+ "description": "Our guide for frontend development",
+ "path": "./contributing/frontend.md"
+ }
+ ]
+ },
+ {
+ "title": "REST API",
+ "description": "Learn how to use Coderd API",
+ "path": "./api/index.md",
+ "icon_path": "./images/icons/api.svg",
+ "children": [
+ {
+ "title": "General",
+ "path": "./api/general.md"
+ },
+ {
+ "title": "Agents",
+ "path": "./api/agents.md"
+ },
+ {
+ "title": "Applications",
+ "path": "./api/applications.md"
+ },
+ {
+ "title": "Audit",
+ "path": "./api/audit.md"
+ },
+ {
+ "title": "Authentication",
+ "path": "./api/authentication.md"
+ },
+ {
+ "title": "Authorization",
+ "path": "./api/authorization.md"
+ },
+ {
+ "title": "Builds",
+ "path": "./api/builds.md"
+ },
+ {
+ "title": "Debug",
+ "path": "./api/debug.md"
+ },
+ {
+ "title": "Enterprise",
+ "path": "./api/enterprise.md"
+ },
+ {
+ "title": "Files",
+ "path": "./api/files.md"
+ },
+ {
+ "title": "Git",
+ "path": "./api/git.md"
+ },
+ {
+ "title": "Insights",
+ "path": "./api/insights.md"
+ },
+ {
+ "title": "Members",
+ "path": "./api/members.md"
+ },
+ {
+ "title": "Organizations",
+ "path": "./api/organizations.md"
+ },
+ {
+ "title": "PortSharing",
+ "path": "./api/portsharing.md"
+ },
+ {
+ "title": "Schemas",
+ "path": "./api/schemas.md"
+ },
+ {
+ "title": "Templates",
+ "path": "./api/templates.md"
+ },
+ {
+ "title": "Users",
+ "path": "./api/users.md"
+ },
+ {
+ "title": "WorkspaceProxies",
+ "path": "./api/workspaceproxies.md"
+ },
+ {
+ "title": "Workspaces",
+ "path": "./api/workspaces.md"
+ }
+ ]
+ },
+ {
+ "title": "Command Line",
+ "description": "Learn how to use Coder CLI",
+ "path": "./cli.md",
+ "icon_path": "./images/icons/terminal.svg",
+ "children": [
+ {
+ "title": "autoupdate",
+ "description": "Toggle auto-update policy for a workspace",
+ "path": "cli/autoupdate.md"
+ },
+ {
+ "title": "coder",
+ "path": "cli.md"
+ },
+ {
+ "title": "config-ssh",
+ "description": "Add an SSH Host entry for your workspaces \"ssh coder.workspace\"",
+ "path": "cli/config-ssh.md"
+ },
+ {
+ "title": "create",
+ "description": "Create a workspace",
+ "path": "cli/create.md"
+ },
+ {
+ "title": "delete",
+ "description": "Delete a workspace",
+ "path": "cli/delete.md"
+ },
+ {
+ "title": "dotfiles",
+ "description": "Personalize your workspace by applying a canonical dotfiles repository",
+ "path": "cli/dotfiles.md"
+ },
+ {
+ "title": "external-auth",
+ "description": "Manage external authentication",
+ "path": "cli/external-auth.md"
+ },
+ {
+ "title": "external-auth access-token",
+ "description": "Print auth for an external provider",
+ "path": "cli/external-auth_access-token.md"
+ },
+ {
+ "title": "favorite",
+ "description": "Add a workspace to your favorites",
+ "path": "cli/favorite.md"
+ },
+ {
+ "title": "features",
+ "description": "List Enterprise features",
+ "path": "cli/features.md"
+ },
+ {
+ "title": "features list",
+ "path": "cli/features_list.md"
+ },
+ {
+ "title": "groups",
+ "description": "Manage groups",
+ "path": "cli/groups.md"
+ },
+ {
+ "title": "groups create",
+ "description": "Create a user group",
+ "path": "cli/groups_create.md"
+ },
+ {
+ "title": "groups delete",
+ "description": "Delete a user group",
+ "path": "cli/groups_delete.md"
+ },
+ {
+ "title": "groups edit",
+ "description": "Edit a user group",
+ "path": "cli/groups_edit.md"
+ },
+ {
+ "title": "groups list",
+ "description": "List user groups",
+ "path": "cli/groups_list.md"
+ },
+ {
+ "title": "licenses",
+ "description": "Add, delete, and list licenses",
+ "path": "cli/licenses.md"
+ },
+ {
+ "title": "licenses add",
+ "description": "Add license to Coder deployment",
+ "path": "cli/licenses_add.md"
+ },
+ {
+ "title": "licenses delete",
+ "description": "Delete license by ID",
+ "path": "cli/licenses_delete.md"
+ },
+ {
+ "title": "licenses list",
+ "description": "List licenses (including expired)",
+ "path": "cli/licenses_list.md"
+ },
+ {
+ "title": "list",
+ "description": "List workspaces",
+ "path": "cli/list.md"
+ },
+ {
+ "title": "login",
+ "description": "Authenticate with Coder deployment",
+ "path": "cli/login.md"
+ },
+ {
+ "title": "logout",
+ "description": "Unauthenticate your local session",
+ "path": "cli/logout.md"
+ },
+ {
+ "title": "netcheck",
+ "description": "Print network debug information for DERP and STUN",
+ "path": "cli/netcheck.md"
+ },
+ {
+ "title": "open",
+ "description": "Open a workspace",
+ "path": "cli/open.md"
+ },
+ {
+ "title": "open vscode",
+ "description": "Open a workspace in VS Code Desktop",
+ "path": "cli/open_vscode.md"
+ },
+ {
+ "title": "ping",
+ "description": "Ping a workspace",
+ "path": "cli/ping.md"
+ },
+ {
+ "title": "port-forward",
+ "description": "Forward ports from a workspace to the local machine. For reverse port forwarding, use \"coder ssh -R\".",
+ "path": "cli/port-forward.md"
+ },
+ {
+ "title": "provisionerd",
+ "description": "Manage provisioner daemons",
+ "path": "cli/provisionerd.md"
+ },
+ {
+ "title": "provisionerd start",
+ "description": "Run a provisioner daemon",
+ "path": "cli/provisionerd_start.md"
+ },
+ {
+ "title": "publickey",
+ "description": "Output your Coder public key used for Git operations",
+ "path": "cli/publickey.md"
+ },
+ {
+ "title": "rename",
+ "description": "Rename a workspace",
+ "path": "cli/rename.md"
+ },
+ {
+ "title": "reset-password",
+ "description": "Directly connect to the database to reset a user's password",
+ "path": "cli/reset-password.md"
+ },
+ {
+ "title": "restart",
+ "description": "Restart a workspace",
+ "path": "cli/restart.md"
+ },
+ {
+ "title": "schedule",
+ "description": "Schedule automated start and stop times for workspaces",
+ "path": "cli/schedule.md"
+ },
+ {
+ "title": "schedule override-stop",
+ "description": "Override the stop time of a currently running workspace instance.",
+ "path": "cli/schedule_override-stop.md"
+ },
+ {
+ "title": "schedule show",
+ "description": "Show workspace schedules",
+ "path": "cli/schedule_show.md"
+ },
+ {
+ "title": "schedule start",
+ "description": "Edit workspace start schedule",
+ "path": "cli/schedule_start.md"
+ },
+ {
+ "title": "schedule stop",
+ "description": "Edit workspace stop schedule",
+ "path": "cli/schedule_stop.md"
+ },
+ {
+ "title": "server",
+ "description": "Start a Coder server",
+ "path": "cli/server.md"
+ },
+ {
+ "title": "server create-admin-user",
+ "description": "Create a new admin user with the given username, email and password and adds it to every organization.",
+ "path": "cli/server_create-admin-user.md"
+ },
+ {
+ "title": "server dbcrypt",
+ "description": "Manage database encryption.",
+ "path": "cli/server_dbcrypt.md"
+ },
+ {
+ "title": "server dbcrypt decrypt",
+ "description": "Decrypt a previously encrypted database.",
+ "path": "cli/server_dbcrypt_decrypt.md"
+ },
+ {
+ "title": "server dbcrypt delete",
+ "description": "Delete all encrypted data from the database. THIS IS A DESTRUCTIVE OPERATION.",
+ "path": "cli/server_dbcrypt_delete.md"
+ },
+ {
+ "title": "server dbcrypt rotate",
+ "description": "Rotate database encryption keys.",
+ "path": "cli/server_dbcrypt_rotate.md"
+ },
+ {
+ "title": "server postgres-builtin-serve",
+ "description": "Run the built-in PostgreSQL deployment.",
+ "path": "cli/server_postgres-builtin-serve.md"
+ },
+ {
+ "title": "server postgres-builtin-url",
+ "description": "Output the connection URL for the built-in PostgreSQL deployment.",
+ "path": "cli/server_postgres-builtin-url.md"
+ },
+ {
+ "title": "show",
+ "description": "Display details of a workspace's resources and agents",
+ "path": "cli/show.md"
+ },
+ {
+ "title": "speedtest",
+ "description": "Run upload and download tests from your machine to a workspace",
+ "path": "cli/speedtest.md"
+ },
+ {
+ "title": "ssh",
+ "description": "Start a shell into a workspace",
+ "path": "cli/ssh.md"
+ },
+ {
+ "title": "start",
+ "description": "Start a workspace",
+ "path": "cli/start.md"
+ },
+ {
+ "title": "stat",
+ "description": "Show resource usage for the current workspace.",
+ "path": "cli/stat.md"
+ },
+ {
+ "title": "stat cpu",
+ "description": "Show CPU usage, in cores.",
+ "path": "cli/stat_cpu.md"
+ },
+ {
+ "title": "stat disk",
+ "description": "Show disk usage, in gigabytes.",
+ "path": "cli/stat_disk.md"
+ },
+ {
+ "title": "stat mem",
+ "description": "Show memory usage, in gigabytes.",
+ "path": "cli/stat_mem.md"
+ },
+ {
+ "title": "state",
+ "description": "Manually manage Terraform state to fix broken workspaces",
+ "path": "cli/state.md"
+ },
+ {
+ "title": "state pull",
+ "description": "Pull a Terraform state file from a workspace.",
+ "path": "cli/state_pull.md"
+ },
+ {
+ "title": "state push",
+ "description": "Push a Terraform state file to a workspace.",
+ "path": "cli/state_push.md"
+ },
+ {
+ "title": "stop",
+ "description": "Stop a workspace",
+ "path": "cli/stop.md"
+ },
+ {
+ "title": "support",
+ "description": "Commands for troubleshooting issues with a Coder deployment.",
+ "path": "cli/support.md"
+ },
+ {
+ "title": "support bundle",
+ "description": "Generate a support bundle to troubleshoot issues connecting to a workspace.",
+ "path": "cli/support_bundle.md"
+ },
+ {
+ "title": "templates",
+ "description": "Manage templates",
+ "path": "cli/templates.md"
+ },
+ {
+ "title": "templates archive",
+ "description": "Archive unused or failed template versions from a given template(s)",
+ "path": "cli/templates_archive.md"
+ },
+ {
+ "title": "templates create",
+ "description": "DEPRECATED: Create a template from the current directory or as specified by flag",
+ "path": "cli/templates_create.md"
+ },
+ {
+ "title": "templates delete",
+ "description": "Delete templates",
+ "path": "cli/templates_delete.md"
+ },
+ {
+ "title": "templates edit",
+ "description": "Edit the metadata of a template by name.",
+ "path": "cli/templates_edit.md"
+ },
+ {
+ "title": "templates init",
+ "description": "Get started with a templated template.",
+ "path": "cli/templates_init.md"
+ },
+ {
+ "title": "templates list",
+ "description": "List all the templates available for the organization",
+ "path": "cli/templates_list.md"
+ },
+ {
+ "title": "templates pull",
+ "description": "Download the active, latest, or specified version of a template to a path.",
+ "path": "cli/templates_pull.md"
+ },
+ {
+ "title": "templates push",
+ "description": "Create or update a template from the current directory or as specified by flag",
+ "path": "cli/templates_push.md"
+ },
+ {
+ "title": "templates versions",
+ "description": "Manage different versions of the specified template",
+ "path": "cli/templates_versions.md"
+ },
+ {
+ "title": "templates versions archive",
+ "description": "Archive a template version(s).",
+ "path": "cli/templates_versions_archive.md"
+ },
+ {
+ "title": "templates versions list",
+ "description": "List all the versions of the specified template",
+ "path": "cli/templates_versions_list.md"
+ },
+ {
+ "title": "templates versions unarchive",
+ "description": "Unarchive a template version(s).",
+ "path": "cli/templates_versions_unarchive.md"
+ },
+ {
+ "title": "tokens",
+ "description": "Manage personal access tokens",
+ "path": "cli/tokens.md"
+ },
+ {
+ "title": "tokens create",
+ "description": "Create a token",
+ "path": "cli/tokens_create.md"
+ },
+ {
+ "title": "tokens list",
+ "description": "List tokens",
+ "path": "cli/tokens_list.md"
+ },
+ {
+ "title": "tokens remove",
+ "description": "Delete a token",
+ "path": "cli/tokens_remove.md"
+ },
+ {
+ "title": "unfavorite",
+ "description": "Remove a workspace from your favorites",
+ "path": "cli/unfavorite.md"
+ },
+ {
+ "title": "update",
+ "description": "Will update and start a given workspace if it is out of date",
+ "path": "cli/update.md"
+ },
+ {
+ "title": "users",
+ "description": "Manage users",
+ "path": "cli/users.md"
+ },
+ {
+ "title": "users activate",
+ "description": "Update a user's status to 'active'. Active users can fully interact with the platform",
+ "path": "cli/users_activate.md"
+ },
+ {
+ "title": "users create",
+ "path": "cli/users_create.md"
+ },
+ {
+ "title": "users delete",
+ "description": "Delete a user by username or user_id.",
+ "path": "cli/users_delete.md"
+ },
+ {
+ "title": "users list",
+ "path": "cli/users_list.md"
+ },
+ {
+ "title": "users show",
+ "description": "Show a single user. Use 'me' to indicate the currently authenticated user.",
+ "path": "cli/users_show.md"
+ },
+ {
+ "title": "users suspend",
+ "description": "Update a user's status to 'suspended'. A suspended user cannot log into the platform",
+ "path": "cli/users_suspend.md"
+ },
+ {
+ "title": "version",
+ "description": "Show coder version",
+ "path": "cli/version.md"
+ }
+ ]
+ },
+ {
+ "title": "Security",
+ "description": "Security advisories",
+ "path": "./security/index.md",
+ "icon_path": "./images/icons/security.svg",
+ "children": [
+ {
+ "title": "API tokens of deleted users not invalidated",
+ "description": "Fixed in v0.23.0 (Apr 25, 2023)",
+ "path": "./security/0001_user_apikeys_invalidation.md"
+ }
+ ]
+ },
+ {
+ "title": "FAQs",
+ "description": "Frequently asked questions",
+ "path": "./faqs.md",
+ "icon_path": "./images/icons/info.svg"
+ },
+ {
+ "title": "Guides",
+ "description": "Employee-authored tutorials",
+ "path": "./guides/index.md",
+ "icon_path": "./images/icons/notes.svg",
+ "children": [
+ {
+ "title": "Generate a Support Bundle",
+ "description": "Generate and upload a Support Bundle to Coder Support",
+ "path": "./guides/support-bundle.md"
+ },
+ {
+ "title": "Configuring Okta",
+ "description": "Custom claims/scopes with Okta for group/role sync",
+ "path": "./guides/configuring-okta.md"
+ },
+ {
+ "title": "Google to AWS Federation",
+ "description": "Federating a Google Cloud service account to AWS",
+ "path": "./guides/gcp-to-aws.md"
+ },
+ {
+ "title": "JFrog Artifactory Integration",
+ "description": "Integrate Coder with JFrog Artifactory",
+ "path": "./guides/artifactory-integration.md"
+ },
+ {
+ "title": "Island Secure Browser Integration",
+ "description": "Integrate Coder with Island's Secure Browser",
+ "path": "./guides/island-integration.md"
+ },
+ {
+ "title": "Template ImagePullSecrets",
+ "description": "Creating ImagePullSecrets for private registries",
+ "path": "./guides/image-pull-secret.md"
+ },
+ {
+ "title": "Postgres SSL",
+ "description": "Configure Coder to connect to Postgres over SSL",
+ "path": "./guides/postgres-ssl.md"
+ },
+ {
+ "title": "Azure Federation",
+ "description": "Federating Coder to Azure",
+ "path": "./guides/azure-federation.md"
+ },
+ {
+ "title": "Scanning Coder Workspaces with JFrog Xray",
+ "description": "Integrate Coder with JFrog Xray",
+ "path": "./guides/xray-integration.md"
+ }
+ ]
+ }
+ ]
+}
diff --git a/docs/platforms/aws.md b/docs/platforms/aws.md
index 83e0c6c2aa642..e69de29bb2d1d 100644
--- a/docs/platforms/aws.md
+++ b/docs/platforms/aws.md
@@ -1,89 +0,0 @@
-# Amazon Web Services
-
-This guide is designed to get you up and running with a Coder proof-of-concept
-VM on AWS EC2 using a [Coder-provided AMI](https://github.com/coder/packages).
-If you are familiar with EC2 however, you can use our
-[install script](../install/index.md#install-coder) to run Coder on any popular
-Linux distribution.
-
-## Requirements
-
-This guide assumes your AWS account has `AmazonEC2FullAccess` permissions.
-
-## Launch a Coder instance from the from AWS Marketplace
-
-We publish an Ubuntu 22.04 AMI with Coder and Docker pre-installed. Search for
-`Coder` in the EC2 "Launch an Instance" screen or
-[launch directly from the marketplace](https://aws.amazon.com/marketplace/pp/prodview-5gxjyur2vc7rg).
-
-
-
-Be sure to keep the default firewall (SecurityGroup) options checked so you can
-connect over HTTP, HTTPS, and SSH.
-
-
-
-We recommend keeping the default instance type (`t2.xlarge`, 4 cores and 16 GB
-memory) if you plan on provisioning Docker containers as workspaces on this EC2
-instance. Keep in mind this platforms is intended for proof-of-concept
-deployments and you should adjust your infrastructure when preparing for
-production use. See: [Scaling Coder](../admin/scaling/scale-testing.md)
-
-Be sure to add a keypair so that you can connect over SSH to further
-[configure Coder](../admin/configure.md).
-
-After launching the instance, wait 30 seconds and navigate to the public IPv4
-address. You should be redirected to a public tunnel URL.
-
-
-
-That's all! Use the UI to create your first user, template, and workspace. We
-recommend starting with a Docker template since the instance has Docker
-pre-installed.
-
-
-
-## Configuring Coder server
-
-Coder is primarily configured by server-side flags and environment variables.
-Given you created or added key-pairs when launching the instance, you can
-[configure your Coder deployment](../admin/configure.md) by logging in via SSH
-or using the console:
-
-```shell
-ssh ubuntu@
-sudo vim /etc/coder.d/coder.env # edit config
-sudo systemctl daemon-reload
-sudo systemctl restart coder # restart Coder
-```
-
-## Give developers EC2 workspaces (optional)
-
-Instead of running containers on the Coder instance, you can offer developers
-full EC2 instances with the
-[aws-linux](https://github.com/coder/coder/tree/main/examples/templates/aws-linux)
-template.
-
-Before you add the AWS template from the dashboard or CLI, you'll need to modify
-the instance IAM role.
-
-
-
-You must create or select a role that has `EC2FullAccess` permissions or a
-limited
-[Coder-specific permissions policy](https://github.com/coder/coder/tree/main/examples/templates/aws-linux#required-permissions--policy).
-
-From there, you can import the AWS starter template in the dashboard and begin
-creating VM-based workspaces.
-
-
-
-## Next steps
-
-- [IDEs with Coder](../ides.md)
-- [Writing custom templates for Coder](../templates/index.md)
-- [Configure the Coder server](../admin/configure.md)
-- [Use your own domain + TLS](../admin/configure.md#tls--reverse-proxy)
diff --git a/docs/reference/README.md b/docs/reference/README.md
new file mode 100644
index 0000000000000..2e8228638d626
--- /dev/null
+++ b/docs/reference/README.md
@@ -0,0 +1,6 @@
+# Reference
+
+Autogenerated documentation around Coder.
+
+- [REST API](./api)
+- [Command Line](./cli)
diff --git a/docs/api/index.md b/docs/reference/api/README.md
similarity index 100%
rename from docs/api/index.md
rename to docs/reference/api/README.md
diff --git a/docs/api/agents.md b/docs/reference/api/agents.md
similarity index 100%
rename from docs/api/agents.md
rename to docs/reference/api/agents.md
diff --git a/docs/api/applications.md b/docs/reference/api/applications.md
similarity index 100%
rename from docs/api/applications.md
rename to docs/reference/api/applications.md
diff --git a/docs/api/audit.md b/docs/reference/api/audit.md
similarity index 100%
rename from docs/api/audit.md
rename to docs/reference/api/audit.md
diff --git a/docs/api/authentication.md b/docs/reference/api/authentication.md
similarity index 100%
rename from docs/api/authentication.md
rename to docs/reference/api/authentication.md
diff --git a/docs/api/authorization.md b/docs/reference/api/authorization.md
similarity index 100%
rename from docs/api/authorization.md
rename to docs/reference/api/authorization.md
diff --git a/docs/api/builds.md b/docs/reference/api/builds.md
similarity index 100%
rename from docs/api/builds.md
rename to docs/reference/api/builds.md
diff --git a/docs/api/debug.md b/docs/reference/api/debug.md
similarity index 100%
rename from docs/api/debug.md
rename to docs/reference/api/debug.md
diff --git a/docs/api/enterprise.md b/docs/reference/api/enterprise.md
similarity index 100%
rename from docs/api/enterprise.md
rename to docs/reference/api/enterprise.md
diff --git a/docs/api/files.md b/docs/reference/api/files.md
similarity index 100%
rename from docs/api/files.md
rename to docs/reference/api/files.md
diff --git a/docs/api/general.md b/docs/reference/api/general.md
similarity index 100%
rename from docs/api/general.md
rename to docs/reference/api/general.md
diff --git a/docs/api/git.md b/docs/reference/api/git.md
similarity index 100%
rename from docs/api/git.md
rename to docs/reference/api/git.md
diff --git a/docs/api/insights.md b/docs/reference/api/insights.md
similarity index 100%
rename from docs/api/insights.md
rename to docs/reference/api/insights.md
diff --git a/docs/api/members.md b/docs/reference/api/members.md
similarity index 100%
rename from docs/api/members.md
rename to docs/reference/api/members.md
diff --git a/docs/api/notifications.md b/docs/reference/api/notifications.md
similarity index 100%
rename from docs/api/notifications.md
rename to docs/reference/api/notifications.md
diff --git a/docs/api/organizations.md b/docs/reference/api/organizations.md
similarity index 100%
rename from docs/api/organizations.md
rename to docs/reference/api/organizations.md
diff --git a/docs/api/portsharing.md b/docs/reference/api/portsharing.md
similarity index 100%
rename from docs/api/portsharing.md
rename to docs/reference/api/portsharing.md
diff --git a/docs/api/schemas.md b/docs/reference/api/schemas.md
similarity index 100%
rename from docs/api/schemas.md
rename to docs/reference/api/schemas.md
diff --git a/docs/api/templates.md b/docs/reference/api/templates.md
similarity index 100%
rename from docs/api/templates.md
rename to docs/reference/api/templates.md
diff --git a/docs/api/users.md b/docs/reference/api/users.md
similarity index 100%
rename from docs/api/users.md
rename to docs/reference/api/users.md
diff --git a/docs/api/workspaceproxies.md b/docs/reference/api/workspaceproxies.md
similarity index 100%
rename from docs/api/workspaceproxies.md
rename to docs/reference/api/workspaceproxies.md
diff --git a/docs/api/workspaces.md b/docs/reference/api/workspaces.md
similarity index 100%
rename from docs/api/workspaces.md
rename to docs/reference/api/workspaces.md
diff --git a/docs/cli.md b/docs/reference/cli/README.md
similarity index 95%
rename from docs/cli.md
rename to docs/reference/cli/README.md
index ab97ca9cc4d10..b42acc857d0af 100644
--- a/docs/cli.md
+++ b/docs/reference/cli/README.md
@@ -92,8 +92,7 @@ Print all options, how they're set, then exit.
| Type | string |
| Environment | $CODER_SESSION_TOKEN |
-Specify an authentication token. For security reasons setting
-CODER_SESSION_TOKEN is preferred.
+Specify an authentication token. For security reasons setting CODER_SESSION_TOKEN is preferred.
### --no-version-warning
@@ -120,8 +119,7 @@ Suppress warnings about unlicensed features.
| Type | string-array |
| Environment | $CODER_HEADER |
-Additional HTTP headers added to all requests. Provide as key=value. Can be
-specified multiple times.
+Additional HTTP headers added to all requests. Provide as key=value. Can be specified multiple times.
### --header-command
@@ -130,8 +128,7 @@ specified multiple times.
| Type | string |
| Environment | $CODER_HEADER_COMMAND |
-An external command that outputs additional HTTP headers added to all requests.
-The command must output each header as `key=value` on its own line.
+An external command that outputs additional HTTP headers added to all requests. The command must output each header as `key=value` on its own line.
### -v, --verbose
@@ -158,10 +155,7 @@ Disable direct (P2P) connections to workspaces.
| Type | bool |
| Environment | $CODER_DISABLE_NETWORK_TELEMETRY |
-Disable network telemetry. Network telemetry is collected when connecting to
-workspaces using the CLI, and is forwarded to the server. If telemetry is also
-enabled on the server, it may be sent to Coder. Network telemetry is used to
-measure network quality and detect regressions.
+Disable network telemetry. Network telemetry is collected when connecting to workspaces using the CLI, and is forwarded to the server. If telemetry is also enabled on the server, it may be sent to Coder. Network telemetry is used to measure network quality and detect regressions.
### --global-config
diff --git a/docs/cli/autoupdate.md b/docs/reference/cli/autoupdate.md
similarity index 100%
rename from docs/cli/autoupdate.md
rename to docs/reference/cli/autoupdate.md
diff --git a/docs/cli/config-ssh.md b/docs/reference/cli/config-ssh.md
similarity index 100%
rename from docs/cli/config-ssh.md
rename to docs/reference/cli/config-ssh.md
diff --git a/docs/cli/create.md b/docs/reference/cli/create.md
similarity index 100%
rename from docs/cli/create.md
rename to docs/reference/cli/create.md
diff --git a/docs/cli/delete.md b/docs/reference/cli/delete.md
similarity index 100%
rename from docs/cli/delete.md
rename to docs/reference/cli/delete.md
diff --git a/docs/cli/dotfiles.md b/docs/reference/cli/dotfiles.md
similarity index 100%
rename from docs/cli/dotfiles.md
rename to docs/reference/cli/dotfiles.md
diff --git a/docs/cli/external-auth.md b/docs/reference/cli/external-auth.md
similarity index 100%
rename from docs/cli/external-auth.md
rename to docs/reference/cli/external-auth.md
diff --git a/docs/cli/external-auth_access-token.md b/docs/reference/cli/external-auth_access-token.md
similarity index 100%
rename from docs/cli/external-auth_access-token.md
rename to docs/reference/cli/external-auth_access-token.md
diff --git a/docs/cli/favorite.md b/docs/reference/cli/favorite.md
similarity index 100%
rename from docs/cli/favorite.md
rename to docs/reference/cli/favorite.md
diff --git a/docs/cli/features.md b/docs/reference/cli/features.md
similarity index 100%
rename from docs/cli/features.md
rename to docs/reference/cli/features.md
diff --git a/docs/cli/features_list.md b/docs/reference/cli/features_list.md
similarity index 100%
rename from docs/cli/features_list.md
rename to docs/reference/cli/features_list.md
diff --git a/docs/cli/groups.md b/docs/reference/cli/groups.md
similarity index 100%
rename from docs/cli/groups.md
rename to docs/reference/cli/groups.md
diff --git a/docs/cli/groups_create.md b/docs/reference/cli/groups_create.md
similarity index 100%
rename from docs/cli/groups_create.md
rename to docs/reference/cli/groups_create.md
diff --git a/docs/cli/groups_delete.md b/docs/reference/cli/groups_delete.md
similarity index 100%
rename from docs/cli/groups_delete.md
rename to docs/reference/cli/groups_delete.md
diff --git a/docs/cli/groups_edit.md b/docs/reference/cli/groups_edit.md
similarity index 100%
rename from docs/cli/groups_edit.md
rename to docs/reference/cli/groups_edit.md
diff --git a/docs/cli/groups_list.md b/docs/reference/cli/groups_list.md
similarity index 100%
rename from docs/cli/groups_list.md
rename to docs/reference/cli/groups_list.md
diff --git a/docs/cli/licenses.md b/docs/reference/cli/licenses.md
similarity index 100%
rename from docs/cli/licenses.md
rename to docs/reference/cli/licenses.md
diff --git a/docs/cli/licenses_add.md b/docs/reference/cli/licenses_add.md
similarity index 100%
rename from docs/cli/licenses_add.md
rename to docs/reference/cli/licenses_add.md
diff --git a/docs/cli/licenses_delete.md b/docs/reference/cli/licenses_delete.md
similarity index 100%
rename from docs/cli/licenses_delete.md
rename to docs/reference/cli/licenses_delete.md
diff --git a/docs/cli/licenses_list.md b/docs/reference/cli/licenses_list.md
similarity index 100%
rename from docs/cli/licenses_list.md
rename to docs/reference/cli/licenses_list.md
diff --git a/docs/cli/list.md b/docs/reference/cli/list.md
similarity index 100%
rename from docs/cli/list.md
rename to docs/reference/cli/list.md
diff --git a/docs/cli/login.md b/docs/reference/cli/login.md
similarity index 100%
rename from docs/cli/login.md
rename to docs/reference/cli/login.md
diff --git a/docs/cli/logout.md b/docs/reference/cli/logout.md
similarity index 100%
rename from docs/cli/logout.md
rename to docs/reference/cli/logout.md
diff --git a/docs/cli/netcheck.md b/docs/reference/cli/netcheck.md
similarity index 100%
rename from docs/cli/netcheck.md
rename to docs/reference/cli/netcheck.md
diff --git a/docs/cli/notifications.md b/docs/reference/cli/notifications.md
similarity index 100%
rename from docs/cli/notifications.md
rename to docs/reference/cli/notifications.md
diff --git a/docs/cli/notifications_pause.md b/docs/reference/cli/notifications_pause.md
similarity index 100%
rename from docs/cli/notifications_pause.md
rename to docs/reference/cli/notifications_pause.md
diff --git a/docs/cli/notifications_resume.md b/docs/reference/cli/notifications_resume.md
similarity index 100%
rename from docs/cli/notifications_resume.md
rename to docs/reference/cli/notifications_resume.md
diff --git a/docs/cli/open.md b/docs/reference/cli/open.md
similarity index 100%
rename from docs/cli/open.md
rename to docs/reference/cli/open.md
diff --git a/docs/cli/open_vscode.md b/docs/reference/cli/open_vscode.md
similarity index 100%
rename from docs/cli/open_vscode.md
rename to docs/reference/cli/open_vscode.md
diff --git a/docs/cli/ping.md b/docs/reference/cli/ping.md
similarity index 100%
rename from docs/cli/ping.md
rename to docs/reference/cli/ping.md
diff --git a/docs/cli/port-forward.md b/docs/reference/cli/port-forward.md
similarity index 100%
rename from docs/cli/port-forward.md
rename to docs/reference/cli/port-forward.md
diff --git a/docs/cli/provisionerd.md b/docs/reference/cli/provisionerd.md
similarity index 100%
rename from docs/cli/provisionerd.md
rename to docs/reference/cli/provisionerd.md
diff --git a/docs/cli/provisionerd_start.md b/docs/reference/cli/provisionerd_start.md
similarity index 100%
rename from docs/cli/provisionerd_start.md
rename to docs/reference/cli/provisionerd_start.md
diff --git a/docs/cli/publickey.md b/docs/reference/cli/publickey.md
similarity index 100%
rename from docs/cli/publickey.md
rename to docs/reference/cli/publickey.md
diff --git a/docs/cli/rename.md b/docs/reference/cli/rename.md
similarity index 100%
rename from docs/cli/rename.md
rename to docs/reference/cli/rename.md
diff --git a/docs/cli/reset-password.md b/docs/reference/cli/reset-password.md
similarity index 100%
rename from docs/cli/reset-password.md
rename to docs/reference/cli/reset-password.md
diff --git a/docs/cli/restart.md b/docs/reference/cli/restart.md
similarity index 100%
rename from docs/cli/restart.md
rename to docs/reference/cli/restart.md
diff --git a/docs/cli/schedule.md b/docs/reference/cli/schedule.md
similarity index 100%
rename from docs/cli/schedule.md
rename to docs/reference/cli/schedule.md
diff --git a/docs/cli/schedule_override-stop.md b/docs/reference/cli/schedule_override-stop.md
similarity index 100%
rename from docs/cli/schedule_override-stop.md
rename to docs/reference/cli/schedule_override-stop.md
diff --git a/docs/cli/schedule_show.md b/docs/reference/cli/schedule_show.md
similarity index 100%
rename from docs/cli/schedule_show.md
rename to docs/reference/cli/schedule_show.md
diff --git a/docs/cli/schedule_start.md b/docs/reference/cli/schedule_start.md
similarity index 100%
rename from docs/cli/schedule_start.md
rename to docs/reference/cli/schedule_start.md
diff --git a/docs/cli/schedule_stop.md b/docs/reference/cli/schedule_stop.md
similarity index 100%
rename from docs/cli/schedule_stop.md
rename to docs/reference/cli/schedule_stop.md
diff --git a/docs/cli/server.md b/docs/reference/cli/server.md
similarity index 100%
rename from docs/cli/server.md
rename to docs/reference/cli/server.md
diff --git a/docs/cli/server_create-admin-user.md b/docs/reference/cli/server_create-admin-user.md
similarity index 100%
rename from docs/cli/server_create-admin-user.md
rename to docs/reference/cli/server_create-admin-user.md
diff --git a/docs/cli/server_dbcrypt.md b/docs/reference/cli/server_dbcrypt.md
similarity index 100%
rename from docs/cli/server_dbcrypt.md
rename to docs/reference/cli/server_dbcrypt.md
diff --git a/docs/cli/server_dbcrypt_decrypt.md b/docs/reference/cli/server_dbcrypt_decrypt.md
similarity index 100%
rename from docs/cli/server_dbcrypt_decrypt.md
rename to docs/reference/cli/server_dbcrypt_decrypt.md
diff --git a/docs/cli/server_dbcrypt_delete.md b/docs/reference/cli/server_dbcrypt_delete.md
similarity index 100%
rename from docs/cli/server_dbcrypt_delete.md
rename to docs/reference/cli/server_dbcrypt_delete.md
diff --git a/docs/cli/server_dbcrypt_rotate.md b/docs/reference/cli/server_dbcrypt_rotate.md
similarity index 100%
rename from docs/cli/server_dbcrypt_rotate.md
rename to docs/reference/cli/server_dbcrypt_rotate.md
diff --git a/docs/cli/server_postgres-builtin-serve.md b/docs/reference/cli/server_postgres-builtin-serve.md
similarity index 100%
rename from docs/cli/server_postgres-builtin-serve.md
rename to docs/reference/cli/server_postgres-builtin-serve.md
diff --git a/docs/cli/server_postgres-builtin-url.md b/docs/reference/cli/server_postgres-builtin-url.md
similarity index 100%
rename from docs/cli/server_postgres-builtin-url.md
rename to docs/reference/cli/server_postgres-builtin-url.md
diff --git a/docs/cli/show.md b/docs/reference/cli/show.md
similarity index 100%
rename from docs/cli/show.md
rename to docs/reference/cli/show.md
diff --git a/docs/cli/speedtest.md b/docs/reference/cli/speedtest.md
similarity index 100%
rename from docs/cli/speedtest.md
rename to docs/reference/cli/speedtest.md
diff --git a/docs/cli/ssh.md b/docs/reference/cli/ssh.md
similarity index 100%
rename from docs/cli/ssh.md
rename to docs/reference/cli/ssh.md
diff --git a/docs/cli/start.md b/docs/reference/cli/start.md
similarity index 100%
rename from docs/cli/start.md
rename to docs/reference/cli/start.md
diff --git a/docs/cli/stat.md b/docs/reference/cli/stat.md
similarity index 100%
rename from docs/cli/stat.md
rename to docs/reference/cli/stat.md
diff --git a/docs/cli/stat_cpu.md b/docs/reference/cli/stat_cpu.md
similarity index 100%
rename from docs/cli/stat_cpu.md
rename to docs/reference/cli/stat_cpu.md
diff --git a/docs/cli/stat_disk.md b/docs/reference/cli/stat_disk.md
similarity index 100%
rename from docs/cli/stat_disk.md
rename to docs/reference/cli/stat_disk.md
diff --git a/docs/cli/stat_mem.md b/docs/reference/cli/stat_mem.md
similarity index 100%
rename from docs/cli/stat_mem.md
rename to docs/reference/cli/stat_mem.md
diff --git a/docs/cli/state.md b/docs/reference/cli/state.md
similarity index 100%
rename from docs/cli/state.md
rename to docs/reference/cli/state.md
diff --git a/docs/cli/state_pull.md b/docs/reference/cli/state_pull.md
similarity index 100%
rename from docs/cli/state_pull.md
rename to docs/reference/cli/state_pull.md
diff --git a/docs/cli/state_push.md b/docs/reference/cli/state_push.md
similarity index 100%
rename from docs/cli/state_push.md
rename to docs/reference/cli/state_push.md
diff --git a/docs/cli/stop.md b/docs/reference/cli/stop.md
similarity index 100%
rename from docs/cli/stop.md
rename to docs/reference/cli/stop.md
diff --git a/docs/cli/support.md b/docs/reference/cli/support.md
similarity index 100%
rename from docs/cli/support.md
rename to docs/reference/cli/support.md
diff --git a/docs/cli/support_bundle.md b/docs/reference/cli/support_bundle.md
similarity index 100%
rename from docs/cli/support_bundle.md
rename to docs/reference/cli/support_bundle.md
diff --git a/docs/cli/templates.md b/docs/reference/cli/templates.md
similarity index 100%
rename from docs/cli/templates.md
rename to docs/reference/cli/templates.md
diff --git a/docs/cli/templates_archive.md b/docs/reference/cli/templates_archive.md
similarity index 100%
rename from docs/cli/templates_archive.md
rename to docs/reference/cli/templates_archive.md
diff --git a/docs/cli/templates_create.md b/docs/reference/cli/templates_create.md
similarity index 100%
rename from docs/cli/templates_create.md
rename to docs/reference/cli/templates_create.md
diff --git a/docs/cli/templates_delete.md b/docs/reference/cli/templates_delete.md
similarity index 100%
rename from docs/cli/templates_delete.md
rename to docs/reference/cli/templates_delete.md
diff --git a/docs/cli/templates_edit.md b/docs/reference/cli/templates_edit.md
similarity index 100%
rename from docs/cli/templates_edit.md
rename to docs/reference/cli/templates_edit.md
diff --git a/docs/cli/templates_init.md b/docs/reference/cli/templates_init.md
similarity index 100%
rename from docs/cli/templates_init.md
rename to docs/reference/cli/templates_init.md
diff --git a/docs/cli/templates_list.md b/docs/reference/cli/templates_list.md
similarity index 100%
rename from docs/cli/templates_list.md
rename to docs/reference/cli/templates_list.md
diff --git a/docs/cli/templates_pull.md b/docs/reference/cli/templates_pull.md
similarity index 100%
rename from docs/cli/templates_pull.md
rename to docs/reference/cli/templates_pull.md
diff --git a/docs/cli/templates_push.md b/docs/reference/cli/templates_push.md
similarity index 100%
rename from docs/cli/templates_push.md
rename to docs/reference/cli/templates_push.md
diff --git a/docs/cli/templates_versions.md b/docs/reference/cli/templates_versions.md
similarity index 100%
rename from docs/cli/templates_versions.md
rename to docs/reference/cli/templates_versions.md
diff --git a/docs/cli/templates_versions_archive.md b/docs/reference/cli/templates_versions_archive.md
similarity index 100%
rename from docs/cli/templates_versions_archive.md
rename to docs/reference/cli/templates_versions_archive.md
diff --git a/docs/cli/templates_versions_list.md b/docs/reference/cli/templates_versions_list.md
similarity index 100%
rename from docs/cli/templates_versions_list.md
rename to docs/reference/cli/templates_versions_list.md
diff --git a/docs/cli/templates_versions_unarchive.md b/docs/reference/cli/templates_versions_unarchive.md
similarity index 100%
rename from docs/cli/templates_versions_unarchive.md
rename to docs/reference/cli/templates_versions_unarchive.md
diff --git a/docs/cli/tokens.md b/docs/reference/cli/tokens.md
similarity index 100%
rename from docs/cli/tokens.md
rename to docs/reference/cli/tokens.md
diff --git a/docs/cli/tokens_create.md b/docs/reference/cli/tokens_create.md
similarity index 100%
rename from docs/cli/tokens_create.md
rename to docs/reference/cli/tokens_create.md
diff --git a/docs/cli/tokens_list.md b/docs/reference/cli/tokens_list.md
similarity index 100%
rename from docs/cli/tokens_list.md
rename to docs/reference/cli/tokens_list.md
diff --git a/docs/cli/tokens_remove.md b/docs/reference/cli/tokens_remove.md
similarity index 100%
rename from docs/cli/tokens_remove.md
rename to docs/reference/cli/tokens_remove.md
diff --git a/docs/cli/unfavorite.md b/docs/reference/cli/unfavorite.md
similarity index 100%
rename from docs/cli/unfavorite.md
rename to docs/reference/cli/unfavorite.md
diff --git a/docs/cli/update.md b/docs/reference/cli/update.md
similarity index 100%
rename from docs/cli/update.md
rename to docs/reference/cli/update.md
diff --git a/docs/cli/users.md b/docs/reference/cli/users.md
similarity index 100%
rename from docs/cli/users.md
rename to docs/reference/cli/users.md
diff --git a/docs/cli/users_activate.md b/docs/reference/cli/users_activate.md
similarity index 100%
rename from docs/cli/users_activate.md
rename to docs/reference/cli/users_activate.md
diff --git a/docs/cli/users_create.md b/docs/reference/cli/users_create.md
similarity index 100%
rename from docs/cli/users_create.md
rename to docs/reference/cli/users_create.md
diff --git a/docs/cli/users_delete.md b/docs/reference/cli/users_delete.md
similarity index 100%
rename from docs/cli/users_delete.md
rename to docs/reference/cli/users_delete.md
diff --git a/docs/cli/users_list.md b/docs/reference/cli/users_list.md
similarity index 100%
rename from docs/cli/users_list.md
rename to docs/reference/cli/users_list.md
diff --git a/docs/cli/users_show.md b/docs/reference/cli/users_show.md
similarity index 100%
rename from docs/cli/users_show.md
rename to docs/reference/cli/users_show.md
diff --git a/docs/cli/users_suspend.md b/docs/reference/cli/users_suspend.md
similarity index 100%
rename from docs/cli/users_suspend.md
rename to docs/reference/cli/users_suspend.md
diff --git a/docs/cli/version.md b/docs/reference/cli/version.md
similarity index 100%
rename from docs/cli/version.md
rename to docs/reference/cli/version.md
diff --git a/docs/cli/whoami.md b/docs/reference/cli/whoami.md
similarity index 100%
rename from docs/cli/whoami.md
rename to docs/reference/cli/whoami.md
diff --git a/docs/start/README.md b/docs/start/README.md
new file mode 100644
index 0000000000000..a833100756b92
--- /dev/null
+++ b/docs/start/README.md
@@ -0,0 +1,108 @@
+# About Coder
+
+Coder is an open-source platform for creating and managing developer workspaces
+on your preferred clouds and servers.
+
+
+
+
+
+By building on top of common development interfaces (SSH) and infrastructure tools (Terraform), Coder aims to make the process of **provisioning** and **accessing** remote workspaces approachable for organizations of various sizes and stages of cloud-native maturity.
+
+
+
+## How it works
+
+Coder workspaces are represented with Terraform, but no Terraform knowledge is
+required to get started. We have a database of pre-made templates built into the
+product.
+
+
+
+
+
+Coder workspaces don't stop at compute. You can add storage buckets, secrets, sidecars
+and whatever else Terraform lets you dream up.
+
+[Learn more about managing infrastructure.](./templates/index.md)
+
+## IDE Support
+
+You can use any Web IDE ([code-server](https://github.com/coder/code-server), [projector](https://github.com/JetBrains/projector-server), [Jupyter](https://jupyter.org/), etc.), [JetBrains Gateway](https://www.jetbrains.com/remote-development/gateway/), [VS Code Remote](https://code.visualstudio.com/docs/remote/ssh-tutorial) or even a file sync such as [mutagen](https://mutagen.io/).
+
+
+
+
+
+## Why remote development
+
+Migrating from local developer machines to workspaces hosted by cloud services
+is an [increasingly common solution for
+developers](https://blog.alexellis.io/the-internet-is-my-computer/) and
+[organizations
+alike](https://slack.engineering/development-environments-at-slack). There are
+several benefits, including:
+
+- **Increased speed:** Server-grade compute speeds up operations in software
+ development, such as IDE loading, code compilation and building, and the
+ running of large workloads (such as those for monolith or microservice
+ applications)
+
+- **Easier environment management:** Tools such as Terraform, nix, Docker,
+ devcontainers, and so on make developer onboarding and the troubleshooting of
+ development environments easier
+
+- **Increase security:** Centralize source code and other data onto private
+ servers or cloud services instead of local developer machines
+
+- **Improved compatibility:** Remote workspaces share infrastructure
+ configuration with other development, staging, and production environments,
+ reducing configuration drift
+
+- **Improved accessibility:** Devices such as lightweight notebooks,
+ Chromebooks, and iPads can connect to remote workspaces via browser-based IDEs
+ or remote IDE extensions
+
+## Why Coder
+
+The key difference between Coder OSS and other remote IDE platforms is the added
+layer of infrastructure control. This additional layer allows admins to:
+
+- Support ARM, Windows, Linux, and macOS workspaces
+- Modify pod/container specs (e.g., adding disks, managing network policies,
+ setting/updating environment variables)
+- Use VM/dedicated workspaces, developing with Kernel features (no container
+ knowledge required)
+- Enable persistent workspaces, which are like local machines, but faster and
+ hosted by a cloud service
+
+Coder includes [production-ready templates](https://github.com/coder/coder/tree/c6b1daabc5a7aa67bfbb6c89966d728919ba7f80/examples/templates) for use with AWS EC2,
+Azure, Google Cloud, Kubernetes, and more.
+
+## What Coder is _not_
+
+- Coder is not an infrastructure as code (IaC) platform. Terraform is the first
+ IaC _provisioner_ in Coder, allowing Coder admins to define Terraform
+ resources as Coder workspaces.
+
+- Coder is not a DevOps/CI platform. Coder workspaces can follow best practices
+ for cloud service-based workloads, but Coder is not responsible for how you
+ define or deploy the software you write.
+
+- Coder is not an online IDE. Instead, Coder supports common editors, such as VS
+ Code, vim, and JetBrains, over HTTPS or SSH.
+
+- Coder is not a collaboration platform. You can use git and dedicated IDE
+ extensions for pull requests, code reviews, and pair programming.
+
+- Coder is not a SaaS/fully-managed offering. You must host
+ Coder on a cloud service (AWS, Azure, GCP) or your private data center.
+
+## Up next
+
+- Learn about [Templates](./templates/index.md)
+- [Install Coder](./install/index.md#install-coder)
diff --git a/docs/start/coder-tour.md b/docs/start/coder-tour.md
new file mode 100644
index 0000000000000..9263b11e6313d
--- /dev/null
+++ b/docs/start/coder-tour.md
@@ -0,0 +1,185 @@
+## Tour Coder and Set up your first deployment.
+
+For day-zero Coder users, we recommend following this guide to set up a local
+Coder deployment, create your first template, and connect to a workspace. This
+is completely free and leverages our
+[open source repository](https://github.com/coder/coder).
+
+We'll use [Docker](https://docs.docker.com/engine) to manage the compute for a
+slim deployment to experiment with [workspaces](../user-guides/README.md) and
+[templates](../admin/templates/README.md).
+
+Docker is not necessary for every Coder deployment and is only used here for
+simplicity.
+
+# Set up your Coder Deployment
+
+## 1. Install Docker
+
+First, install [Docker](https://docs.docker.com/engine/install/) locally.
+
+> If you already have the Coder binary installed, restart it after installing
+> Docker.
+
+## 2. Install Coder daemon
+
+
+
+## Linux/macOS
+
+Our install script is the fastest way to install Coder on Linux/macOS:
+
+```sh
+curl -L https://coder.com/install.sh | sh
+```
+
+## Windows
+
+> **Important:** If you plan to use the built-in PostgreSQL database, you will
+> need to ensure that the
+> [Visual C++ Runtime](https://learn.microsoft.com/en-US/cpp/windows/latest-supported-vc-redist#latest-microsoft-visual-c-redistributable-version)
+> is installed.
+
+You can use the
+[`winget`](https://learn.microsoft.com/en-us/windows/package-manager/winget/#use-winget)
+package manager to install Coder:
+
+```powershell
+winget install Coder.Coder
+```
+
+
+
+## 3. Start the server
+
+To start or restart the Coder deployment, use the following command:
+
+```shell
+coder server
+```
+
+The output will provide you with a URL to access your deployment, where you'll
+create your first administrator account.
+
+
+
+Once you've signed in, you'll be brought to an empty workspaces page, which
+we'll soon populate with your first development environments.
+
+### More information on the Coder Server
+
+# Create your first template
+
+A common way to create a template is to begin with a starter template then
+modify it for your needs. Coder makes this easy with starter templates for
+popular development targets like Docker, Kubernetes, Azure, and so on. Once your
+template is up and running, you can edit it in the Coder dashboard. Coder even
+handles versioning for you so you can publish official updates or revert to
+previous versions.
+
+In this tutorial, you'll create your first template from the Docker starter
+template.
+
+## 1. Choose a starter template
+
+Select **Templates** to see the **Starter Templates**. Use the **Docker
+Containers** template by pressing **Use Template**.
+
+
+
+> You can also a find a comprehensive list of starter templates in **Templates**
+> -> **Create Template** -> **Starter Templates**.
+
+## 2. Create your template
+
+In **Create template**, fill in **Name** and **Display name**, then select
+**Create template**.
+
+
+
+TODO:
+
+- add CLI guide for making a new template
+- refactor text below to be more beginner-friendly
+
+# Create a workspace
+
+## 1. Create a workspace from your template
+
+When the template is ready, select **Create Workspace**.
+
+
+
+In **New workspace**, fill in **Name** then scroll down to select **Create
+Workspace**.
+
+
+
+Coder starts your new workspace from your template.
+
+After a few seconds, your workspace is ready to use.
+
+
+
+## 4. Try out your new workspace
+
+This starter template lets you connect to your workspace in a few ways:
+
+- VS Code Desktop: Loads your workspace into
+ [VS Code Desktop](https://code.visualstudio.com/Download) installed on your
+ local computer.
+- code-server: Opens [browser-based VS Code](../ides/web-ides.md) with your
+ workspace.
+- Terminal: Opens a browser-based terminal with a shell in the workspace's
+ Docker instance.
+- SSH: Use SSH to log in to the workspace from your local machine. If you
+ haven't already, you'll have to install Coder on your local machine to
+ configure your SSH client.
+
+> **Tip**: You can edit the template to let developers connect to a workspace in
+> [a few more ways](../ides.md).
+
+When you're done, you can stop the workspace.
+
+## 6. Modify your template
+
+Now you can modify your template to suit your team's needs.
+
+Let's replace the `golang` package in the Docker image with the `python3`
+package. You can do this by editing the template's `Dockerfile` directly in your
+web browser.
+
+In the Coder dashboard, select **Templates** then your first template.
+
+
+
+In the drop-down menu, select **Edit files**.
+
+
+
+Expand the **build** directory and select **Dockerfile**.
+
+
+
+Edit `build/Dockerfile` to replace `golang` with `python3`.
+
+
+
+Select **Build template** and wait for Coder to prepare the template for
+workspaces.
+
+
+
+Select **Publish version**. In the **Publish new version** dialog, make sure
+**Promote to default version** is checked then select **Publish**.
+
+
+
+Now when developers create a new workspace from this template, they can use
+Python 3 instead of Go.
+
+For developers with workspaces that were created with a previous version of your
+template, Coder will notify them that there's a new version of the template.
+
+You can also handle [change management](./change-management.md) through your own
+repo and continuous integration.
diff --git a/docs/templates/tutorial.md b/docs/start/first-template.md
similarity index 77%
rename from docs/templates/tutorial.md
rename to docs/start/first-template.md
index 7063b7b288e7d..ca062aa18052c 100644
--- a/docs/templates/tutorial.md
+++ b/docs/start/first-template.md
@@ -12,48 +12,47 @@ template.
## Before you start
-You'll need a computer or cloud computing instance with both
+Use the [previous section](./local-deploy.md) of this guide to set up
[Docker](https://docs.docker.com/get-docker/) and [Coder](../install/index.md)
-installed on it.
-
-> When setting up your computer or computing instance, make sure to install
-> Docker first, then Coder.
+on your local machine to continue.
## 1. Log in to Coder
-In your web browser, go to your Coder dashboard to log in.
+In your web browser, go to your Coder dashboard using the URL provided during
+setup to log in.
## 2. Choose a starter template
-Select **Templates** > **Starter Templates**.
-
-
+Select **Templates** to see the **Starter Templates**. Use the **Docker
+Containers** template by pressing **Use Template**.
-In **Filter**, select **Docker** then select **Develop in Docker**.
+
-
+> You can also a find a comprehensive list of starter templates in **Templates**
+> -> **Create Template** -> **Starter Templates**. s
-Select **Use template**.
+## 3. Create your template
-
+In **Create template**, fill in **Name** and **Display name**, then select
+**Create template**.
-## 3. Create your template
+
-In **Create template**, fill in **Name** and **Display name**,then scroll down
-and select **Create template**.
+TODO:
-
+- add CLI guide for making a new template
+- refactor text below to be more beginner-friendly
-## 4. Create a workspace from your template
+
## 6. Modify your template
diff --git a/docs/start/first-workspace.md b/docs/start/first-workspace.md
new file mode 100644
index 0000000000000..09ef7aa73168f
--- /dev/null
+++ b/docs/start/first-workspace.md
@@ -0,0 +1,67 @@
+# Creating your first coder workspace
+
+A workspace is the environment that a developer works in. Developers in a team
+each work from their own workspace and can use [multiple IDEs](../ides.md).
+
+A developer creates a workspace from a
+[shared template](../tutorials/templates/README.md). This lets an entire team
+work in environments that are identically configured and provisioned with the
+same resources.
+
+## Before you begin
+
+This guide will use the Docker template from the
+[previous step](./first-template.md) to create and connect to a Coder workspace.
+
+## 1. Create a workspace from your template through the GUI
+
+You can create a workspace in the UI. Log in to your Coder instance, go to the
+**Templates** tab, find the template you need, and select **Create Workspace**.
+
+
+
+In **New workspace**, fill in **Name** then scroll down to select **Create
+Workspace**.
+
+
+
+Coder starts your new workspace from your template.
+
+After a few seconds, your workspace is ready to use.
+
+
+
+## 2. Try out your new workspace
+
+The Docker starter template lets you connect to your workspace in a few ways:
+
+- VS Code Desktop: Loads your workspace into
+ [VS Code Desktop](https://code.visualstudio.com/Download) installed on your
+ local computer.
+- code-server: Opens [browser-based VS Code](../ides/web-ides.md) with your
+ workspace.
+- Terminal: Opens a browser-based terminal with a shell in the workspace's
+ Docker instance.
+- SSH: Use SSH to log in to the workspace from your local machine. If you
+ haven't already, you'll have to install Coder on your local machine to
+ configure your SSH client.
+
+> **Tip**: You can edit the template to let developers connect to a workspace in
+> [a few more ways](../ides.md).
+
+## 3. Modify your workspace settings
+
+Developers can modify attributes of their workspace including update policy,
+scheduling, and parameters which define their development environment.
+
+Once you're finished, you can stop your workspace.
+
+
+
+## Read more on using workspaces
+
+- Creating workspaces with the CLI
+- Creating worksapces with the API
+-
+
+## Next Steps
diff --git a/docs/start/local-deploy.md b/docs/start/local-deploy.md
new file mode 100644
index 0000000000000..b373eb8c06a49
--- /dev/null
+++ b/docs/start/local-deploy.md
@@ -0,0 +1,66 @@
+## Setting up a Coder deployment
+
+For day-zero Coder users, we recommend following this guide to set up a local
+Coder deployment from our
+[open source repository](https://github.com/coder/coder).
+
+We'll use [Docker](https://docs.docker.com/engine) to manage the compute for a
+slim deployment to experiment with [workspaces](../user-guides/README.md) and
+[templates](../admin/templates/README.md).
+
+Docker is not necessary for every Coder deployment and is only used here for
+simplicity.
+
+### Install Coder daemon
+
+First, install [Docker](https://docs.docker.com/engine/install/) locally.
+
+> If you already have the Coder binary installed, restart it after installing
+> Docker.
+
+
+
+## Linux/macOS
+
+Our install script is the fastest way to install Coder on Linux/macOS:
+
+```sh
+curl -L https://coder.com/install.sh | sh
+```
+
+## Windows
+
+> **Important:** If you plan to use the built-in PostgreSQL database, you will
+> need to ensure that the
+> [Visual C++ Runtime](https://learn.microsoft.com/en-US/cpp/windows/latest-supported-vc-redist#latest-microsoft-visual-c-redistributable-version)
+> is installed.
+
+You can use the
+[`winget`](https://learn.microsoft.com/en-us/windows/package-manager/winget/#use-winget)
+package manager to install Coder:
+
+```powershell
+winget install Coder.Coder
+```
+
+
+
+### Start the server
+
+To start or restart the Coder deployment, use the following command:
+
+```shell
+coder server
+```
+
+The output will provide you with an access URL to create your first
+administrator account.
+
+
+
+Once you've signed in, you'll be brought to an empty workspaces page, which
+we'll soon populate with your first development environments.
+
+### Next steps
+
+TODO: Add link to next page.
diff --git a/docs/about/screenshots.md b/docs/start/screenshots.md
similarity index 100%
rename from docs/about/screenshots.md
rename to docs/start/screenshots.md
diff --git a/docs/start/why-coder.md b/docs/start/why-coder.md
new file mode 100644
index 0000000000000..94dd8e58b6216
--- /dev/null
+++ b/docs/start/why-coder.md
@@ -0,0 +1,3 @@
+# Why use Coder
+
+TODO: Make this page!
diff --git a/docs/templates/README.md b/docs/templates/README.md
deleted file mode 100644
index 253f58848f00b..0000000000000
--- a/docs/templates/README.md
+++ /dev/null
@@ -1,422 +0,0 @@
-# Templates
-
-Templates are written in [Terraform](https://www.terraform.io/) and describe the
-infrastructure for workspaces (e.g., docker_container, aws_instance,
-kubernetes_pod).
-
-In most cases, a small group of users (team leads or Coder administrators) [have permissions](../admin/users.md#roles) to create and manage templates. Then, other
-users provision their [workspaces](../workspaces.md) from templates using the UI
-or CLI.
-
-## Get the CLI
-
-The CLI and the server are the same binary. We did this to encourage virality so
-individuals can start their own Coder deployments.
-
-From your local machine, download the CLI for your operating system from the
-[releases](https://github.com/coder/coder/releases/latest) or run:
-
-```shell
-curl -fsSL https://coder.com/install.sh | sh
-```
-
-To see the sub-commands for managing templates, run:
-
-```shell
-coder templates --help
-```
-
-## Login to your Coder Deployment
-
-Before you can create templates, you must first login to your Coder deployment
-with the CLI.
-
-```shell
-coder login https://coder.example.com # aka the URL to your coder instance
-```
-
-This will open a browser and ask you to authenticate to your Coder deployment,
-returning an API Key.
-
-> Make a note of the API Key. You can re-use the API Key in future CLI logins or
-> sessions.
-
-```shell
-coder --token login https://coder.example.com/ # aka the URL to your coder instance
-```
-
-## Add a template
-
-Before users can create workspaces, you'll need at least one template in Coder.
-
-```shell
-# create a local directory to store templates
-mkdir -p $HOME/coder/templates
-cd $HOME/coder/templates
-
-# start from an example
-coder templates init
-
-# optional: modify the template
-vim /main.tf
-
-# add the template to Coder deployment
-coder templates create
-```
-
-> See the documentation and source code for each example as well as community
-> templates in the
-> [examples/](https://github.com/coder/coder/tree/main/examples/templates)
-> directory in the repo.
-
-## Configure Max Workspace Autostop
-
-To control cost, specify a maximum time to live flag for a template in hours or
-minutes.
-
-```shell
-coder templates create my-template --default-ttl 4h
-```
-
-## Customize templates
-
-Example templates are not designed to support every use (e.g
-[examples/aws-linux](https://github.com/coder/coder/tree/main/examples/templates/aws-linux)
-does not support custom VPCs). You can add these features by editing the
-Terraform code once you run `coder templates init` (new) or `coder templates pull` (existing).
-
-Refer to the following resources to build your own templates:
-
-- Terraform: [Documentation](https://developer.hashicorp.com/terraform/docs) and
- [Registry](https://registry.terraform.io)
-- Common [concepts in templates](#concepts-in-templates) and [Coder Terraform provider](https://registry.terraform.io/providers/coder/coder/latest/docs)
-- [Coder example templates](https://github.com/coder/coder/tree/main/examples/templates) code
-
-## Concepts in templates
-
-While templates are written with standard Terraform, the [Coder Terraform Provider](https://registry.terraform.io/providers/coder/coder/latest/docs) is used to define the workspace lifecycle and establish a connection from resources
-to Coder.
-
-Below is an overview of some key concepts in templates (and workspaces). For all
-template options, reference [Coder Terraform provider docs](https://registry.terraform.io/providers/coder/coder/latest/docs).
-
-### Resource
-
-Resources in Coder are simply [Terraform resources](https://www.terraform.io/language/resources).
-If a Coder agent is attached to a resource, users can connect directly to the
-resource over SSH or web apps.
-
-### Coder agent
-
-Once a Coder workspace is created, the Coder agent establishes a connection
-between a resource (docker_container) and Coder, so that a user can connect to
-their workspace from the web UI or CLI. A template can have multiple agents to
-allow users to connect to multiple resources in their workspace.
-
-> Resources must download and start the Coder agent binary to connect to Coder.
-> This means the resource must be able to reach your Coder URL.
-
-```hcl
-data "coder_workspace" "me" {
-}
-
-resource "coder_agent" "pod1" {
- os = "linux"
- arch = "amd64"
-}
-
-resource "kubernetes_pod" "pod1" {
- spec {
- ...
- container {
- command = ["sh", "-c", coder_agent.pod1.init_script]
- env {
- name = "CODER_AGENT_TOKEN"
- value = coder_agent.dev.token
- }
- }
- }
-}
-```
-
-The `coder_agent` resource can be configured with additional arguments. For example,
-you can use the `env` property to set environment variables that will be inherited
-by all child processes of the agent, including SSH sessions. See the
-[Coder Terraform Provider documentation](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/agent)
-for the full list of supported arguments for the `coder_agent`.
-
-#### startup_script
-
-Use the Coder agent's `startup_script` to run additional commands like
-installing IDEs, [cloning dotfiles](../dotfiles.md#templates), and cloning
-project repos.
-
-```hcl
-resource "coder_agent" "coder" {
- os = "linux"
- arch = "amd64"
- dir = "/home/coder"
- startup_script = </tmp/code-server.log 2>&1 &
-
-# var.repo and var.dotfiles_uri is specified
-# elsewhere in the Terraform code as input
-# variables.
-
-# clone repo
-ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
-git clone --progress git@github.com:${var.repo}
-
-# use coder CLI to clone and install dotfiles
-coder dotfiles -y ${var.dotfiles_uri}
-
- EOT
-}
-```
-
-### Start/stop
-
-[Learn about resource persistence in Coder](./resource-persistence.md)
-
-Coder workspaces can be started/stopped. This is often used to save on cloud
-costs or enforce ephemeral workflows. When a workspace is started or stopped,
-the Coder server runs an additional [terraform apply](https://www.terraform.io/cli/commands/apply),
-informing the Coder provider that the workspace has a new transition state.
-
-This template sample has one persistent resource (docker volume) and one
-ephemeral resource (docker container).
-
-```hcl
-data "coder_workspace" "me" {
-}
-
-resource "docker_volume" "home_volume" {
- # persistent resource (remains a workspace is stopped)
- count = 1
- name = "coder-${data.coder_workspace.me.id}-home"
- lifecycle {
- ignore_changes = all
- }
-}
-
-resource "docker_container" "workspace" {
- # ephemeral resource (deleted when workspace is stopped, created when started)
- count = data.coder_workspace.me.start_count # 0 (stopped), 1 (started)
- volumes {
- container_path = "/home/coder/"
- volume_name = docker_volume.home_volume.name
- read_only = false
- }
- # ... other config
-}
-```
-
-#### Using updated images when rebuilding a workspace
-
-To ensure that Coder uses an updated image when rebuilding a workspace, we
-suggest that admins update the tag in the template (e.g., `my-image:v0.4.2` ->
-`my-image:v0.4.3`) or digest (`my-image@sha256:[digest]` ->
-`my-image@sha256:[new_digest]`).
-
-Alternatively, if you're willing to wait for longer start times from Coder, you
-can set the `imagePullPolicy` to `Always` in your Terraform template; when set,
-Coder will check `image:tag` on every build and update if necessary:
-
-```hcl
-resource "kubernetes_pod" "podName" {
- spec {
- container {
- image_pull_policy = "Always"
- }
- }
-}
-```
-
-### Edit templates
-
-You can edit a template using the coder CLI or the UI. Only [template admins and
-owners](../admin/users.md) can edit a template.
-
-Using the UI, navigate to the template page, click on the menu, and select "Edit files". In the template editor, you create, edit and remove files. Before publishing a new template version, you can test your modifications by clicking the "Build template" button. Newly published template versions automatically become the default version selection when creating a workspace.
-
-> **Tip**: Even without publishing a version as active, you can still use it to create a workspace before making it the default for everybody in your organization. This may help you debug new changes without impacting others.
-
-Using the CLI, login to Coder and run the following command to edit a single
-template:
-
-```shell
-coder templates edit --description "This is my template"
-```
-
-Review editable template properties by running `coder templates edit -h`.
-
-Alternatively, you can pull down the template as a tape archive (`.tar`) to your
-current directory:
-
-```shell
-coder templates pull file.tar
-```
-
-Then, extract it by running:
-
-```shell
-tar -xf file.tar
-```
-
-Make the changes to your template then run this command from the root of the
-template folder:
-
-```shell
-coder templates push
-```
-
-Your updated template will now be available. Outdated workspaces will have a
-prompt in the dashboard to update.
-
-### Delete templates
-
-You can delete a template using both the coder CLI and UI. Only [template admins
-and owners](../admin/users.md) can delete a template, and the template must not
-have any running workspaces associated to it.
-
-Using the CLI, login to Coder and run the following command to delete a
-template:
-
-```shell
-coder templates delete
-```
-
-In the UI, navigate to the template you want to delete, and select the dropdown
-in the right-hand corner of the page to delete the template.
-
-
-
-#### Delete workspaces
-
-When a workspace is deleted, the Coder server essentially runs a [terraform
-destroy](https://www.terraform.io/cli/commands/destroy) to remove all resources
-associated with the workspace.
-
-> Terraform's
-> [prevent-destroy](https://www.terraform.io/language/meta-arguments/lifecycle#prevent_destroy)
-> and
-> [ignore-changes](https://www.terraform.io/language/meta-arguments/lifecycle#ignore_changes)
-> meta-arguments can be used to prevent accidental data loss.
-
-### Coder apps
-
-By default, all templates allow developers to connect over SSH and a web
-terminal. See [Configuring Web IDEs](../ides/web-ides.md) to learn how to give
-users access to additional web applications.
-
-### Data source
-
-When a workspace is being started or stopped, the `coder_workspace` data source
-provides some useful parameters. See the [Coder Terraform provider](https://registry.terraform.io/providers/coder/coder/latest/docs/data-sources/workspace) for more information.
-
-For example, the [Docker quick-start template](https://github.com/coder/coder/tree/main/examples/templates/docker)
-sets a few environment variables based on the username and email address of the
-workspace's owner, so that you can make Git commits immediately without any
-manual configuration:
-
-```hcl
-resource "coder_agent" "main" {
- # ...
- env = {
- GIT_AUTHOR_NAME = "${data.coder_workspace.me.owner}"
- GIT_COMMITTER_NAME = "${data.coder_workspace.me.owner}"
- GIT_AUTHOR_EMAIL = "${data.coder_workspace.me.owner_email}"
- GIT_COMMITTER_EMAIL = "${data.coder_workspace.me.owner_email}"
- }
-}
-```
-
-You can add these environment variable definitions to your own templates, or
-customize them however you like.
-
-## Troubleshooting templates
-
-Occasionally, you may run into scenarios where a workspace is created, but the
-agent is either not connected or the [startup script](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/agent#startup_script)
-has failed or timed out.
-
-### Agent connection issues
-
-If the agent is not connected, it means the agent or [init script](https://github.com/coder/coder/tree/main/provisionersdk/scripts)
-has failed on the resource.
-
-```console
-$ coder ssh myworkspace
-⢄⡱ Waiting for connection from [agent]...
-```
-
-While troubleshooting steps vary by resource, here are some general best
-practices:
-
-- Ensure the resource has `curl` installed (alternatively, `wget` or `busybox`)
-- Ensure the resource can `curl` your Coder [access
- URL](../admin/configure.md#access-url)
-- Manually connect to the resource and check the agent logs (e.g., `kubectl exec`, `docker exec` or AWS console)
- - The Coder agent logs are typically stored in `/tmp/coder-agent.log`
- - The Coder agent startup script logs are typically stored in `/tmp/coder-startup-script.log`
- - The Coder agent shutdown script logs are typically stored in `/tmp/coder-shutdown-script.log`
-- This can also happen if the websockets are not being forwarded correctly when running Coder behind a reverse proxy. [Read our reverse-proxy docs](../admin/configure.md#tls--reverse-proxy)
-
-### Agent does not become ready
-
-If the agent does not become ready, it means the [startup script](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/agent#startup_script) is still running or has exited with a non-zero status. This also means the [login before ready](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/agent#login_before_ready) option hasn't been set to true.
-
-```console
-$ coder ssh myworkspace
-⢄⡱ Waiting for [agent] to become ready...
-```
-
-To troubleshoot readiness issues, check the agent logs as suggested above. You can connect to the workspace using `coder ssh` with the `--no-wait` flag. Please note that while this makes login possible, the workspace may be in an incomplete state.
-
-```console
-$ coder ssh myworkspace --no-wait
-
- > The workspace is taking longer than expected to get
- ready, the agent startup script is still executing.
- See troubleshooting instructions at: [...]
-
-user@myworkspace $
-```
-
-If the startup script is expected to take a long time, you can try raising the timeout defined in the template:
-
-```tf
-resource "coder_agent" "main" {
- # ...
- login_before_ready = false
- startup_script_timeout = 1800 # 30 minutes in seconds.
-}
-```
-
-## Template permissions (enterprise)
-
-Template permissions can be used to give users and groups access to specific
-templates. [Learn more about RBAC](../admin/rbac.md) to learn how to manage
-
-## Community Templates
-
-You can see a list of community templates by our users
-[here](https://github.com/coder/coder/blob/main/examples/templates/community-templates.md).
-
-## Next Steps
-
-- Learn about [Authentication & Secrets](./authentication.md)
-- Learn about [Change Management](./change-management.md)
-- Learn about [Resource Metadata](./resource-metadata.md)
-- Learn about [Workspaces](../workspaces.md)
diff --git a/docs/templates/authentication.md b/docs/templates/authentication.md
deleted file mode 100644
index 770aeb3179927..0000000000000
--- a/docs/templates/authentication.md
+++ /dev/null
@@ -1,48 +0,0 @@
-# Provider Authentication
-
-
-
- Do not store secrets in templates. Assume every user has cleartext access
- to every template.
-
-
-
-The Coder server's
-[provisioner](https://registry.terraform.io/providers/coder/coder/latest/docs/data-sources/provisioner)
-process needs to authenticate with other provider APIs to provision workspaces.
-There are two approaches to do this:
-
-- Pass credentials to the provisioner as parameters.
-- Preferred: Execute the Coder server in an environment that is authenticated
- with the provider.
-
-We encourage the latter approach where supported:
-
-- Simplifies the template.
-- Keeps provider credentials out of Coder's database, making it a less valuable
- target for attackers.
-- Compatible with agent-based authentication schemes, which handle credential
- rotation or ensure the credentials are not written to disk.
-
-Generally, you can set up an environment to provide credentials to Coder in
-these ways:
-
-- A well-known location on disk. For example, `~/.aws/credentials` for AWS on
- POSIX systems.
-- Environment variables.
-
-It is usually sufficient to authenticate using the CLI or SDK for the provider
-before running Coder, but check the Terraform provider's documentation for
-details.
-
-These platforms have Terraform providers that support authenticated
-environments:
-
-- [Google Cloud](https://registry.terraform.io/providers/hashicorp/google/latest/docs)
-- [Amazon Web Services](https://registry.terraform.io/providers/hashicorp/aws/latest/docs)
-- [Microsoft Azure](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs)
-- [Kubernetes](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs)
-
-Other providers might also support authenticated environments. Check the
-[documentation of the Terraform provider](https://registry.terraform.io/browse/providers)
-for details.
diff --git a/docs/templates/best-practices.md b/docs/templates/best-practices.md
deleted file mode 100644
index 71aed19447d39..0000000000000
--- a/docs/templates/best-practices.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Template best practices
-
-We recommend a few ways to manage workspace resources, authentication, and
-versioning.
-
-
-
diff --git a/docs/templates/change-management.md b/docs/templates/change-management.md
deleted file mode 100644
index fe995070ce780..0000000000000
--- a/docs/templates/change-management.md
+++ /dev/null
@@ -1,32 +0,0 @@
-# Template Change Management
-
-We recommend source-controlling your templates as you would other code. You can
-[install Coder](../install/) in CI/CD pipelines to push new template versions.
-
-```console
-# Install the Coder CLI
-curl -L https://coder.com/install.sh | sh
-# curl -L https://coder.com/install.sh | sh -s -- --version=0.x
-
-# To create API tokens, use `coder tokens create`.
-# If no `--lifetime` flag is passed during creation, the default token lifetime
-# will be 30 days.
-# These variables are consumed by Coder
-export CODER_URL=https://coder.example.com
-export CODER_SESSION_TOKEN=*****
-
-# Template details
-export CODER_TEMPLATE_NAME=kubernetes
-export CODER_TEMPLATE_DIR=.coder/templates/kubernetes
-export CODER_TEMPLATE_VERSION=$(git rev-parse --short HEAD)
-
-# Push the new template version to Coder
-coder templates push --yes $CODER_TEMPLATE_NAME \
- --directory $CODER_TEMPLATE_DIR \
- --name=$CODER_TEMPLATE_VERSION # Version name is optional
-```
-
-To cap token lifetime on creation,
-[configure Coder server to set a shorter max token lifetime](../cli/server.md#--max-token-lifetime).
-For an example, see how we push our development image and template
-[with GitHub actions](https://github.com/coder/coder/blob/main/.github/workflows/dogfood.yaml).
diff --git a/docs/templates/configuration.md b/docs/templates/configuration.md
deleted file mode 100644
index 42f19c1403f81..0000000000000
--- a/docs/templates/configuration.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# Administering Templates
-
-Templates offer a variety of configuration options to template admins.
-
-
-
diff --git a/docs/templates/customizing.md b/docs/templates/customizing.md
deleted file mode 100644
index 16a951243371c..0000000000000
--- a/docs/templates/customizing.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# Customizing templates
-
-You can give developers more information and control over their workspaces:
-
-
-
diff --git a/docs/templates/dependencies.md b/docs/templates/dependencies.md
deleted file mode 100644
index a3949f1c0e4e6..0000000000000
--- a/docs/templates/dependencies.md
+++ /dev/null
@@ -1,113 +0,0 @@
-# Template Dependencies
-
-When creating Coder templates, it is unlikely that you will just be using
-built-in providers. Part of Terraform's flexibility stems from its rich plugin
-ecosystem, and it makes sense to take advantage of this.
-
-That having been said, here are some recommendations to follow, based on the
-[Terraform documentation](https://developer.hashicorp.com/terraform/tutorials/configuration-language/provider-versioning).
-
-Following these recommendations will:
-
-- **Prevent unexpected changes:** Your templates will use the same versions of
- Terraform providers each build. This will prevent issues related to changes in
- providers.
-- **Improve build performance:** Coder caches provider versions on each build.
- If the same provider version can be re-used on subsequent builds, Coder will
- simply re-use the cached version if it is available.
-- **Improve build reliability:** As some providers are hundreds of megabytes in
- size, interruptions in connectivity to the Terraform registry during a
- workspace build can result in a failed build. If Coder is able to re-use a
- cached provider version, the likelihood of this is greatly reduced.
-
-## Lock your provider and module versions
-
-If you add a Terraform provider to `required_providers` without specifying a
-version requirement, Terraform will always fetch the latest version on each
-invocation:
-
-```terraform
-terraform {
- required_providers {
- coder = {
- source = "coder/coder"
- }
- frobnicate = {
- source = "acme/frobnicate"
- }
- }
-}
-```
-
-Any new releases of the `coder` or `frobnicate` providers will be picked up upon
-the next time a workspace is built using this template. This may include
-breaking changes.
-
-To prevent this, add a
-[version constraint](https://developer.hashicorp.com/terraform/language/expressions/version-constraints)
-to each provider in the `required_providers` block:
-
-```terraform
-terraform {
- required_providers {
- coder = {
- source = "coder/coder"
- version = ">= 0.2, < 0.3"
- }
- frobnicate = {
- source = "acme/frobnicate"
- version = "~> 1.0.0"
- }
- }
-}
-```
-
-In the above example, the `coder/coder` provider will be limited to all versions
-above or equal to `0.2.0` and below `0.3.0`, while the `acme/frobnicate`
-provider will be limited to all versions matching `1.0.x`.
-
-The above also applies to Terraform modules. In the below example, the module
-`razzledazzle` is locked to version `1.2.3`.
-
-```terraform
-module "razzledazzle" {
- source = "registry.example.com/modules/razzle/dazzle"
- version = "1.2.3"
- foo = "bar"
-}
-```
-
-## Use a Dependency Lock File
-
-Terraform allows creating a
-[dependency lock file](https://developer.hashicorp.com/terraform/language/files/dependency-lock)
-to track which provider versions were selected previously. This allows you to
-ensure that the next workspace build uses the same provider versions as with the
-last build.
-
-To create a new Terraform lock file, run the
-[`terraform init` command](https://developer.hashicorp.com/terraform/cli/commands/init)
-inside a folder containing the Terraform source code for a given template.
-
-This will create a new file named `.terraform.lock.hcl` in the current
-directory. When you next run [`coder templates push`](../cli/templates_push.md),
-the lock file will be stored alongside with the other template source code.
-
-> Note: Terraform best practices also recommend checking in your
-> `.terraform.lock.hcl` into Git or other VCS.
-
-The next time a workspace is built from that template, Coder will make sure to
-use the same versions of those providers as specified in the lock file.
-
-If, at some point in future, you need to update the providers and versions you
-specified within the version constraints of the template, run
-
-```console
-terraform init -upgrade
-```
-
-This will check each provider, check the newest satisfiable version based on the
-version constraints you specified, and update the `.terraform.lock.hcl` with
-those new versions. When you next run `coder templates push`, again, the updated
-lock file will be stored and used to determine the provider versions to use for
-subsequent workspace builds.
diff --git a/docs/templates/docker-in-workspaces.md b/docs/templates/docker-in-workspaces.md
deleted file mode 100644
index ab697b34baca7..0000000000000
--- a/docs/templates/docker-in-workspaces.md
+++ /dev/null
@@ -1,461 +0,0 @@
-# Docker in Workspaces
-
-There are a few ways to run Docker within container-based Coder workspaces.
-
-| Method | Description | Limitations |
-| ---------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| [Sysbox container runtime](#sysbox-container-runtime) | Install the sysbox runtime on your Kubernetes nodes for secure docker-in-docker and systemd-in-docker. Works with GKE, EKS, AKS. | Requires [compatible nodes](https://github.com/nestybox/sysbox#host-requirements). [Limitations](https://github.com/nestybox/sysbox/blob/master/docs/user-guide/limitations.md) |
-| [Envbox](#envbox) | A container image with all the packages necessary to run an inner sysbox container. Removes the need to setup sysbox-runc on your nodes. Works with GKE, EKS, AKS. | Requires running the outer container as privileged (the inner container that acts as the workspace is locked down). Requires compatible [nodes](https://github.com/nestybox/sysbox/blob/master/docs/distro-compat.md#sysbox-distro-compatibility). |
-| [Rootless Podman](#rootless-podman) | Run podman inside Coder workspaces. Does not require a custom runtime or privileged containers. Works with GKE, EKS, AKS, RKE, OpenShift | Requires smarter-device-manager for FUSE mounts. [See all](https://github.com/containers/podman/blob/main/rootless.md#shortcomings-of-rootless-podman) |
-| [Privileged docker sidecar](#privileged-sidecar-container) | Run docker as a privileged sidecar container. | Requires a privileged container. Workspaces can break out to root on the host machine. |
-
-## Sysbox container runtime
-
-The [Sysbox](https://github.com/nestybox/sysbox) container runtime allows
-unprivileged users to run system-level applications, such as Docker, securely
-from the workspace containers. Sysbox requires a
-[compatible Linux distribution](https://github.com/nestybox/sysbox/blob/master/docs/distro-compat.md)
-to implement these security features. Sysbox can also be used to run systemd
-inside Coder workspaces. See [Systemd in Docker](#systemd-in-docker).
-
-### Use Sysbox in Docker-based templates
-
-After [installing Sysbox](https://github.com/nestybox/sysbox#installation) on
-the Coder host, modify your template to use the sysbox-runc runtime:
-
-```hcl
-resource "docker_container" "workspace" {
- # ...
- name = "coder-${data.coder_workspace.me.owner}-${lower(data.coder_workspace.me.name)}"
- image = "codercom/enterprise-base:ubuntu"
- env = ["CODER_AGENT_TOKEN=${coder_agent.main.token}"]
- command = ["sh", "-c", coder_agent.main.init_script]
- # Use the Sysbox container runtime (required)
- runtime = "sysbox-runc"
-}
-
-resource "coder_agent" "main" {
- arch = data.coder_provisioner.me.arch
- os = "linux"
- startup_script = < \
- --docker-server=us.gcr.io \
- --docker-username=_json_key \
- --docker-password="$(cat ./json-key-file.yaml)" \
- --docker-email=
-```
-
-```hcl
-env {
- name = "CODER_IMAGE_PULL_SECRET"
- value_from {
- secret_key_ref {
- name = ""
- key = ".dockerconfigjson"
- }
- }
-}
-```
-
-## Rootless podman
-
-[Podman](https://docs.podman.io/en/latest/) is Docker alternative that is
-compatible with OCI containers specification. which can run rootless inside
-Kubernetes pods. No custom RuntimeClass is required.
-
-Before using Podman, please review the following documentation:
-
-- [Basic setup and use of Podman in a rootless environment](https://github.com/containers/podman/blob/main/docs/tutorials/rootless_tutorial.md)
-
-- [Shortcomings of Rootless Podman](https://github.com/containers/podman/blob/main/rootless.md#shortcomings-of-rootless-podman)
-
-1. Enable
- [smart-device-manager](https://gitlab.com/arm-research/smarter/smarter-device-manager#enabling-access)
- to securely expose a FUSE devices to pods.
-
- ```shell
- cat < ⚠️ **Warning**: If you are using a managed Kubernetes distribution (e.g.
- > AKS, EKS, GKE), be sure to set node labels via your cloud provider.
- > Otherwise, your nodes may drop the labels and break podman functionality.
-
-3. For systems running SELinux (typically Fedora-, CentOS-, and Red Hat-based
- systems), you might need to disable SELinux or set it to permissive mode.
-
-4. Use this
- [kubernetes-with-podman](https://github.com/coder/community-templates/tree/main/kubernetes-podman)
- example template, or make your own.
-
- ```shell
- echo "kubernetes-with-podman" | coder templates init
- cd ./kubernetes-with-podman
- coder templates create
- ```
-
- > For more information around the requirements of rootless podman pods, see:
- > [How to run Podman inside of Kubernetes](https://www.redhat.com/sysadmin/podman-inside-kubernetes)
-
-## Privileged sidecar container
-
-A
-[privileged container](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities)
-can be added to your templates to add docker support. This may come in handy if
-your nodes cannot run Sysbox.
-
-> ⚠️ **Warning**: This is insecure. Workspaces will be able to gain root access
-> to the host machine.
-
-### Use a privileged sidecar container in Docker-based templates
-
-```hcl
-resource "coder_agent" "main" {
- os = "linux"
- arch = "amd64"
-}
-
-resource "docker_network" "private_network" {
- name = "network-${data.coder_workspace.me.id}"
-}
-
-resource "docker_container" "dind" {
- image = "docker:dind"
- privileged = true
- name = "dind-${data.coder_workspace.me.id}"
- entrypoint = ["dockerd", "-H", "tcp://0.0.0.0:2375"]
- networks_advanced {
- name = docker_network.private_network.name
- }
-}
-
-resource "docker_container" "workspace" {
- count = data.coder_workspace.me.start_count
- image = "codercom/enterprise-base:ubuntu"
- name = "dev-${data.coder_workspace.me.id}"
- command = ["sh", "-c", coder_agent.main.init_script]
- env = [
- "CODER_AGENT_TOKEN=${coder_agent.main.token}",
- "DOCKER_HOST=${docker_container.dind.name}:2375"
- ]
- networks_advanced {
- name = docker_network.private_network.name
- }
-}
-```
-
-### Use a privileged sidecar container in Kubernetes-based templates
-
-```hcl
-terraform {
- required_providers {
- coder = {
- source = "coder/coder"
- }
- kubernetes = {
- source = "hashicorp/kubernetes"
- version = "2.16.0"
- }
- }
-}
-
-variable "workspaces_namespace" {
- default = "coder-namespace"
-}
-
-data "coder_workspace" "me" {}
-
-resource "coder_agent" "main" {
- os = "linux"
- arch = "amd64"
-}
-
-resource "kubernetes_pod" "main" {
- count = data.coder_workspace.me.start_count
- metadata {
- name = "coder-${data.coder_workspace.me.owner}-${data.coder_workspace.me.name}"
- namespace = var.namespace
- }
- spec {
- # Run a privileged dind (Docker in Docker) container
- container {
- name = "docker-sidecar"
- image = "docker:dind"
- security_context {
- privileged = true
- run_as_user = 0
- }
- command = ["dockerd", "-H", "tcp://127.0.0.1:2375"]
- }
- container {
- name = "dev"
- image = "codercom/enterprise-base:ubuntu"
- command = ["sh", "-c", coder_agent.main.init_script]
- security_context {
- run_as_user = "1000"
- }
- env {
- name = "CODER_AGENT_TOKEN"
- value = coder_agent.main.token
- }
- # Use the Docker daemon in the "docker-sidecar" container
- env {
- name = "DOCKER_HOST"
- value = "localhost:2375"
- }
- }
- }
-}
-```
-
-## Systemd in Docker
-
-Additionally, [Sysbox](https://github.com/nestybox/sysbox) can be used to give
-workspaces full `systemd` capabilities.
-
-After
-[installing Sysbox on Kubernetes](https://github.com/nestybox/sysbox/blob/master/docs/user-guide/install-k8s.md),
-modify your template to use the sysbox-runc RuntimeClass. This requires the
-Kubernetes Terraform provider version 2.16.0 or greater.
-
-```hcl
-terraform {
- required_providers {
- coder = {
- source = "coder/coder"
- }
- kubernetes = {
- source = "hashicorp/kubernetes"
- version = "2.16.0"
- }
- }
-}
-
-variable "workspaces_namespace" {
- default = "coder-namespace"
-}
-
-data "coder_workspace" "me" {}
-
-resource "coder_agent" "main" {
- os = "linux"
- arch = "amd64"
- dir = "/home/coder"
-}
-
-resource "kubernetes_pod" "dev" {
- count = data.coder_workspace.me.start_count
- metadata {
- name = "coder-${data.coder_workspace.me.owner}-${data.coder_workspace.me.name}"
- namespace = var.workspaces_namespace
- annotations = {
- "io.kubernetes.cri-o.userns-mode" = "auto:size=65536"
- }
- }
-
- spec {
-
- # Use Sysbox container runtime (required)
- runtime_class_name = "sysbox-runc"
-
- # Run as root in order to start systemd (required)
- security_context {
- run_as_user = 0
- fs_group = 0
- }
-
- container {
- name = "dev"
- env {
- name = "CODER_AGENT_TOKEN"
- value = coder_agent.main.token
- }
- image = "codercom/enterprise-base:ubuntu"
- command = ["sh", "-c", <
-
diff --git a/docs/templates/open-in-coder.md b/docs/templates/open-in-coder.md
deleted file mode 100644
index 21cf76717ac1a..0000000000000
--- a/docs/templates/open-in-coder.md
+++ /dev/null
@@ -1,120 +0,0 @@
-# Open in Coder
-
-You can embed an "Open in Coder" button into your git repos or internal wikis to
-let developers quickly launch a new workspace.
-
-
-
-## How it works
-
-To support any infrastructure and software stack, Coder provides a generic
-approach for "Open in Coder" flows.
-
-### 1. Set up git authentication
-
-See [External Authentication](../admin/external-auth.md) to set up git
-authentication in your Coder deployment.
-
-### 2. Modify your template to auto-clone repos
-
-The id in the template's `coder_external_auth` data source must match the
-`CODER_EXTERNAL_AUTH_X_ID` in the Coder deployment configuration.
-
-If you want the template to clone a specific git repo:
-
-```hcl
-# Require external authentication to use this template
-data "coder_external_auth" "github" {
- id = "primary-github"
-}
-
-resource "coder_agent" "dev" {
- # ...
- dir = "~/coder"
- startup_script =< Note: The `dir` attribute can be set in multiple ways, for example:
->
-> - `~/coder`
-> - `/home/coder/coder`
-> - `coder` (relative to the home directory)
-
-If you want the template to support any repository via
-[parameters](./parameters.md)
-
-```hcl
-# Require external authentication to use this template
-data "coder_external_auth" "github" {
- id = "primary-github"
-}
-
-# Prompt the user for the git repo URL
-data "coder_parameter" "git_repo" {
- name = "git_repo"
- display_name = "Git repository"
- default = "https://github.com/coder/coder"
-}
-
-locals {
- folder_name = try(element(split("/", data.coder_parameter.git_repo.value), length(split("/", data.coder_parameter.git_repo.value)) - 1), "")
-}
-
-resource "coder_agent" "dev" {
- # ...
- dir = "~/${local.folder_name}"
- startup_script =<) and `YOUR_TEMPLATE` with the name of your template.
-
-### 4. Optional: pre-fill parameter values in the "Create Workspace" page
-
-This can be used to pre-fill the git repo URL, disk size, image, etc.
-
-```md
-[](https://YOUR_ACCESS_URL/templates/YOUR_TEMPLATE/workspace?param.git_repo=https://github.com/coder/slog¶m.home_disk_size%20%28GB%29=20)
-```
-
-
-
-### 5. Optional: disable specific parameter fields by including their names as
-
-specified in your template in the `disable_params` search params list
-
-```md
-[](https://YOUR_ACCESS_URL/templates/YOUR_TEMPLATE/workspace?disable_params=first_parameter,second_parameter)
-```
-
-### Example: Kubernetes
-
-For a full example of the Open in Coder flow in Kubernetes, check out
-[this example template](https://github.com/bpmct/coder-templates/tree/main/kubernetes-open-in-coder).
diff --git a/docs/templates/process-logging.md b/docs/templates/process-logging.md
deleted file mode 100644
index 51bf613238a44..0000000000000
--- a/docs/templates/process-logging.md
+++ /dev/null
@@ -1,315 +0,0 @@
-# Workspace Process Logging
-
-The workspace process logging feature allows you to log all system-level
-processes executing in the workspace.
-
-> **Note:** This feature is only available on Linux in Kubernetes. There are
-> additional requirements outlined further in this document.
-
-Workspace process logging adds a sidecar container to workspace pods that will
-log all processes started in the workspace container (e.g., commands executed in
-the terminal or processes created in the background by other processes).
-Processes launched inside containers or nested containers within the workspace
-are also logged. You can view the output from the sidecar or send it to a
-monitoring stack, such as CloudWatch, for further analysis or long-term storage.
-
-Please note that these logs are not recorded or captured by the Coder
-organization in any way, shape, or form.
-
-> This is an [Enterprise](https://coder.com/docs/v2/latest/enterprise) feature.
-> To learn more about Coder Enterprise, please
-> [contact sales](https://coder.com/contact).
-
-## How this works
-
-Coder uses [eBPF](https://ebpf.io/) (which we chose for its minimal performance
-impact) to perform in-kernel logging and filtering of all exec system calls
-originating from the workspace container.
-
-The core of this feature is also open source and can be found in the
-[exectrace](https://github.com/coder/exectrace) GitHub repo. The enterprise
-component (in the `enterprise/` directory of the repo) is responsible for
-starting the eBPF program with the correct filtering options for the specific
-workspace.
-
-## Requirements
-
-The host machine must be running a Linux kernel >= 5.8 with the kernel config
-`CONFIG_DEBUG_INFO_BTF=y` enabled.
-
-To check your kernel version, run:
-
-```shell
-uname -r
-```
-
-To validate the required kernel config is enabled, run either of the following
-commands on your nodes directly (_not_ from a workspace terminal):
-
-```shell
-cat /proc/config.gz | gunzip | grep CONFIG_DEBUG_INFO_BTF
-```
-
-```shell
-cat "/boot/config-$(uname -r)" | grep CONFIG_DEBUG_INFO_BTF
-```
-
-If these requirements are not met, workspaces will fail to start for security
-reasons.
-
-Your template must be a Kubernetes template. Workspace process logging is not
-compatible with the `sysbox-runc` runtime due to technical limitations, but it
-is compatible with our `envbox` template family.
-
-## Example templates
-
-We provide working example templates for Kubernetes, and Kubernetes with
-`envbox` (for [Docker support in workspaces](./docker-in-workspaces.md)). You
-can view these templates in the
-[exectrace repo](https://github.com/coder/exectrace/tree/main/enterprise/templates).
-
-## Configuring custom templates to use workspace process logging
-
-If you have an existing Kubernetes or Kubernetes with `envbox` template that you
-would like to add workspace process logging to, follow these steps:
-
-1. Ensure the image used in your template has `curl` installed.
-
-1. Add the following section to your template's `main.tf` file:
-
-
-
- ```hcl
- locals {
- # This is the init script for the main workspace container that runs before the
- # agent starts to configure workspace process logging.
- exectrace_init_script = </dev/null 2>&1; then
- echo "curl is required to download the Coder binary"
- echo "Please install curl to your image and try again"
- # 127 is command not found.
- exit 127
- fi
-
- echo "Sending process ID namespace inum to exectrace sidecar"
- rc=0
- max_retry=5
- counter=0
- until [ $counter -ge $max_retry ]; do
- set +e
- curl \
- --fail \
- --silent \
- --connect-timeout 5 \
- -X POST \
- -H "Content-Type: text/plain" \
- --data "$pidns_inum" \
- http://127.0.0.1:56123
- rc=$?
- set -e
- if [ $rc -eq 0 ]; then
- break
- fi
-
- counter=$((counter+1))
- echo "Curl failed with exit code $${rc}, attempt $${counter}/$${max_retry}; Retrying in 3 seconds..."
- sleep 3
- done
- if [ $rc -ne 0 ]; then
- echo "Failed to send process ID namespace inum to exectrace sidecar"
- exit $rc
- fi
-
- EOT
- }
- ```
-
-1. Update the `command` of your workspace container like the following:
-
-
-
- ```hcl
- resource "kubernetes_pod" "main" {
- ...
- spec {
- ...
- container {
- ...
- // NOTE: this command is changed compared to the upstream kubernetes
- // template
- command = [
- "sh",
- "-c",
- "${local.exectrace_init_script}\n\n${coder_agent.main.init_script}",
- ]
- ...
- }
- ...
- }
- ...
- }
- ```
-
- > **Note:** If you are using the `envbox` template, you will need to update
- > the third argument to be
- > `"${local.exectrace_init_script}\n\nexec /envbox docker"` instead.
-
-1. Add the following container to your workspace pod spec.
-
-
-
- ```hcl
- resource "kubernetes_pod" "main" {
- ...
- spec {
- ...
- // NOTE: this container is added compared to the upstream kubernetes
- // template
- container {
- name = "exectrace"
- image = "ghcr.io/coder/exectrace:latest"
- image_pull_policy = "Always"
- command = [
- "/opt/exectrace",
- "--init-address", "127.0.0.1:56123",
- "--label", "workspace_id=${data.coder_workspace.me.id}",
- "--label", "workspace_name=${data.coder_workspace.me.name}",
- "--label", "user_id=${data.coder_workspace.me.owner_id}",
- "--label", "username=${data.coder_workspace.me.owner}",
- "--label", "user_email=${data.coder_workspace.me.owner_email}",
- ]
- security_context {
- // exectrace must be started as root so it can attach probes into the
- // kernel to record process events with high throughput.
- run_as_user = "0"
- run_as_group = "0"
- // exectrace requires a privileged container so it can control mounts
- // and perform privileged syscalls against the host kernel to attach
- // probes.
- privileged = true
- }
- }
- ...
- }
- ...
- }
- ```
-
- > **Note:** `exectrace` requires root privileges and a privileged container
- > to attach probes to the kernel. This is a requirement of eBPF.
-
-1. Add the following environment variable to your workspace pod:
-
-
-
- ```hcl
- resource "kubernetes_pod" "main" {
- ...
- spec {
- ...
- env {
- name = "CODER_AGENT_SUBSYSTEM"
- value = "exectrace"
- }
- ...
- }
- ...
- }
- ```
-
-Once you have made these changes, you can push a new version of your template
-and workspace process logging will be enabled for all workspaces once they are
-restarted.
-
-## Viewing workspace process logs
-
-To view the process logs for a specific workspace you can use `kubectl` to print
-the logs:
-
-```bash
-kubectl logs pod-name --container exectrace
-```
-
-The raw logs will look something like this:
-
-```json
-{
- "ts": "2022-02-28T20:29:38.038452202Z",
- "level": "INFO",
- "msg": "exec",
- "fields": {
- "labels": {
- "user_email": "jessie@coder.com",
- "user_id": "5e876e9a-121663f01ebd1522060d5270",
- "username": "jessie",
- "workspace_id": "621d2e52-a6987ef6c56210058ee2593c",
- "workspace_name": "main"
- },
- "cmdline": "uname -a",
- "event": {
- "filename": "/usr/bin/uname",
- "argv": ["uname", "-a"],
- "truncated": false,
- "pid": 920684,
- "uid": 101000,
- "gid": 101000,
- "comm": "bash"
- }
- }
-}
-```
-
-### View logs in AWS EKS
-
-If you're using AWS' Elastic Kubernetes Service, you can
-[configure your cluster](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Container-Insights-EKS-logs.html)
-to send logs to CloudWatch. This allows you to view the logs for a specific user
-or workspace.
-
-To view your logs, go to the CloudWatch dashboard (which is available on the
-**Log Insights** tab) and run a query similar to the following:
-
-```text
-fields @timestamp, log_processed.fields.cmdline
-| sort @timestamp asc
-| filter kubernetes.container_name="exectrace"
-| filter log_processed.fields.labels.username="zac"
-| filter log_processed.fields.labels.workspace_name="code"
-```
-
-## Usage considerations
-
-- The sidecar attached to each workspace is a privileged container, so you may
- need to review your organization's security policies before enabling this
- feature. Enabling workspace process logging does _not_ grant extra privileges
- to the workspace container itself, however.
-- `exectrace` will log processes from nested Docker containers (including deeply
- nested containers) correctly, but Coder does not distinguish between processes
- started in the workspace and processes started in a child container in the
- logs.
-- With `envbox` workspaces, this feature will detect and log startup processes
- begun in the outer container (including container initialization processes).
-- Because this feature logs **all** processes in the workspace, high levels of
- usage (e.g., during a `make` run) will result in an abundance of output in the
- sidecar container. Depending on how your Kubernetes cluster is configured, you
- may incur extra charges from your cloud provider to store the additional logs.
diff --git a/docs/templates/resource-persistence.md b/docs/templates/resource-persistence.md
deleted file mode 100644
index 4ca38a6d397d9..0000000000000
--- a/docs/templates/resource-persistence.md
+++ /dev/null
@@ -1,93 +0,0 @@
-# Resource persistence
-
-By default, all Coder resources are persistent, but production templates
-**must** use the practices laid out in this document to prevent accidental
-deletion.
-
-Coder templates have full control over workspace ephemerality. In a completely
-ephemeral workspace, there are zero resources in the Off state. In a completely
-persistent workspace, there is no difference between the Off and On states.
-
-The needs of most workspaces fall somewhere in the middle, persisting user data
-like filesystem volumes, but deleting expensive, reproducible resources such as
-compute instances.
-
-## Disabling persistence
-
-The Terraform
-[`coder_workspace` data source](https://registry.terraform.io/providers/coder/coder/latest/docs/data-sources/workspace)
-exposes the `start_count = [0 | 1]` attribute. To make a resource ephemeral, you
-can assign the `start_count` attribute to resource's
-[`count`](https://developer.hashicorp.com/terraform/language/meta-arguments/count)
-meta-argument.
-
-In this example, Coder will provision or tear down the `docker_container`
-resource:
-
-```hcl
-data "coder_workspace" "me" {
-}
-
-resource "docker_container" "workspace" {
- # When `start_count` is 0, `count` is 0, so no `docker_container` is created.
- count = data.coder_workspace.me.start_count # 0 (stopped), 1 (started)
- # ... other config
-}
-```
-
-## ⚠️ Persistence pitfalls
-
-Take this example resource:
-
-```hcl
-data "coder_workspace" "me" {
-}
-
-resource "docker_volume" "home_volume" {
- name = "coder-${data.coder_workspace.me.owner}-home"
-}
-```
-
-Because we depend on `coder_workspace.me.owner`, if the owner changes their
-username, Terraform will recreate the volume (wiping its data!) the next time
-that Coder starts the workspace.
-
-To prevent this, use immutable IDs:
-
-- `coder_workspace.me.owner_id`
-- `coder_workspace.me.id`
-
-```hcl
-data "coder_workspace" "me" {
-}
-
-resource "docker_volume" "home_volume" {
- # This volume will survive until the Workspace is deleted or the template
- # admin changes this resource block.
- name = "coder-${data.coder_workspace.id}-home"
-}
-```
-
-## 🛡 Bulletproofing
-
-Even if your persistent resource depends exclusively on immutable IDs, a change
-to the `name` format or other attributes would cause Terraform to rebuild the
-resource.
-
-You can prevent Terraform from recreating a resource under any circumstance by
-setting the
-[`ignore_changes = all` directive in the `lifecycle` block](https://developer.hashicorp.com/terraform/language/meta-arguments/lifecycle#ignore_changes).
-
-```hcl
-data "coder_workspace" "me" {
-}
-
-resource "docker_volume" "home_volume" {
- # This resource will survive until either the entire block is deleted
- # or the workspace is.
- name = "coder-${data.coder_workspace.me.id}-home"
- lifecycle {
- ignore_changes = all
- }
-}
-```
diff --git a/docs/templates/schedule.md b/docs/templates/schedule.md
deleted file mode 100644
index d03c85000463b..0000000000000
--- a/docs/templates/schedule.md
+++ /dev/null
@@ -1,49 +0,0 @@
-# Workspace Scheduling
-
-You can configure a template to control how workspaces are started and stopped.
-You can also manage the lifecycle of failed or inactive workspaces.
-
-
-
-## Schedule
-
-Template [admins](../admin/users.md) may define these default values:
-
-- [**Default autostop**](../workspaces.md#autostart-and-autostop): How long a
- workspace runs without user activity before Coder automatically stops it.
-- [**Autostop requirement**](../workspaces.md#autostop-requirement-enterprise):
- Enforce mandatory workspace restarts to apply template updates regardless of
- user activity.
-- **Activity bump**: The duration of inactivity that must pass before a worksace
- is automatically stopped.
-- **Dormancy**: This allows automatic deletion of unused workspaces to reduce
- spend on idle resources.
-
-## Allow users scheduling
-
-For templates where a uniform autostop duration is not appropriate, admins may
-allow users to define their own autostart and autostop schedules. Admins can
-restrict the days of the week a workspace should automatically start to help
-manage infrastructure costs.
-
-## Failure cleanup (enterprise)
-
-Failure cleanup defines how long a workspace is permitted to remain in the
-failed state prior to being automatically stopped. Failure cleanup is an
-enterprise-only feature.
-
-## Dormancy threshold (enterprise)
-
-Dormancy Threshold defines how long Coder allows a workspace to remain inactive
-before being moved into a dormant state. A workspace's inactivity is determined
-by the time elapsed since a user last accessed the workspace. A workspace in the
-dormant state is not eligible for autostart and must be manually activated by
-the user before being accessible. Coder stops workspaces during their transition
-to the dormant state if they are detected to be running. Dormancy Threshold is
-an enterprise-only feature.
-
-## Dormancy auto-deletion (enterprise)
-
-Dormancy Auto-Deletion allows a template admin to dictate how long a workspace
-is permitted to remain dormant before it is automatically deleted. Dormancy
-Auto-Deletion is an enterprise-only feature.
diff --git a/docs/templates/troubleshooting.md b/docs/templates/troubleshooting.md
deleted file mode 100644
index 1a4b79d1cff80..0000000000000
--- a/docs/templates/troubleshooting.md
+++ /dev/null
@@ -1,155 +0,0 @@
-# Troubleshooting templates
-
-Occasionally, you may run into scenarios where a workspace is created, but the
-agent is either not connected or the
-[startup script](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/agent#startup_script)
-has failed or timed out.
-
-## Agent connection issues
-
-If the agent is not connected, it means the agent or
-[init script](https://github.com/coder/coder/tree/main/provisionersdk/scripts)
-has failed on the resource.
-
-```console
-$ coder ssh myworkspace
-⢄⡱ Waiting for connection from [agent]...
-```
-
-While troubleshooting steps vary by resource, here are some general best
-practices:
-
-- Ensure the resource has `curl` installed (alternatively, `wget` or `busybox`)
-- Ensure the resource can `curl` your Coder
- [access URL](../admin/configure.md#access-url)
-- Manually connect to the resource and check the agent logs (e.g.,
- `kubectl exec`, `docker exec` or AWS console)
- - The Coder agent logs are typically stored in `/tmp/coder-agent.log`
- - The Coder agent startup script logs are typically stored in
- `/tmp/coder-startup-script.log`
- - The Coder agent shutdown script logs are typically stored in
- `/tmp/coder-shutdown-script.log`
-- This can also happen if the websockets are not being forwarded correctly when
- running Coder behind a reverse proxy.
- [Read our reverse-proxy docs](../admin/configure.md#tls--reverse-proxy)
-
-## Startup script issues
-
-Depending on the contents of the
-[startup script](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/agent#startup_script),
-and whether or not the
-[startup script behavior](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/agent#startup_script_behavior)
-is set to blocking or non-blocking, you may notice issues related to the startup
-script. In this section we will cover common scenarios and how to resolve them.
-
-### Unable to access workspace, startup script is still running
-
-If you're trying to access your workspace and are unable to because the
-[startup script](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/agent#startup_script)
-is still running, it means the
-[startup script behavior](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/agent#startup_script_behavior)
-option is set to blocking or you have enabled the `--wait=yes` option (for e.g.
-`coder ssh` or `coder config-ssh`). In such an event, you can always access the
-workspace by using the web terminal, or via SSH using the `--wait=no` option. If
-the startup script is running longer than it should, or never completing, you
-can try to [debug the startup script](#debugging-the-startup-script) to resolve
-the issue. Alternatively, you can try to force the startup script to exit by
-terminating processes started by it or terminating the startup script itself (on
-Linux, `ps` and `kill` are useful tools).
-
-For tips on how to write a startup script that doesn't run forever, see the
-[`startup_script`](#startup_script) section. For more ways to override the
-startup script behavior, see the
-[`startup_script_behavior`](#startup_script_behavior) section.
-
-Template authors can also set the
-[startup script behavior](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/agent#startup_script_behavior)
-option to non-blocking, which will allow users to access the workspace while the
-startup script is still running. Note that the workspace must be updated after
-changing this option.
-
-### Your workspace may be incomplete
-
-If you see a warning that your workspace may be incomplete, it means you should
-be aware that programs, files, or settings may be missing from your workspace.
-This can happen if the
-[startup script](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/agent#startup_script)
-is still running or has exited with a non-zero status (see
-[startup script error](#startup-script-error)). No action is necessary, but you
-may want to
-[start a new shell session](#session-was-started-before-the-startup-script-finished-web-terminal)
-after it has completed or check the
-[startup script logs](#debugging-the-startup-script) to see if there are any
-issues.
-
-### Session was started before the startup script finished
-
-The web terminal may show this message if it was started before the
-[startup script](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/agent#startup_script)
-finished, but the startup script has since finished. This message can safely be
-dismissed, however, be aware that your preferred shell or dotfiles may not yet
-be activated for this shell session. You can either start a new session or
-source your dotfiles manually. Note that starting a new session means that
-commands running in the terminal will be terminated and you may lose unsaved
-work.
-
-Examples for activating your preferred shell or sourcing your dotfiles:
-
-- `exec zsh -l`
-- `source ~/.bashrc`
-
-### Startup script exited with an error
-
-When the
-[startup script](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/agent#startup_script)
-exits with an error, it means the last command run by the script failed. When
-`set -e` is used, this means that any failing command will immediately exit the
-script and the remaining commands will not be executed. This also means that
-[your workspace may be incomplete](#your-workspace-may-be-incomplete). If you
-see this error, you can check the
-[startup script logs](#debugging-the-startup-script) to figure out what the
-issue is.
-
-Common causes for startup script errors:
-
-- A missing command or file
-- A command that fails due to missing permissions
-- Network issues (e.g., unable to reach a server)
-
-### Debugging the startup script
-
-The simplest way to debug the
-[startup script](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/agent#startup_script)
-is to open the workspace in the Coder dashboard and click "Show startup log" (if
-not already visible). This will show all the output from the script. Another
-option is to view the log file inside the workspace (usually
-`/tmp/coder-startup-script.log`). If the logs don't indicate what's going on or
-going wrong, you can increase verbosity by adding `set -x` to the top of the
-startup script (note that this will show all commands run and may output
-sensitive information). Alternatively, you can add `echo` statements to show
-what's going on.
-
-Here's a short example of an informative startup script:
-
-```shell
-echo "Running startup script..."
-echo "Run: long-running-command"
-/path/to/long-running-command
-status=$?
-echo "Done: long-running-command, exit status: ${status}"
-if [ $status -ne 0 ]; then
- echo "Startup script failed, exiting..."
- exit $status
-fi
-```
-
-> **Note:** We don't use `set -x` here because we're manually echoing the
-> commands. This protects against sensitive information being shown in the log.
-
-This script tells us what command is being run and what the exit status is. If
-the exit status is non-zero, it means the command failed and we exit the script.
-Since we are manually checking the exit status here, we don't need `set -e` at
-the top of the script to exit on error.
-
-> **Note:** If you aren't seeing any logs, check that the `dir` directive points
-> to a valid directory in the file system.
diff --git a/docs/guides/index.md b/docs/tutorials/README.md
similarity index 100%
rename from docs/guides/index.md
rename to docs/tutorials/README.md
diff --git a/docs/tutorials/artifactory-integration.md b/docs/tutorials/artifactory-integration.md
new file mode 100644
index 0000000000000..a7be26b421716
--- /dev/null
+++ b/docs/tutorials/artifactory-integration.md
@@ -0,0 +1,176 @@
+# JFrog Artifactory Integration
+
+
+January 24, 2024
+
+---
+
+Use Coder and JFrog Artifactory together to secure your development environments
+without disturbing your developers' existing workflows.
+
+This guide will demonstrate how to use JFrog Artifactory as a package registry
+within a workspace.
+
+## Requirements
+
+- A JFrog Artifactory instance
+- 1:1 mapping of users in Coder to users in Artifactory by email address or
+ username
+- Repositories configured in Artifactory for each package manager you want to
+ use
+
+## Provisioner Authentication
+
+The most straight-forward way to authenticate your template with Artifactory is
+by using our official Coder [modules](https://registry.coder.com). We publish
+two type of modules that automate the JFrog Artifactory and Coder integration.
+
+1. [JFrog-OAuth](https://registry.coder.com/modules/jfrog-oauth)
+2. [JFrog-Token](https://registry.coder.com/modules/jfrog-token)
+
+### JFrog-OAuth
+
+This module is usable by JFrog self-hosted (on-premises) Artifactory as it
+requires configuring a custom integration. This integration benefits from
+Coder's [external-auth](https://coder.com/docs/admin/external-auth) feature and
+allows each user to authenticate with Artifactory using an OAuth flow and issues
+user-scoped tokens to each user.
+
+To set this up, follow these steps:
+
+1. Modify your Helm chart `values.yaml` for JFrog Artifactory to add,
+
+```yaml
+artifactory:
+ enabled: true
+ frontend:
+ extraEnvironmentVariables:
+ - name: JF_FRONTEND_FEATURETOGGLER_ACCESSINTEGRATION
+ value: "true"
+ access:
+ accessConfig:
+ integrations-enabled: true
+ integration-templates:
+ - id: "1"
+ name: "CODER"
+ redirect-uri: "https://CODER_URL/external-auth/jfrog/callback"
+ scope: "applied-permissions/user"
+```
+
+> Note Replace `CODER_URL` with your Coder deployment URL, e.g.,
+>
+
+2. Create a new Application Integration by going to
+ and select the
+ Application Type as the integration you created in step 1.
+
+
+
+3. Add a new
+ [external authentication](https://coder.com/docs/admin/external-auth) to
+ Coder by setting these env variables,
+
+```env
+# JFrog Artifactory External Auth
+CODER_EXTERNAL_AUTH_1_ID="jfrog"
+CODER_EXTERNAL_AUTH_1_TYPE="jfrog"
+CODER_EXTERNAL_AUTH_1_CLIENT_ID="YYYYYYYYYYYYYYY"
+CODER_EXTERNAL_AUTH_1_CLIENT_SECRET="XXXXXXXXXXXXXXXXXXX"
+CODER_EXTERNAL_AUTH_1_DISPLAY_NAME="JFrog Artifactory"
+CODER_EXTERNAL_AUTH_1_DISPLAY_ICON="/icon/jfrog.svg"
+CODER_EXTERNAL_AUTH_1_AUTH_URL="https://JFROG_URL/ui/authorization"
+CODER_EXTERNAL_AUTH_1_SCOPES="applied-permissions/user"
+```
+
+> Note Replace `JFROG_URL` with your JFrog Artifactory base URL, e.g.,
+>
+
+4. Create or edit a Coder template and use the
+ [JFrog-OAuth](https://registry.coder.com/modules/jfrog-oauth) module to
+ configure the integration.
+
+```hcl
+module "jfrog" {
+ source = "registry.coder.com/modules/jfrog-oauth/coder"
+ version = "1.0.0"
+ agent_id = coder_agent.example.id
+ jfrog_url = "https://jfrog.example.com"
+ configure_code_server = true # this depends on the code-server
+ username_field = "username" # If you are using GitHub to login to both Coder and Artifactory, use username_field = "username"
+ package_managers = {
+ "npm": "npm",
+ "go": "go",
+ "pypi": "pypi"
+ }
+}
+```
+
+### JFrog-Token
+
+This module makes use of the
+[Artifactory terraform provider](https://registry.terraform.io/providers/jfrog/artifactory/latest/docs)
+and an admin-scoped token to create user-scoped tokens for each user by matching
+their Coder email or username with Artifactory. This can be used for both SaaS
+and self-hosted(on-premises) Artifactory instances.
+
+To set this up, follow these steps:
+
+1. Get a JFrog access token from your Artifactory instance. The token must be an
+ [admin token](https://registry.terraform.io/providers/jfrog/artifactory/latest/docs#access-token)
+ with scope `applied-permissions/admin`.
+2. Create or edit a Coder template and use the
+ [JFrog-Token](https://registry.coder.com/modules/jfrog-token) module to
+ configure the integration and pass the admin token. It is recommended to
+ store the token in a sensitive terraform variable to prevent it from being
+ displayed in plain text in the terraform state.
+
+```hcl
+variable "artifactory_access_token" {
+ type = string
+ sensitive = true
+}
+
+module "jfrog" {
+ source = "registry.coder.com/modules/jfrog-token/coder"
+ version = "1.0.0"
+ agent_id = coder_agent.example.id
+ jfrog_url = "https://example.jfrog.io"
+ configure_code_server = true # this depends on the code-server
+ artifactory_access_token = var.artifactory_access_token
+ package_managers = {
+ "npm": "npm",
+ "go": "go",
+ "pypi": "pypi"
+ }
+}
+```
+
+
+The admin-level access token is used to provision user tokens and is never exposed to
+developers or stored in workspaces.
+
+
+If you do not want to use the official modules, you can check example template
+that uses Docker as the underlying compute
+[here](https://github.com/coder/coder/tree/main/examples/jfrog/docker). The same
+concepts apply to all compute types.
+
+## Offline Deployments
+
+See the [offline deployments](../templates/modules.md#offline-installations)
+section for instructions on how to use coder-modules in an offline environment
+with Artifactory.
+
+## More reading
+
+- See the full example template
+ [here](https://github.com/coder/coder/tree/main/examples/jfrog/docker).
+- To serve extensions from your own VS Code Marketplace, check out
+ [code-marketplace](https://github.com/coder/code-marketplace#artifactory-storage).
+- To store templates in Artifactory, check out our
+ [Artifactory modules](../templates/modules.md#artifactory) docs.
diff --git a/docs/guides/azure-federation.md b/docs/tutorials/azure-federation.md
similarity index 100%
rename from docs/guides/azure-federation.md
rename to docs/tutorials/azure-federation.md
diff --git a/docs/guides/configuring-okta.md b/docs/tutorials/configuring-okta.md
similarity index 100%
rename from docs/guides/configuring-okta.md
rename to docs/tutorials/configuring-okta.md
diff --git a/docs/guides/example-guide.md b/docs/tutorials/example-guide.md
similarity index 100%
rename from docs/guides/example-guide.md
rename to docs/tutorials/example-guide.md
diff --git a/docs/tutorials/faqs.md b/docs/tutorials/faqs.md
new file mode 100644
index 0000000000000..f4df0dbe65611
--- /dev/null
+++ b/docs/tutorials/faqs.md
@@ -0,0 +1,541 @@
+# FAQs
+
+Frequently asked questions on Coder OSS and Enterprise deployments. These FAQs
+come from our community and enterprise customers, feel free to
+[contribute to this page](https://github.com/coder/coder/edit/main/docs/faqs.md).
+
+For other community resources, see our
+[Github discussions](https://github.com/coder/coder/discussions), or join our
+[Discord server](https://discord.gg/coder).
+
+### How do I add an enterprise license?
+
+Visit https://coder.com/trial or contact
+[sales@coder.com](mailto:sales@coder.com?subject=License) to get a v2 enterprise
+trial key.
+
+You can add a license through the UI or CLI.
+
+In the UI, click the Deployment tab -> Licenses and upload the `jwt` license
+file.
+
+> To add the license with the CLI, first
+> [install the Coder CLI](./install/index.md#install-script) and server to the
+> latest release.
+
+If the license is a text string:
+
+```sh
+coder licenses add -l 1f5...765
+```
+
+If the license is in a file:
+
+```sh
+coder licenses add -f
+```
+
+### I'm experiencing networking issues, so want to disable Tailscale, STUN, Direct connections and force use of websockets
+
+The primary developer use case is a local IDE connecting over SSH to a Coder
+workspace.
+
+Coder's networking stack has intelligence to attempt a peer-to-peer or
+[Direct connection](https://coder.com/docs/networking#direct-connections)
+between the local IDE and the workspace. However, this requires some additional
+protocols like UDP and being able to reach a STUN server to echo the IP
+addresses of the local IDE machine and workspace, for sharing using a Wireguard
+Coordination Server. By default, Coder assumes Internet and attempts to reach
+Google's STUN servers to perform this IP echo.
+
+Operators experimenting with Coder may run into networking issues if UDP (which
+STUN requires) or the STUN servers are unavailable, potentially resulting in
+lengthy local IDE and SSH connection times as the Coder control plane attempts
+to establish these direct connections.
+
+Setting the following flags as shown disables this logic to simplify
+troubleshooting.
+
+| Flag | Value | Meaning |
+| -------------------------------------------------------------------------------------------------------------- | ----------- | ------------------------------------- |
+| [`CODER_BLOCK_DIRECT`](https://coder.com/docs/reference/cli/server#--block-direct-connections) | `true` | Blocks direct connections |
+| [`CODER_DERP_SERVER_STUN_ADDRESSES`](https://coder.com/docs/reference/cli/server#--derp-server-stun-addresses) | `"disable"` | Disables STUN |
+| [`CODER_DERP_FORCE_WEBSOCKETS`](https://coder.com/docs/reference/cli/server#--derp-force-websockets) | `true` | Forces websockets over Tailscale DERP |
+
+### How do I configure NGINX as the reverse proxy in front of Coder?
+
+[This doc](https://github.com/coder/coder/tree/main/examples/web-server/nginx#configure-nginx)
+in our repo explains in detail how to configure NGINX with Coder so that our
+Tailscale Wireguard networking functions properly.
+
+### How do I hide some of the default icons in a workspace like VS Code Desktop, Terminal, SSH, Ports?
+
+The visibility of Coder apps is configurable in the template. To change the
+default (shows all), add this block inside the
+[`coder_agent`](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/agent)
+of a template and configure as needed:
+
+```hcl
+ display_apps {
+ vscode = false
+ vscode_insiders = false
+ ssh_helper = false
+ port_forwarding_helper = false
+ web_terminal = true
+ }
+```
+
+This example will hide all built-in
+[`coder_app`](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/app)
+icons except the web terminal.
+
+### I want to allow code-server to be accessible by other users in my deployment.
+
+> It is **not** recommended to share a web IDE, but if required, the following
+> deployment environment variable settings are required.
+
+Set deployment (Kubernetes) to allow path app sharing
+
+```yaml
+# allow authenticated users to access path-based workspace apps
+- name: CODER_DANGEROUS_ALLOW_PATH_APP_SHARING
+ value: "true"
+# allow Coder owner roles to access path-based workspace apps
+- name: CODER_DANGEROUS_ALLOW_PATH_APP_SITE_OWNER_ACCESS
+ value: "true"
+```
+
+In the template, set
+[`coder_app`](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/app)
+[`share`](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/app#share)
+option to `authenticated` and when a workspace is built with this template, the
+pretty globe shows up next to path-based `code-server`:
+
+```hcl
+resource "coder_app" "code-server" {
+ ...
+ share = "authenticated"
+ ...
+}
+```
+
+### I installed Coder and created a workspace but the icons do not load.
+
+An important concept to understand is that Coder creates workspaces which have
+an agent that must be able to reach the `coder server`.
+
+If the [`CODER_ACCESS_URL`](https://coder.com/docs/admin/configure#access-url)
+is not accessible from a workspace, the workspace may build, but the agent
+cannot reach Coder, and thus the missing icons. e.g., Terminal, IDEs, Apps.
+
+> By default, `coder server` automatically creates an Internet-accessible
+> reverse proxy so that workspaces you create can reach the server.
+
+If you are doing a standalone install, e.g., on a Macbook and want to build
+workspaces in Docker Desktop, everything is self-contained and workspaces
+(containers in Docker Desktop) can reach the Coder server.
+
+```sh
+coder server --access-url http://localhost:3000 --address 0.0.0.0:3000
+```
+
+> Even `coder server` which creates a reverse proxy, will let you use
+> http://localhost to access Coder from a browser.
+
+### I updated a template, and an existing workspace based on that template fails to start.
+
+When updating a template, be aware of potential issues with input variables. For
+example, if a template prompts users to choose options like a
+[code-server](https://github.com/coder/code-server)
+[VS Code](https://code.visualstudio.com/) IDE release, a
+[container image](https://hub.docker.com/u/codercom), or a
+[VS Code extension](https://marketplace.visualstudio.com/vscode), removing any
+of these values can lead to existing workspaces failing to start. This issue
+occurs because the Terraform state will not be in sync with the new template.
+
+However, a lesser-known CLI sub-command,
+[`coder update`](https://coder.com/docs/reference/cli/update), can resolve this
+issue. This command re-prompts users to re-enter the input variables,
+potentially saving the workspace from a failed status.
+
+```sh
+coder update --always-prompt
+```
+
+### I'm running coder on a VM with systemd but latest release installed isn't showing up.
+
+Take, for example, a Coder deployment on a VM with a 2 shared vCPU systemd
+service. In this scenario, it's necessary to reload the daemon and then restart
+the Coder service. This prevents the `systemd` daemon from trying to reference
+the previous Coder release service since the unit file has changed.
+
+The following commands can be used to update Coder and refresh the service:
+
+```sh
+curl -fsSL https://coder.com/install.sh | sh
+sudo systemctl daemon-reload
+sudo systemctl restart coder.service
+```
+
+### I'm using the built-in Postgres database and forgot admin email I set up.
+
+1. Run the `coder server` command below to retrieve the `psql` connection URL
+ which includes the database user and password.
+2. `psql` into Postgres, and do a select query on the `users` table.
+3. Restart the `coder server`, pull up the Coder UI and log in (you will still
+ need your password)
+
+```sh
+coder server postgres-builtin-url
+psql "postgres://coder@localhost:53737/coder?sslmode=disable&password=I2S...pTk"
+```
+
+### How to find out Coder's latest Terraform provider version?
+
+[Coder is on the HashiCorp's Terraform registry](https://registry.terraform.io/providers/coder/coder/latest).
+Check this frequently to make sure you are on the latest version.
+
+Sometimes, the version may change and `resource` configurations will either
+become deprecated or new ones will be added when you get warnings or errors
+creating and pushing templates.
+
+### How can I set up TLS for my deployment and not create a signed certificate?
+
+Caddy is an easy-to-configure reverse proxy that also automatically creates
+certificates from Let's Encrypt.
+[Install docs here](https://caddyserver.com/docs/quick-starts/reverse-proxy) You
+can start Caddy as a `systemd` service.
+
+The Caddyfile configuration will appear like this where `127.0.0.1:3000` is your
+`CODER_ACCESS_URL`:
+
+```text
+coder.example.com {
+
+ reverse_proxy 127.0.0.1:3000
+
+ tls {
+
+ issuer acme {
+ email user@example.com
+ }
+
+ }
+}
+```
+
+### I'm using Caddy as my reverse proxy in front of Coder. How do I set up a wildcard domain for port forwarding?
+
+Caddy requires your DNS provider's credentials to create wildcard certificates.
+This involves building the Caddy binary
+[from source](https://github.com/caddyserver/caddy) with the DNS provider plugin
+added. e.g.,
+[Google Cloud DNS provider here](https://github.com/caddy-dns/googleclouddns)
+
+To compile Caddy, the host running Coder requires Go. Once installed, replace
+the existing Caddy binary in `usr/bin` and restart the Caddy service.
+
+The updated Caddyfile configuration will look like this:
+
+```text
+*.coder.example.com, coder.example.com {
+
+ reverse_proxy 127.0.0.1:3000
+
+ tls {
+ issuer acme {
+ email user@example.com
+ dns googleclouddns {
+ gcp_project my-gcp-project
+ }
+ }
+ }
+
+}
+```
+
+### Can I use local or remote Terraform Modules in Coder templates?
+
+One way is to reference a Terraform module from a GitHub repo to avoid
+duplication and then just extend it or pass template-specific
+parameters/resources:
+
+```hcl
+# template1/main.tf
+module "central-coder-module" {
+ source = "github.com/yourorg/central-coder-module"
+ myparam = "custom-for-template1"
+}
+
+resource "ebs_volume" "custom_template1_only_resource" {
+}
+```
+
+```hcl
+# template2/main.tf
+module "central-coder-module" {
+ source = "github.com/yourorg/central-coder-module"
+ myparam = "custom-for-template2"
+ myparam2 = "bar"
+}
+
+resource "aws_instance" "custom_template2_only_resource" {
+}
+```
+
+Another way using local modules is to symlink the module directory inside the
+template directory and then `tar` the template.
+
+```sh
+ln -s modules template_1/modules
+tar -cvh -C ./template_1 | coder templates -d -
+```
+
+References:
+
+- [Public Github Issue 6117](https://github.com/coder/coder/issues/6117)
+- [Public Github Issue 5677](https://github.com/coder/coder/issues/5677)
+- [Coder docs: Templates/Change Management](https://coder.com/docs/templates/change-management)
+
+### Can I run Coder in an air-gapped or offline mode? (no Internet)?
+
+Yes, Coder can be deployed in air-gapped or offline mode.
+https://coder.com/docs/install/offline
+
+Our product bundles with the Terraform binary so assume access to terraform.io
+during installation. The docs outline rebuilding the Coder container with
+Terraform built-in as well as any required Terraform providers.
+
+Direct networking from local SSH to a Coder workspace needs a STUN server. Coder
+defaults to Google's STUN servers, so you can either create your STUN server in
+your network or disable and force all traffic through the control plane's DERP
+proxy.
+
+### Create a randomized computer_name for an Azure VM
+
+Azure VMs have a 15 character limit for the `computer_name` which can lead to
+duplicate name errors.
+
+This code produces a hashed value that will be difficult to replicate.
+
+```hcl
+locals {
+ concatenated_string = "${data.coder_workspace.me.name}+${data.coder_workspace_owner.me.name}"
+ hashed_string = md5(local.concatenated_string)
+ truncated_hash = substr(local.hashed_string, 0, 16)
+}
+```
+
+### Do you have example JetBrains Gateway templates?
+
+In August 2023, JetBrains certified the Coder plugin signifying enhanced
+stability and reliability.
+
+The Coder plugin will appear in the Gateway UI when opened.
+
+Selecting the most suitable template depends on how the deployment manages
+JetBrains IDE versions. If downloading from
+[jetbrains.com](https://www.jetbrains.com/remote-development/gateway/) is
+acceptable, see the example templates below which specifies the product code,
+IDE version and build number in the
+[`coder_app`](https://registry.terraform.io/providers/coder/coder/latest/docs/resources/app#share)
+resource. This will present an icon in the workspace dashboard which when
+clicked, will look for a locally installed Gateway, and open it. Alternatively,
+the IDE can be baked into the container image and manually open Gateway (or
+IntelliJ which has Gateway built-in), using a session token to Coder and then
+open the IDE.
+
+- [IntelliJ IDEA](https://github.com/sharkymark/v2-templates/tree/main/pod-idea)
+- [IntelliJ IDEA with Icon](https://github.com/sharkymark/v2-templates/tree/main/pod-idea-icon)
+
+### What options do I have for adding VS Code extensions into code-server, VS Code Desktop or Microsoft's Code Server?
+
+Coder has an open-source project called
+[`code-marketplace`](https://github.com/coder/code-marketplace) which is a
+private VS Code extension marketplace. There is even integration with JFrog
+Artifactory.
+
+- [Blog post](https://coder.com/blog/running-a-private-vs-code-extension-marketplace)
+- [OSS project](https://github.com/coder/code-marketplace)
+
+[See this example template](https://github.com/sharkymark/v2-templates/blob/main/code-marketplace/main.tf#L229C1-L232C12)
+where the agent specifies the URL and config environment variables which
+code-server picks up and points the developer to.
+
+Another option is to use Microsoft's code-server - which is like Coder's, but it
+can connect to Microsoft's extension marketplace so Copilot and chat can be
+retrieved there.
+[See a sample template here](https://github.com/sharkymark/v2-templates/blob/main/vs-code-server/main.tf).
+
+Another option is to use VS Code Desktop (local) and that connects to
+Microsoft's marketplace.
+https://github.com/sharkymark/v2-templates/blob/main/vs-code-server/main.tf
+
+> Note: these are example templates with no SLAs on them and are not guaranteed
+> for long-term support.
+
+### I want to run Docker for my workspaces but not install Docker Desktop.
+
+[Colima](https://github.com/abiosoft/colima) is a Docker Desktop alternative.
+
+This example is meant for a users who want to try out Coder on a macOS device.
+
+Install Colima and docker with:
+
+```sh
+brew install colima
+brew install docker
+```
+
+Start Colima:
+
+```sh
+colima start
+```
+
+Start Colima with specific compute options:
+
+```sh
+colima start --cpu 4 --memory 8
+```
+
+Starting Colima on a M3 Macbook Pro:
+
+```sh
+colima start --arch x86_64 --cpu 4 --memory 8 --disk 10
+```
+
+Colima will show the path to the docker socket so we have a
+[community template](https://github.com/sharkymark/v2-templates/tree/main/docker-code-server)
+that prompts the Coder admin to enter the docker socket as a Terraform variable.
+
+### How to make a `coder_app` optional?
+
+An example use case is the user should decide if they want a browser-based IDE
+like code-server when creating the workspace.
+
+1. Add a `coder_parameter` with type `bool` to ask the user if they want the
+ code-server IDE
+
+```hcl
+data "coder_parameter" "code_server" {
+ name = "Do you want code-server in your workspace?"
+ description = "Use VS Code in a browser."
+ type = "bool"
+ default = false
+ mutable = true
+ icon = "/icon/code.svg"
+ order = 6
+}
+```
+
+2. Add conditional logic to the `startup_script` to install and start
+ code-server depending on the value of the added `coder_parameter`
+
+```sh
+# install and start code-server, VS Code in a browser
+
+if [ ${data.coder_parameter.code_server.value} = true ]; then
+ echo "🧑🏼💻 Downloading and installing the latest code-server IDE..."
+ curl -fsSL https://code-server.dev/install.sh | sh
+ code-server --auth none --port 13337 >/dev/null 2>&1 &
+fi
+```
+
+3. Add a Terraform meta-argument
+ [`count`](https://developer.hashicorp.com/terraform/language/meta-arguments/count)
+ in the `coder_app` resource so it will only create the resource if the
+ `coder_parameter` is `true`
+
+```hcl
+# code-server
+resource "coder_app" "code-server" {
+ count = data.coder_parameter.code_server.value ? 1 : 0
+ agent_id = coder_agent.coder.id
+ slug = "code-server"
+ display_name = "code-server"
+ icon = "/icon/code.svg"
+ url = "http://localhost:13337?folder=/home/coder"
+ subdomain = false
+ share = "owner"
+
+ healthcheck {
+ url = "http://localhost:13337/healthz"
+ interval = 3
+ threshold = 10
+ }
+}
+```
+
+### Why am I getting this "remote host doesn't meet VS Code Server's prerequisites" error when opening up VSCode remote in a Linux environment?
+
+
+
+It is because, more than likely, the supported OS of either the container image
+or VM/VPS doesn't have the proper C libraries to run the VS Code Server. For
+instance, Alpine is not supported at all. If so, you need to find a container
+image or supported OS for the VS Code Server. For more information on OS
+prerequisites for Linux, please look at the VSCode docs.
+https://code.visualstudio.com/docs/remote/linux#_local-linux-prerequisites
+
+### How can I resolve disconnects when connected to Coder via JetBrains Gateway?
+
+If your JetBrains IDE is disconnected for a long period of time due to a network
+change (for example turning off a VPN), you may find that the IDE will not
+reconnect once the network is re-established (for example turning a VPN back
+on). When this happens a persistent message will appear similar to the below:
+
+```console
+No internet connection. Changes in the document might be lost. Trying to reconnect…
+```
+
+To resolve this, add this entry to your SSH config file on your local machine:
+
+```console
+Host coder-jetbrains--*
+ ServerAliveInterval 5
+```
+
+This will make SSH check that it can contact the server every five seconds. If
+it fails to do so `ServerAliveCountMax` times (3 by default for a total of 15
+seconds) then it will close the connection which forces JetBrains to recreate
+the hung session. You can tweak `ServerAliveInterval` and `ServerAliveCountMax`
+to increase or decrease the total timeout.
+
+Note that the JetBrains Gateway configuration blocks for each host in your SSH
+config file will be overwritten by the JetBrains Gateway client when it
+re-authenticates to your Coder deployment so you must add the above config as a
+separate block and not add it to any existing ones.
+
+### How can I restrict inbound/outbound file transfers from Coder workspaces?
+
+In certain environments, it is essential to keep confidential files within
+workspaces and prevent users from uploading or downloading resources using tools
+like `scp` or `rsync`.
+
+To achieve this, template admins can use the environment variable
+`CODER_AGENT_BLOCK_FILE_TRANSFER` to enable additional SSH command controls.
+This variable allows the system to check if the executed application is on the
+block list, which includes `scp`, `rsync`, `ftp`, and `nc`.
+
+```hcl
+resource "docker_container" "workspace" {
+ ...
+ env = [
+ "CODER_AGENT_TOKEN=${coder_agent.main.token}",
+ "CODER_AGENT_BLOCK_FILE_TRANSFER=true",
+ ...
+ ]
+}
+```
+
+#### Important Notice
+
+This control operates at the `ssh-exec` level or during `sftp` sessions. While
+it can help prevent automated file transfers using the specified tools, users
+can still SSH into the workspace and manually initiate file transfers. The
+primary purpose of this feature is to warn and discourage users from downloading
+confidential resources to their local machines.
+
+For more advanced security needs, consider adopting an endpoint security
+solution.
diff --git a/docs/guides/gcp-to-aws.md b/docs/tutorials/gcp-to-aws.md
similarity index 100%
rename from docs/guides/gcp-to-aws.md
rename to docs/tutorials/gcp-to-aws.md
diff --git a/docs/guides/image-pull-secret.md b/docs/tutorials/image-pull-secret.md
similarity index 100%
rename from docs/guides/image-pull-secret.md
rename to docs/tutorials/image-pull-secret.md
diff --git a/docs/tutorials/integrations/README.md b/docs/tutorials/integrations/README.md
new file mode 100644
index 0000000000000..d96b7735f7bbb
--- /dev/null
+++ b/docs/tutorials/integrations/README.md
@@ -0,0 +1,3 @@
+# Integration tutorials
+
+TODO: create page
diff --git a/docs/tutorials/island-integration.md b/docs/tutorials/island-integration.md
new file mode 100644
index 0000000000000..74cd449f4257f
--- /dev/null
+++ b/docs/tutorials/island-integration.md
@@ -0,0 +1,163 @@
+# Island Browser Integration
+
+
+April 24, 2024
+
+---
+
+[Island](https://www.island.io/) is an enterprise-grade browser, offering a
+Chromium-based experience similar to popular web browsers like Chrome and Edge.
+It includes built-in security features for corporate applications and data,
+aiming to bridge the gap between consumer-focused browsers and the security
+needs of the enterprise.
+
+Coder natively integrates with Island's feature set, which include data loss
+protection (DLP), application awareness, browser session recording, and single
+sign-on (SSO). This guide intends to document these feature categories and how
+they apply to your Coder deployment.
+
+## General Configuration
+
+### Create an Application Group for Coder
+
+We recommend creating an Application Group specific to Coder in the Island
+Management console. This Application Group object will be referenced when
+creating browser policies.
+
+[See the Island documentation for creating an Application Group](https://documentation.island.io/docs/create-and-configure-an-application-group-object).
+
+## Advanced Data Loss Protection
+
+Integrate Island's advanced data loss prevention (DLP) capabilities with Coder's
+cloud development environment (CDE), enabling you to control the “last mile”
+between developers’ CDE and their local devices, ensuring that sensitive IP
+remains in your centralized environment.
+
+### Block cut, copy, paste, printing, screen share
+
+1. [Create a Data Sandbox Profile](https://documentation.island.io/docs/create-and-configure-a-data-sandbox-profile)
+
+1. Configure the following actions to allow/block (based on your security
+ requirements):
+
+- Screenshot and Screen Share
+- Printing
+- Save Page
+- Clipboard Limitations
+
+1. [Create a Policy Rule](https://documentation.island.io/docs/create-and-configure-a-policy-rule-general)
+ to apply the Data Sandbox Profile
+
+1. Define the Coder Application group as the Destination Object
+
+1. Define the Data Sandbox Profile as the Action in the Last Mile Protection
+ section
+
+### Conditionally allow copy on Coder's CLI authentication page
+
+1. [Create a URL Object](https://documentation.island.io/docs/create-and-configure-a-policy-rule-general)
+ with the following configuration:
+
+- **Include**
+- **URL type**: Wildcard
+- **URL address**: `coder.example.com/cli-auth`
+- **Casing**: Insensitive
+
+1. [Create a Data Sandbox Profile](https://documentation.island.io/docs/create-and-configure-a-data-sandbox-profile)
+
+1. Configure action to allow copy/paste
+
+1. [Create a Policy Rule](https://documentation.island.io/docs/create-and-configure-a-policy-rule-general)
+ to apply the Data Sandbox Profile
+
+1. Define the URL Object you created as the Destination Object
+
+1. Define the Data Sandbox Profile as the Action in the Last Mile Protection
+ section
+
+### Prevent file upload/download from the browser
+
+1. Create a Protection Profiles for both upload/download
+
+- [Upload documentation](https://documentation.island.io/docs/create-and-configure-an-upload-protection-profile)
+- [Download documentation](https://documentation.island.io/v1/docs/en/create-and-configure-a-download-protection-profile)
+
+1. [Create a Policy Rule](https://documentation.island.io/docs/create-and-configure-a-policy-rule-general)
+ to apply the Protection Profiles
+
+1. Define the Coder Application group as the Destination Object
+
+1. Define the applicable Protection Profile as the Action in the Data Protection
+ section
+
+### Scan files for sensitive data
+
+1. [Create a Data Loss Prevention scanner](https://documentation.island.io/docs/create-a-data-loss-prevention-scanner)
+
+1. [Create a Policy Rule](https://documentation.island.io/docs/create-and-configure-a-policy-rule-general)
+ to apply the DLP Scanner
+
+1. Define the Coder Application group as the Destination Object
+
+1. Define the DLP Scanner as the Action in the Data Protection section
+
+## Application Awareness and Boundaries
+
+Ensure that Coder is only accessed through the Island browser, guaranteeing that
+your browser-level DLP policies are always enforced, and developers can’t
+sidestep such policies simply by using another browser.
+
+### Configure browser enforcement, conditional access policies
+
+1. Create a conditional access policy for your configured identity provider.
+
+> Note: the configured IdP must be the same for both Coder and Island
+
+- [Azure Active Directory/Entra ID](https://documentation.island.io/docs/configure-browser-enforcement-for-island-with-azure-ad#create-and-apply-a-conditional-access-policy)
+- [Okta](https://documentation.island.io/docs/configure-browser-enforcement-for-island-with-okta)
+- [Google](https://documentation.island.io/docs/configure-browser-enforcement-for-island-with-google-enterprise)
+
+## Browser Activity Logging
+
+Govern and audit in-browser terminal and IDE sessions using Island, such as
+screenshots, mouse clicks, and keystrokes.
+
+### Activity Logging Module
+
+1. [Create an Activity Logging Profile](https://documentation.island.io/docs/create-and-configure-an-activity-logging-profile)
+
+Supported browser events include:
+
+- Web Navigation
+- File Download
+- File Upload
+- Clipboard/Drag & Drop
+- Print
+- Save As
+- Screenshots
+- Mouse Clicks
+- Keystrokes
+
+1. [Create a Policy Rule](https://documentation.island.io/docs/create-and-configure-a-policy-rule-general)
+ to apply the Activity Logging Profile
+
+1. Define the Coder Application group as the Destination Object
+
+1. Define the Activity Logging Profile as the Action in the Security &
+ Visibility section
+
+## Identity-aware logins (SSO)
+
+Integrate Island's identity management system with Coder's authentication
+mechanisms to enable identity-aware logins.
+
+### Configure single sign-on (SSO) seamless authentication between Coder and Island
+
+Configure the same identity provider (IdP) for both your Island and Coder
+deployment. Upon initial login to the Island browser, the user's session token
+will automatically be passed to Coder and authenticate their Coder session.
diff --git a/docs/tutorials/operating/README.md b/docs/tutorials/operating/README.md
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/docs/guides/postgres-ssl.md b/docs/tutorials/postgres-ssl.md
similarity index 100%
rename from docs/guides/postgres-ssl.md
rename to docs/tutorials/postgres-ssl.md
diff --git a/docs/guides/support-bundle.md b/docs/tutorials/support-bundle.md
similarity index 95%
rename from docs/guides/support-bundle.md
rename to docs/tutorials/support-bundle.md
index 093c0c4191e0c..2b0ffad843bec 100644
--- a/docs/guides/support-bundle.md
+++ b/docs/tutorials/support-bundle.md
@@ -1,13 +1,5 @@
# Generate and upload a Support Bundle to Coder Support
-