What to do when the primary path fails — or when you need capabilities beyond what Always Free provides.
cd /opt/oracle-tools/scripts/mosesman-occ/ # clone if missing
python3 setup_wizard.py # interactive config
python3 bot.py # foreground
# or via Docker if pollutes Python envs you care about:
docker compose up -d --build
docker logs -f oci-occ-fixmosesman uses direct OCI API rather than Resource Manager, so it has different rate-limit exposure.
Manual retry against OCI CLI directly:
# 1. List availability domains
oci iam availability-domain list \
--compartment-id "$(oci iam tenancy get --query 'data.id' --raw-output)" \
--query 'data[*].name' --raw-output
# 2. Get Ubuntu ARM image OCID for our region
oci compute image list \
--compartment-id "$(oci iam tenancy get --query 'data.id' --raw-output)" \
--operating-system "Canonical Ubuntu" \
--shape "VM.Standard.A1.Flex" \
--query 'data[0].id' --raw-output
# 3. Get subnet OCID
oci network subnet list \
--compartment-id "$(oci iam tenancy get --query 'data.id' --raw-output)" \
--vcn-id "$(oci network vcn list --compartment-id ... --query 'data[0].id' --raw-output)" \
--query 'data[0].id' --raw-output
# 4. Loop create instance — rotate AD on each attempt
for AD in $(oci iam availability-domain list --compartment-id ...); do
oci compute instance launch \
--compartment-id "$(oci iam tenancy get --query 'data.id' --raw-output)" \
--availability-domain "$AD" \
--shape "VM.Standard.A1.Flex" \
--shape-config '{"ocpus":2,"memoryInGBs":12}' \
--image-id "$UBUNTU_ARM_OCID" \
--subnet-id "$SUBNET_OCID" \
--assign-public-ip true \
--metadata "{\"ssh_authorized_keys\":\"$(cat /opt/oracle-tools/keys/oracle-arm-ed25519.pub)\"}" \
--display-name "oracle-arm-1"
if [[ $? -eq 0 ]]; then break; fi
sleep 30
doneManual = full control, fewer abstractions, more boilerplate.
You can't change home region after signup. Workarounds:
- Cancel Oracle account — Oracle support usually does it within 24h
- Re-register with new email + new CC + new home region
- Use the original (sub-optimal) region, accept latency
We document this because it's irreversible. Pick wisely at signup.
- Card-not-real-name? Use real card matching billing address
- Card-issued-in-restricted-country? Try Privacy.com (US), Revolut virtual, or Wise (international). Variable success.
- Card-prepaid? Oracle explicitly rejects prepaid in some countries
- Card-debit? ~50/50 — try credit first
If all fails: use a friend/relative's card with their consent. The account belongs to whoever's name matches; you can still use the VM once provisioned.
Oracle support is reachable at https://cloud.oracle.com/contact Choose "Account upgrade" issue type. Usually responds within 24h.
If Tailscale fails to bring ARM into the mesh:
- Force-rejoin with
sudo tailscale up --ssh --force-reauth - Check you're logged into the same Tailscale account on both nodes
- Check ACLs at https://login.tailscale.com/admin/acls/
If SSH via public IP fails (50mbps throttle):
- Use Tailscale 100.x.x.x directly
- Or do pacenter config to prefer tailnet
When you need a bigger box for a one-shot heavy workload (CI/CD,
ML training, batch render, kernel compile), Oracle allows you to
provision larger shapes above Always Free and pay only for
compute-hours used. Pattern discovered by codelesscody in the
rssnyder gist comments (Feb 2026).
Cost formula:
Always Free ARM rates that Oracle publishes (verify at docs.oracle.com):
- OCPU rate: ~$0.0105/OCPU-hour
- Memory rate: ~$0.0015/GB-hour
Example workloads:
| Workload | Shape | Duration | Cost |
|---|---|---|---|
| Default Always Free | 2 OCPU / 12 GB | 30 days | $0 |
| CI/CD burst | 4 OCPU / 24 GB | 8 hours | $1.30 CPU + $0.29 MEM = $1.59 |
| ML training | 12 OCPU / 64 GB | 24 hours × 3 days | $9.07 + $6.91 = $15.98 |
| Single render job | 8 OCPU / 32 GB | 4 hours | $0.34 + $0.19 = $0.53 |
| Intense dataset compilation | 12 OCPU / 64 GB | 10 days | $30.24 + $23.04 = $53.28 |
Provisioning a burst:
# 1. Create a Stack OR launch directly via oci CLI
# Direct launch example for 4 OCPU / 24 GB 8h burst:
oci compute instance launch \
--compartment-id "<TENANCY_OCID>" \
--availability-domain "AD-1" \
--shape "VM.Standard.A1.Flex" \
--shape-config '{"ocpus":4,"memoryInGBs":24}' \
--image-id "<UBUNTU_22_04_ARM_OCID>" \
--subnet-id "<SUBNET_OCID>" \
--assign-public-ip true \
--metadata "{\"ssh_authorized_keys\":\"$(cat /root/.ssh/id_ed25519.pub)\"}" \
--display-name "burst-cicd-$(date +%Y%m%d)"Important checks before burst provisioning:
- You are on PAYG tier — required because shape > Always Free
- Compute-hours quota — verify you won't exceed monthly budget
oci limits resource-availability get \ --service compute \ --limit-name "compute-core-count-per-region" - Billing alert — set budget at 50% / 90% thresholds Console → Billing → Budgets
Cleanup (critical — burst costs accumulate):
# After workload finishes, IMMEDIATELY:
oci compute instance terminate \
--instance-id "<BURST_INSTANCE_OCID>" --force
# Wait ~2 min for full teardown
# Verify: oci compute instance list | grep "burst"Recommendation: keep the burst size reasonable. 12 OCPU/64 GB for 10 days = $53 vs Hetzner CAX41 32GB €33/month for steady compute. Oracle burst is cheaper only for true one-shot workloads.
If you originally provisioned 4/24 pre-June 2026 and never downgraded:
- Free-Tier account: Oracle may have already shut down your VM
- PAYG account: you're being billed for over-budget hours
Recovery (PAYG):
# Get instance OCID
oci compute instance list \
--compartment-id "<TENANCY_OCID>" \
--query 'data[?"shape"==`VM.Standard.A1.Flex`].{ocid:id,name:"display-name"}'
# Stop instance
oci compute instance action --instance-id <OCID> --action STOP
# Wait 30s for stopped state
# Edit shape
oci compute instance update \
--instance-id <OCID> \
--shape-config '{"ocpus":2,"memoryInGBs":12}'
# Restart
oci compute instance action --instance-id <OCID> --action STARTRecovery (Free-Tier):
- Contact Oracle support within 7 days
- Request re-provisioning of data (if backed up to block volume)
- Otherwise fall back to fresh bot run for 2/12 allocation