Shellhub

ShellHub is a modern SSH server for remotely accessing linux devices via command line (using any SSH client) or web-based user interface, designed as an alternative to sshd.

Directory Structure

    • .env
    • docker-compose.yml

docker-compose.yml

version: '3.7'
services:
  ssh:
    image: shellhubio/ssh:${SHELLHUB_VERSION}
    restart: unless-stopped
    environment:
      - PRIVATE_KEY=/run/secrets/ssh_private_key
      - SHELLHUB_ENTERPRISE=${SHELLHUB_ENTERPRISE}
      - SHELLHUB_CLOUD=${SHELLHUB_CLOUD}
      - SHELLHUB_LOG_LEVEL=${SHELLHUB_LOG_LEVEL}
      - SHELLHUB_LOG_FORMAT=${SHELLHUB_LOG_FORMAT}
      - SHELLHUB_BILLING=${SHELLHUB_BILLING}
      - ALLOW_PUBLIC_KEY_ACCESS_BELLOW_0_6_0=${SHELLHUB_ALLOW_PUBLIC_KEY_ACCESS_BELLOW_0_6_0}
      - RECORD_URL=${SHELLHUB_RECORD_URL}
      - BILLING_URL=${SHELLHUB_BILLING_URL}
    ports:
      - "${SHELLHUB_SSH_PORT}:2222"
    secrets:
      - ssh_private_key
    networks:
      - shellhub
    healthcheck:
      test: "curl -f http://ssh:8080/healthcheck || exit 1"
      interval: 30s
      start_period: 10s
    depends_on:
      - redis
  api:
    image: shellhubio/api:${SHELLHUB_VERSION}
    restart: unless-stopped
    environment:
      - SHELLHUB_VERSION=${SHELLHUB_VERSION}
      - PRIVATE_KEY=/run/secrets/api_private_key
      - PUBLIC_KEY=/run/secrets/api_public_key
      - SHELLHUB_ENTERPRISE=${SHELLHUB_ENTERPRISE}
      - SHELLHUB_BILLING=${SHELLHUB_BILLING}
      - SHELLHUB_CLOUD=${SHELLHUB_CLOUD}
      - GEOIP=${SHELLHUB_GEOIP}
      - MAXMIND_LICENSE=${SHELLHUB_MAXMIND_LICENSE}
      - RECORD_RETENTION=${SHELLHUB_RECORD_RETENTION}
      - TELEMETRY=${SHELLHUB_TELEMETRY:-}
      - TELEMETRY_SCHEDULE=${SHELLHUB_TELEMETRY_SCHEDULE:-}
      - SESSION_RECORD_CLEANUP_SCHEDULE=${SHELLHUB_SESSION_RECORD_CLEANUP_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_GROUP_MAX_DELAY=${SHELLHUB_ASYNQ_GROUP_MAX_DELAY}
      - ASYNQ_GROUP_GRACE_PERIOD=${SHELLHUB_ASNYQ_GROUP_GRACE_PERIOD}
      - ASYNQ_GROUP_MAX_SIZE=${SHELLHUB_ASYNQ_GROUP_MAX_SIZE}
      - REDIS_CACHE_POOL_SIZE=${SHELLHUB_REDIS_CACHE_POOL_SIZE}
      - MAXIMUM_ACCOUNT_LOCKOUT=${SHELLHUB_MAXIMUM_ACCOUNT_LOCKOUT}
    depends_on:
      - mongo
      - redis
    links:
      - mongo
      - redis
    secrets:
      - api_private_key
      - api_public_key
    networks:
      - shellhub
    healthcheck:
      test: "curl -f http://api:8080/api/healthcheck || exit 1"
      interval: 30s
      start_period: 10s
  ui:
    image: shellhubio/ui:${SHELLHUB_VERSION}
    restart: unless-stopped
    environment:
      - SHELLHUB_STRIPE_PUBLISHABLE_KEY=${STRIPE_PUBLISHABLE_KEY}
      - SHELLHUB_BILLING=${SHELLHUB_BILLING}
      - SHELLHUB_ENTERPRISE=${SHELLHUB_ENTERPRISE}
      - SHELLHUB_CLOUD=${SHELLHUB_CLOUD}
      - SHELLHUB_ANNOUNCEMENTS=${SHELLHUB_ANNOUNCEMENTS}
      - SHELLHUB_VERSION=${SHELLHUB_VERSION}
      - SHELLHUB_SENTRY_DSN=${SHELLHUB_SENTRY_DSN}
      - SHELLHUB_PAYWALL=${SHELLHUB_PAYWALL}
      - SHELLHUB_CONNECTOR=${SHELLHUB_CONNECTOR}
    networks:
      - shellhub
    healthcheck:
      test: "curl -f http://ui:8080/healthcheck || exit 1"
      interval: 30s
      start_period: 10s
  gateway:
    image: shellhubio/gateway:${SHELLHUB_VERSION}
    restart: unless-stopped
    environment:
      - SHELLHUB_DOMAIN=${SHELLHUB_DOMAIN}
      - SHELLHUB_PUBLIC_URL_DOMAIN=${SHELLHUB_PUBLIC_URL_DOMAIN}
      - SHELLHUB_VERSION=${SHELLHUB_VERSION}
      - SHELLHUB_SSH_PORT=${SHELLHUB_SSH_PORT}
      - SHELLHUB_PROXY=${SHELLHUB_PROXY}
      - SHELLHUB_ENTERPRISE=${SHELLHUB_ENTERPRISE}
      - SHELLHUB_CLOUD=${SHELLHUB_CLOUD}
      - SHELLHUB_AUTO_SSL=${SHELLHUB_AUTO_SSL}
    depends_on:
      - api
      - ui
    ports:
      - ${SHELLHUB_BIND_ADDRESS}:${SHELLHUB_HTTP_PORT}:80
    networks:
      - shellhub
    healthcheck:
      test: "curl -f -k -L http://gateway/healthcheck || exit 1"
      interval: 30s
      start_period: 10s
  cli:
    image: shellhubio/cli:${SHELLHUB_VERSION}
    stop_signal: SIGKILL
    command: /bin/sleep infinity
    environment:
      - SHELLHUB_LOG_LEVEL=${SHELLHUB_LOG_LEVEL}
      - SHELLHUB_LOG_FORMAT=${SHELLHUB_LOG_FORMAT}
    networks:
      - shellhub
  mongo:
    image: mongo:4.4.29
    restart: unless-stopped
    healthcheck:
      test: 'test $$(echo "rs.initiate({ _id: ''rs'', members: [ { _id: 0, host: ''mongo:27017'' } ] }).ok || rs.status().ok" | mongo --quiet) -eq 1'
      interval: 30s
      start_period: 10s
    command: ["--replSet", "rs", "--bind_ip_all"]
    networks:
      - shellhub
  redis:
    image: redis
    restart: unless-stopped
    command: ["redis-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}

Resources

Website: https://www.shellhub.io/

GitHub: https://github.com/shellhub-io/shellhub

Docker Hub: https://hub.docker.com/u/shellhubio

Configuration: https://docs.shellhub.io/self-hosted/deploying