Skip to content
QuickCloud Docs
Getting Started

Container Setup Guide

Run QuickCloud products on your own infrastructure using Docker images from the private registry.

Container Setup Guide

This guide walks you through getting a QuickCloud product running on your own infrastructure from scratch. By the end you'll have a container running with its web UI accessible, connected to your source system and target cloud.

Prerequisites

Before you begin, make sure you have:

  • Docker Engine 24+ installed on your deployment host (or a Kubernetes cluster)
  • Registry credentials — sent in your welcome email. If you can't find them, rotate them from the portal
  • Cloud credentials for your target environment (AWS, Azure, or GCP)
  • Source system access — connection details for the system you're migrating (mainframe host, database, directory server, etc.)

Step 1 — Authenticate to the registry

Log in using the credentials from your welcome email:

echo "YOUR_PASSWORD" | docker login registry.quickcloud.co \
  -u YOUR_USERNAME --password-stdin

You should see Login Succeeded. Docker stores the token in ~/.docker/config.json — you only need to do this once per machine.

Can't find your credentials? Log in to your customer portal and copy them from the Access page.


Step 2 — Pull your product image

Pull the image for the product you want to run:

# App Modernization (AI)
docker pull registry.quickcloud.co/quickcloud/app-replatforming:latest

# Mainframe Migration
docker pull registry.quickcloud.co/quickcloud/mainframe-migration:latest

# Database Migration
docker pull registry.quickcloud.co/quickcloud/database-migration:latest

# Identity & Access (IAM) Migration
docker pull registry.quickcloud.co/quickcloud/iam-migration:latest

# Modernization, Security & Cost Intelligence (AI)
docker pull registry.quickcloud.co/quickcloud/security:latest

# Modernization, Security & Cost Intelligence (AI)
docker pull registry.quickcloud.co/quickcloud/cost-optimizer:latest

# QA Automation (AI)
docker pull registry.quickcloud.co/quickcloud/qa-testing:latest

# Performance & Load Testing
docker pull registry.quickcloud.co/quickcloud/performance-testing:latest

Your subscription determines which images you can pull. Attempting to pull an image outside your plan will return a denied error.


Step 3 — Configure your environment

Each container is configured via environment variables. Create a .env file in your project directory:

# .env

# Required for every product
QUICKCLOUD_API_KEY=your_api_key_from_welcome_email
QUICKCLOUD_TENANT_ID=your_tenant_id_from_welcome_email
TARGET_CLOUD=aws                      # aws | azure | gcp

# AWS target credentials (if TARGET_CLOUD=aws)
AWS_ACCESS_KEY_ID=AKIA...
AWS_SECRET_ACCESS_KEY=...
AWS_DEFAULT_REGION=us-east-1

# Azure target credentials (if TARGET_CLOUD=azure)
# AZURE_TENANT_ID=...
# AZURE_CLIENT_ID=...
# AZURE_CLIENT_SECRET=...
# AZURE_SUBSCRIPTION_ID=...

# GCP target credentials (if TARGET_CLOUD=gcp)
# GOOGLE_APPLICATION_CREDENTIALS=/run/secrets/gcp-key.json

API key and tenant ID are in your welcome email. You can also find them under Settings → API Access in the QuickCloud web UI once the container is running.

Least-privilege cloud permissions

For AWS, we recommend a dedicated IAM role with read access to the services the product needs to analyze:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:Describe*",
        "rds:Describe*",
        "s3:List*",
        "s3:GetBucketPolicy",
        "iam:List*",
        "iam:Get*",
        "cloudwatch:GetMetricStatistics",
        "cloudwatch:ListMetrics",
        "ce:GetCostAndUsage"
      ],
      "Resource": "*"
    }
  ]
}

Your account manager can share product-specific permission sets if you need a tighter scope.


Step 4 — Run with Docker Compose

Create a docker-compose.yml in the same directory as your .env:

version: '3.8'

services:
  quickcloud:
    image: registry.quickcloud.co/quickcloud/mainframe-migration:latest
    env_file: .env
    ports:
      - "8080:8080"
    volumes:
      - quickcloud-data:/data          # persistent job history & config
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 30s

