Self-Hosted Server Release Runbook¶
This document describes the process for releasing Appcircle Server (self-hosted) and rolling the release out to deploy branches, documentation, and customer-facing channels.
Overview¶
- Release flow: PR reviews and release work run on the release branch.
- Release candidates: Release candidates are built from the release branches too. So, we can test the release candidates in the self-hosted test environment (https://my.self.appcircle.io).
- Convergence point: Master is the single meeting point for release and deploy branches. All deploy branches are based from master.
- Deploy branches: Each customer or environment has a
deploy/<name>branch. After a release, you update these branches by mergingmaster(and handling hotfixes as below).
Pre-Release Local Verification¶
After a version is released (e.g. 3.29.6), run a local instance and confirm on the master branch:
| Check | What to verify |
|---|---|
| Version | Displayed version matches the release (e.g. 3.29.6). |
| Hotfixes | Any expected hotfixes are included; none missing or unintended. |
| Docker images | In the docker-images.txt, all relevant images are on latest except the hotfix tags. |
| Image Tags | Image tags are correct for the release (e.g. 3.29.6) in the ./config/compose.yaml.tmpl and ./config/dmz/compose.yaml.tmpl files. |
Fix any mismatch before proceeding to deploy-branch updates and customer communication.
Deploy Branch Update Workflow¶
Backend will signal when a release is ready to be distributed to customers (e.g. “3.29.6 released, you can distribute to customers”). Then:
- Process branches one by one: Switch to each deploy branch and update it; do not batch.
- Revert hotfixes that were applied only on that deploy branch. Do not revert hotfixes that are already part of
master(i.e. that came with the release). - Merge master into the deploy branch:
git merge master - Resolve conflicts if any, then push.
Listing deploy branches (by last commit date)¶
Pull the latest master branch:
git checkout master && \
git pull
To see deploy branches and their latest commit (handy when deciding order or checking state):
git for-each-ref \
--sort=-committerdate \
--format='%(committerdate:iso8601)|%(refname:short)|%(objectname:short)|%(subject)' \
refs/heads refs/remotes \
| grep deploy | grep -v "origin/" \
| head -n 20 \
| column -t -s '|'
Current customer deploy branches:
2026-02-12 14:05:22 +0300 deploy/cloud-providers 7f62be91 Merge branch 'master' into deploy/cloud-providers
2026-02-12 14:02:33 +0300 deploy/ziraatteknoloji 5fc56fde Merge branch 'master' into deploy/ziraatteknoloji
2026-02-12 13:58:36 +0300 deploy/teb e27d56f0 Merge branch 'master' into deploy/teb
2026-02-12 13:58:24 +0300 deploy/ptt c336d5a4 Merge branch 'master' into deploy/ptt
2026-02-12 13:58:14 +0300 deploy/oregon-ha d7b9d51c Merge branch 'master' into deploy/oregon-ha
2026-02-12 13:58:03 +0300 deploy/kkb-prod 82ddca57 Merge branch 'master' into deploy/kkb-prod
2026-02-12 13:57:45 +0300 deploy/kkb 1ffc51c4 Merge branch 'master' into deploy/kkb
2026-02-12 13:57:22 +0300 deploy/intertech-test 2fda8f58 Merge branch 'master' into deploy/intertech-test
2026-02-12 13:57:07 +0300 deploy/intertech-prod 3cfed5b1 Merge branch 'master' into deploy/intertech-prod
2026-02-12 13:56:37 +0300 deploy/gib 1ed23a87 Merge branch 'master' into deploy/gib
2026-02-12 13:56:18 +0300 deploy/anadolu-sigorta 8c8d080a Merge branch 'master' into deploy/anadolu-sigorta
2026-02-12 13:55:58 +0300 deploy/alternatif-bank 6f3bd58a Merge branch 'master' into deploy/alternatif-bank
2026-02-12 13:55:41 +0300 deploy/albaraka-tech 1af8fa63 Merge branch 'master' into deploy/albaraka-tech
2026-02-12 13:54:07 +0300 deploy/halkbank-chmod-400-hotfix-3.29.8 b402cc46 Merge branch 'master' into deploy/halkbank-chmod-400-hotfix-3.29.8
2026-02-12 13:53:15 +0300 deploy/halkbank-test-chmod-400-hotfix-3.29.8 c4249c5c Merge branch 'master' into deploy/halkbank-test-chmod-400-hotfix-3.29.8
2025-12-26 09:38:49 +0300 deploy/halkbank-test-chmod-400-hotfix-3.29.4 3f4a035b increase storage size to 5TB
2025-12-25 23:34:17 +0300 deploy/halkbank-chmod-400-hotfix-3.29.4 b790db7a Upgrade license
2025-12-24 16:47:47 +0300 deploy/halkbank-test-chmod-400-hotfix 28bc83a7 Merge branch 'master' into deploy/halkbank-test-chmod-400-hotfix
2025-12-24 16:47:07 +0300 deploy/halkbank-chmod-400-hotfix d1c3ab79 Merge branch 'master' into deploy/halkbank-chmod-400-hotfix
The “main” branch for a given customer may be a dedicated deploy branch (e.g. deploy/halkbank-test-chmod-400-hotfix). Use the same workflow: revert branch-only hotfixes, then merge master.
All ine one function for updating a deploy branch (in bash or zsh). Save this function in the ~/.bashrc or ~/.zshrc file and source it.
update_deploy_branch() {
local branch_name="$1"
# 1. Validate input
if [ -z "$branch_name" ]; then
echo "Error: No branch name provided."
return 1
fi
# 2. Execute logic with strict exit on failure (set -e equivalent)
git checkout "$branch_name" && \
git pull && \
if git --no-pager log -1 --pretty=format:"%B" | grep -q "Merge branch 'master' into"; then
echo "Latest commit is master branch merge. No need to revert a hotfix."
fi && \
git merge master --no-edit && \
git push
}
Then, you can update a deploy branch with:
update_deploy_branch "deploy/customer-name"
Customer-Specific Hotfix on an Older Version¶
If a customer needs a hotfix on an older version (not on current master):
- Check out that customer’s deploy branch.
- Reset the commit that corresponds to the previous version (before the release you don’t want to include).
- Apply the hotfix on top of that state.
- Push as a new branch (e.g.
deploy/customer-name-hotfix-description). Do not force-push over the main deploy branch unless that’s the agreed process.
Cloud Providers Deploy Branch¶
Do not forget to maintain the cloud providers deploy branch (e.g. deploy/cloud-providers) with the same workflow: revert deploy-only hotfixes, then git merge master, and push.
Documentation (Update Server Page & Release Notes)¶
Version History and Update Server page¶
- Version History: Keep the version history table up to date. If a version was not released for self-hosted (e.g. 3.29.5 was skipped and 3.29.6 is the next self-hosted release), use – or “N/A” for that row.
- Release date: Use the self-hosted release date, not the cloud/SaaS release date.
- Update server page: Keep the “Update server” / “Version history” content in sync with the actual self-hosted releases.
Docusaurus and release notes¶
- Open a Docusaurus pull request with the documentation changes (version history, update server page, etc.).
- Send the PR to Sarp for review.
- Sarp will open/publish the release note tags for the self-hosted release (e.g. 3.29.6) so they appear in the release notes.
Zendesk & CSM (“Waiting for Self-Hosted Release”)¶
- CSM: Notify that the self-hosted release is done and customers can now update. They will handle the Zendesk tickets.
- Zendesk tickets in “waiting for self-hosted release” can be moved to the next step once the release is done.
- CSM may wait for the release note and version history to be published; we must ping them when the doc/PR is ready so they can communicate to customers.
Linear: Issue Status Updates¶
- In Linear, find issues that are in “Waiting for self-hosted deployment” (or equivalent) and update them to “Deployed to self-hosted” (or the correct “released” state) after the release is rolled out.
Version-Specific Notes (Examples)¶
Some releases have one-off rules.
Example (3.14.0):
Users should make a MinIO migration while updating to 3.14.0. Check the MinIO migration caution in the update document and it's own MinIO migration documentation.
Example (3.29.6):
The Appcircle server container images are hardened.
When in doubt, check release notes, Linear, or the team before publishing or pinging customers.