Skip to content

Security

Built secure by default.
Configurable to your risk level.

Every ReefOffice server comes with a strong security foundation — no setup required.

The short version — for the questions your clients actually ask:

Where is our data?
On your own dedicated server in the EU — never shared with another client.
Who can access it?
You. In Managed mode ReefOffice can maintain it for you — every action logged — or pick air-gapped so no one connects without your say-so.
How is it backed up?
Daily, encrypted on your server before it leaves, and kept in a separate EU location.
Can we leave?
Yes — everything runs on open-source apps in standard formats. Export anytime.

The detail behind each answer is below — in plain language, with the technical specifics one click away.

Baseline

Always included — nothing to configure

🏠

Your own server, not shared with anyone

Your files, emails, and passwords live on a machine that belongs only to you — no other companies or clients share it.

Technical details ▸
  • → Your own VPS on Contabo Cloud — EU data centers
  • → 8 vCPU (AMD EPYC), 24 GB RAM, 400 GB SSD — allocated exclusively to your instance
  • → NixOS — immutable OS, every config change is traceable and reproducible
  • → Full root access, isolated at the hypervisor level — no other client can access your machine
🔐

A stolen password alone can never open your door

Whether the login password is leaked in a breach, guessed, or stolen via phishing — it still will not open the door without the second factor. Every team member is enrolled on their first login. No exceptions, no opt-outs.

Technical details ▸
  • → Authentik SSO — one identity for all services; 2FA is checked at the SSO layer, so it covers Nextcloud, Vaultwarden, and everything else automatically
  • → Default: TOTP — 6-digit code from any authenticator app (Aegis, Google Authenticator, 1Password…)
  • → Upgrade: FIDO2/WebAuthn — hardware key (YubiKey) or device passkey; phishing-resistant by design
  • → No SMS — not offered; SIM-swap attacks make SMS 2FA unreliable
  • → First login redirects to TOTP setup — there is no skip path
💪

Login passwords your team can't make weak

Every team member has one password to log in — to Nextcloud, Vaultwarden, and every other service. When they set or change it, the system rejects anything easy to guess, and anything already found in a known data breach.

