Connect · Configure · Troubleshoot

Fix the issue before you build

Find instructions for using your Cloud Mac. Start with the four cards below if this is your first connection, or search by symptom to troubleshoot an existing instance.

After delivery

Verify your connection and access

MacFTP provides dedicated Apple Silicon hardware running macOS natively—not a virtual machine. Use the actual IP address, username, and connection details shown in your instance details in the console. Don’t use your order number as your login username.

SSH login

Open a local terminal and replace the username, IP address, and port in the command with the values from your instance details. The first time you connect, check the host fingerprint before trusting it.

ssh -p PORT USER@NODE_IP

Check the error: for a timeout, check the network; for Connection refused, check the port and instance status; for Permission denied, check the username and authentication method. Don’t keep guessing passwords.

VNC / Screen Sharing

Find the graphical connection method in your instance details in the console. Enter the address, port, and credentials provided when setting up your client. Don’t assume your SSH password also works for the graphical session.

If the screen is black, disconnect and reconnect. Make sure you haven’t reconnected to an old session. If SSH works, save your build logs and check whether the system is still running before considering a full restart.

The in-browser graphical connection is available only in instance details after you sign in. Connection credentials aren’t shown on this public help page.

Passwords and keys

After your first login, run passwd to change your current user’s password. Generate an SSH key locally and add only the public key to the remote ~/.ssh/authorized_keys. Keep the private key on your local machine.

~/.ssh Set the directory permissions to 700, authorized_keys to 600. Keep your current connection open, then use another terminal to verify that key-based login works.

Don’t close the existing session or disable the current authentication method until you’ve verified the new connection. Never include private keys, passwords, or recovery details in a support ticket.

Xcode and Command Line Tools

First run xcode-select -p and xcodebuild -version to check the current environment. To use the graphical interface, connect remotely and check Xcode in Applications.

To install only the command-line tools, run xcode-select --install. iOS archiving still requires the full Xcode app. After installing Xcode, launch it once and install any required components before handing the environment over to CI.

If multiple versions are installed, switch using the actual app path. Renaming the app alone won’t stop the Runner from using the old developer directory.

From local to cloud

Three migration stages, each with a clear acceptance check

First, get a one-off build of the same commit working, then enable automated jobs. The timings below are planning estimates, not delivery commitments. Actual time depends on repository size, network speed, dependency downloads, and signing setup.

01 / Data

Sync source files, not build caches

Allow 15–45 minutes; large asset repositories may take longer.

Prefer checking out a specific commit from version control. To transfer uncommitted files, use SFTP or rsync. Exclude DerivedData, project build directories, and local logs to avoid bringing stale paths and caches to the new machine.

Use a dry run to review the file list before syncing. Replace USER and NODE_IP in the example with the values provided for your instance. Configure a custom SSH port separately if needed.

rsync -av --dry-run \
  --exclude='DerivedData/' \
  --exclude='build/' \
  ./ USER@NODE_IP:~/project/
git rev-parse HEAD
git status --short

Pass criteria: both machines are on the same commit, all required assets are present, and sensitive configuration hasn’t been added to the repository.

02 / Toolchain

Rebuild dependencies and signing setup

Allow 30–90 minutes; the first download may take longer.

Record the versions of local Xcode, SDKs, Homebrew, and script dependencies. First, run brew --version to check whether Homebrew is installed. If the project has a Brewfile, use it to restore dependencies.

Transfer the p12 file and provisioning profiles over an encrypted connection. Import the certificate into a dedicated keychain and put provisioning profiles in the build user’s directory. Don’t put passwords in the repository or build logs.

brew --version
xcodebuild -version
xcodebuild -showsdks
security find-identity -v -p codesigning

Pass criteria: the SDK meets project requirements, the signing identity is valid, and a manual archive completes successfully.

03 / CI setup

Register the Runner, then enable automated triggers

Allow 20–60 minutes, excluding project test time.

Install a GitHub Actions self-hosted Runner or GitLab Runner using the registration instructions generated by your code hosting platform. Use the registration token only during setup; don’t store machine passwords in your workflow.

Check the self-hosted , macOS and ARM64 labels. Manually trigger a build for a specific commit first. Check the working directory, artifact path, and signing permissions before enabling automatic builds for branches.

uname -m
sw_vers -productVersion
xcode-select -p
git rev-parse HEAD

Pass criteria: the Runner is online, the correct commit was built, the archive can be retrieved, and the logs contain no credentials.

When multiple jobs run on the same physical node, they share its CPU, unified memory, and SSD. Limit concurrency first, then increase it gradually to avoid mistaking resource contention for a node issue.

Run one step at a time

Useful commands: check the prerequisites before copying

Directory and file names in these examples are placeholders. Replace them with paths that exist on your machine. Commands using sudo require administrator privileges. Don’t paste commands containing passwords into public logs.

Select the Xcode developer directory

This example applies when /Applications/Xcode.app already exists. If multiple versions are installed, confirm the app path first, then check the version and SDK after switching. To use a different version for a single task, set DEVELOPER_DIR for that task.

Switch and verify
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
xcode-select -p
xcodebuild -version
xcodebuild -showsdks

