Deploy Applications
Deploy Applications
Deploy and manage containerized workloads on ALPON edge AI computers from the Sixfab Connect platform. This guide covers two deployment paths (Docker Hub and the private Sixfab Container Registry), container access, lifecycle management, log streaming, and CI/CD patterns for production fleets.
ALPON X4 and ALPON X5 AI run application workloads as Docker containers managed from the Sixfab Connect platform. Open the device's Applications tab, click + Deploy, then either pull an ARM64-compatible image from Docker Hub by typing its path (e.g. nginx:latest) or select a custom image you have pushed to your private Sixfab Container Registry at cr.sixfab.io. Configure ports in the 30000-32767 range, environment variables, and volumes, then deploy. The container starts on the device within seconds.
ALPON devices are built on ARM64. Every container image deployed must include a linux/arm64 variant. Most official images on Docker Hub (nginx, redis, postgres, node) ship multi-arch manifests with ARM64 included. Custom images must be built with docker buildx build --platform linux/arm64.
Overview
ALPON treats every workload as an isolated Docker container. The runtime is preinstalled on the device and authenticated against the Sixfab Container Registry out of the box, so deployment is a one-click operation from the cloud dashboard. There is no SSH-based provisioning, no manual docker pull, and no per-device credential management.
What you can deploy
How deployment works
Every ALPON device opens a persistent connection to the Sixfab Connect control plane. When a deploy is triggered from the dashboard, the platform sends a structured manifest to the device, which then pulls the image, applies port and volume mappings, and starts the container. Status is streamed back to the cloud in real time.
Deployment Methods
ALPON supports two image sources. Both deploy through the same Applications tab on Connect; the difference is where the image lives.
Pull any ARM64-compatible public image directly from Docker Hub. Best for off-the-shelf services like nginx, redis, postgres, or Grafana when you do not need to ship custom code.
- No build pipeline needed
- Type the image path and deploy
- Subject to Docker Hub rate limits
Build, push, and deploy your own custom images from the private registry at cr.sixfab.io. Required for proprietary code, custom AI models, fleet-specific configurations, or any production deployment.
- Private, tenant-isolated storage
- Devices auto-authenticate, no Docker login per device
- 10 GB / 100 tags default quota
Deploying from Docker Hub
The fastest way to run a container on ALPON. The example below deploys nginx; the same flow applies to any ARM64-compatible image.
Log in to connect.sixfab.com, open Assets, select your registered ALPON device, then switch to the Applications tab. Click + Deploy to open the configuration panel.
Fill in the deployment form. The minimum required fields are Container Name, Image, and at least one Port mapping if the container exposes a service.
Click to enlarge
Click to enlarge
Click to enlarge
- Container Name: a descriptive identifier (e.g.
my-nginx). - Image: check "I would like to use my own container path" and enter the Docker Hub image, e.g.
nginx:latestorredis:7-alpine. - Ports: map device ports to container ports (e.g. host 30800 → container 80). Host ports must be in 30000-32767.
- Environment, Volumes, Host Network, Privileged: see Configuration Reference for full semantics.
Review the form and click + Deploy. The device pulls the image and starts the container; status flips to Running in the Applications list once the container is live.
Click to enlarge
Once deployed, the container appears in the Applications list with its status and resource usage.
Click to enlarge
Initial pulls over cellular links can be slow for large images. After the first pull the image is cached on the device; subsequent restarts are instant.
Sixfab Container Registry
The Sixfab Container Registry is a private system for securely storing and managing container images, hosted at cr.sixfab.io. Images are organized into repositories scoped to your account and pulled automatically by every ALPON device you own.
Registry overview
The Registry is accessible from Developer Tools → Registry in Sixfab Connect. It shows each repository with size, creation date, and quota usage.
Click to enlarge
Each account has 10 GB total storage and 100 image tags. Pushes that exceed either limit are rejected. Contact Sixfab engineering to request a quota increase.
Push an image to the Registry
Run the following commands on your build machine (laptop, server, or CI runner) to push a local image to your registry namespace.
Open Sixfab Registry in Connect. Your username is the 6-digit number visible at the top of the Registry page.
Click to enlarge
Click Reset Password on the Registry page. The password is shown once; copy and store it in a secrets manager.
Click to enlarge
Registry credentials are independent from your Sixfab Connect account login. If lost, the only recovery is to issue a new password via Reset Password, which invalidates the previous one.
Authenticate Docker against cr.sixfab.io. Replace 719663 with your own 6-digit registry username.
# Authenticate Docker to the Sixfab Container Registry docker login cr.sixfab.io --username 719663 # Password: paste the registry password (input is hidden)
Build the image with Docker Buildx, targeting linux/arm64. The --load flag makes the resulting image available locally so you can tag and push it.
# From the directory containing your Dockerfile docker buildx build --load --platform linux/arm64 -t my-app:latest .
docker buildx version.
Tag the image so Docker knows where to push it. The path format is cr.sixfab.io/[username]/[image]:[tag].
docker tag my-app:latest cr.sixfab.io/719663/my-app:latestUpload the image to your private repository. Layer caching means subsequent pushes only transfer changed layers.
docker push cr.sixfab.io/719663/my-app:latestThe push refers to repository [cr.sixfab.io/719663/my-app] 2aeab3830f8e: Pushed 571fd9f78ac9: Pushed latest: digest: sha256:2aeab3830f8eaf2775fd599fda6a516a95c1480239ba5e64a632a68c1f3bd53d size: 29.31 MB
Refresh the Registry page on Connect. The new image appears in the repository list with size, creation date, and last-update timestamp.
Click to enlarge
Click Details on a repository to inspect its tags, digests, and per-tag usage.
Click to enlarge
Drill into a tag to view the full manifest, architecture, and runtime Config (entrypoint, command, working directory, exposed ports).
Click to enlarge
arm64), OS (linux), runtime config, and layer-level breakdownOpen the device's Applications tab and click + Deploy. In the Image field, leave the custom-path checkbox unchecked to pick from your registry dropdown. Select the image and tag, configure ports and environment, then deploy.
Click to enlarge
Pick a port within 30000-32767 (e.g. 30900 if 30800 is already in use), review the configuration, and click + Deploy.
Click to enlarge
You do not need to run docker login on the ALPON device. Every ALPON is preconfigured with credentials scoped to its owner's registry namespace plus official Sixfab images. Cross-tenant pulls are rejected at the registry layer.
Configuration Reference
Every field exposed in the deployment form, with semantics and constraints.
my-nginx, vision-pipeline-v2).cr.sixfab.io/719663/my-app:latest) when picking from the dropdown, or a Docker Hub path (e.g. nginx:latest) when "I would like to use my own container path" is checked. Always ARM64.DATABASE_URL=postgres://..., API_KEY=...). Values are encrypted in transit and at rest on the platform.Port range explained
ALPON exposes container services on host ports in the 30000-32767 range. This range is firewalled to allow inbound traffic from the local network and from Sixfab Connect's remote access tunnels. Ports outside this range are reserved for the operating system, the Sixfab agent, and cellular telemetry.
Access the Container
Once a container is running, there are three ways to reach it depending on your network position relative to the device.
Access from the local network
Find the device's IP on the Network tab of the Asset Detail page, then open a browser on any machine in the same network.
Click to enlarge
# Replace [DEVICE_IP] with the value from the Network tab http://[DEVICE_IP]:30800
Click to enlarge
Access via the remote terminal
If the device is offsite or behind NAT, open the Device tab and click Open Remote Terminal. The terminal session runs on the device itself, so 127.0.0.1 resolves to the device.
Click to enlarge
# Verify the container is reachable on the device itself curl http://127.0.0.1:30800 # <!DOCTYPE html> # <html> # <head><title>Welcome to nginx!</title>...
Click to enlarge
Access via a connected display
Connect a monitor to the device, open a browser locally, and navigate to http://127.0.0.1:30800. Suitable for digital signage, kiosk dashboards, and on-device debugging.
Manage & Lifecycle
Every running container exposes lifecycle controls in the Applications tab. Operations are issued from the cloud and applied on the device within seconds.
Click to enlarge
Updating to a new image version
Two patterns work, depending on how you tag releases:
- Mutable tag (
:latest): push a new image with the same tag, then click Restart. The device pulls the new digest and recreates the container. - Immutable tag (
:v1.2.3): push a new tag, click Edit Deployment on the running container, change the image tag, and save. Recommended for production traceability.
Mutable tags like :latest make rollback impossible if a regression slips in. Tag every release with an immutable identifier (semver, git SHA, or build number) and update deployments explicitly.
Logs & Debugging
Containerized applications write to stdout and stderr; ALPON captures both streams and exposes them in the dashboard. For deeper inspection, use the in-container terminal.
Stream logs from the dashboard
On the Applications tab, click Logs next to the container. The view tails the last 1000 lines and streams new output in real time. Use it to confirm startup, watch request traffic, or catch crash loops.
Inspect a running container
Open the Container Terminal from the dashboard to drop into an interactive shell. The session uses the image's default shell (typically /bin/sh for Alpine, /bin/bash for Debian-based images).
# Inspect environment env | grep -i DATABASE # Tail application log files written inside the container tail -f /var/log/app.log # Check listening ports netstat -tlnp 2>/dev/null || ss -tlnp
Use the device terminal for Docker-level operations
The container terminal runs inside the container. To inspect Docker itself (image cache, volumes, networks), open the Remote Terminal on the Device tab.
# List running containers on the device docker ps # Inspect a specific container's runtime config docker inspect <container-name> # View resource usage live docker stats
CI/CD Integration
The Sixfab Container Registry is a standard OCI registry, so any CI system that can run Docker can build and push to it. Below is a complete GitHub Actions workflow that builds for ARM64 and pushes on every tagged release.
GitHub Actions: build & push to Sixfab Registry
Store the registry password in repository secrets as SIXFAB_REGISTRY_PASSWORD and your username as SIXFAB_REGISTRY_USERNAME.
name: Build and push to Sixfab Registry on: push: tags: ['v*'] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Log in to Sixfab Registry uses: docker/login-action@v3 with: registry: cr.sixfab.io username: ${{ secrets.SIXFAB_REGISTRY_USERNAME }} password: ${{ secrets.SIXFAB_REGISTRY_PASSWORD }} - name: Build and push (linux/arm64) uses: docker/build-push-action@v5 with: context: . platforms: linux/arm64 push: true tags: | cr.sixfab.io/${{ secrets.SIXFAB_REGISTRY_USERNAME }}/my-app:${{ github.ref_name }} cr.sixfab.io/${{ secrets.SIXFAB_REGISTRY_USERNAME }}/my-app:latest
GitLab CI example
build_arm64: image: docker:24 services: [docker:24-dind] variables: DOCKER_BUILDKIT: "1" before_script: - echo "$SIXFAB_REGISTRY_PASSWORD" | docker login cr.sixfab.io -u "$SIXFAB_REGISTRY_USERNAME" --password-stdin script: - docker buildx create --use - docker buildx build --platform linux/arm64 -t cr.sixfab.io/$SIXFAB_REGISTRY_USERNAME/my-app:$CI_COMMIT_TAG --push .
Triggering deployment from CI
Pushing a new tag does not automatically redeploy running containers. For automated rollout you have two choices:
- Edit Deployment from the dashboard after CI publishes the new tag. Suitable for staged or manual rollouts.
- Use mutable tags (
:latest) plus the Restart action. CI overwrites:latest, then a separate step calls the Sixfab Connect API to restart the container, triggering a fresh pull. Sacrifices traceability for speed.
Troubleshooting
Common failure modes and their fixes.
Cause: the image was built for linux/amd64 instead of linux/arm64. ALPON cannot execute x86 binaries.
Fix: rebuild with docker buildx build --platform linux/arm64. Verify the resulting manifest with docker manifest inspect <image>; the architecture field must read arm64.
Cause: the local Docker session is not authenticated against cr.sixfab.io, or the password has been reset since you last logged in.
Fix: run docker login cr.sixfab.io --username [your_username] and paste a current password. Use Reset Password on the Registry page if you have lost it.
Cause: another container on the device is bound to the same host port. Each host port can be used by only one container.
Fix: pick a different port within 30000-32767 (e.g. 30900), or stop/edit the conflicting container first.
Cause: large images over cellular links (especially uncompressed AI model weights) can take many minutes per layer. The pull is not stuck; the Sixfab agent is throttled to avoid saturating the link.
Fix: minimize image size (multi-stage builds, .dockerignore, slim base images). For first-time provisioning of large images, attach the device to Wi-Fi or Ethernet temporarily; subsequent updates only transfer changed layers.
Cause: the registry account has hit the default quota.
Fix: delete unused tags or whole repositories from the Registry page. Images currently in use by a deployed device are protected and cannot be deleted; stop the deployment first. Contact Sixfab engineering to request a quota increase.
Cause: the application crashed during startup or the entrypoint completed without keeping the process alive.
Fix: open Logs on the container to see the exit reason. Common cases: missing environment variable, invalid config file path, port already bound inside the container, missing volume source on the device. Fix and use Edit Deployment to relaunch.
Related guides
Updated about 3 hours ago
