Skip to content

Agent

The agent is part of Vaicoa Pro and Vaicoa Team. To install it, see Install the agent.

The Vaicoa agent is an OS package, cloudviewer-agent, around the upstream Vector collector. It sends metrics and warning log lines from a Linux server to Vaicoa, and job reports through cloudviewer-report. Free mode does not use it.

FamilyPackage managerPackage
Debian, Ubuntuapt.deb
RHEL family: Rocky Linux, AlmaLinux, CentOS Stream, Fedoradnf or yum.rpm
Requirement
Architecturex86-64 and Arm64 (such as Hetzner’s CAX servers). The package contains no compiled code (all / noarch); Vector’s repositories provide the collector for each architecture
Init systemsystemd
Toolscurl. On Debian and Ubuntu also gpg, when the installer has to add Vector’s repository
Installas root
Testedthe full install, from package to first data, has been tested on Ubuntu 24.04, Debian 12 and Rocky Linux 9
Other systemsAlpine, NixOS and systems without systemd: the container image, or the files from the repository’s agent/ directory, installed by hand
Packagecloudviewer-agent: a few KB of readable shell scripts and systemd units, no binaries of its own. Built from the open-source cloudviewer-app/cloudviewer-agent repository (Apache-2.0)
Version<year>.<quarter>.<patch>, for example 2026.3.0
Collectorthe vector package (0.57.0 or later) from Vector’s own signed repository; cloudviewer-agent depends on it
Signing keyhttps://get.vaicoa.com/keys/cloudviewer.gpg
aptdeb [signed-by=/usr/share/keyrings/cloudviewer.gpg] https://get.vaicoa.com/apt stable main in /etc/apt/sources.list.d/cloudviewer.list
dnf, yum/etc/yum.repos.d/cloudviewer.repo with baseurl=https://get.vaicoa.com/rpm, gpgcheck=1, repo_gpgcheck=1
Vector, apthttps://apt.vector.dev/ stable vector-0 in /etc/apt/sources.list.d/vector.list, keys from keys.datadoghq.com in /usr/share/keyrings/datadog-archive-keyring.gpg
Vector, dnfhttps://yum.vector.dev/stable/vector-0/$basearch/ in /etc/yum.repos.d/vector.repo
Updateswith the package manager: apt upgrade, dnf upgrade
Pinning VectorVector’s repositories keep every version, so apt preferences or dnf versionlock work

The installer adds Vector’s repository only when vector is not installed and no vector.list or vector.repo exists.

Terminal window
# One server, with its token from Monitored Servers → Add server → One server
curl -fsSL https://get.vaicoa.com/agent | sh -s -- --token <agent_token>
# Hetzner Cloud servers, with a fleet token (Add server → Fleet enrollment)
curl -fsSL https://get.vaicoa.com/agent | sh -s -- --enroll-token <fleet_token>
# Remove the agent
curl -fsSL https://get.vaicoa.com/agent | sh -s -- --uninstall

The installer checks for root, systemd and curl, detects apt, dnf or yum, adds the repositories, installs cloudviewer-agent with the package manager and runs cloudviewer-agent enroll. After that, nothing on the server is managed by a script.

FlagMeaning
--token <t>Per-server agent token from the portal, shown once. Optional when /etc/cloudviewer-agent/agent.env already exists
--enroll-token <t>Fleet enrollment token. Hetzner Cloud servers only: the server identifies itself through the metadata service. Cannot be combined with --token
--facade-url <u>Vaicoa API base URL. Default https://api.vaicoa.com
--uninstallRemove the agent, its configuration, token and buffered data, through the package manager
--helpShow the usage

Pre-provisioned install (cloud-init, Ansible, Terraform user_data): write CV_AGENT_TOKEN=<agent_token> (or CV_AGENT_ENROLL_TOKEN=<fleet_token>) to /etc/cloudviewer-agent/agent.env, mode 0600, before installing the package. The package then enrolls during installation. cloudviewer-agent enroll without flags does the same on a server that already has the package.

Per-server tokenFleet enrollment token
Created inMonitored Servers → Add server → One server, one per serverAdd server → Fleet enrollment, one per rollout, for one project
ServersAnyHetzner Cloud servers only: identified through the metadata service
On the serverIn agent.envNot stored. The server receives its own per-server token
Linked to the cloud server in your projectNo, not yetYes
Agent charts, jobs and log lines on a cloud server’s detail screenNoYes
Retired when the cloud server is deleted through the Hetzner APINoYes
Dedicated serversYes, with their own detail screenNot possible
Last usedShown per token during a rotationEnrollment tokens list, per token
RevokeRevoke agent token: every token of the server stops working within about ten secondsRevoke enrollment token: no new enrollments; registered servers keep reporting

Fleet enrollment is refused, with a message, for an unknown or revoked token, when the plan’s server limit is reached, and for a server that is not in the token’s project.

