How to deploy an application to a Quake AI VM from CI
Coming from another cloud?
▸AWS·Code Deploy EC2
This Quake AI feature maps to AWS’s Code Deploy EC2.
▸DigitalOcean·APP Platform CI
This Quake AI feature maps to DigitalOcean’s APP Platform CI.
▸Linode·CI CD
This Quake AI feature maps to Linode’s CI CD.
How to deploy an application to a Quake AI VM from CI
Ship application changes from GitHub Actions or GitLab CI to a Quake AI instance over SSH. Quake AI does not provide hosted CI runners. Use GitHub-hosted or GitLab.com runners by default, or run a self-hosted runner on a Quake AI VM when you need private network access.
Prerequisites
Store CI secrets#
Add these repository secrets (names are examples; match your workflow):
| Secret | Purpose |
|---|---|
SSH_PRIVATE_KEY | Private key that matches the public key on the instance |
DEPLOY_HOST | Floating IP or hostname of the target instance |
DEPLOY_USER | SSH user on the instance (ubuntu, debian, etc.) |
For post-deploy OpenStack API checks, add application credential variables using the same OS_* shape as the OpenTofu CI/CD guide.
Pattern A: Rsync and restart over SSH#
name: Deploy to VM
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install SSH key
run: |
install -m 700 -d ~/.ssh
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
ssh-keyscan -H "${{ secrets.DEPLOY_HOST }}" >> ~/.ssh/known_hosts
- name: Rsync application
run: |
rsync -az --delete ./ "${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }}:/opt/myapp/"
- name: Restart service
run: |
ssh "${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }}" \
'sudo systemctl restart myapp'Pattern B: Build a container image and restart on the VM#
Build the image in CI, save it as a tarball or push to a third-party registry, then SSH to the instance to docker load or docker pull and restart the container.
See also#
Usage Guidelines
The sample code, software libraries, command line tools, proofs of concept, templates, and other related technology on this page (including any of the foregoing that is provided by Quake AI personnel) is provided to you as Quake AI Content under the Quake AI Customer Agreement, or the relevant written agreement between you and Quake AI (whichever applies). Do not use this Quake AI Content in your production accounts, or on production or other critical data. You are responsible for testing, securing, and optimizing the Quake AI Content (such as sample code) as appropriate for production grade use based on your specific quality control practices and standards. Deploying Quake AI Content may incur Quake AI charges for creating or using Quake AI chargeable resources, such as running Compute instances or storing data in Object Storage. Your use is also subject to the Acceptable Use Policy.
For the full policy, see Usage Guidelines.
Last validated: 08.09.2026
See Also
How to add a block volume to a template
Shares: IaC, Terraform
How to emulate a branchable Postgres workflow
Shares: IaC, Terraform
How to customize a template's image and flavor
Shares: IaC, Terraform
How to restore PostgreSQL from a self-managed-postgres backup
Shares: IaC, Terraform
Instances
Prerequisite