Technical details ▸
  • → Applies to the Authentik SSO password — the single login for all services (Nextcloud, Vaultwarden web UI, etc.)
  • → zxcvbn score ≥ 3 (NIST SP 800-63B): models real attacker guessing strategies — dictionary words, name+year patterns, keyboard walks — no rigid character-class rules that train users to write "Password1!"
  • → 12 characters minimum
  • → HaveIBeenPwned check on every set/change — zero tolerance, any breach appearance rejects the password
  • → Does not cover the Vaultwarden master password (vault encryption key set per user in their client app — outside Authentik's scope)
📋

A log of everything done on your server

Every action we take on your server is recorded with a timestamp, visible to you in real time from your dashboard.

Technical details ▸
  • → Hash-chained audit trail — every action recorded, visible in the Security tab of each server in your dashboard
  • → SSH host key pinned on first connection (TOFU) — key mismatch causes connection failure and is logged
🤖

Your automations can't leak your passwords

The workflows running on your server need admin access to your apps to do their job. ReefOffice keeps those credentials in a locked layer your team can never open or read — so a built-in automation can never become a back door to copy out a password.

Technical details ▸
  • → Built-in automations run in an operator-only automation runtime — never in the Activepieces no-code builder your team uses
  • → Their secrets are encrypted and read only by the running job through job-scoped runtime credentials; agent-triggered runs go through a local allow-listed shim and never receive general automation-engine credentials
  • → Your no-code builder holds zero operator credentials; the two layers are kept separate
  • → Operator-only workspace membership is re-enforced on every deploy — no stale account keeps access
🧠

Your documents are searched without ever leaving your server

To make your files, invoices, and notes searchable, most AI tools upload your documents to a big AI company (OpenAI and the like) to be processed. ReefOffice runs a small AI model on your own server for that step — so the contents of your documents are never sent to anyone, not even to be indexed or searched.

Technical details ▸
  • → Embeddings (the math that makes text searchable) are computed locally by bge-m3 (a multilingual, MIT-licensed open model) in Ollama on your VM — no third-party AI API is ever called
  • → Vectors and text live in Qdrant on your own server; a search never leaves the machine
  • → On Private AI plans the answer runs on a ReefOffice GPU in Germany — only your question and the matching snippets go to it, and no third-party AI is ever involved
  • → On no-GPU plans you may optionally connect your own AI key for written answers; then only the question + the matching snippets are sent (never your whole corpus), and only if you opt in
☁️

Automatic backups — encrypted before they leave your server

Your data is backed up daily (and more often), encrypted on your server before being sent anywhere, and stored in a separate location from your server.

Technical details ▸
  • → Restic — client-side AES-256 encryption before transfer, unique key per VM
  • → Stored on Hetzner Storage Box (EU) over SFTP/SSH port 23 — geographically separate from the Contabo compute VM, encrypted before transfer
  • → Retention: 24 hourly · 7 daily · 4 weekly · 12 monthly snapshots
  • → Backup key never stored in the ReefOffice control-plane database

Your choices

Three choices — pick what fits your situation

These are set when your server is created. SSH management can be disabled later; disk encryption and zero-knowledge backup mode require provisioning or a planned handoff.

🔒

Disk encryption

Default: on

The question: what happens if someone physically accesses your server hardware?

✓ On — root data is encrypted

The root filesystem is encrypted at rest. This protects removed disks and root-disk snapshots that do not include the boot unlock material.

Off — files are readable

Anyone with physical access to the disk can read your files directly.

Technical details ▸
  • → LUKS2 root-filesystem encryption by default — applied before NixOS is installed
  • → A random key is generated per VM at provisioning and applied automatically at boot — no passphrase prompt on reboot
  • → Small unencrypted boot partition (bootloader + initrd) · rest of disk LUKS2-encrypted (ext4)
  • → LUKS protects data at rest only — for running-system security see the kernel hardening section in the FAQ below
🛠️

Access mode

Default: Managed

The question: who can connect to your server to apply updates and manage services?

Managed — we handle it

ReefOffice applies updates, toggles services, and fixes issues for you. Every action is logged and visible to you.

Air-gapped — you decide

Nobody connects without your explicit permission. You apply updates on your schedule. Required for zero-trust environments only.

Technical details ▸
  • → Managed: control plane holds a dedicated SSH key; TOFU host key pinning prevents MITM on reconnect
  • → Air-gapped: only your SSH keys are installed; ReefOffice cannot toggle services or apply updates remotely after handoff
  • → Optional weekly digest email (opt-in from Settings): lists all operations across your servers — covers Managed-mode SSH activity without per-action noise
  • → Honest: in Managed mode, ReefOffice has permanent root SSH access. All access is logged, but it is not zero-operator access.
🗝️

Backup encryption key

Default: Standard

The question: if you need to restore a backup, who needs to be involved?

Standard — we restore for you

The backup key stays on your server. If something goes wrong, we can restore your data without waiting for you to provide a key.

Zero-knowledge — only you can restore

After handoff, you replace the backup key with one only you hold. We cannot read or restore those backups without your involvement.

Technical details ▸
  • → Standard: restic password stored on the encrypted root filesystem — never in the control-plane DB
  • → Zero-knowledge: after handoff, you replace the placeholder restic password with a key only you hold; ReefOffice cannot restore backups for you
  • → Attack chain in Standard mode: attacker must break LUKS2, then achieve root, then read the backup key — a multi-stage independent compromise
  • → Zero-knowledge removes ReefOffice backup-key custody after handoff, at the cost of self-managed restore

Deep dive

For security teams — threats, mitigations & roadmap

Click any question to expand.

Do my documents get sent to OpenAI or another AI company to be searched?
No. The step that makes your documents searchable — turning text into "embeddings" (vectors) — is the part competitors typically outsource to a third-party AI API, which means your file contents leave their building. ReefOffice runs that model locally: bge-m3 (a multilingual, MIT-licensed open model) in Ollama on your own VM. The vectors and text are stored in Qdrant, also on your VM. So indexing and searching your corpus never make an outbound AI call — your document contents stay on your server. On Private AI plans the answer is generated by an open-weights model (Qwen by default, or a European model like Mistral) on a ReefOffice GPU in an ISO 27001-compliant data center in Germany, under a data-processing agreement — only your question and the matching snippets are sent to it, nothing is stored there, and no third-party AI is ever involved. The only case anything leaves is if you deliberately connect your own external AI key on a no-GPU plan for written answers — and even then only your question plus the few matching snippets are sent, never the whole corpus.
How are the built-in automations isolated from my team and my no-code tools?
The pre-built automations (document indexing, invoice follow-up, contract filing, deal-won setup, …) run in an operator-only automation runtime that ReefOffice manages — not in Activepieces, the no-code builder your team uses. The credentials they need (your Nextcloud / Dolibarr / Paperless admin accounts, the mail relay) are stored encrypted and read only by the running job through job-scoped runtime credentials; they are never written into any workflow definition a user can open. When the private AI agent triggers one of the approved automations, it calls a local allow-listed shim that injects the credentials server-side, so the agent never receives general automation-engine credentials. Your Activepieces sandbox contains zero operator credentials, and runtime access is enforced operator-only on every deployment, so a stale account cannot linger with access. This closes the class of risk where a built-in automation becomes a way to read out an admin password.
LUKS only protects the disk at rest — what protects a running server?
Correct, and that is by design — LUKS is the right tool for disk-at-rest threats (physical drives, decommissioning, and snapshots that do not include boot unlock material). For a running server we apply a separate layer of controls baked into every NixOS build: ptrace is restricted (scope=3) to prevent process inspection, kexec is disabled so the kernel cannot be replaced at runtime, unprivileged eBPF is blocked, kernel pointers are hidden (kptr_restrict=2), unprivileged userfaultfd is disabled, unprivileged io_uring creation is restricted, and coredumps are suppressed. Full io_uring disable remains available for special hardened deployments, but the default keeps privileged infrastructure compatibility. NixOS immutability means no package manager can silently install unexpected binaries. Daily CVE scanning (vulnix) detects vulnerable packages and reports results in the dashboard.
Do you scan for known CVEs in Authentik, Nextcloud, and Vaultwarden?
Yes — every server runs a daily CVE scan using vulnix, a NixOS-native tool. Because NixOS pins exact package versions as cryptographic hashes (reproducible builds), vulnix can cross-reference every installed package against the National Vulnerability Database in seconds. Results appear in your dashboard Security tab with the package name, version, and CVE IDs. NixOS typically delivers a patched package within 24–48 hours of a CVE disclosure — the next daily scan confirms the fix. This is something most self-hosted stacks cannot do without significant tooling; here it runs out of the box.
What if the ReefOffice control plane itself is compromised?
Air-gapped mode is the complete answer — we hold no SSH key, so a full compromise of our infrastructure has no SSH path to your VM. In Managed mode, the hash-chained audit trail records control-plane operations. In addition, you can enable the optional weekly digest email from your account settings: it summarises service toggles, NixOS update outcomes, and CVE counts across your servers — giving you a regular, expected, easy-to-read confirmation that nothing unexpected happened. Any anomaly in that digest is an early signal to review the full audit log.
Can Contabo staff read my data?
LUKS protects the encrypted root filesystem if someone gets access to a removed root disk or a root-disk snapshot without the boot unlock material. ReefOffice uses unattended LUKS so servers can reboot automatically, which means the boot partition and initrd are a separate part of the threat model. A complete provider-level image of both boot and root storage is not the same as a removed encrypted root disk. The remaining running-VM paths, such as hypervisor-level memory or runtime access, are governed by provider controls, contracts, and audits rather than LUKS.
How long is the attack chain to reach the backup key in Standard mode?
An attacker would need to compromise the running VM, or obtain enough boot material and disk access to unlock the encrypted root filesystem, then read /etc/reefoffice/secrets.env. The backup key is never in the ReefOffice control-plane database. If your compliance requirement is that the backup key must be unreachable under any VM-level compromise, Zero-knowledge mode removes ReefOffice backup-key custody after handoff.
How does SSH host key pinning prevent man-in-the-middle attacks?
On the first SSH connection after provisioning, the control plane records the VM's public host key (Trust On First Use — TOFU). Every subsequent connection verifies the key matches that record. A mismatch — indicating the VM was replaced or a MITM was inserted — causes the connection to fail immediately and is written to the audit log. This means a rogue VM cannot silently intercept management traffic even if DNS or IP routing is compromised.
Who hosts ReefOffice's servers, and can I trust them?
Your server runs on Contabo GmbH, a German hosting company founded in 2003 with its own data centers in Munich and Nuremberg — not a reseller. Contabo serves 225,000+ customers in 190 countries on more than 450,000 servers, and independent monitoring by HOSTtest recorded 100% uptime for Q3 2025 and Q4 2024. Contabo is a registered German company (Amtsgericht München, HRB 180722).

Have a security or compliance question?

Tell us your risk requirements — disk encryption, access mode, zero-knowledge backups, or a specific control — and we'll walk through how ReefOffice handles it for your workspace.

Talk to us

Security question or responsible disclosure: security@reefoffice.com

← Back to ReefOffice