CommandWhat it does
cloudviewer-agent enroll --token <t>Checks the token with Vaicoa, writes agent.env and the configuration, enables and starts the services. Run again with a new token, it replaces the token in place
cloudviewer-agent enroll --enroll-token <t>Fleet registration through the Hetzner Cloud metadata service, then the same as above with the server’s own new token. Does nothing on a server that is already enrolled
cloudviewer-agent enrollEnrolls from an existing agent.env
cloudviewer-agent statusEnrolled or not, the state of the services, the configuration version and the Vector version. Exits with 3 when not enrolled
cloudviewer-agent renderRebuilds vector.yaml from the last parameters, without network. The package runs it on upgrades
cloudviewer-agent uninstallUnregisters the server, stops the services and removes configuration, token and data. The package stays installed
cloudviewer-reportJob report wrapper, see Job reports API
systemctl status cloudviewer-agentThe collector service

enroll accepts --facade-url <u> and --quiet. enroll, render and uninstall need root. Running enroll again is always safe.

PathWhat
/usr/bin/cloudviewer-agentThe commands above
/usr/bin/cloudviewer-reportJob report wrapper
/usr/libexec/cloudviewer-agent/fetch-configAsks Vaicoa for the parameters, every minute
/usr/libexec/cloudviewer-agent/render-configBuilds vector.yaml from the parameters
/usr/libexec/cloudviewer-agent/fleet-enrollFleet registration
/usr/lib/systemd/system/cloudviewer-agent.serviceVector, running the rendered configuration
/usr/lib/systemd/system/cloudviewer-agent-config.service and .timerThe parameter check, every minute
/usr/share/doc/cloudviewer-agent/README.mdThe repository’s README
/etc/cloudviewer-agent/agent.envCV_AGENT_TOKEN and CV_AGENT_FACADE_URL. Mode 0600, owner cloudviewer-agent
/etc/cloudviewer-agent/manifestThe last parameters received
/etc/cloudviewer-agent/vector.yamlThe rendered configuration. Mode 0640, cloudviewer-agent:vector. Rewritten on every change; do not edit
/etc/cloudviewer-agent/config.etagVersion of the last parameters
/var/lib/cloudviewer-agent/Vector’s buffers and checkpoints, owner vector. Not /var/lib/vector, so a Vector of your own can run alongside

dpkg -L cloudviewer-agent or rpm -ql cloudviewer-agent lists every file the package installs.

UserRunsCan
vectorcloudviewer-agent.service (the collector)read journald and the auth log through its groups systemd-journal and adm; read, not write, its configuration. Created by the vector package
cloudviewer-agentcloudviewer-agent-config.service (the parameter check)write /etc/cloudviewer-agent. Created by the package

Nothing runs as root after enrollment. Only the commands you run yourself (enroll, render, uninstall) do.

DataSourcePlan
CPU, memory, load, disk I/O, network and filesystem usage per mount point, every 30 secondsVector’s host metricsPro and Team
System log lines with priority 0 to 4 (emergency to warning), from all unitsjournaldPro and Team
SSH and sudo log lines/var/log/auth.log or /var/log/secure, if the system writes one of themTeam, after an admin turns on Collect SSH and sudo log lines in the portal’s Log Collection
Job reportscloudviewer-report or your own HTTP callPro and Team
  • The app charts memory, disk and load from the agent. CPU and network charts come from the Hetzner Cloud API, so only cloud servers have them.
  • Your own services’ lines are included when they go to journald at warning priority or higher, for example logger -p user.warning -t backup "s3 sync retried 3 times, succeeded" or systemd-cat -t myapp -p warning. Info-level lines are not sent.
  • Before a line leaves the server, the values after authorization, bearer, password, passwd, secret, token and key, and PEM private key blocks, are replaced with [REDACTED]. Vaicoa applies the same rules again when the line arrives. See log context.
  • Log lines are kept for 72 hours, at most 2,000 lines per server.
  • Turning SSH and sudo lines off stops them at each server’s next parameter check, usually within a minute. Lines that arrive after that are refused.
  • Nothing else: no application logs other than journald, no file contents, no process list.
  • When the team’s plan no longer includes the agent, Vaicoa stops storing what it sends. Nothing changes on the server.
LimitValueAbove it
Log lines120 a minuteDropped. The app says that lines were rate-limited
Length of a log line2,048 bytesCut off
Metric samples10,000 a minuteDropped. The app says that metrics were rate-limited
New metric series2,000 an hourNew series dropped; known series are still accepted
Stored log lines72 hours, at most 2,000 linesOldest removed first
Job reportssee Job reports API

Each limit applies to one server. Other servers of the team are not affected.

The agent only connects out. It opens no inbound port.

DestinationPortWhen
api.vaicoa.com443Always: parameters every minute, metrics, log lines, job reports, registration and unregistration
get.vaicoa.com443Install and update: the installer, the package repository, the signing key
apt.vector.dev or yum.vector.dev443Install and update: the vector package
keys.datadoghq.com443Install and update: Vector’s signing keys
169.254.169.25480Fleet enrollment only: the Hetzner Cloud metadata service, for the server’s id
ghcr.io443Container and Kubernetes only: image and Helm chart

