ShellHub
★ 2.1kA self-hosted alternative to Termius
Apache License 2.0Open Source — No Paywall4 Containers — 4 containers — moderate hosting footprintSource · ComposeNo external DB3 documented maintainers
About
ShellHub is a centralized SSH gateway designed to help users access and manage servers, embedded Linux devices, and containerized environments from anywhere. It is positioned for individuals, small...
Community Ratings
No ratings yetNew this week
Read recap →Weekly Recap — Oct 2, 2026 – Oct 9, 2026Oct 9, 2026
Features
- native SSH support
- SCP/SFTP support
- SSH port forwarding
- public-key authentication
- firewall rules
- audit logging
- session recording
- built-in session player
- container remote access
- web UI
Details
- Last Updated
- Oct 12, 2026
- Created
- May 16, 2019
- Install Methods
- sourcedocker-compose
- Requirements
- Dockerdocker-composeOpenSSH Client or PuTTY for native SSH access
- Authentication
- local
- Runtime / Stack
- Docker
- Privacy & Independence
- Cloud: Optional
- User Model
- Multi-UserMulti-Tenant
- Deployment
Deployment: Docker Compose ✓4 Containers — moderate hosting footprintRuns as 4 containers
Run ShellHub with Docker Compose
Compose file from the ShellHub project repository.
4 services · infra: valkey · 3 unclassified (server, ui, gateway)
no resource limits declared
docker-compose.yml · @ 9a86f3e · scanned Sep 26, 2026
name: shellhub
services:
server:
image: shellhubio/server:${SHELLHUB_VERSION}
restart: unless-stopped
environment:
- SHELLHUB_VERSION=${SHELLHUB_VERSION}
- DATABASE=${SHELLHUB_DATABASE}
- PRIVATE_KEY=/run/secrets/api_private_key
- PUBLIC_KEY=/run/secrets/api_public_key
- SSH_HOST_KEY_FILE=/run/secrets/ssh_private_key
- SHELLHUB_AUTO_SSL=${SHELLHUB_AUTO_SSL}
- ALLOW_PUBLIC_KEY_ACCESS_BELLOW_0_6_0=${SHELLHUB_ALLOW_PUBLIC_KEY_ACCESS_BELLOW_0_6_0}
- SHELLHUB_EDITION=${SHELLHUB_EDITION}
- SHELLHUB_CHATWOOT_IDENTITY_KEY=${SHELLHUB_CHATWOOT_IDENTITY_KEY-}
- POSTGRES_HOST=${SHELLHUB_POSTGRES_HOST}
- POSTGRES_PORT=${SHELLHUB_POSTGRES_PORT}
- POSTGRES_USERNAME=${SHELLHUB_POSTGRES_USERNAME}
- POSTGRES_PASSWORD=${SHELLHUB_POSTGRES_PASSWORD}
- POSTGRES_DATABASE=${SHELLHUB_POSTGRES_DATABASE}
- POSTGRES_LOG_LEVEL=${SHELLHUB_POSTGRES_LOG_LEVEL}
- POSTGRES_LOG_VERBOSE=${SHELLHUB_POSTGRES_LOG_VERBOSE}
- TELEMETRY=${SHELLHUB_TELEMETRY:-}
- TELEMETRY_SCHEDULE=${SHELLHUB_TELEMETRY_SCHEDULE:-}
- SHELLHUB_LOG_LEVEL=${SHELLHUB_LOG_LEVEL}
- SHELLHUB_LOG_FORMAT=${SHELLHUB_LOG_FORMAT}
- SENTRY_DSN=${SHELLHUB_SENTRY_DSN}
- SHELLLHUB_ANNOUNCEMENTS=${SHELLLHUB_ANNOUNCEMENTS:-}
- SHELLHUB_SSH_PORT=${SHELLHUB_SSH_PORT}
- SHELLHUB_DOMAIN=${SHELLHUB_DOMAIN}
- ASYNQ_UNIQUENESS_TIMEOUT=${SHELLHUB_ASYNQ_UNIQUENESS_TIMEOUT}
- REDIS_CACHE_POOL_SIZE=${SHELLHUB_REDIS_CACHE_POOL_SIZE}
- MAXIMUM_ACCOUNT_LOCKOUT=${SHELLHUB_MAXIMUM_ACCOUNT_LOCKOUT}
- METRICS=${SHELLHUB_METRICS}
- SHELLHUB_PROVISIONING_KEY_WEBHOOK_ALLOWED_CIDRS=${SHELLHUB_PROVISIONING_KEY_WEBHOOK_ALLOWED_CIDRS-}
- SHELLHUB_SESSION_KEEPALIVE_TIMEOUT=${SHELLHUB_SESSION_KEEPALIVE_TIMEOUT:-5m}
depends_on:
- redis
links:
- redis
ports:
- "${SHELLHUB_SSH_PORT}:2222"
secrets:
- api_private_key
- api_public_key
- ssh_private_key
networks:
# api and ssh are kept resolvable so anything still addressing the old
# service names on this network keeps working across the upgrade.
shellhub:
aliases:
- api
- ssh
healthcheck:
test: "curl -f http://server:8080/api/healthcheck || exit 1"
interval: 30s
start_period: 10s
ui:
image: shellhubio/ui:${SHELLHUB_VERSION}
restart: unless-stopped
environment:
- SHELLHUB_EDITION=${SHELLHUB_EDITION}
- SHELLHUB_VERSION=${SHELLHUB_VERSION}
- SHELLHUB_SENTRY_DSN=${SHELLHUB_SENTRY_DSN}
- SHELLHUB_ONBOARDING_URL=${SHELLHUB_ONBOARDING_URL}
- SHELLHUB_ANNOUNCEMENTS=${SHELLHUB_ANNOUNCEMENTS}
- SHELLHUB_CHATWOOT_BASEURL=${SHELLHUB_CHATWOOT_BASEURL-}
- SHELLHUB_CHATWOOT_WEBSITE_TOKEN=${SHELLHUB_CHATWOOT_WEBSITE_TOKEN-}
- SHELLHUB_CHATWOOT_IDENTITY_KEY=${SHELLHUB_CHATWOOT_IDENTITY_KEY-}
networks:
- shellhub
healthcheck:
test: "wget -q --spider -T 5 http://ui:8080/health || exit 1"
interval: 30s
start_period: 10s
gateway:
image: shellhubio/gateway:${SHELLHUB_VERSION}
restart: unless-stopped
environment:
- SHELLHUB_LOG_LEVEL=${SHELLHUB_LOG_LEVEL}
- SHELLHUB_LOG_FORMAT=${SHELLHUB_LOG_FORMAT}
- SHELLHUB_DOMAIN=${SHELLHUB_DOMAIN}
- SHELLHUB_PROXY=${SHELLHUB_PROXY}
- SHELLHUB_PROXY_TRUSTED_IPS=${SHELLHUB_PROXY_TRUSTED_IPS}
- SHELLHUB_EDITION=${SHELLHUB_EDITION}
- SHELLHUB_AUTO_SSL=${SHELLHUB_AUTO_SSL}
- SHELLHUB_ACME_CA_SERVER=${SHELLHUB_ACME_CA_SERVER}
- SHELLHUB_TLS_CERT_FILE=${SHELLHUB_TLS_CERT_FILE}
- SHELLHUB_TLS_KEY_FILE=${SHELLHUB_TLS_KEY_FILE}
- SHELLHUB_GATEWAY_ACCESS_LOGS=${SHELLHUB_GATEWAY_ACCESS_LOGS}
- SHELLHUB_DATABASE=${SHELLHUB_DATABASE}
depends_on:
- server
- ui
ports:
- ${SHELLHUB_BIND_ADDRESS}:${SHELLHUB_HTTP_PORT}:80
networks:
- shellhub
extra_hosts:
- "healthcheck.internal:127.0.0.1"
healthcheck:
test: wget -q --spider -T 5 http://healthcheck.internal/healthz || exit 1
interval: 30s
start_period: 10s
redis:
image: valkey/valkey:9.1-alpine
restart: unless-stopped
command: ["valkey-server", "--appendonly", "no", "--save", "\"\""]
networks:
- shellhub
secrets:
ssh_private_key:
file: ./ssh_private_key
api_private_key:
file: ./api_private_key
api_public_key:
file: ./api_public_key
networks:
shellhub:
name: ${SHELLHUB_NETWORK}
This file may be out of date. Check the ShellHub documentation for current setup steps.
Tags
Remote AccessPermissive LicenseNetwork UtilitiesIoT PlatformsSelf Hosting SolutionsSysadminsMobile App
Mentions Raspberry Pi in its docs: Self-hosted apps for Raspberry Pi
Track your self-hosted stack
Bookmark software to try, rate tools you've used, and keep your collection in one place.
Metadata extracted from README on Aug 5, 2026
Related Software
MeshCentral
7.4k
MeshCentral is a web-based computer management platform for remotely controlling computers on a local network or over the internet.
Remote AccessIoT PlatformsWeb Servers+4
FMD Server
221
A server to communicate with the FMD (Find My Device) Android app, to locate and control your devices.
IoT PlatformsRemote AccessCopyleft License+2
wg-easy
27.1k
A web UI for installing and managing WireGuard on Linux hosts.
Self Hosting SolutionsNetwork UtilitiesRemote Access+1
Single Container
rathole
14.3k
A secure, high-performance reverse proxy for NAT traversal that forwards services behind a NAT to the Internet.
Proxy ServersNetwork UtilitiesRemote Access+1
sish
4.8k
Open source SSH tunneling software for forwarding HTTP(S), WS(S), TCP, aliases, and SNI traffic using plain SSH.
Proxy ServersNetwork UtilitiesRemote Access+2
Guacamole
4.0k
guacamole-server provides guacd, libguac, and protocol support libraries that form the server-side basis of Apache Guacamole remote desktop access.
Remote AccessPermissive LicenseProxy Servers+2
Firezone
9.1k
Firezone is an open source platform for secure remote access and zero-trust network connectivity for organizations.
Remote AccessPermissive LicenseAuthentication Services+2
Open Core
Sshwifty
3.1k
Sshwifty is a web-based SSH and Telnet client that lets users access remote shells from a browser.
Remote AccessMobile terminalsCopyleft License+3
HomeServerHQ
73
HomeServerHQ is an all-in-one home server infrastructure and management utility that installs and configures a home server, relay server, and supporting open source services.
Self Hosting SolutionsCopyleft LicenseWeb Servers+3
PiKVM
10.4k
PiKVM is an open-source Raspberry Pi-based KVM-over-IP solution for remotely managing servers and workstations.
Remote AccessIoT PlatformsFully FOSS
Fully FOSS
Onloc
11
Onloc is a service for tracking and locating devices, providing the back-end for storing and retrieving its data.
IoT PlatformsRemote AccessMaps and GPS
netbird
29.9k
NetBird is a WireGuard-based private networking and access control platform for creating secure overlays and managing remote access.
Network UtilitiesRemote AccessOpen Core+1
3 ContainersOpen Core

