# Servers

Source: https://docs.ops0.com/docs/servers/overview

Manage your infrastructure server fleet — Linux servers over SSH and Windows servers over WinRM — from a single dashboard. Servers you add here become the deployment targets for Ansible configurations.

![ops0 Servers list showing Linux and Windows servers with status and connection details](https://docs.ops0.com/images/servers-overview.png)

**Top-level section**

Servers is its own top-level area of ops0, linked directly from the main Dashboard (the **Total Servers** card). It is not nested under Settings.

---

## What are Servers?

A **Server** is a machine ops0 can reach and manage — either a Linux host over SSH (authenticated with a PEM key) or a Windows host over WinRM (authenticated with a username and password). Once a server is added, it can be:

- Targeted by [Configurations](https://docs.ops0.com/docs/configurations/ai-generator) projects for Ansible playbook deployments
- Organized into [Server Groups](https://docs.ops0.com/docs/servers/groups) for easier management
- Tested for connectivity and monitored for online/offline status

---

## Adding a Server

### Open Servers
Navigate to the top-level **Servers** page.

### Click Add Server
Click the **Add Server** button in the header.

### Choose Server Type
Select **Linux (SSH)** or **Windows (WinRM)**. Choosing a type sets sensible defaults — port `22` and username `root` for Linux, port `5985` and username `administrator` for Windows.

### Enter Connection Details
Fill in the **Server Name**, **Hostname**, **IP Address**, **Port**, and **Username**.

### Provide Authentication
- **Linux**: Select a **PEM Key** from your saved keys (required).
- **Windows**: Enter a **Password** for WinRM authentication (required when creating; optional on edit — leave blank to keep the existing password).

### Optionally Assign a Group
Select a **Server Group** to place the server in, or leave it ungrouped.

### Save
Submit the form. ops0 creates the server and immediately runs a connection test against it.

---

## Server Fields

| Field | Description |
|-------|-------------|
| **Name** | Display name for the server |
| **Hostname** | DNS hostname of the server |
| **IP Address** | IP address ops0 connects to |
| **Port** | SSH port (default `22`) or WinRM port (default `5985` HTTP / `5986` HTTPS) |
| **Type** | `Linux` (SSH) or `Windows` (WinRM) |
| **Username** | Login user (`root` default for Linux, `administrator` default for Windows) |
| **PEM Key** | Private key used for SSH authentication (Linux only) |
| **Operating System / Version** | Detected automatically from a successful connection test |
| **Group** | The Server Group the server belongs to, if any |
| **Status** | `online`, `offline`, `testing`, or `unknown` |
| **Last Seen** | Timestamp of the most recent successful connection |

---

## Connection Testing

Every server can be tested on demand, and a test always runs automatically right after a server is created.

### Trigger a Test
Click the connection/Wi-Fi icon on a server row to test it, or let the automatic test run at creation time.

### ops0 Connects
For Linux servers, ops0 connects over SSH using the assigned PEM key. For Windows servers, ops0 connects over WinRM using the stored (encrypted) password.

### Status Updates
On success, the server is marked **online**, `lastSeen` is updated, and the detected **operating system** and **version** are recorded. On failure, the server is marked **offline** and an error is shown.

**Passwords and keys are encrypted at rest**

Windows server passwords are encrypted before storage and only decrypted in memory to run a connection test. PEM keys are likewise decrypted only when needed to establish an SSH connection.

---

## Servers List

Search

Filter by name, hostname, IP address, username, or detected OS

Type Filter

Show All, Linux only, or Windows only, with live counts

Each server card shows its name, status, IP address and port, OS type icon, username, detected operating system (once known), assigned group, and authentication method (PEM key name for Linux, "WinRM Authentication" for Windows).

### Status Values

| Status | Meaning |
|--------|---------|
| **online** | Last connection test succeeded |
| **offline** | Last connection test failed |
| **testing** | A connection test is currently in progress |
| **unknown** | No connection test has completed yet |

### Row Actions

| Action | Description |
|--------|-------------|
| **Test Connection** | Re-run the SSH/WinRM reachability check |
| **Edit** | Update server details, group, or credentials |
| **Delete** | Remove the server from ops0 (with a confirmation prompt) |

---

## Bulk Import from Cloud Providers

Instead of adding servers one at a time, you can import running instances directly from a connected cloud integration.

### Click Import Servers
Click **Import Servers** in the header.

### Choose Provider and Account
Select a cloud provider — **AWS**, **Azure**, **Google Cloud**, or **Oracle Cloud** — then choose which connected integration/account to pull instances from.

### Select Instances
ops0 lists the provider's compute instances (name, instance ID, state, instance type, region, and private/public IP). Search by name, ID, or IP, and filter by **All / Running / Stopped**. Select individual instances or use **Select All**.

### Configure Connection Settings
For each selected instance, confirm or adjust the **username** (a sensible default is pre-filled per provider — e.g. `ec2-user` for AWS, `azureuser` for Azure, `opc` for Oracle Cloud, `Administrator` for Windows) and provide a **PEM key** (Linux) or **password** (Windows).

### Import
Click **Import** to create servers for all selected instances. ops0 reports how many were imported, how many were skipped (already imported previously), and how many failed.

**Duplicate detection**

Instances already imported (matched by their cloud instance ID) are automatically skipped rather than duplicated.

---

## Windows Server Setup (WinRM)

Windows servers require WinRM to be enabled before ops0 can connect. A **Windows Setup Guide** button on the Servers page opens step-by-step PowerShell instructions:

### Enable WinRM Service
Run `Enable-PSRemoting -Force` as Administrator to start the WinRM service and HTTP listener.

### Open the Firewall
Add an inbound firewall rule allowing TCP port `5985`.

### Enable Local Account Access
Set the `LocalAccountTokenFilterPolicy` registry value so local (non-domain) accounts can authenticate over WinRM.

### Enable Basic Authentication
Run `winrm set winrm/config/service/auth '@{Basic="true"}'`.

### Allow Unencrypted Traffic (HTTP)
Run `winrm set winrm/config/service '@{AllowUnencrypted="true"}'` to permit HTTP (port 5985) connections.

**Use HTTPS in production**

Port 5985 is unencrypted HTTP. For production environments, ops0 supports connecting over port 5986 (HTTPS) with a properly configured certificate instead.

---

## Feature Availability

Servers (and bulk import) are gated behind an organization-level feature flag. If the feature is not enabled for your organization, the Servers page shows a notice and the **Add Server** / **Import Servers** actions are disabled until support enables it for you.

---

## Next Steps

- [Server Groups](https://docs.ops0.com/docs/servers/groups): Organize servers into logical groups for easier management

- [AI Configuration Generator](https://docs.ops0.com/docs/configurations/ai-generator): Generate and deploy Ansible playbooks against your servers