The installer has no proxy option. An HTTPS_PROXY set for the services is untested.

Plan changes and settings from the portal reach your servers within a minute, without SSH access. Every minute, the agent asks Vaicoa for a small set of declared parameters, such as the plan and whether to send journald lines and SSH and sudo lines. It checks them against a fixed list of keys and values and builds its configuration locally from the template in the package. Anything else, such as an unknown key, an unknown version or a full configuration, is rejected, and the last working configuration stays.

No executable code is sent this way, and the token never travels in the parameters. Even if Vaicoa’s servers were compromised, an attacker could only change these documented settings, not run code on your servers.

In the portal (Monitored Servers):

BadgeMeaning
WaitingRegistered, no report yet
ConnectedLast report less than 5 minutes ago
StaleLast report 5 minutes to 1 hour ago
OfflineLast report more than 1 hour ago
RevokedThe server has no active token
RetiredA fleet-enrolled cloud server deleted from its Hetzner project, or the agent unregistered. Visible for 72 hours, then deleted with its data

A fleet-enrolled server shows “self-registered via” and the token’s label. During a rotation, the row shows when the old and the new token were last used.

In the app, for dedicated servers:

StateMeaning
Waiting for agentNo report yet
Agent connectedThe agent reported within the last 5 minutes
Last seen …The agent has not reported for more than 5 minutes; the time is that of its last report
Agent revokedThe server has no active token
RetiredAs in the portal

After 5 minutes without metrics, the server raises stopped reporting (Alert rules).

ActionUnregisters the serverRemoves from the server
apt purge cloudviewer-agentyespackage, configuration, token, buffered data
apt remove cloudviewer-agentnothe package files only
dnf remove cloudviewer-agentyespackage, configuration, token, buffered data
Installer with --uninstallyesruns the package manager as above
cloudviewer-agent uninstallyesconfiguration, token, buffered data; the package stays
Remove server in the portalremoves it from monitoringnothing; its token stops working
helm uninstall cloudviewer-agentnothe DaemonSet
Deleting a fleet-enrolled cloud server through the Hetzner APIretired automaticallyn/a

Unregistering is best effort. If the call fails, the command says so; check the portal and remove the server there if it does not show Retired. A retired server frees its plan slot at once.

What stays installed:

  • Debian, Ubuntu: the vector package, /etc/apt/sources.list.d/cloudviewer.list and vector.list, and the keys in /usr/share/keyrings/. If you do not use Vector for anything else, run apt autoremove and delete the two list files.
  • RHEL family: /etc/yum.repos.d/cloudviewer.repo and vector.repo. dnf normally removes vector together with the agent.
  • The cloudviewer-agent system user.
Terminal window
dpkg -L cloudviewer-agent && dpkg --verify cloudviewer-agent # Debian, Ubuntu
rpm -ql cloudviewer-agent && rpm -V cloudviewer-agent # RHEL family

The first command lists every file of the package, the second reports files that changed since installation. The token, parameters and buffers in /etc/cloudviewer-agent/ and /var/lib/cloudviewer-agent/ are not part of the package.

For hosts without apt, dnf or systemd:

Terminal window
docker run -d --name cloudviewer-agent --restart always \
-e CV_AGENT_TOKEN=<agent_token> \
-v /proc:/host/proc:ro -v /sys:/host/sys:ro -v /:/host/root:ro \
-e PROCFS_ROOT=/host/proc -e SYSFS_ROOT=/host/sys \
ghcr.io/cloudviewer-app/cloudviewer-agent:<version>
VariableMeaning
CV_AGENT_TOKEN, CV_AGENT_TOKEN_FILEPer-server agent token, or a file that holds it
CV_AGENT_ENROLL_TOKEN, CV_AGENT_ENROLL_TOKEN_FILEFleet enrollment token, Hetzner Cloud only; the container must reach the metadata service
CV_AGENT_FACADE_URLVaicoa API base URL. Default https://api.vaicoa.com

The container checks for new parameters every 60 seconds, like the package. A wrong or revoked token stops it with a message in its log.

Chartoci://ghcr.io/cloudviewer-app/charts/cloudviewer-agent
ShapeA DaemonSet: one pod per node, hostNetwork, read-only mounts of the node’s /proc, /sys and /
CredentialA Secret with the key enroll-token (a fleet token, for clusters) or token (a per-server token, single-node clusters only: one token on several nodes reports them all as the same server). If both exist, token wins
ValuesexistingSecret, enrollToken, token, facadeUrl, image.repository, image.tag, image.digest, image.pullPolicy, resources, tolerations, nodeSelector, podAnnotations, priorityClassName
PermissionsNo ServiceAccount or RBAC; the pod only talks to Vaicoa
Nodes outside Hetzner CloudCannot use a fleet token; their pods restart with a message that says so
Removalhelm uninstall cloudviewer-agent does not unregister the nodes. Nodes deleted from the Hetzner project retire on their own; remove the others in the portal

Details: the chart README.