Import a p12 into the build keychain

First, create a dedicated keychain named build.keychain-db and unlock it in the user session that runs the job. When importing, enter the p12 password when prompted. Seeing the certificate doesn’t guarantee that CI has permission to access its private key.

Import and check the signing identity
security import ./signing.p12 \
  -k "$HOME/Library/Keychains/build.keychain-db" \
  -T /usr/bin/codesign
security find-identity -v -p codesigning \
  "$HOME/Library/Keychains/build.keychain-db"

Manage a Runner with launchd

The following applies to a registered GitHub Actions Runner directory that includes svc.sh . The service script installs and starts the service, which is managed by launchd. For GitLab Runner, use its own service commands; don’t use this script.

Run in the Runner directory
./svc.sh install
./svc.sh start
./svc.sh status
launchctl list | grep -i runner

Seeing the job in launchd only confirms that the service is registered. Check that the Runner is online in your code hosting platform, then trigger a build to test it. For jobs that need a GUI or keychain interaction, also verify the user session.

Orders and service term

Check the expiration date separately from the payment status

Service is prepaid by day, week, month, or quarter, with one payment for the selected term. Account, payment, and instance statuses are separate. When reporting an issue, include both the order number and instance number.

How do I renew, and how can I confirm my data will be retained?

Sign in to the console and find the order for your subscription or instance to check its expiration date and renewal options. After renewing the existing subscription, confirm that the service term has been extended. Creating an order for a new instance doesn’t renew your existing node. If the expiration date hasn’t updated after payment, keep your transaction receipt and submit a support ticket. You’re responsible for keeping your own backups of important data.

Will I get an expiration reminder, and which date should I use?

Use the order expiration date shown in the console and check the time zone displayed there. Keep your account email address active, and check your inbox and spam folder. Don’t rely on receiving an email as the only way to track your service term. Set your own reminder in a team calendar, and renew or move your code, certificates, and build artifacts before expiration.

Which payment methods and currencies are supported, and how do I check a transaction?

We accept only USDT-TRC20 and Visa / Mastercard / Amex (via Stripe). All charges are in USD; available payment gateways are determined by the response from the backend. For on-chain payments, check the network, amount, and payment page details. For card payments, use the result shown in the order. To report an issue, provide the order number or transaction hash—never share your full card number, verification code, or wallet private key.

Where can I get help with a payment issue, refund, or receipt?

First, check your billing details, payment history, and any available receipts in the console. Refund eligibility, scope, and related rules are covered in the Terms of Service. Don’t treat deleting local connection settings or stopping use of the machine as a refund request. If you suspect a duplicate charge, include the relevant order and transaction references and contact us through a support ticket in the console.

Save the details first

Troubleshoot in order, starting with the smallest scope

First, work out whether the issue affects one client, one session, or the entire node. Record the original error and when it occurred, then complete one check at a time. Don’t change the network, reset passwords, and restart all at once—you’ll make the issue harder to trace.

Network and connection target

Check the IP address, port, and username again in your instance details. Try another local network and check your local proxy, firewall, and company egress policies. A failed ICMP ping alone doesn’t prove SSH is unavailable; check the actual port connection too.

ssh -vv -o ConnectTimeout=10 -p PORT USER@NODE_IP

Record whether the connection timed out, was refused, or failed authentication. Before sharing debug logs, remove your local username, sensitive paths, and authentication details.

Disk space and build caches

First run df -h / to check available space, then run du -sh ~/Library/Developer/Xcode/DerivedData to see how much space the cache uses. Stop related builds before cleaning up by project to avoid deleting an archive that’s still being written.

Keep deliverable artifacts, signing files, and any required logs. After cleanup, retry the same commit and check for damaged dependencies or incorrect paths.

System and toolchain prompts

Check for pending system dialogs or Xcode’s first-launch prompt in the graphical session. Run sw_vers, xcodebuild -version and xcodebuild -showsdks to confirm that CI is using the expected environment.

Pause jobs and back up your data first. Then decide whether to update the system or toolchain. Don’t switch Xcode paths while an archive is running.

Restore a session or restart

Disconnect and reconnect the remote client first. If SSH is still available, check uptime and any running jobs. Only if the entire machine needs recovery, sign in to the console, open the instance details, and use the restart option there.

A restart interrupts builds and remote connections. Save any logs and artifacts you can retrieve first. If you can’t access the console or there’s no restart option, submit a support ticket instead of repeatedly requesting a restart.

Still need help?

Give your support ticket a useful head start

Sign in to the console to submit a technical support ticket linked to your order and instance. If you can’t sign in or have a pre-sales question, email support@macftp.com. See the Contact page for other contact information.

  • Identify the instance: order number, instance number, node, and model. The node is in Singapore, Tokyo, Seoul, or Hong Kong. Use the full model name shown in your instance details.
  • Describe what happened: date and time, including time zone; the full error message; steps to reproduce; and whether SSH and the graphical connection each work.
  • Help us avoid back-and-forth: include the checks you’ve already completed, recent changes, and redacted log excerpts. Don’t send passwords, private keys, p12 passwords, or full payment credentials.