Getting Started

Introduction

Learn what SkyPort is, what it actually ships, and where to start.

SkyPort is a self-hosted infrastructure platform that puts you in complete control. Unlike hosted solutions like Railway or Vercel, SkyPort runs on your own infrastructure — whether that's a single VPS, a home server, or a Kubernetes cluster.

Minimum System Requirements

SkyPort is designed to run on modest infrastructure, but the recommended minimums are:

  • 1 vCPU core
  • 512 MB RAM
  • 2 GB RAM+ recommended for Docker-based setups.

This docs site focuses on the implementation that exists in the repository and keeps the writing close to the CLI, dashboard, and backend surfaces you can actually use.

It is designed around the real implementation in this repository:

installer/install.sh
#!/usr/bin/env bash
set -Eeuo pipefail

# =========================================================
# CONFIG
# =========================================================

SKYPORT_REPO="${SKYPORT_REPO:-Nil369/SkyPort}"
SKYPORT_VERSION="${SKYPORT_VERSION:-latest}"

SKYPORT_HOST="${SKYPORT_HOST:-0.0.0.0}"
SKYPORT_PORT="${SKYPORT_PORT:-8080}"

INSTALL_DIR="/opt/skyport"
DATA_DIR="${INSTALL_DIR}/data"
WORKSPACE_DIR="${INSTALL_DIR}/workspace"

CONFIG_DIR="/etc/skyport"

SERVER_BIN="/usr/local/bin/skyport-server"
CLI_BIN="/usr/local/bin/skyport"

ENV_FILE="${CONFIG_DIR}/skyport.env"

SERVICE_FILE="/etc/systemd/system/skyport.service"

# =========================================================
# HELPERS
# =========================================================

log() {
  echo "[skyport] $*"
}

error() {
  echo "[skyport] ERROR: $*" >&2
  exit 1
}

require_root() {
  if [ "$(id -u)" -ne 0 ]; then
    error "Please run as root or use sudo."
  fi
}

require_cmd() {
  command -v "$1" >/dev/null 2>&1 || error "Missing required command: $1"
}

# =========================================================
# DETECT OS
# =========================================================

detect_os() {
  local os
  os="$(uname -s | tr '[:upper:]' '[:lower:]')"

  case "$os" in
    linux)
      echo "linux"
      ;;
    darwin)
      echo "darwin"
      ;;
    *)
      error "Unsupported OS: $os"
      ;;
  esac
}

detect_arch() {
  local arch
  arch="$(uname -m)"

  case "$arch" in
    x86_64|amd64)
      echo "amd64"
      ;;
    aarch64|arm64)
      echo "arm64"
      ;;
    *)
      error "Unsupported architecture: $arch"
      ;;
  esac
}

# =========================================================
# RELEASE
# =========================================================

latest_release() {
  curl -fsSL "https://api.github.com/repos/${SKYPORT_REPO}/releases/latest" \
    | grep '"tag_name"' \
    | head -n1 \
    | sed -E 's/.*"([^"]+)".*/\1/'
}

server_url() {
  local version="$1"
  local os="$2"
  local arch="$3"

  echo "https://github.com/${SKYPORT_REPO}/releases/download/${version}/skyport-server-${os}-${arch}"
}

cli_url() {
  local version="$1"
  local os="$2"
  local arch="$3"

  echo "https://github.com/${SKYPORT_REPO}/releases/download/${version}/skyport-${os}-${arch}"
}

# =========================================================
# USER
# =========================================================

create_user() {
  if id -u skyport >/dev/null 2>&1; then
    return
  fi

  log "Creating skyport user..."

  useradd \
    --system \
    --home "${INSTALL_DIR}" \
    --shell /usr/sbin/nologin \
    skyport || true
}

# =========================================================
# DIRECTORIES
# =========================================================

create_directories() {
  mkdir -p "${INSTALL_DIR}"
  mkdir -p "${DATA_DIR}"
  mkdir -p "${WORKSPACE_DIR}"
  mkdir -p "${CONFIG_DIR}"

  chown -R skyport:skyport "${INSTALL_DIR}" || true
}

# =========================================================
# ENV
# =========================================================

generate_secret() {
  tr -dc A-Za-z0-9 </dev/urandom | head -c 48
}

write_env() {
  local jwt_secret
  jwt_secret="$(generate_secret)"

  cat > "${ENV_FILE}" <<EOF
SKYPORT_HOST=${SKYPORT_HOST}
SKYPORT_PORT=${SKYPORT_PORT}

SKYPORT_ENV=production
SKYPORT_LOG_LEVEL=info

SKYPORT_DB_PATH=${DATA_DIR}/skyport.db
SKYPORT_WORKSPACE_ROOT=${WORKSPACE_DIR}

JWT_SECRET=${jwt_secret}
JWT_EXPIRES=604800

ENABLE_TERMINAL=true
ENABLE_DOCKER=true
ENABLE_PROJECTS=true
ENABLE_METRICS=true
ENABLE_FILESYSTEM=true

ALLOWED_ORIGINS=*
TRUSTED_PROXIES=127.0.0.1,::1
EOF

  chmod 600 "${ENV_FILE}"
}

