Changes between Version 5 and Version 6 of User Guide/Portal


Ignore:
Timestamp:
Mar 30, 2026, 5:53:47 PM (10 days ago)
Author:
editor
Comment:

Restructured as overview page with links to sub-pages

Legend:

Unmodified
Added
Removed
Modified
  • User Guide/Portal

    v5 v6  
    22= COSMOS Portal User Guide =
    33
    4 The [https://www.cosmos-lab.org/portal COSMOS Portal] is a web application for managing your testbed account, making reservations, and monitoring testbed resources. It is the primary interface for all COSMOS and ORBIT testbed users, from first-time registration through day-to-day experiment management. This guide covers the features available to regular users.
     4The [https://www.cosmos-lab.org/portal COSMOS Portal] is the primary web interface for managing your COSMOS and ORBIT testbed account, scheduling experiments, monitoring resources, and interacting with the testbed community. Whether you are a first-time user registering for access or an experienced researcher managing complex multi-domain experiments, the portal provides all the tools you need through a clean, modern interface.
    55
    66The portal is accessible at '''https://www.cosmos-lab.org/portal'''
    77
    8 ----
    9 
    10 == Getting Started == #GettingStarted
    11 
    12 === Creating an Account === #CreateAccount
    13 
    14 Before you can use any COSMOS or ORBIT testbed resources, you need an account. Your account is associated with an organization (research group) and must be approved by your group's PI (Principal Investigator).
    15 
    16 1. Go to [https://www.cosmos-lab.org/register_usr Register User]
    17 2. Fill in your details:
    18    * '''Username''' -- 3-16 characters, must start with a letter. Only lowercase letters, digits, hyphens, and underscores are allowed. This becomes your login name on testbed console servers and other infrastructure machines.
    19    * '''First Name, Last Name''' -- ASCII characters only
    20    * '''Email''' -- must be a valid institutional email. Some organizations enforce domain restrictions (e.g., only @university.edu addresses).
    21    * '''Phone''' -- include country code (e.g., +1 for US). The system auto-normalizes formats like (555) 123-4567.
    22    * '''Organization''' -- select your research group from the dropdown. You can type to search/filter the list.
    23    * '''Password''' -- minimum 8 characters and must contain uppercase, lowercase, digit, and a special character. The system also checks for common/weak passwords.
    24    * '''Mailing List''' -- choose Full (all announcements), Digest (weekly summary), or None
    25 3. Complete the CAPTCHA verification
    26 4. Check your email and click the activation link within 30 minutes
    27 5. After activation, your request is forwarded to your group PI and the global administrators for approval
    28 6. Once approved, you receive a confirmation email and can log in immediately
    29 
    30 [[Image(portal-register.png, width=40%)]]
    31 
    32 If your organization is not listed, ask your PI or faculty advisor to [https://www.cosmos-lab.org/register_org register a new organization] first. Organization registration follows a similar activation and approval workflow.
    33 
    34 === Logging In === #Login
    35 
    36 1. Go to [https://www.cosmos-lab.org/portal/login Portal Login]
    37 2. Enter your username and password
    38 3. You will be taken to the Dashboard
    39 
    40 [[Image(portal-login.png, width=30%)]]
    41 
    42 If you forgot your password, click '''Forgot Password''' on the login page, enter your username and email, and you will receive a reset link valid for 1 hour. If you forgot your username, click '''Forgot Username''' and enter your email address — all matching usernames will be sent to you.
     8Every authenticated user sees a left-hand sidebar organized into sections. The sections and pages available to you depend on your role (regular user, PI/Group Admin, or Global Admin). This guide covers the features visible to all regular authenticated users. The sidebar collapses into a hamburger menu on mobile devices for a fully responsive experience.
    439
    4410----
    4511
    46 == Dashboard == #Dashboard
     12== Portal Sections ==
    4713
    48 The Dashboard is your home page after logging in. It provides an at-a-glance summary of your account and testbed usage:
     14The portal is organized into the following sections, each documented in detail on its own page:
    4915
    50 * '''Profile card''' -- your name, username, email, organization, and the date your account was created
    51 * '''Quick links''' -- direct access to Edit Profile and SSH Keys pages
    52 * '''Usage statistics''':
    53   * '''Disk Usage''' -- total storage used across all NFS-mounted home directories, shown in gigabytes
    54   * '''Reservations''' -- total reservation count both all-time and for the last 4 weeks, helping you understand your testbed utilization
    55   * '''Login Time''' -- total SSH session time and number of login sessions across all testbed consoles
     16=== [wiki:UserGuide/Portal/GettingStarted Getting Started] ===
    5617
    57 Usage statistics are updated periodically (approximately every 24 hours) and may not reflect the most recent activity.
     18New to COSMOS? Start here. This section walks you through creating an account, activating it via email confirmation, and logging in for the first time. It covers username requirements, password policies, organization selection, and what to expect during the approval process. If you already have an ORBIT account, your credentials work on COSMOS as well.
    5819
    59 [[Image(portal-dashboard.png, width=50%)]]
     20=== [wiki:UserGuide/Portal/Dashboard Dashboard] ===
     21
     22Your home page after logging in. The Dashboard provides an at-a-glance summary of your profile, disk usage, reservation history, and login activity. It also features quick links to frequently used pages and a Community Forum link that opens a discussion popup where you can interact with other testbed users.
     23
     24=== [wiki:UserGuide/Portal/Account Account Management] ===
     25
     26Manage your profile information, change your password, and upload SSH public keys. SSH keys are essential for connecting to testbed nodes during your experiments — the portal validates key format and type in real time and supports modern key types including Ed25519, ECDSA, and FIDO/U2F hardware keys. This section includes step-by-step instructions for generating keys on Linux, macOS, and Windows.
     27
     28=== [wiki:UserGuide/Portal/SSH SSH Access] ===
     29
     30Once you have a reservation and SSH keys configured, you need to connect to testbed nodes. This section explains the SSH connection model: you first connect to a console server (jump host) using your portal username, then hop to individual testbed nodes as root. It covers ProxyJump configuration, SSH tunneling for web services and Jupyter notebooks, SOCKS proxies, and how to set up your `~/.ssh/config` for convenient access.
     31
     32=== [wiki:UserGuide/Portal/Scheduler Scheduler] ===
     33
     34The Scheduler is a calendar-based reservation system that gives you exclusive access to testbed domains and sandboxes during your time slot. This section explains how to navigate the calendar, create single and recurring reservations, invite collaborators, compete for contested time slots, and understand the automatic approval algorithm. It also documents the color coding system and the My Reservations management page.
     35
     36=== [wiki:UserGuide/Portal/Status Testbed Status] ===
     37
     38During active reservations, Status pages appear in the sidebar showing real-time information about the testbed domain you have reserved. The primary status page displays a visual grid of all nodes with color-coded power states (on, off, unreachable). For SB4 reservations, an RF Matrix control page lets you interactively adjust RF attenuation values between nodes.
     39
     40=== [wiki:UserGuide/Portal/DiskImages Disk Images] ===
     41
     42The Disk Images page lets you browse, search, and manage testbed disk images. You can view your own images, publicly available images shared by other users, and (for admins) the complete image library. Each image shows its name, owner, size, creation date, and a description. You can also manage image visibility (public/private) and delete images you own.
     43
     44=== [wiki:UserGuide/Portal/Forum Community Forum] ===
     45
     46The COSMOS Community Forum is an integrated discussion platform where testbed users can ask questions, share experiment results, discuss best practices, and get help from the community and testbed administrators. The forum opens in a popup window so you can keep it alongside the portal while working. It uses single sign-on — if you are logged into the portal, you are automatically logged into the forum.
     47
     48=== [wiki:UserGuide/Portal/Directory Directory] ===
     49
     50The Directory section lets you browse the COSMOS/ORBIT user community. You can search and filter the complete list of registered users by name, username, or email, and browse all registered organizations with their members and PIs.
    6051
    6152----
    6253
    63 == Account Management == #Account
     54== Quick Navigation Reference ==
    6455
    65 === Edit Profile === #Profile
     56||= Sidebar Section =||= Page =||= Description =||
     57|| My Account || [wiki:UserGuide/Portal/Dashboard Dashboard] || Profile summary, quick links, usage statistics ||
     58|| || Community Forum || Discussion forum (opens in popup window) ||
     59|| Scheduler || [wiki:UserGuide/Portal/Scheduler Scheduler] || Calendar-based reservation system ||
     60|| || My Reservations || List and manage your upcoming reservations ||
     61|| Status || Testbed Status || Node power state grid (visible during active reservations) ||
     62|| || RF Matrix (SB4) || RF attenuation matrix control (SB4 reservations only) ||
     63|| Directory || Users || Browse all registered users ||
     64|| || Groups || Browse all organizations and their members ||
     65|| || [wiki:UserGuide/Portal/DiskImages Disk Images] || Browse and manage testbed disk images ||
    6666
    67 Click your name in the top-right corner and select '''Edit Profile''', or use the quick link on the Dashboard.
    68 
    69 You can update your first name, last name, email address, and phone number. Changes take effect immediately and are reflected in LDAP (the testbed's directory service), so updated email addresses will be used for all future notifications.
    70 
    71 [[Image(portal-profile.png, width=40%)]]
    72 
    73 === Change Password === #Password
    74 
    75 On the Edit Profile page, scroll down to the Change Password section. Enter your current password, then your new password twice for confirmation. The same strength requirements as registration apply (8+ characters, mixed case, digit, special character, not a common pattern).
    76 
    77 === SSH Keys === #SSHKeys
    78 
    79 SSH keys are essential for accessing testbed nodes during your reservations. The portal lets you manage your public keys from '''SSH Keys''' (accessible via the top-right user menu).
    80 
    81 * '''Upload a key''' -- paste your public SSH key. The portal validates the key format, type, and encoding in real-time before accepting it. Supported key types include ssh-rsa, ssh-ed25519, ecdsa-sha2-nistp256/384/521, and FIDO/U2F keys (sk-ssh-ed25519, sk-ecdsa).
    82 * '''View keys''' -- see all your uploaded keys with their type and comment/label
    83 * '''Delete a key''' -- remove individual keys you no longer need
    84 
    85 You can upload multiple keys (e.g., one from your laptop and one from your desktop). These keys are deployed to testbed console servers (jump hosts), giving you SSH access during active reservations. On baseline node images, root SSH access is granted automatically for the duration of your reservation.
    86 
    87 [[Image(portal-ssh-keys.png, width=40%)]]
    88 
    89 ==== Generating SSH Keys ====
    90 
    91 If you don't already have an SSH key pair, you'll need to generate one. An SSH key pair consists of a '''private key''' (kept secret on your computer) and a '''public key''' (uploaded to the portal).
    92 
    93 '''On Linux or macOS:'''
    94 {{{
    95 ssh-keygen -t ed25519 -C "your_email@example.com"
    96 }}}
    97 This creates `~/.ssh/id_ed25519` (private) and `~/.ssh/id_ed25519.pub` (public). Copy the contents of the `.pub` file to paste into the portal.
    98 
    99 '''On Windows:'''
    100 Use the built-in OpenSSH client (available in Windows 10/11) via PowerShell, or use [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html PuTTYgen] to generate a key pair. If using PuTTY, make sure to export the public key in OpenSSH format.
    101 
    102 '''Further reading:'''
    103 * [https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent GitHub: Generating SSH Keys] -- comprehensive tutorial for all platforms
    104 * [https://www.ssh.com/academy/ssh/keygen SSH Academy: ssh-keygen] -- reference for key generation options and best practices
    105 * [https://wiki.archlinux.org/title/SSH_keys ArchWiki: SSH Keys] -- detailed guide covering key types, security considerations, and agent forwarding
     67The top-right corner of the portal shows your name with a dropdown menu providing quick access to '''Edit Profile''', '''SSH Keys''', and '''Log Out'''.
    10668
    10769----
    10870
    109 == SSH Access to Testbed Nodes == #SSHAccess
     71== Tips and Troubleshooting ==
    11072
    111 Once you have an approved reservation and your SSH key uploaded, you can connect to testbed nodes via SSH through the console server for your reserved domain.
    112 
    113 '''Important:''' Your portal username is used to log in to the '''console servers''' (jump hosts) and other testbed infrastructure. On the testbed '''nodes''' themselves, you log in as '''root''' when using baseline images, or with whatever username you configure on your own custom/derivative images.
    114 
    115 === Basic SSH Connection ===
    116 
    117 The general pattern for connecting to a testbed node is:
    118 {{{
    119 ssh -J <username>@<console>.cosmos-lab.org root@<node>
    120 }}}
    121 
    122 The `-J` flag sets up a '''jump host''' (also called a ''bastion host'' or ''proxy jump''), routing your SSH connection through the console server to reach the internal testbed node. Your portal username authenticates you on the console; on the node itself you typically log in as `root` (baseline images). For example, to connect to node1-1 in sandbox SB1:
    123 {{{
    124 ssh -J myuser@sb1.cosmos-lab.org root@node1-1
    125 }}}
    126 
    127 You can also configure this permanently in your `~/.ssh/config`:
    128 {{{
    129 Host sb1-*
    130     ProxyJump myuser@sb1.cosmos-lab.org
    131 
    132 Host node1-1
    133     HostName node1-1
    134     User root
    135     ProxyJump myuser@sb1.cosmos-lab.org
    136 }}}
    137 
    138 === SSH Tunneling === #SSHTunnel
    139 
    140 SSH tunnels allow you to securely access services running on testbed nodes (such as web interfaces, Jupyter notebooks, or custom dashboards) from your local machine.
    141 
    142 '''Local port forwarding''' -- forward a port from a remote testbed node to your local machine:
    143 {{{
    144 ssh -L 8888:localhost:8888 -J myuser@sb1.cosmos-lab.org root@node1-1
    145 }}}
    146 This makes port 8888 on node1-1 accessible at `localhost:8888` on your machine. Useful for Jupyter notebooks, web UIs, and other services.
    147 
    148 '''Dynamic SOCKS proxy''' -- create a SOCKS proxy to route all traffic through a testbed node:
    149 {{{
    150 ssh -D 1080 -J myuser@sb1.cosmos-lab.org root@node1-1
    151 }}}
    152 Then configure your browser to use `localhost:1080` as a SOCKS5 proxy.
    153 
    154 '''Further reading on SSH tunneling and access:'''
    155 * [https://www.ssh.com/academy/ssh/tunneling SSH Academy: SSH Tunneling] -- explanation of local, remote, and dynamic forwarding
    156 * [https://www.ssh.com/academy/ssh/tunneling-example SSH Academy: Tunneling Examples] -- practical examples and use cases
    157 * [https://man.openbsd.org/ssh OpenBSD: ssh manual page] -- the authoritative reference for all SSH options
    158 * [https://www.digitalocean.com/community/tutorials/how-to-configure-custom-connection-options-for-your-ssh-client DigitalOcean: SSH Config Tutorial] -- guide to setting up `~/.ssh/config` for convenience
     73* '''Mobile friendly''' — on small screens, the sidebar collapses into a hamburger menu accessible from the top-left corner.
     74* '''Hover for help''' — each sidebar link has a small info icon; hover over it to see a tooltip describing the page.
     75* '''Keyboard shortcuts''' — press Escape to close any modal dialog.
     76* '''Session timeout''' — if your session expires, the portal redirects you to the login page. Your last URL is preserved so you return to the same page after logging in.
     77* '''Can't log in''' — use the Forgot Password or Forgot Username links on the login page. If your account is still pending approval, contact your group PI.
     78* '''SSH connection refused''' — verify that your reservation is currently active (approved, not just pending) and that your public key is uploaded in the SSH Keys page. See the [wiki:UserGuide/Portal/SSH SSH Access] guide for detailed troubleshooting.
     79* '''Can't see status pages''' — Status pages only appear when you have a current or upcoming reservation. Global administrators see all status pages.
    15980
    16081----
    16182
    162 == Scheduler == #Scheduler
    163 
    164 The Scheduler lets you reserve testbed resources (domains and sandboxes) for your experiments. Reservations give you exclusive access to the testbed hardware during your time slot.
    165 
    166 === Viewing the Calendar === #Calendar
    167 
    168 Navigate to '''Scheduler''' in the left sidebar. The calendar displays:
    169 * '''Day''' or '''Week''' view -- toggle with the button at the top
    170 * '''12-hour or 24-hour time''' -- toggle with the 12h/24h button; your preference is saved across sessions
    171 * Resources listed vertically on the left, time slots (30-minute intervals) horizontally
    172 * Date navigation with previous/next arrows, a Today button, and a date picker
    173 * A clock bar showing your local timezone, UTC, and COSMOS Eastern Time
    174 * Past time slots are grayed out and cannot be clicked
    175 
    176 [[Image(portal-scheduler.png, width=50%)]]
    177 
    178 === Reservation Colors === #Colors
    179 
    180 The scheduler uses distinct colors to help you quickly identify reservation ownership and status:
    181 
    182 ||= Color =||= Meaning =||
    183 || '''Green''' || Your approved reservation — confirmed and ready to use ||
    184 || '''Purple''' || Your pending reservation — submitted, waiting for approval ||
    185 || '''Blue''' || Another user's approved reservation ||
    186 || '''Yellow''' || Another user's pending reservation ||
    187 || '''Red''' || Conflict — overlapping pending reservations from different users ||
    188 || '''Dark gray''' || Blackout period — testbed unavailable for maintenance ||
    189 || '''Orange''' || Scheduled maintenance window ||
    190 
    191 === Creating a Reservation === #CreateReservation
    192 
    193 1. Click on an empty (non-grayed) time slot in the calendar for the resource you want
    194 2. In the dialog that appears, configure:
    195    * '''Start and end date/time''' -- adjust using the date picker and time dropdown (respects your 12h/24h preference). You cannot create reservations in the past.
    196    * '''Summary''' (optional) -- a short description of your experiment or purpose
    197    * '''Invite users''' (optional) -- search by name or username to add participants who should have SSH access during your reservation
    198    * '''Group reservation''' (optional) -- toggle this to grant access to all members of a selected organization
    199    * '''Recurrence''' (optional) -- set up weekly or monthly recurring reservations with an end date
    200 3. Click '''Submit'''
    201 
    202 Your reservation appears immediately as pending (purple). It will be approved automatically based on the following schedule:
    203 * Requests submitted before noon Eastern Time are pre-approved for the following day by 2:00 PM
    204 * Other requests are approved at the start of the reserved time slot (just-in-time approval)
    205 
    206 Each resource may have minimum and maximum reservation durations, which are displayed in the creation dialog.
    207 
    208 === Competing for a Slot === #Compete
    209 
    210 If another user has a pending reservation on a slot you want, click their reservation and select '''Compete for this slot'''. The auto-approver resolves conflicts using a fairness algorithm based on recent usage — users who have consumed fewer testbed hours in the past two weeks are given priority. To ensure fair resolution, avoid competing for slots that start in less than 2 hours.
    211 
    212 === Modifying or Canceling === #ModifyCancel
    213 
    214 Click on any of your reservations to view its details:
    215 * '''Edit''' -- change the time, date, duration, participants, or summary. Note: editing resets the reservation to pending status for re-approval.
    216 * '''Cancel''' -- remove a single reservation
    217 * '''Delete Series''' -- cancel all future occurrences of a recurring reservation series
    218 
    219 === My Reservations === #MyReservations
    220 
    221 Navigate to '''My Reservations''' in the sidebar for a consolidated view:
    222 * Your usage statistics -- total reservation hours over the last 28 days
    223 * A sortable table of all upcoming and recent reservations showing resource name, time, duration, and status
    224 * Quick cancel buttons for each active reservation
    225 
    226 [[Image(portal-my-reservations.png, width=50%)]]
    227 
    228 ----
    229 
    230 == Testbed Status == #Status
    231 
    232 Status pages appear in the sidebar '''only when you have an active or upcoming reservation''' (within 24 hours). This restriction ensures that experiment information is not exposed to users without current access. Global administrators can see all status pages at all times.
    233 
    234 === Testbed Status === #TestbedStatus
    235 
    236 Shows the power state of all nodes in each testbed domain as a visual grid. Select a testbed from the dropdown — only testbeds for which you have an active reservation are shown.
    237 
    238 The grid displays nodes positioned by their physical coordinates (X/Y), grouped by type (Nodes, Servers, RF Devices, Virtual Machines). Each cell is color-coded:
    239 * '''Green''' -- powered on
    240 * '''Dark''' -- powered off
    241 * '''Yellow''' -- unreachable (network issue)
    242 * '''Gray''' -- not registered or unknown state
    243 
    244 Hover over any cell to see the node's name, FQDN, and current state. The grid auto-refreshes every 30 seconds.
    245 
    246 === RF Matrix (SB4) === #RFMatrix
    247 
    248 The RF Matrix page is available only when you have a reservation for the SB4 sandbox. It visualizes and controls the JFW 50PMA-012 RF attenuation matrix.
    249 
    250 Features:
    251 * Interactive network topology graph showing port connections and current attenuation values
    252 * Click any connection to set its attenuation (0-63 dB)
    253 * Toggle WiFi/SDR antenna mode per port
    254 * '''Reset All''' -- set all attenuations to 0 dB and switch to WiFi mode
    255 * '''Save/Load configurations''' -- save your matrix setup with a name for later reuse (can be public or private)
    256 * The topology auto-refreshes every 5 seconds to reflect changes from all sources
    257 
    258 ----
    259 
    260 == Directory == #Directory
    261 
    262 The Directory section lets you browse the COSMOS/ORBIT user community.
    263 
    264 === Users === #Users
    265 
    266 Navigate to '''Users''' in the sidebar to browse all registered users. You can:
    267 * Filter alphabetically by clicking a letter (A-Z)
    268 * Search by name, username, or email
    269 * Sort by any column header (Username, Name, Email, Group, Created date)
    270 * Results are paginated with 20 users per page
    271 
    272 === Groups === #Groups
    273 
    274 Navigate to '''Groups''' to browse all registered organizations. You can:
    275 * Filter alphabetically or search by group name or organization name
    276 * Click any group name to see its detail page: full member list, PI (Principal Investigator), and any sub-groups (Linux groups)
    277 
    278 ----
    279 
    280 == Navigation Reference == #Navigation
    281 
    282 The portal sidebar organizes pages into sections. The following are visible to regular authenticated users:
    283 
    284 ||= Section =||= Page =||= Description =||
    285 || My Account || Dashboard || Profile summary, quick links, usage statistics ||
    286 || Scheduler || Scheduler || Calendar-based reservation system ||
    287 || || My Reservations || List and manage your upcoming reservations ||
    288 || Status || Testbed Status || Node power state grid (requires active reservation) ||
    289 || || RF Matrix (SB4) || RF attenuation matrix control (requires SB4 reservation) ||
    290 || Directory || Users || Browse all registered users ||
    291 || || Groups || Browse all organizations and their members ||
    292 
    293 Additional sections appear for PI/Group Admins (group member management) and Global Admins (user/group approval, scheduler management, inventory, and more).
    294 
    295 The top-right corner shows your name with a dropdown menu for '''Edit Profile''', '''SSH Keys''', and '''Log Out'''.
    296 
    297 ----
    298 
    299 == Tips and Troubleshooting == #Tips
    300 
    301 * '''Mobile friendly''' -- on small screens, the sidebar collapses into a hamburger menu accessible from the top-left
    302 * '''Hover for help''' -- each sidebar link has a small info icon; hover over it to see a tooltip describing the page
    303 * '''Keyboard shortcuts''' -- press Escape to close any modal dialog
    304 * '''Timezone awareness''' -- the scheduler shows times in your local timezone by default, with UTC and COSMOS Eastern Time references in the clock bar
    305 * '''Time format''' -- use the 12h/24h toggle button on the scheduler to switch between AM/PM and 24-hour format; your preference is remembered
    306 * '''Session timeout''' -- if your session expires, the portal redirects you to the login page; your last URL is preserved so you return to the same page after logging in
    307 * '''SSH connection refused''' -- verify that your reservation is currently active (approved, not just pending) and that your public key is uploaded in the SSH Keys page
    308 * '''Key not working''' -- make sure you uploaded the ''public'' key (`.pub` file), not the private key. The portal validates the format on upload.
    309 * '''Can't see status pages''' -- status pages only appear when you have a current or upcoming reservation (within 24 hours)
    310 
    311 ----
    312 
    313 == External Resources == #Resources
     83== External Resources ==
    31484
    31585* [https://www.cosmos-lab.org COSMOS Project Homepage]
    31686* [https://www.orbit-lab.org ORBIT Lab Homepage]
    31787* [https://wiki.cosmos-lab.org/wiki/WikiStart COSMOS Wiki]
    318 * [https://www.openssh.com OpenSSH Project] -- the SSH implementation used on all testbed nodes
    319 * [https://www.ssh.com/academy SSH Academy] -- tutorials and reference material for SSH, keys, and tunneling
    320 * [https://docs.github.com/en/authentication/connecting-to-github-with-ssh GitHub SSH Guide] -- beginner-friendly SSH key setup guide (applicable beyond GitHub)
     88* [https://www.openssh.com OpenSSH Project] — the SSH implementation used on all testbed nodes