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-stdinYou 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:latestYour 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.jsonAPI 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 quickcloudThe 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
- Navigate to
http://localhost:8080(or the host's IP if running remotely) - Sign in with the credentials from your welcome email (same as your portal login)
- The setup wizard will prompt you to confirm your cloud connection — click Test connection to verify
- 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
| Product | Min CPU | Min RAM | Recommended storage |
|---|---|---|---|
| App Modernization | 4 cores | 8 GB | 50 GB |
| Mainframe Migration | 4 cores | 16 GB | 100 GB |
| Database Migration | 2 cores | 8 GB | 50 GB |
| Modernization, Security & Cost Intelligence (AI) | 2 cores | 4 GB | 20 GB |
| Cost Optimization | 2 cores | 4 GB | 20 GB |
| QA Automation (AI) | 2 cores | 4 GB | 20 GB |
| Performance Testing | 4 cores | 8 GB | 50 GB |
Networking
The container only needs outbound internet access to:
registry.quickcloud.co:443— image pulls and license validationapi.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-dataCreate 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 quickcloudCreate the env secret:
kubectl create secret generic quickcloud-env \
--from-env-file=.env \
-n quickcloudUpgrading
QuickCloud releases are tagged. To upgrade to the latest version:
docker compose pull
docker compose up -dJob history and configuration are persisted in the quickcloud-data volume — upgrades are non-destructive.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
unauthorized on docker pull | Credentials expired or wrong | Rotate credentials in the portal |
denied on docker pull | Image not in your plan | Check your plan includes this product |
| Container exits immediately | Missing required env var | Run docker compose logs quickcloud and check for FATAL: missing env |
| Web UI shows "License invalid" | QUICKCLOUD_API_KEY incorrect | Copy the key from your welcome email exactly — no trailing spaces |
| Cloud connection test fails | IAM permissions missing | Review the permission set above; check CloudTrail for the Access denied event |
| High memory usage | Job processing large codebase | Increase 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.