# =========================================================
# DOWNLOAD
# =========================================================

install_server() {
  local version="$1"
  local os="$2"
  local arch="$3"

  local url
  url="$(server_url "$version" "$os" "$arch")"

  log "Downloading server..."
  log "$url"

  curl -fL "$url" -o "${SERVER_BIN}"

  chmod +x "${SERVER_BIN}"
}

install_cli() {
  local version="$1"
  local os="$2"
  local arch="$3"

  local url
  url="$(cli_url "$version" "$os" "$arch")"

  log "Downloading CLI..."
  log "$url"

  curl -fL "$url" -o "${CLI_BIN}"

  chmod +x "${CLI_BIN}"
}

# =========================================================
# SYSTEMD
# =========================================================

install_systemd_service() {

cat > "${SERVICE_FILE}" <<EOF
[Unit]
Description=SkyPort
After=network.target

[Service]
Type=simple

User=skyport
Group=skyport

WorkingDirectory=${INSTALL_DIR}

EnvironmentFile=${ENV_FILE}

ExecStart=${SERVER_BIN}

Restart=always
RestartSec=3

NoNewPrivileges=true

[Install]
WantedBy=multi-user.target
EOF

  systemctl daemon-reload
  systemctl enable skyport
  systemctl restart skyport
}

# =========================================================
# IP
# =========================================================

primary_ip() {

  if command -v hostname >/dev/null 2>&1; then
    hostname -I 2>/dev/null | awk '{print $1}'
    return
  fi

  echo "localhost"
}

# =========================================================
# MAIN
# =========================================================

main() {

  require_root

  require_cmd curl

  local os
  local arch
  local version

  os="$(detect_os)"
  arch="$(detect_arch)"

  if [ "${SKYPORT_VERSION}" = "latest" ]; then
    log "Fetching latest release..."
    version="$(latest_release)"
  else
    version="${SKYPORT_VERSION}"
  fi

  [ -n "${version}" ] || error "Could not resolve release version."

  log "Installing SkyPort ${version}"
  log "OS: ${os}"
  log "ARCH: ${arch}"

  create_user

  create_directories

  install_server "${version}" "${os}" "${arch}"

  install_cli "${version}" "${os}" "${arch}"

  write_env

  if [ "${os}" = "linux" ] && command -v systemctl >/dev/null 2>&1; then
    install_systemd_service
  fi

  local ip
  ip="$(primary_ip)"

  echo
  echo "===================================================="
  echo " SkyPort Installed Successfully"
  echo "===================================================="
  echo
  echo "Server Binary:"
  echo "  ${SERVER_BIN}"
  echo
  echo "CLI Binary:"
  echo "  ${CLI_BIN}"
  echo
  echo "Web UI:"
  echo "  http://${ip}:${SKYPORT_PORT}"
  echo
  echo "Swagger:"
  echo "  http://${ip}:${SKYPORT_PORT}/docs/index.html"
  echo
  echo "CLI Examples:"
  echo "  skyport login"
  echo "  skyport start webui"
  echo "  skyport start tui"
  echo "  skyport projects"
  echo
  echo "Service Status:"
  echo "  systemctl status skyport"
  echo
}

main "$@"

What SkyPort Covers

SkyPort currently focuses on:

  • Docker container operations and host runtime control
  • PM2 process management and log access
  • VPS access through SSH sessions
  • Reverse proxy generation and Caddy-oriented routing flows
  • Host metrics and live log streaming
  • Project and deployment management through the API and CLI
  • A marketplace catalog with native or Docker install recording
  • A bundled web UI and a terminal UI for operator workflows

How The Product Is Structured

SkyPort is intentionally split into three layers:

  • CLI & TUI for automation and operator workflows
  • Web UI for the embedded dashboard experience
  • Backend API for host, runtime, and service operations

Core Workflows

Terminal-first operations

terminal
skyport start webui
skyport start tui
skyport docker ps
skyport pm2 list
skyport server ssh

Deployment and project flow

terminal
skyport auth login
skyport project list
skyport deploy --project-path ./my-app --start-cmd "npm run start"
skyport rollback <deployment-id>

Marketplace and service recording

terminal
skyport marketplace list
skyport marketplace install --slug postgres --mode native

Who This Docs Site Is For

  • Developers shipping on a VPS or single-host setup
  • Operators managing Docker and PM2 from a small control plane
  • Open-source users who want reproducible setup and clear references
  • Contributors who need an accurate view of the platform layout

Next Steps

Planning to expose SkyPort publicly?

Read the Production Setup 🔥 guide to configure:
  • reverse proxies (Caddy, Nginx, Apache)
  • HTTPS and SSL
  • DNS and custom domains
  • VPS networking
  • Secure production deployment
  1. Read Installation for your platform.
  2. Follow Quick Start to bring the server up.
  3. Review First Deployment for a real workflow.
  4. Open CLI Installation if you plan to automate from the terminal.
SkyPort

SkyPort Docs

Self-hosted infrastructure platform