Start here
About this manual
Everything needed to run SOiL's internal systems — the staff portal, the dashboards, the domain, email, and remote access to Sage Evolution — written so that someone new could pick it up and keep things running.
It is in two parts. Part A (Admin User) is for the person who manages the portal day to day — staff access, the dashboards, HR records. Part B (Server Administrator) is for whoever maintains the underlying infrastructure — the domain, Cloudflare, deployments, and the Sage server.
Passwords are not written into this document. Where a real secret is needed it shows 🔒 in Bitwarden — meaning the value lives in Bitwarden, SOiL's password vault (see the Credential register). Keep that rule: this page is gated, but documents get copied and shared, so secrets stay in Bitwarden.
soiloils-hub/admin-manual.html; redeploy the hub after editing (see Dashboards & deploys).Start here
System overview
SOiL runs four things you need to understand. They are independent — a problem in one rarely affects the others.
| System | What it is | Where it lives |
|---|---|---|
| The portal (hub) | The staff landing page. A login screen, then tiles linking to each dashboard and resource. | Cloudflare Pages → hub.soiloils.com |
| The dashboards | People (HR), Performance, and Pricing/Incentive. Self-contained web pages. | Cloudflare Pages → people / performance subdomains |
| Domain & email | The soiloils.com domain and all company email. | DNS managed in Cloudflare; mailboxes hosted at xneelo |
| Sage remote access | A secure way to reach the Sage Evolution accounting PC from any browser. | Cloudflare Tunnel + the soil-server PC on-site |
Start here
Quick links
| What | Link | Who needs it |
|---|---|---|
| Staff portal | hub.soiloils.com | Everyone |
| People (HR) dashboard | people.soiloils.com | Admin / HR |
| Performance dashboard | performance.soiloils.com | Admin / management |
| Sage remote access | sage.soiloils.com (via App Launcher) | Authorised finance staff |
| Cloudflare dashboard | dash.cloudflare.com | Server admin |
| Cloudflare Zero Trust (Sage gate) | one.dash.cloudflare.com | Server admin |
| Sage App Launcher | bold-frost-4f30.cloudflareaccess.com | Authorised finance staff |
| Domain registrar / mail host | konsoleH (xneelo) | Server admin |
Part A — Admin User Guide
The portal & login
The portal is the front door for staff. It lives at hub.soiloils.com and branded as Veld Botanicals — Elements of Wellness.
How staff log in
Each person signs in with a personal username and a shared password. The username controls their name, role label, and which dashboards they see; the password is currently the same for all staff (the general portal PIN — 🔒 in Bitwarden).
Adding, removing, or editing a portal user
Users are defined in a list near the top of the hub's code. To change them you edit the hub file and redeploy.
- Open
soiloils-hub/index.htmlin a text editor. - Find the block of lines that look like:
{ username: "natalie", password: "••••••", name: "Natalie", role: "Admin", access: ["people","performance","production"] }, - Copy a line, change
username,name,role, andaccess. To remove someone, delete their line (or put//at the start to disable it). accessis the list of dashboards that person can open — use any ofpeople,performance,production.- Save, then redeploy the hub (see Dashboards & deploys).
Part A — Admin User Guide
The dashboards
Three dashboards hang off the portal. Each is a self-contained page; staff reach them through the tiles on the hub once logged in.
| Dashboard | Address | Purpose |
|---|---|---|
| People (HR) | people.soiloils.com | Staff records, leave, sick days, and the employee records register (see below). |
| Performance | performance.soiloils.com | Sales and operational performance views. |
| Pricing / Incentive | soiloils-pricing.pages.dev | Incentive and pricing analysis, fed by monthly Sage inventory exports. |
Part A — Admin User Guide
HR employee records
The People dashboard has an Employee Records tab holding each employee's statutory details:
- V number — the internal employee number (e.g.
V002). - ID number — the SA ID; the first six digits are the date of birth, which the dashboard works out and displays automatically.
- Tax number — SARS income-tax reference.
- UIF reference — the company UIF reference.
The fields are locked by default
To prevent accidental edits, these fields are read-only until an admin unlocks them. There is a separate HR admin password for this (🔒 in Bitwarden — distinct from the portal login).
- Open the Employee Records tab.
- Click Unlock and enter the HR admin password.
- Fields become editable, and the Add employee button appears.
- Make your changes — they save automatically. The lock re-engages when you reload.
Part A — Admin User Guide
Sage remote access (for staff)
Finance staff who are authorised can open the Sage Evolution desktop in a browser tab — no software to install. From the portal's Systems & Access section, click Sage Evolution — Remote Access (or go to the App Launcher at bold-frost-4f30.cloudflareaccess.com).
They will be asked to sign in twice:
- Cloudflare gate — enter your authorised work email; a one-time PIN is emailed to you; enter it.
- Windows login — username
.\sageuserand the Sage Windows password (🔒 in Bitwarden).
Only emails on the approved list can pass the first gate. To add or remove someone, the server admin edits the policy (Part B). The full technical setup is in Part B and in the file sage-browser-rdp-setup.md.
Part B — Server Administrator Guide
Accounts & credentials
Before touching anything, know where the keys are. SOiL's systems rest on a small number of accounts:
| Account | Username / identifier | Controls |
|---|---|---|
| Cloudflare | soilorganicoils@gmail.com | DNS, all dashboards (Pages), the Sage tunnel & gate |
| xneelo / konsoleH | Account holder login | Domain registration, mailboxes |
| Sage server (Windows) | .\sageuser (+ Administrator) | The Sage Evolution PC desktop |
| This manual | Admin password | Access to this handbook |
All passwords for these live in Bitwarden, not in this file (see the Credential register). If you are taking over and do not have access to the Bitwarden vault, that is the first thing to obtain from the outgoing owner.
Part B — Server Administrator Guide
Cloudflare account
Cloudflare is the hub of everything. One free-tier account holds the domain's DNS, every dashboard (as "Pages" projects), and the Sage remote-access setup (under "Zero Trust").
| Login | dash.cloudflare.com · soilorganicoils@gmail.com · 🔒 in Bitwarden |
| Account ID | 85548a513420cad9dff92c4702d907a9 |
| Plan | Free (covers DNS, Pages, Zero Trust under 50 users, and the Tunnel) |
| Recurring cost | R0 — nothing is billed for the current setup |
Part B — Server Administrator Guide
Domain & DNS
The domain soiloils.com is registered at xneelo, but its DNS is delegated to Cloudflare. That means: domain renewal and mailboxes are managed at xneelo; everything else (which address points where) is managed in Cloudflare → DNS → Records.
| Setting | Value |
|---|---|
| Registrar / mail host | xneelo — konsoleH |
| Nameservers (set at xneelo) | alex.ns.cloudflare.com · alina.ns.cloudflare.com |
| DNS managed in | Cloudflare → soiloils.com → DNS → Records |
What points where
| Name | Type | Target | Proxy |
|---|---|---|---|
| hub | CNAME | soiloils-hub.pages.dev | Proxied |
| people | CNAME | soiloils-people.pages.dev | Proxied |
| performance | CNAME | soiloils-performance.pages.dev | Proxied |
| sage | CNAME | bc4070df-…cfargotunnel.com | Proxied |
| @ / www / mail | A | 197.221.10.81 | DNS-only |
Part B — Server Administrator Guide
Email — the thing you must not break
Company email is hosted at xneelo; Cloudflare only carries the DNS records that route mail. If those records are wrong, email stops. Treat them as sacred.
| Record | Name | Value |
|---|---|---|
| MX | @ | mail.soiloils.com (priority 10) |
| A | 197.221.10.81 — DNS-only | |
| TXT (SPF) | @ | v=spf1 mx a include:spf.host-h.net ?all |
| TXT (DKIM) | xneelo._domainkey | long DKIM key — leave exactly as is |
| CNAME | smtp / imap / pop / relay | mail.soiloils.com — DNS-only |
@soiloils.com address to confirm mail still flows. The full record map is saved in soiloils-cloudflare-import.txt.Part B — Server Administrator Guide
Dashboards & how to deploy them
Each website is a Cloudflare Pages project. The source is a folder of files on the work computer; "deploying" means uploading that folder so the live site updates.
| Live site | Pages project | Source folder |
|---|---|---|
| hub.soiloils.com | soiloils-hub | Artifacts/SOiL/soiloils-hub/ |
| people.soiloils.com | soiloils-people | Artifacts/SOiL/soiloils-people/ |
| performance.soiloils.com | soiloils-performance | Artifacts/SOiL/…/ |
| (pricing) | soiloils-pricing | Artifacts/SOiL/…/ |
Deploy by drag-and-drop (the reliable method, ~30 seconds)
- Go to dash.cloudflare.com → Workers & Pages → open the project (e.g.
soiloils-hub). - Click Create new deployment.
- Drag the whole project folder onto the upload area and confirm.
- Wait for "Success". The live site updates within a minute.
soiloils-hub/admin-manual.html. To publish an edit to it, redeploy the soiloils-hub project the same way. It is then reachable at hub.soiloils.com/admin-manual.html.Part B — Server Administrator Guide
Sage remote access — how it works
Goal: let authorised staff use the Sage Evolution desktop from any browser, securely, with no software install. The pieces:
- The server — a PC on-site called
soil-serverrunning Sage Evolution and Windows Remote Desktop. - Cloudflare Tunnel — a small program (
cloudflared) on that PC that makes a secure outbound connection to Cloudflare. No router ports are opened. Tunnel namesage-evolution-pc. - Browser-based RDP — Cloudflare's Access-for-Infrastructure feature renders the Windows desktop in the browser. Free under 50 users.
- The gate — a Cloudflare Access policy that emails a one-time PIN, restricted to an approved email list.
| Item | Value |
|---|---|
| Public address | sage.soiloils.com (reached via the App Launcher) |
| App Launcher / team domain | bold-frost-4f30.cloudflareaccess.com |
| Tunnel name / ID | sage-evolution-pc · bc4070df-cf49-4194-9700-44923c3c494a |
| Target (the PC) | sage-pc → 192.168.2.100 port 3389 |
| Access policy | Sage Authorized Staff — currently grant@soil.co.za, natalie@soil.co.za |
| Windows login | .\sageuser + password (🔒 in Bitwarden) |
To authorise a new person for Sage
- Cloudflare → Zero Trust → Access → Applications → open the Sage app → its policy Sage Authorized Staff.
- Add their work email to the Include → Emails list. Save.
- Give them the Windows login (
.\sageuser+ password) separately and securely.
sage-browser-rdp-setup.md in the SOiL folder. Read it before changing anything on the Cloudflare side.Part B — Server Administrator Guide
The Sage server (soil-server)
| Detail | Value |
|---|---|
| Device name | soil-server |
| OS | Windows 10 Pro 22H2 |
| LAN IP | 192.168.2.100 |
| RDP port | 3389 |
| Hardware | Intel i5-10400, 16 GB RAM |
| Runs | Sage Evolution, plus cloudflared as a service |
| Windows accounts | Administrator, Soil Server (both admins), and sageuser (for remote login) |
The Sage remote login account
Staff log into the Sage desktop with a dedicated account, sageuser, created so the main admin account stays separate. If you ever need to recreate it, open PowerShell as Administrator on the server and run:
net user sageuser <STRONG_PASSWORD> /add
net localgroup "Remote Desktop Users" sageuser /add
wmic useraccount where "name='sageuser'" set PasswordExpires=false
Then record the password in the vault. The Sage tile login is .\sageuser + that password.
If Sage remote access stops working
Almost always the server, not Cloudflare. The most common cause is the PC being off, asleep, or the Remote Desktop listener not running after an update. Check, on the server:
Test-NetConnection 192.168.2.100 -Port 3389
If TcpTestSucceeded is False, Remote Desktop is not listening — reboot the server (after hours; it is the live Sage box). After reboot the same command should return True, and the Sage tile will work again. Keep the PC set to never sleep.
Part B — Server Administrator Guide
Routine maintenance
| How often | Task |
|---|---|
| Monthly | Send a test email in & out of a @soiloils.com address — confirm mail flows. |
| Monthly | Open each dashboard URL and the Sage tile to confirm all are up. |
| Quarterly | Confirm cloudflared service on soil-server is running and set to start automatically; update it if a new version is out, then restart the service. |
| Quarterly | Review the Sage authorised-email list — remove anyone who has left. |
| Annually | Confirm the soiloils.com domain renewal at xneelo is paid and not lapsing. |
| On staff change | Update portal users (hub) and the Sage policy as needed. |
| On any change | Update this manual and redeploy the hub. |
Reference
Credential register
Passwords are deliberately not printed here. This table lists every credential, who/what it is for, and where the actual value is kept. All real values live in Bitwarden, SOiL's password vault (free, set up as described below).
| Credential | Username / identifier | Value |
|---|---|---|
| Cloudflare account | soilorganicoils@gmail.com | 🔒 in Bitwarden |
| Cloudflare API token (deploys) | — | 🔒 in Bitwarden |
| xneelo / konsoleH | Account holder | 🔒 in Bitwarden |
| Sage Windows login | .\sageuser | 🔒 in Bitwarden |
| Sage server admin | Administrator / Soil Server | 🔒 in Bitwarden |
| Portal staff login (shared PIN) | personal usernames | 🔒 in Bitwarden |
| HR records admin unlock | — | 🔒 in Bitwarden |
| This manual's admin password | — | 🔒 in Bitwarden (change instructions below) |
Setting up the vault (Bitwarden)
SOiL uses Bitwarden — a free, open-source password manager — as the single home for every secret in this manual.
- Create the account. Sign up at bitwarden.com with a strong master password that is not reused anywhere else. This master password is the one thing never written down digitally — memorise it.
- Turn on two-factor authentication (Settings → Security → Two-step login).
- Add every credential from the register above as a Bitwarden item: Cloudflare login + recovery codes, the Cloudflare API token, xneelo/konsoleH,
.\sageuser, the server admin accounts, the portal PIN, the HR unlock, and this manual's password. - Share with one trusted colleague. Bitwarden's free plan includes a 2-person Organisation — create one, put the SOiL credentials in a shared collection, and invite a second trusted person (e.g. a manager). This ensures the company is never locked out if one person is unavailable.
- Make a break-glass backup. Print the credential list once, seal it in an envelope, and store it in a locked drawer or safe at the office — for the rare case nobody can reach Bitwarden itself.
Changing this manual's password
Open soiloils-hub/admin-manual.html, find the line near the bottom that reads const ADMIN_PW = "…";, change the value, save, and redeploy the hub. Record the new value in the vault.
Reference
Troubleshooting
| Symptom | Most likely cause & fix |
|---|---|
| A dashboard edit "won't show" on the live URL | Not deployed. Redeploy the project (drag-drop). The live site only changes on deploy. |
| A site shows "NXDOMAIN" / won't resolve | Missing DNS record. In Cloudflare → DNS, confirm the CNAME exists and is proxied; or re-add the custom domain in the Pages project. |
| Email stops sending/receiving | Check the MX, SPF, DKIM records in Cloudflare are present, correct, and DNS-only. Compare against soiloils-cloudflare-import.txt. |
| Sage tile: "no route to host" / won't connect | Server-side. Run Test-NetConnection 192.168.2.100 -Port 3389 on soil-server; if False, reboot the server after hours. |
| Sage gate won't let someone in | Their email isn't on the Sage Authorized Staff policy. Add it in Zero Trust → Access. |
| "Access is denied" on a server command | PowerShell isn't elevated. Reopen it as Administrator. |
| Can't log into Cloudflare | Use the Gmail account's recovery; this is why two people must hold access. Without it, nothing can be changed. |
Reference
Glossary
| DNS | The internet's address book — translates names like people.soiloils.com into the right destination. |
| Nameservers | The servers that hold a domain's DNS. Ours are delegated to Cloudflare. |
| Cloudflare Pages | Free website hosting. Each dashboard is one "Pages project". |
| Deploy | Uploading the website files so the live site updates. |
| Proxied (orange) vs DNS-only (grey) | Whether traffic passes through Cloudflare. Websites = proxied; email = DNS-only. |
| Cloudflare Tunnel / cloudflared | A secure outbound connection from the Sage PC to Cloudflare, so no firewall ports are opened. |
| RDP | Remote Desktop — viewing/controlling the Sage PC's screen remotely. |
| Zero Trust / Access | Cloudflare's security layer that gates Sage behind an email PIN. |
| MX / SPF / DKIM | DNS records that route and authenticate email. Do not delete. |