Files
coder-server/compose.dev.yaml
Cian Johnston 88465ea48a chore: misc improvements to compose.dev.yaml (#22541)
- Unexposes port 5432 so it doesn't conflict with existing databases.
You can still hop into the DB if you need.
- Updates multiple CODER_ envs to sensible defaults, overrideable via env
2026-03-03 12:07:57 +00:00

365 lines
10 KiB
YAML

# docker-compose.dev.yml — Development environment
services:
database:
labels:
- "com.coder.dev"
networks:
- coder-dev
image: postgres:17
environment:
POSTGRES_USER: coder
POSTGRES_PASSWORD: coder
POSTGRES_DB: coder
volumes:
- coder_dev_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U coder"]
interval: 2s
timeout: 5s
retries: 10
# Ensure named volumes are owned by the coder user (uid 1000)
# since Docker creates them as root by default.
init-volumes:
labels:
- "com.coder.dev"
image: codercom/oss-dogfood:latest
user: "0:0"
volumes:
- go_cache:/go-cache
- coder_cache:/cache
- bootstrap_token:/bootstrap
- site_node_modules:/app/site/node_modules
command: >
chown -R 1000:1000
/go-cache
/cache
/bootstrap
/app/site/node_modules
build-slim:
labels:
- "com.coder.dev"
network_mode: "host"
image: codercom/oss-dogfood:latest
depends_on:
init-volumes:
condition: service_completed_successfully
database:
condition: service_healthy
working_dir: /app
# Add the Docker group so coderd can access the Docker socket.
# If your Docker group is not 999, the below should work:
# export DOCKER_GROUP=$(getent group docker | cut -d: -f3)
group_add:
- "${DOCKER_GROUP:-999}"
environment:
GOMODCACHE: /go-cache/mod
GOCACHE: /go-cache/build
DOCKER_HOST: "${CODER_DEV_DOCKER_HOST:-unix:///var/run/docker.sock}"
volumes:
- .:/app
- go_cache:/go-cache
- coder_cache:/cache
- "${DOCKER_SOCKET:-/var/run/docker.sock}:/var/run/docker.sock"
command: >
sh -c '
if [ "${CODER_BUILD_AGPL:-0}" = "1" ]; then
make -j build-slim CODER_BUILD_AGPL=1
else
make -j build-slim
fi &&
mkdir -p /cache/site/orig/bin &&
cp site/out/bin/coder-* /cache/site/orig/bin/
'
coderd:
labels:
- "com.coder.dev"
networks:
- coder-dev
image: codercom/oss-dogfood:latest
depends_on:
database:
condition: service_healthy
build-slim:
condition: service_completed_successfully
environment:
CODER_ACCESS_URL: "${CODER_DEV_ACCESS_URL-http://localhost:3000}"
CODER_CACHE_DIRECTORY: "${CODER_CACHE_DIRECTORY-/cache}"
CODER_DANGEROUS_ALLOW_CORS_REQUESTS: "${CODER_DANGEROUS_ALLOW_CORS_REQUESTS-true}"
CODER_DEV_ADMIN_PASSWORD: "${CODER_DEV_ADMIN_PASSWORD-SomeSecurePassword!}"
CODER_EXPERIMENTS: "${CODER_EXPERIMENTS-*}"
CODER_HTTP_ADDRESS: "${CODER_HTTP_ADDRESS-0.0.0.0:3000}"
CODER_PG_CONNECTION_URL: "${CODER_PG_CONNECTION_URL-postgresql://coder:coder@database:5432/coder?sslmode=disable}"
CODER_PROMETHEUS_ENABLE: "${CODER_PROMETHEUS_ENABLE-true}"
CODER_SWAGGER_ENABLE: "${CODER_SWAGGER_ENABLE-true}"
CODER_TELEMETRY_ENABLE: "${CODER_TELEMETRY_ENABLE-false}"
CODER_VERBOSE: "${CODER_VERBOSE-true}"
DOCKER_HOST: "${CODER_DEV_DOCKER_HOST-unix:///var/run/docker.sock}"
GOCACHE: /go-cache/build
GOMODCACHE: /go-cache/mod
# Add the Docker group so coderd can access the Docker socket.
# Override DOCKER_GROUP if your host's docker group is not 999.
group_add:
- "${DOCKER_GROUP:-999}"
ports:
- "3000:3000"
healthcheck:
test: ["CMD-SHELL", "curl -sf http://localhost:3000/healthz || exit 1"]
interval: 5s
timeout: 5s
retries: 30
start_period: 120s
working_dir: /app
volumes:
- .:/app
- go_cache:/go-cache
- coder_cache:/cache
- "${DOCKER_SOCKET:-/var/run/docker.sock}:/var/run/docker.sock"
command: >
sh -c '
CMD_PATH="./enterprise/cmd/coder"
[ "${CODER_BUILD_AGPL:-0}" = "1" ] && CMD_PATH="./cmd/coder"
exec go run "$$CMD_PATH" server \
--http-address 0.0.0.0:3000 \
--access-url "${CODER_DEV_ACCESS_URL:-http://localhost:3000}" \
--swagger-enable \
--dangerous-allow-cors-requests=true \
--enable-terraform-debug-mode
'
setup-init:
labels:
- "com.coder.dev"
networks:
- coder-dev
image: codercom/oss-dogfood:latest
depends_on:
coderd:
condition: service_healthy
working_dir: /app
environment:
CODER_URL: "http://coderd:3000"
CODER_DEV_ADMIN_PASSWORD: "${CODER_DEV_ADMIN_PASSWORD:-SomeSecurePassword!}"
GOMODCACHE: /go-cache/mod
GOCACHE: /go-cache/build
volumes:
- .:/app
- go_cache:/go-cache
- bootstrap_token:/bootstrap
- ./scripts/docker-dev:/scripts:ro
command: ["sh", "/scripts/setup-init.sh"]
setup-users:
labels:
- "com.coder.dev"
networks:
- coder-dev
image: codercom/oss-dogfood:latest
depends_on:
setup-init:
condition: service_completed_successfully
working_dir: /app
environment:
CODER_URL: "http://coderd:3000"
CODER_DEV_MEMBER_PASSWORD: "${CODER_DEV_MEMBER_PASSWORD:-SomeSecurePassword!}"
GOMODCACHE: /go-cache/mod
GOCACHE: /go-cache/build
volumes:
- .:/app
- go_cache:/go-cache
- bootstrap_token:/bootstrap:ro
- ./scripts/docker-dev:/scripts:ro
command: ["sh", "/scripts/setup-users.sh"]
setup-template:
labels:
- "com.coder.dev"
networks:
- coder-dev
image: codercom/oss-dogfood:latest
depends_on:
setup-init:
condition: service_completed_successfully
working_dir: /app
environment:
CODER_URL: "http://coderd:3000"
DOCKER_HOST: "${CODER_DEV_DOCKER_HOST:-unix:///var/run/docker.sock}"
GOMODCACHE: /go-cache/mod
GOCACHE: /go-cache/build
volumes:
- .:/app
- go_cache:/go-cache
- bootstrap_token:/bootstrap:ro
- ./scripts/docker-dev:/scripts:ro
- "${DOCKER_SOCKET:-/var/run/docker.sock}:/var/run/docker.sock"
command: ["sh", "/scripts/setup-template.sh"]
site:
labels:
- "com.coder.dev"
networks:
- coder-dev
image: codercom/oss-dogfood:latest
depends_on:
setup-template:
condition: service_completed_successfully
working_dir: /app/site
environment:
CODER_HOST: "http://coderd:3000"
ports:
- "8080:8080"
volumes:
- ./site:/app/site
- site_node_modules:/app/site/node_modules
command: sh -c "pnpm install --frozen-lockfile && pnpm dev --host"
wsproxy:
profiles: ["proxy"]
labels:
- "com.coder.dev"
networks:
- coder-dev
image: codercom/oss-dogfood:latest
depends_on:
setup-init:
condition: service_completed_successfully
working_dir: /app
environment:
CODER_URL: "http://coderd:3000"
GOMODCACHE: /go-cache/mod
GOCACHE: /go-cache/build
volumes:
- .:/app
- go_cache:/go-cache
- bootstrap_token:/bootstrap:ro
ports:
- "3010:3010"
command: >
sh -c '
export CODER_SESSION_TOKEN=$$(cat /bootstrap/token) &&
go run ./cmd/coder wsproxy delete local-proxy --yes 2>/dev/null || true
PROXY_TOKEN=$$(go run ./cmd/coder wsproxy create \
--name=local-proxy \
--display-name="Local Proxy" \
--icon="/emojis/1f4bb.png" \
--only-token)
exec go run ./cmd/coder wsproxy server \
--dangerous-allow-cors-requests=true \
--http-address=0.0.0.0:3010 \
--proxy-session-token="$$PROXY_TOKEN" \
--primary-access-url=http://coderd:3000
'
setup-multi-org:
profiles: ["multi-org"]
labels:
- "com.coder.dev"
networks:
- coder-dev
image: codercom/oss-dogfood:latest
depends_on:
setup-users:
condition: service_completed_successfully
setup-template:
condition: service_completed_successfully
working_dir: /app
environment:
CODER_URL: "http://coderd:3000"
DOCKER_HOST: "${CODER_DEV_DOCKER_HOST:-unix:///var/run/docker.sock}"
LICENSE_FILE: "${CODER_DEV_LICENSE_FILE:-./license.txt}"
GOMODCACHE: /go-cache/mod
GOCACHE: /go-cache/build
volumes:
- .:/app
- go_cache:/go-cache
- bootstrap_token:/bootstrap:ro
- ./scripts/docker-dev:/scripts:ro
- "${CODER_DEV_LICENSE_FILE:-./license.txt}:/license.txt:ro"
command: ["sh", "/scripts/setup-multi-org.sh"]
ext-provisioner:
profiles: ["multi-org"]
labels:
- "com.coder.dev"
networks:
- coder-dev
healthcheck:
test: ["CMD", "curl", "--fail", "http://localhost:2112"]
image: codercom/oss-dogfood:latest
depends_on:
setup-multi-org:
condition: service_completed_successfully
group_add:
- "${DOCKER_GROUP:-999}"
working_dir: /app
environment:
CODER_URL: "${CODER_URL-http://coderd:3000}"
DOCKER_HOST: "${CODER_DEV_DOCKER_HOST-unix:///var/run/docker.sock}"
GOMODCACHE: /go-cache/mod
GOCACHE: /go-cache/build
CODER_PROMETHEUS_ENABLE: "${CODER_PROMETHEUS_ENABLE-1}"
volumes:
- .:/app
- go_cache:/go-cache
- bootstrap_token:/bootstrap:ro
- "${DOCKER_SOCKET:-/var/run/docker.sock}:/var/run/docker.sock"
command: >
sh -c '
export CODER_SESSION_TOKEN=$$(cat /bootstrap/token) &&
exec go run ./enterprise/cmd/coder provisionerd start \
--tag "scope=organization" \
--name second-org-daemon \
--org second-organization
'
setup-multi-org-template:
profiles: ["multi-org"]
labels:
- "com.coder.dev"
networks:
- coder-dev
image: codercom/oss-dogfood:latest
depends_on:
setup-multi-org:
condition: service_completed_successfully
ext-provisioner:
condition: service_healthy
working_dir: /app
environment:
CODER_URL: "http://coderd:3000"
GOMODCACHE: /go-cache/mod
GOCACHE: /go-cache/build
volumes:
- .:/app
- go_cache:/go-cache
- bootstrap_token:/bootstrap:ro
- ./scripts/docker-dev:/scripts:ro
command: ["sh", "-c", "/scripts/setup-template.sh second-organization"]
volumes:
coder_dev_data:
labels:
- "com.coder.dev"
go_cache:
labels:
- "com.coder.dev"
coder_cache:
labels:
- "com.coder.dev"
site_node_modules:
labels:
- "com.coder.dev"
bootstrap_token:
labels:
- "com.coder.dev"
networks:
coder-dev:
labels:
- "com.coder.dev"
name: coder-dev
driver: bridge