shc apps

Selfhosted Cloud

your cloud OS
affineblockscoutciso-assistantclickhousecrowdsecdefectdojodefectdojo-classicdependency-trackdocusealethereumexternal-imapexternal-mongodbexternal-mysqlexternal-oidcexternal-postgresexternal-redisexternal-smtpfleetfrappefusionpbxgiteagitlabgitlab-runnergraphitigreenbonehighlight
hockeypuckhulyhyperswitchimmichivatarjellyfinkeycloakkeygenkubokuttlibrechatmailmailcowmariadbmatomomatrixmauticmetabases3managerexternal-s3mission-controlmongodbmonicamysqlnetbirdnextcloud
nginxopenhandsopenobservepaperlesspeertubepenpotplanepmmpostgrespostizpulprediss3shlinksonarqubesupabasetraefikuptime-kumavaultwardenwazuhwhoamiwindmillwordpress+ any Docker app
browse the app catalogue
shc install nextcloud
nextcloud gitlab immich librechat

supported platforms

  • if one person can't run it, it won't last

  • Hundreds of great apps, locked away

  • An app is not a container

    It is a container plus a hostname, a certificate, a database, an identity provider, a backup schedule, and a restore that has actually been tested.

    DNS + TLS
    --runtime docker|podman|incus|apple
  • Connect two apps, never touch a credential

    files hold references, values stay encrypted in the vault

  • Sign in once

    someone revoked nextcloud when they left. the leftover eight still take the old password.

    without · a login per app
  • NO KUBERNETES Skip the control plane. One person is enough.

    Kubernetes solved a problem most people don't have

migrate from

continue at your own risk

wire apps together

nextcloud
gitlab
keycloak
postgres
external-s3
mailcow

anatomy of an app

app.yaml
name: gitlab
vars:
  rootPassword@secret!
  postgres:
    database@string!
  images:
    gitlab@string!
vars.yaml
rootPassword: 
postgres:
  database: 
images:
  gitlab: 
compose.yaml
services:
  gitlab:
    image: ""
    environment:
      GITLAB_OMNIBUS_CONFIG: |
       db_database = ''
       root_password = ''
  valkey:
    image: "{{ vars.images.valkey }}"

shc install gitlab

An app is the authored compose plus app.yaml. A deployment is that app installed for one tenant and one environment. It owns its network. --stack names it. The leader renders each replica once, at install or update, and stores the spec. Nodes materialise the stored spec. apps/gitlab/{app,vars,compose}.yaml

highly available

rqlite3 voters · healthy
select a node to operate on it
3 / 5

survives node failure

reconcile pass · 10s here · 1m in prod next in 10s
deploymentnextcloudrunning
servicenextcloudrunning 3/3
replicanextcloud-1running
replicanextcloud-2running
replicanextcloud-3running

two ways in

your data, your choice

backendsdisk on the nodenfs · cephfshcloud · awsebs · gcepd · +6 more

node-2app node
on-node
rwo
shared FS rwx
single
attach
node-5standby
nextcloudhealthy vol-0abc123

attached · node-2 · rwo

node-2 disk · the volume is part of the node; it can't move, and node loss loses it shared FS · every node mounts the same bytes: nothing to move, ever block device · drag it to node-5: it detaches, reattaches, and the app follows
shc update nextcloud --where 'node=node-5' --yes
shc update nextcloud --where 'node=node-5' --restore-from-backup --yes

The bytes sit on that node's disk. Lose the node and you restore from backup. Every node mounts the same filesystem (RWX), so a move is never needed, and never possible. No auto-failover by default (auto_failover: false): a block volume reattaches only after you move the app.

Drag the volume onto a node to attach it there, or use the left and right arrow keys to aim and Enter to drop.

Drag nextcloud onto a node to run it there, or use the left and right arrow keys to aim and Enter to drop.

backups without downtime

A backup you haven't restored is a hope. Snapshots that were never replayed are the most common way a self-hosted estate dies. Backups here are scheduled, encrypted, and restorable with one command.

frozen copyconverter · pg_dumppostgres.sql
one backup holdsvolumespostgres.sql
Without converters a deployment snapshots its volumes and nothing else. shc backup export writes a backup out to a local archive.
shc backup create -s nextcloud

the runbook

shc init
shc node join <token>
shc node join <token>
shc install postgres
shc install nextcloud -i postgres
3 nodes · 2 apps · healthy

boot sound “CRT turn on” by Coolshows101sound · CC BY 4.0 · trimmed