Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
SHELL := $(SHELL) -e
ASDF := $(shell asdf where golang)
VERSION ?= 2.18.1
VERSION ?= 2.19.0

# Help
.PHONY: $(shell sed -n -e '/^$$/ { n ; /^[^ .\#][^ ]*:/ { s/:.*$$// ; p ; } ; }' $(MAKEFILE_LIST))
Expand Down
14 changes: 13 additions & 1 deletion docker/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ regarding FiftyOne Enterprise.
- [Advanced Configuration](#advanced-configuration)
- [Backup And Recovery](#backup-and-recovery)
- [Secrets And Sensitive Data](#secrets-and-sensitive-data)
- [Telemetry](#telemetry)
- [Snapshot Archival](#snapshot-archival)
- [Static Banner Configuration](#static-banner-configuration)
- [Storage Credentials and `FIFTYONE_ENCRYPTION_KEY`](#storage-credentials-and-fiftyone_encryption_key)
Expand Down Expand Up @@ -239,7 +240,7 @@ You can override the default image used by any service in
```yaml
services:
fiftyone-app:
image: voxel51/fiftyone-app-torch:v2.18.1
image: voxel51/fiftyone-app-torch:v2.19.0
```

> [!NOTE]
Expand Down Expand Up @@ -656,6 +657,17 @@ and
[adding secrets](https://docs.voxel51.com/enterprise/secrets.html#adding-secrets)
for questions regarding storage and encryption.

### Telemetry

FiftyOne Enterprise bundles a telemetry sidecar and Redis backend by
default in every compose file.
The Settings → Metrics page in teams-app exposes live per-service
metrics (CPU, memory, FDs, thread counts) and tailed logs.

Please refer to the
[telemetry configuration documentation](./docs/configuring-telemetry.md)
for full details.

### Snapshot Archival

Since version v1.5, FiftyOne Enterprise supports
Expand Down
162 changes: 154 additions & 8 deletions docker/common-services.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
services:
fiftyone-app-common:
image: voxel51/fiftyone-app:v2.18.1
image: voxel51/fiftyone-app:v2.19.0
environment:
API_URL: ${API_URL}
FIFTYONE_APP_DEFAULT_QUERY_PERFORMANCE: ${FIFTYONE_APP_DEFAULT_QUERY_PERFORMANCE}
Expand All @@ -17,6 +17,7 @@ services:
FIFTYONE_MEDIA_CACHE_APP_IMAGES: false
FIFTYONE_MEDIA_CACHE_SIZE_BYTES: -1
FIFTYONE_SIGNED_URL_EXPIRATION: ${FIFTYONE_SIGNED_URL_EXPIRATION:-24}
FIFTYONE_TELEMETRY_REDIS_URL: ${FIFTYONE_TELEMETRY_REDIS_URL:-redis://telemetry-redis:6379}
# If you are routing through a proxy server you will want to set
# HTTP_PROXY_URL, HTTPS_PROXY_URL, and NO_PROXY_LIST in your .env
# then add the following environment variables to your
Expand All @@ -32,7 +33,7 @@ services:
restart: always

teams-api-common:
image: voxel51/fiftyone-teams-api:v2.18.1
image: voxel51/fiftyone-teams-api:v2.19.0
environment:
API_EXTERNAL_URL: ${FIFTYONE_API_URI}
CAS_BASE_URL: ${CAS_BASE_URL:-http://teams-cas:3000/cas/api}
Expand All @@ -43,6 +44,7 @@ services:
FIFTYONE_ENV: ${FIFTYONE_ENV}
FIFTYONE_INTERNAL_SERVICE: true
FIFTYONE_LOGGING_FORMAT: ${FIFTYONE_LOGGING_FORMAT:-text}
FIFTYONE_TELEMETRY_REDIS_URL: ${FIFTYONE_TELEMETRY_REDIS_URL:-redis://telemetry-redis:6379}
GRAPHQL_DEFAULT_LIMIT: ${GRAPHQL_DEFAULT_LIMIT}
LOGGING_LEVEL: ${API_LOGGING_LEVEL:-INFO}
MONGO_DEFAULT_DB: ${FIFTYONE_DATABASE_NAME}
Expand All @@ -61,17 +63,18 @@ services:
restart: always

teams-app-common:
image: voxel51/fiftyone-teams-app:v2.18.1
image: voxel51/fiftyone-teams-app:v2.19.0
environment:
API_URL: ${API_URL}
APP_USE_HTTPS: ${APP_USE_HTTPS:-true}
FIFTYONE_API_URI: ${FIFTYONE_API_URI:-"Please contact your Admin for an API URI"}
FIFTYONE_APP_ALLOW_MEDIA_EXPORT: ${FIFTYONE_APP_ALLOW_MEDIA_EXPORT:-true}
FIFTYONE_APP_TEAMS_SDK_RECOMMENDED_VERSION: 2.18.1
FIFTYONE_APP_TEAMS_SDK_RECOMMENDED_VERSION: 2.19.0
FIFTYONE_AUTH_SECRET: ${FIFTYONE_AUTH_SECRET}
FIFTYONE_SERVER_ADDRESS: ""
FIFTYONE_SERVER_PATH_PREFIX: /api/proxy/fiftyone-teams
FIFTYONE_TEAMS_PROXY_URL: ${FIFTYONE_TEAMS_PROXY_URL}
FIFTYONE_TELEMETRY_REDIS_URL: ${FIFTYONE_TELEMETRY_REDIS_URL:-redis://telemetry-redis:6379}
NODE_ENV: production
RECOIL_DUPLICATE_ATOM_KEY_CHECKING_ENABLED: false
FIFTYONE_APP_ANONYMOUS_ANALYTICS_ENABLED: ${FIFTYONE_APP_ANONYMOUS_ANALYTICS_ENABLED:-true}
Expand All @@ -95,7 +98,7 @@ services:
restart: always

teams-cas-common:
image: voxel51/fiftyone-teams-cas:v2.18.1
image: voxel51/fiftyone-teams-cas:v2.19.0
environment:
CAS_DATABASE_NAME: ${CAS_DATABASE_NAME:-cas}
CAS_DEFAULT_USER_ROLE: ${CAS_DEFAULT_USER_ROLE:-GUEST}
Expand Down Expand Up @@ -130,7 +133,7 @@ services:
read_only: true

teams-plugins-common:
image: voxel51/fiftyone-app-torch:v2.18.1
image: voxel51/fiftyone-app-torch:v2.19.0
environment:
API_URL: ${API_URL}
FIFTYONE_AUTH_SECRET: ${FIFTYONE_AUTH_SECRET}
Expand All @@ -144,6 +147,7 @@ services:
FIFTYONE_MEDIA_CACHE_APP_IMAGES: false
FIFTYONE_MEDIA_CACHE_SIZE_BYTES: -1
FIFTYONE_PLUGINS_DIR: /opt/plugins
FIFTYONE_TELEMETRY_REDIS_URL: ${FIFTYONE_TELEMETRY_REDIS_URL:-redis://telemetry-redis:6379}
# If you are routing through a proxy server you will want to set
# HTTP_PROXY_URL, HTTPS_PROXY_URL, and NO_PROXY_LIST in your .env
# then add the following environment variables to your
Expand All @@ -157,9 +161,13 @@ services:
restart: always

teams-do-common:
image: voxel51/fiftyone-teams-cv-full:v2.18.1
image: voxel51/fiftyone-teams-cv-full:v2.19.0
# Telemetry default-on requires teams-do to share its PID namespace
# with a single sidecar (compose's `pid: "service:<name>"` only joins
# one replica). Force replicas=1 to keep the 1:1 pairing deterministic.
# See docker/docs/configuring-telemetry.md for multi-worker patterns.
deploy:
replicas: ${FIFTYONE_DELEGATED_OPERATOR_WORKER_REPLICAS:-3}
replicas: 1
command: >
/bin/sh -c "fiftyone delegated launch -t remote -m"
environment:
Expand All @@ -171,6 +179,144 @@ services:
FIFTYONE_INTERNAL_SERVICE: true
FIFTYONE_MEDIA_CACHE_SIZE_BYTES: -1
FIFTYONE_PLUGINS_DIR: /opt/plugins
FIFTYONE_TELEMETRY_REDIS_URL: ${FIFTYONE_TELEMETRY_REDIS_URL:-redis://telemetry-redis:6379}
TELEMETRY_SOCKET: /tmp/telemetry/agent.sock
restart: always
volumes:
- plugins-vol:/opt/plugins:ro
- telemetry-socket:/tmp/telemetry

telemetry-redis-common:
image: ${TELEMETRY_REDIS_IMAGE:-redis:7-alpine}
command:
- redis-server
- --save
- "60"
- "1"
- --dir
- /data
- --maxmemory
- ${TELEMETRY_REDIS_MAXMEMORY:-400mb}
- --maxmemory-policy
- allkeys-lru
restart: always
deploy:
resources:
limits:
cpus: "0.25"
memory: 512M
reservations:
cpus: "0.10"
memory: 256M
volumes:
- telemetry-redis-data:/data

# One sidecar per observed service. `pid: "service:<target>"` joins the
# target's PID namespace so the sidecar can read /proc/<pid>/fd/1 and
# psutil can see the target's process.
fiftyone-app-telemetry-common:
image: voxel51/telemetry-sidecar:v2.19.0
pid: "service:fiftyone-app"
# Matches the workload image's USER 1000:1000 so the kernel's
# ptrace_may_access() check on /proc/<workload-pid>/fd/1 reads passes via the
# same-UID fast path to allow for log tailing
user: "1000:1000"
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
environment:
POD_NAME: fiftyone-app
POD_NAMESPACE: ${TELEMETRY_NAMESPACE:-docker}
SERVICE_TYPE: fiftyone-app
TARGET_NAME: ${FIFTYONE_APP_TARGET_NAME:-hypercorn}
FIFTYONE_TELEMETRY_REDIS_URL: ${FIFTYONE_TELEMETRY_REDIS_URL:-redis://telemetry-redis:6379}
deploy:
resources:
limits:
cpus: "0.10"
memory: 512M
reservations:
cpus: "0.10"
memory: 512M
restart: always

teams-api-telemetry-common:
image: voxel51/telemetry-sidecar:v2.19.0
pid: "service:teams-api"
user: "1000:1000"
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
environment:
POD_NAME: teams-api
POD_NAMESPACE: ${TELEMETRY_NAMESPACE:-docker}
SERVICE_TYPE: teams-api
TARGET_NAME: ${TEAMS_API_TARGET_NAME:-fiftyone-teams-api}
FIFTYONE_TELEMETRY_REDIS_URL: ${FIFTYONE_TELEMETRY_REDIS_URL:-redis://telemetry-redis:6379}
deploy:
resources:
limits:
cpus: "0.10"
memory: 512M
reservations:
cpus: "0.10"
memory: 512M
restart: always

teams-plugins-telemetry-common:
image: voxel51/telemetry-sidecar:v2.19.0
pid: "service:teams-plugins"
user: "1000:1000"
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
environment:
POD_NAME: teams-plugins
POD_NAMESPACE: ${TELEMETRY_NAMESPACE:-docker}
SERVICE_TYPE: teams-plugins
TARGET_NAME: ${TEAMS_PLUGINS_TARGET_NAME:-hypercorn}
FIFTYONE_TELEMETRY_REDIS_URL: ${FIFTYONE_TELEMETRY_REDIS_URL:-redis://telemetry-redis:6379}
deploy:
resources:
limits:
cpus: "0.10"
memory: 512M
reservations:
cpus: "0.10"
memory: 512M
restart: always

teams-do-telemetry-common:
image: voxel51/telemetry-sidecar:v2.19.0
pid: "service:teams-do"
user: "1000:1000"
cap_drop:
- ALL
cap_add:
- SYS_PTRACE # allows for additional profiling metrics (sampled stacks via py-spy)
security_opt:
- no-new-privileges:true
environment:
POD_NAME: teams-do
POD_NAMESPACE: ${TELEMETRY_NAMESPACE:-docker}
SERVICE_TYPE: delegated-operator
TARGET_NAME: ${TEAMS_DO_TARGET_NAME:-fiftyone delegated}
EXECUTOR_SIDECAR: "true"
TELEMETRY_SOCKET: /tmp/telemetry/agent.sock
FIFTYONE_TELEMETRY_REDIS_URL: ${FIFTYONE_TELEMETRY_REDIS_URL:-redis://telemetry-redis:6379}
FIFTYONE_DATABASE_URI: ${FIFTYONE_DATABASE_URI}
FIFTYONE_DATABASE_NAME: ${FIFTYONE_DATABASE_NAME}
deploy:
resources:
limits:
cpus: "0.10"
memory: 512M
reservations:
cpus: "0.10"
memory: 512M
volumes:
- telemetry-socket:/tmp/telemetry
restart: always
13 changes: 13 additions & 0 deletions docker/docs/configuring-delegated-operators.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,19 @@ in conjunction with one of the three plugin configurations.
up -d
```

> [!IMPORTANT]
> The `compose.delegated-operators.yaml` overlay defines three worker
> slots — `teams-do`, `teams-do-2`, `teams-do-3` — each paired with a
> telemetry sidecar. Slot 1 is always on (the default renders one
> observed worker); slots 2 and 3 are gated behind cumulative Compose
> profiles (`do-2`, `do-3`). Set `COMPOSE_PROFILES=do-N` to add slots
> up to N (cap of 3). This replaces the deprecated
> `FIFTYONE_DELEGATED_OPERATOR_WORKER_REPLICAS` environment variable.
> If you used on the <2.19 default of 3 workers, set `COMPOSE_PROFILES=do-3`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix typo in upgrade guidance sentence.

Line 43 reads awkwardly (If you used on the <2.19 default...). Suggested wording: If you were using the pre-2.19 default of 3 workers, set COMPOSE_PROFILES=do-3.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docker/docs/configuring-delegated-operators.md` at line 43, The sentence "If
you used on the <2.19 default of 3 workers, set `COMPOSE_PROFILES=do-3`."
contains a typo and awkward phrasing; replace it with the suggested wording "If
you were using the pre-2.19 default of 3 workers, set `COMPOSE_PROFILES=do-3`."
Update that exact sentence in the documentation to improve clarity.

> See
> [Scaling teams-do with telemetry](./configuring-telemetry.md#scaling-teams-do-with-telemetry)
> for the slot/profile reference and the rationale.

Optionally, delegated operation run logs may be uploaded to a
network-mounted file system or cloud storage path.
Logs are uploaded in the format
Expand Down
22 changes: 15 additions & 7 deletions docker/docs/configuring-gpu-workloads.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,19 @@ We will configure the
[delegated operators](./configuring-delegated-operators.md)
with GPUs.

In your `compose.delegated-operators.yaml`, under `.services.teams-do`,
add the `deploy.resource.reservation.devices` configuration.

The below will deploy a CPU-based delegated operator (`teams-do`) as well
as a GPU-based delegated operator (`teams-do-with-gpu`):
For most deployments, use the shipped GPU overlay
`compose.delegated-operators.gpu.yaml`, which includes the GPU
worker and its paired telemetry sidecar. Activate it alongside the CPU
worker profile (e.g. `COMPOSE_PROFILES=do-1,gpu`); see
[Configuring Telemetry](./configuring-telemetry.md#scaling-teams-do-with-telemetry)
Comment on lines +57 to +58

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix profile example to match delegated-operator profile semantics.

Line 57 uses COMPOSE_PROFILES=do-1,gpu, but this conflicts with the delegated-operators doc update in this PR where slot 1 is always on and optional profiles are do-2/do-3. Use COMPOSE_PROFILES=gpu (or do-2,gpu / do-3,gpu when scaling extra workers).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docker/docs/configuring-gpu-workloads.md` around lines 57 - 58, Update the
example that sets COMPOSE_PROFILES so it follows the delegated-operator profile
semantics: replace the incorrect `COMPOSE_PROFILES=do-1,gpu` with
`COMPOSE_PROFILES=gpu` (or `COMPOSE_PROFILES=do-2,gpu` /
`COMPOSE_PROFILES=do-3,gpu` when showing how to scale extra workers). Ensure any
mention of slot 1 being optional is removed and that examples reference
`do-2`/`do-3` for additional worker slots and `gpu` for the GPU profile.

for the full profile reference.

The snippet below contains custom inline example of
how to add a GPU-based delegated operator (`teams-do-with-gpu`)
alongside the standard `teams-do`. Pair it with telemetry by
adding a matching `teams-do-with-gpu-telemetry` sidecar. See
`docker/<auth-dir>/compose.delegated-operators.gpu.yaml` for an
example.

```yaml
services:
Expand All @@ -65,7 +73,7 @@ services:
service: teams-do-common

teams-do-with-gpu:
image: voxel51/fiftyone-teams-cv-full:v2.18.1
image: voxel51/fiftyone-teams-cv-full:v2.19.0
command: >
/bin/sh -c "fiftyone delegated launch -t remote -n 'teams-do-with-gpu' -m"
environment:
Expand All @@ -81,7 +89,7 @@ services:
volumes:
- plugins-vol:/opt/plugins:ro
deploy:
replicas: ${FIFTYONE_DELEGATED_OPERATOR_WORKER_REPLICAS:-3}
replicas: 1
resources:
reservations:
devices:
Expand Down
Loading
Loading