version: '3.8'
services:
robot:
profiles: ["robot"]
build:
context: {{build_context}}
dockerfile: {{dockerfile_path}}
target: production-robot
args:
RUN_TARGET: robot
image: ${DOCKER_IMAGE:-{{project_name}}}:robot-${DOCKER_TAG:-latest}
container_name: ${COMPOSE_PROJECT_NAME:-{{project_name}}}-robot
environment:
- MECHA10_ENVIRONMENT=${MECHA10_ENVIRONMENT:-production}
- MECHA10_REDIS_URL=${MECHA10_REDIS_URL:-}
- MECHA10_POSTGRES_HOST=${MECHA10_POSTGRES_HOST:-}
- MECHA10_POSTGRES_PASSWORD=${MECHA10_POSTGRES_PASSWORD:-}
- ALLOW_DEGRADED_MODE=${ALLOW_DEGRADED_MODE:-true}
- REQUIRE_ALL_DEVICES=${REQUIRE_ALL_DEVICES:-false}
- RUST_LOG=${RUST_LOG:-info}
volumes:
- ${LOG_PATH:-./logs/robot}:/var/log/{{project_name}}
devices:
- ${CAMERA_DEVICE:-/dev/null}:/dev/video0
- ${LIDAR_DEVICE:-/dev/null}:/dev/ttyUSB0
- ${MOTOR_DEVICE:-/dev/null}:/dev/ttyACM0
cap_add:
- SYS_RAWIO
networks:
- mecha10-network
restart: always
deploy:
resources:
limits:
cpus: ${ROBOT_CPU_LIMIT:-2.0}
memory: ${ROBOT_MEMORY_LIMIT:-512M}
remote:
profiles: ["remote"]
build:
context: {{build_context}}
dockerfile: {{dockerfile_path}}
target: production-remote
args:
RUN_TARGET: remote
ENABLE_GPU: ${GPU_ENABLED:-false}
GPU_VENDOR: ${GPU_VENDOR:-nvidia}
image: ${DOCKER_IMAGE:-{{project_name}}}:remote-${DOCKER_TAG:-latest}
container_name: ${COMPOSE_PROJECT_NAME:-{{project_name}}}-remote
environment:
- MECHA10_ENVIRONMENT=${MECHA10_ENVIRONMENT:-production}
- MECHA10_REDIS_URL=${MECHA10_REDIS_URL:-}
- MECHA10_POSTGRES_HOST=${MECHA10_POSTGRES_HOST:-}
- MECHA10_POSTGRES_PASSWORD=${MECHA10_POSTGRES_PASSWORD:-}
- GPU_ENABLED=${GPU_ENABLED:-false}
- CUDA_VISIBLE_DEVICES=${GPU_DEVICE_IDS:-0}
- NVIDIA_DRIVER_CAPABILITIES=${NVIDIA_DRIVER_CAPABILITIES:-compute,utility}
- MODEL_CACHE_PATH=${MODEL_CACHE_PATH:-/var/cache/mecha10/models}
- DATA_PATH=${DATA_PATH:-/var/cache/mecha10/data}
- ALLOW_DEGRADED_MODE=${ALLOW_DEGRADED_MODE:-true}
- RUST_LOG=${RUST_LOG:-info}
volumes:
- ${LOG_PATH:-./logs/remote}:/var/log/{{project_name}}
- ${MODEL_CACHE_PATH:-./cache/models}:/var/cache/mecha10/models
- ${DATA_PATH:-./cache/data}:/var/cache/mecha10/data
networks:
- mecha10-network
restart: always
deploy:
resources:
limits:
cpus: ${REMOTE_CPU_LIMIT:-4.0}
memory: ${REMOTE_MEMORY_LIMIT:-2G}
reservations:
devices:
- driver: nvidia
count: ${GPU_COUNT:-all}
capabilities: [gpu]
dev:
profiles: ["dev"]
build:
context: {{build_context}}
dockerfile: {{dockerfile_path}}
target: development
container_name: ${COMPOSE_PROJECT_NAME:-{{project_name}}}-dev
environment:
- MECHA10_ENVIRONMENT=${MECHA10_ENVIRONMENT:-development}
- MECHA10_REDIS_URL=${MECHA10_REDIS_URL:-}
- MECHA10_POSTGRES_HOST=${MECHA10_POSTGRES_HOST:-}
- MECHA10_POSTGRES_PASSWORD=${MECHA10_POSTGRES_PASSWORD:-}
- RUST_LOG=${RUST_LOG:-debug}
- CARGO_WATCH_ENABLED=${CARGO_WATCH_ENABLED:-true}
volumes:
{{#if is_monorepo}}
- ./packages:/workspace/packages:ro
{{/if}}
- {{project_path}}/src:/workspace/{{project_path}}/src
- {{project_path}}/drivers:/workspace/{{project_path}}/drivers
- {{project_path}}/nodes:/workspace/{{project_path}}/nodes
- {{project_path}}/embedded:/workspace/{{project_path}}/embedded
- {{project_path}}/build.rs:/workspace/{{project_path}}/build.rs
- {{project_path}}/mecha10.json:/workspace/{{project_path}}/mecha10.json
- {{project_path}}/Cargo.toml:/workspace/{{project_path}}/Cargo.toml
- {{project_path}}/logs:/workspace/{{project_path}}/logs
- cargo-registry:/usr/local/cargo/registry
- cargo-git:/usr/local/cargo/git
- cargo-target:/workspace/target
networks:
- mecha10-network
restart: unless-stopped
command: >
bash -c "
if [ \"$${CARGO_WATCH_ENABLED}\" = \"true\" ]; then
echo '🔥 Hot reload enabled - watching for changes...'
cargo watch -x 'run -- run'
else
cargo run -- run
fi
"
networks:
mecha10-network:
external: ${NETWORK_EXTERNAL:-true}
name: ${NETWORK_NAME:-mecha10_mecha10-network}
volumes:
cargo-registry:
cargo-git:
cargo-target: