## Summary Nests the CLI reference by subcommand so the Command Line sidebar collapses from 156 flat entries to 49 top-level verbs. Each page's URL follows the invocation, its page title is the full command as inline code, and its sidebar label is only its own verb as inline code. | | Before | After | | --- | --- | --- | | File | `docs/reference/cli/oauth2-provider_dcr_disable.md` | `docs/reference/cli/oauth2-provider/dcr/disable.md` | | URL | `/reference/cli/oauth2-provider_dcr_disable` | `/reference/cli/oauth2-provider/dcr/disable` | | Page title (front matter) | `oauth2-provider dcr disable` | `` `coder oauth2-provider dcr disable` `` | | Sidebar label (manifest) | `oauth2-provider dcr disable` | `` `disable` `` | Resolves DOCS-140 (coder/coder half). Also fixes the Makefile part of DOCS-1073 / DOCS-912, which this change depends on. ## Changes - `scripts/clidocgen`: pages nest by command path. A command with visible subcommands becomes its directory's `index.md`, so `oauth2-provider/index.md` and `oauth2-provider/dcr/index.md` sit above `oauth2-provider/dcr/disable.md`. Subcommand table links are relative to the parent page. - `scripts/clidocgen`: the manifest "Command Line" section is built from the command tree (nested, sorted by name, hidden commands skipped) instead of a flat list. The redundant `coder` child that pointed back at `reference/cli/index.md` is gone. - `Makefile`: the CLI rule now replaces `docs/reference/cli/` wholesale, so stale pages get removed. The manifest rule now runs `clidocgen -manifest-only` on top of the API staging manifest, so the CLI nav is generated instead of edited by hand. As a result, the nine pages that had no nav entry (`ai-gateway*`, `secret enable/disable`, `server fix-oidc-links`) now have one. - `scripts/configdocgen` and 48 prose pages: links point at the new paths (for example `reference/cli/server.md` is now `reference/cli/server/index.md`). ## How to review/QA this PR - `docs/reference/cli/**/*` (approximately 190 pages): Each of these pages are generated automatically. Some pages appear deleted, and some pages appear new. Every deleted page corresponds to a new page somewhere else, so no information is being deleted. The docs in this section should adhere to the following, so a test in the build preview for each of these items should be satisfactory: - [ ] Each subcommand of a command gets nested as a child instead of being displayed as a flat list. - [ ] Each parent command is stored in an `index.md` file. - [ ] The title of each page inside the page should now feature the full `coder XYZ` command. - [ ] The title of each page inside the page should now be formatted as inline code. - [ ] The title of each page in the sidebar should be the most granular subcommand of the whole command string (if the page's title is `coder ai-gateway keys create`, the sidebar label is `create`). - [ ] The title of each page in the sidebar should now be formatted as inline code. - [ ] The page slug for each page is now the most granular subcommand. - [ ] All links now point to the correct page. - `docs/manifest.json`: The changes here reflect the updated structure of the `docs/reference/cli` section. - `docs/**/*.md` outside of `docs/reference/cli/**/*` (approximately 50 pages): The extent of the changes in these pages are just updating the paths to point to the new page locations. - [ ] The links on the page all point to the correct new path in `docs/reference/cli`. - `scripts/clidocgen` (4 files): This is the Go code responsible for generating everything inside of `docs/reference/cli/**/*`. A typical code review here should be satisfactory. - `scripts/configdocgen` (2 files): these two files just have updates to the raw `.md` path used by `docs/admin/setup/configuration-reference.md` and updates the tests to reflect that. - `Makefile`: This updates the `make` targets for generating the CLI docs to fit the new structure. ## Merge ordering Without the renderer PRs deployed, both docs sites show literal backticks in titles and sidebar labels. Without the redirects, the old flat URLs return 404. 1. Deploy before merging this PR: coder/docs-engine#176 (beta-docs renders these titles as inline code) and coder/coder.com#1111 (classic docs renders them as inline code). Both are safe to ship first, because titles without backticks render as before. 2. Merge this PR. 3. Merge coder/coder.com#1112 (redirects from the old flat URLs) only once this content reaches the mainline release branch that serves unversioned `/docs`. ## Testing - `go test ./scripts/clidocgen/ ./scripts/configdocgen/ ./scripts/docshtmlcheck/`: pass. New tests cover page paths, subcommand links, the nested manifest, and front matter quoting. - `make docs/reference/cli/index.md docs/manifest.json docs/admin/setup/configuration-reference.md`, then a forced rerun: the second run produced no diff. - Checked the manifest: all 164 CLI entries resolve to a file, no page is missing a nav entry, and everything outside "Command Line" is byte-identical. - Relative `.md` links across `docs/`: 0 broken, same as `main`. - `make pre-commit` and `make pre-push`: pass. On earlier pre-push attempts, different unrelated vitest files timed out under host load. Those files pass when run alone, and the final push passed with `PARALLEL_JOBS=1`. <details> <summary>Implementation plan and decision log</summary> **Goal (from DOCS-140 and the requester):** URLs follow the command hierarchy. Pages are titled with the full command, and sidebar entries with the last verb only. Both are formatted as inline code. **Contract with the renderers:** a title wrapped entirely in one pair of backticks (``^`[^`]+`$``) renders as inline code. Plain-text consumers (`<title>`, meta, search, llms corpus) strip the backticks. Page title comes from front matter `title`, and the sidebar label from the manifest node `title`. **Decisions** - A parent command is `dir/index.md` rather than a sibling `dir.md`. The root CLI page is already `index.md`, and both docs-engine and the legacy coder.com renderer map `x/index.md` to `/x`. - The manifest is built from the command tree, not from the written files, so ordering is deterministic and the nesting matches the pages exactly. - The manifest discard bug (DOCS-1073 item 1) is fixed here, because without that fix the generated nested manifest would never reach the tree. DOCS-1073 items 2 through 4 (a prose fix and a hidden-command policy) are out of scope. - `-manifest-only` keeps the existing parallel `make gen` layout: the API rule still owns `_gen/manifest-staging.json`, and CLI regeneration doesn't retrigger swag. - The renderer and redirect work lives in the companion PRs in coder/docs-engine and coder/coder.com. It is linked above and not duplicated here. </details> --- > [!NOTE] > Generated by Coder Agents on behalf of @nickvigilante.
6.3 KiB
title
| title |
|---|
| GitHub |
By default, new Coder deployments use a Coder-managed GitHub app to authenticate users. We provide it for convenience, allowing you to experiment with Coder without setting up your own GitHub OAuth app.
If you authenticate with it, you grant the control plane read access to your GitHub user email and other metadata listed during the authentication flow.
This access is necessary for the control plane to complete the authentication process. To the best of our knowledge, Coder, the company, does not gain access to this data by administering the GitHub app.
Default Configuration
Important
Installation of the default GitHub app grants Coder (the company) access to your organization's GitHub data.
For production environments, we strongly recommend that you configure your own GitHub OAuth app to ensure that your data is not shared with Coder (the company).
To use the default configuration:
-
Install the GitHub app in any GitHub organization that you want to use with Coder.
The default GitHub app requires device flow to authenticate. This is enabled by default when using the default GitHub app. If you disable device flow using
CODER_OAUTH2_GITHUB_DEVICE_FLOW=false, it will be ignored. -
By default, only the admin user can sign up. To allow additional users to sign up with GitHub, add:
CODER_OAUTH2_GITHUB_ALLOW_SIGNUPS=true -
(Optional) If you want to limit sign-ups to specific GitHub organizations, set:
CODER_OAUTH2_GITHUB_ALLOWED_ORGS="your-org"
Disable the Default GitHub App
You can disable the default GitHub app by configuring your own app or by adding the following environment variable to your control plane configuration:
CODER_OAUTH2_GITHUB_DEFAULT_PROVIDER_ENABLE=false
Note
After you disable the default GitHub provider, the Sign in with GitHub button might still appear on your login page even though the authentication flow is disabled.
To completely hide the GitHub sign-in button, you must disable the default provider and ensure you don't have a custom GitHub OAuth app configured.
Step 1: Configure the OAuth application in GitHub
-
GitHub will ask you for the following Coder parameters:
-
Homepage URL: Set to your Coder deployment's
CODER_ACCESS_URL(e.g.https://coder.domain.com) -
User Authorization Callback URL: Set to
https://coder.domain.comIf you want to allow multiple Coder deployments hosted on subdomains, such as
coder1.domain.com,coder2.domain.com, to authenticate with the same GitHub OAuth app, then you can set User Authorization Callback URL to thehttps://domain.com
-
-
Take note of the Client ID and Client Secret generated by GitHub. You will use these values in the next step.
-
Coder needs 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
The control plane reads these settings from environment variables. Set them
wherever your deployment manages environment variables. For example, use
Helm values.yaml for Kubernetes or /etc/coder.d/coder.env for a system
service.
Kubernetes (Helm): set the variables under coder.env in your
values.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 its value
#- name: CODER_OAUTH2_GITHUB_ALLOW_EVERYONE
# value: "true"
Then apply the change with helm upgrade:
helm upgrade <release-name> coder-v2/coder -n <namespace> -f values.yaml
System service: add the variables to /etc/coder.d/coder.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"
Then restart Coder with sudo service coder restart.
Tip
To allow everyone to sign up using GitHub, set:
CODER_OAUTH2_GITHUB_ALLOW_EVERYONE=true
For GitHub Enterprise support, also set
CODER_OAUTH2_GITHUB_ENTERPRISE_BASE_URL.
Note
Every option above also has an equivalent CLI flag (for example,
CODER_OAUTH2_GITHUB_CLIENT_IDbecomes--oauth2-github-client-id). CLI flags are convenient for ad-hoc invocations ofcoder serverduring local development. For production deployments, prefer environment variables so the configuration lives with the container, Helm chart, or service unit that manages Coder. See the configuration reference for the full mapping between environment variables and flags.
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.
Device Flow
Coder supports device flow for GitHub OAuth. This is enabled by default for the default GitHub app and cannot be disabled for that app.
For your own custom GitHub OAuth app, you can enable device flow by setting:
CODER_OAUTH2_GITHUB_DEVICE_FLOW=true
Device flow is optional for custom GitHub OAuth apps. We generally recommend using the standard OAuth flow instead, as it is more convenient for end users.
Note
If you're using the default GitHub app, device flow is always enabled regardless of the
CODER_OAUTH2_GITHUB_DEVICE_FLOWsetting.