volumes:
  quickcloud-data:

Start the container:

docker compose up -d
docker compose logs -f quickcloud

The web UI is available at http://localhost:8080 once the health check passes — usually within 30 seconds.


Step 5 — Open the web UI and run your first job

  1. Navigate to http://localhost:8080 (or the host's IP if running remotely)
  2. Sign in with the credentials from your welcome email (same as your portal login)
  3. The setup wizard will prompt you to confirm your cloud connection — click Test connection to verify
  4. Follow the wizard to connect your source system and start your first analysis

Each product has its own workflow from here. See the product-specific guide in the sidebar for details.


Production deployment

Resource recommendations

ProductMin CPUMin RAMRecommended storage
App Modernization4 cores8 GB50 GB
Mainframe Migration4 cores16 GB100 GB
Database Migration2 cores8 GB50 GB
Modernization, Security & Cost Intelligence (AI)2 cores4 GB20 GB
Cost Optimization2 cores4 GB20 GB
QA Automation (AI)2 cores4 GB20 GB
Performance Testing4 cores8 GB50 GB

Networking

The container only needs outbound internet access to:

  • registry.quickcloud.co:443 — image pulls and license validation
  • api.quickcloud.co:443 — AI Gateway (used during migration analysis)
  • Your source system host/port
  • Your target cloud API endpoints

No inbound ports are required from the internet — expose port 8080 only within your private network or behind a VPN/reverse proxy.

Running behind a reverse proxy (nginx)

server {
    listen 443 ssl;
    server_name quickcloud.internal.example.com;

    ssl_certificate     /etc/ssl/certs/your-cert.pem;
    ssl_certificate_key /etc/ssl/private/your-key.pem;

    location / {
        proxy_pass         http://localhost:8080;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection "upgrade";
        proxy_set_header   Host $host;
        proxy_read_timeout 3600s;
    }
}

Kubernetes deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: quickcloud
  namespace: quickcloud
spec:
  replicas: 1
  selector:
    matchLabels:
      app: quickcloud
  template:
    metadata:
      labels:
        app: quickcloud
    spec:
      imagePullSecrets:
        - name: quickcloud-registry
      containers:
        - name: quickcloud
          image: registry.quickcloud.co/quickcloud/mainframe-migration:latest
          ports:
            - containerPort: 8080
          envFrom:
            - secretRef:
                name: quickcloud-env
          volumeMounts:
            - name: data
              mountPath: /data
          resources:
            requests:
              cpu: "4"
              memory: "16Gi"
            limits:
              cpu: "8"
              memory: "32Gi"
          livenessProbe:
            httpGet:
              path: /health
              port: 8080
            initialDelaySeconds: 30
            periodSeconds: 30
      volumes:
        - name: data
          persistentVolumeClaim:
            claimName: quickcloud-data

Create the image pull secret:

kubectl create secret docker-registry quickcloud-registry \
  --docker-server=registry.quickcloud.co \
  --docker-username=YOUR_USERNAME \
  --docker-password=YOUR_PASSWORD \
  -n quickcloud

Create the env secret:

kubectl create secret generic quickcloud-env \
  --from-env-file=.env \
  -n quickcloud

Upgrading

QuickCloud releases are tagged. To upgrade to the latest version:

docker compose pull
docker compose up -d

Job history and configuration are persisted in the quickcloud-data volume — upgrades are non-destructive.


Troubleshooting

SymptomLikely causeFix
unauthorized on docker pullCredentials expired or wrongRotate credentials in the portal
denied on docker pullImage not in your planCheck your plan includes this product
Container exits immediatelyMissing required env varRun docker compose logs quickcloud and check for FATAL: missing env
Web UI shows "License invalid"QUICKCLOUD_API_KEY incorrectCopy the key from your welcome email exactly — no trailing spaces
Cloud connection test failsIAM permissions missingReview the permission set above; check CloudTrail for the Access denied event
High memory usageJob processing large codebaseIncrease mem_limit in docker-compose.yml; see resource table above

Still stuck? Open a support ticket from your portal — include the output of docker compose logs quickcloud --tail 100.