---
config:
theme: base
themeCSS: |-
.node { color-scheme: light dark; }
.nodeLabel { line-height: 1.15 !important; }
.compact-list {
display: inline-block;
line-height: 0.95;
}
---
%%{init: {"flowchart":{"rankSpacing":25,"nodeSpacing":20,"curve":"linear","htmlLabels":true,"subGraphTitleMargin":{"top":10,"bottom":18}}}}%%
flowchart TB
%% Top: Configuration recipe
A@{ shape: doc, label: "⚙️ <a href='https://github.com/fs-ise/workstation-setup'>workstation-setup</a><br/>" }
%% Middle: Workstation lifecycle
subgraph WS["<strong>Workstation</strong>"]
direction LR
Setup["<strong>Setup</strong><br/>
<span class='compact-list'>• <a href='install_os.html'>Install OS</a><br/>
• <a href='install_configuration.html'>Apply configuration</a></span><br/>
<span style='font-family:monospace;'>make configure</span><br/>
<i>Fully automated setup</i>"]
Daily["<strong>Day-to-day operations</strong><br/>
<span class='compact-list'>• <a href='install_configuration.html'>Apply configuration</a><br/>
• <a href='audit_configuration.html'>Audit configuration</a><br/>
• <a href='update_configuration.html'>Update configuration</a><br/>
• <a href='backup.html'>Backup data</a></span><br/>
<span style='font-family:monospace;'>make configure<br/>make audit<br/>make update<br/>make backup</span><br/>
<i>Keep the workstation reproducible</i>"]
Restore["<strong>Restore</strong><br/>
<span class='compact-list'>• <a href='install_os.html'>Install OS</a><br/>
• <a href='install_configuration.html'>Apply configuration</a><br/>
• <a href='restore.html'>Restore data</a></span><br/>
<span style='font-family:monospace;'>make configure</span><br/>
<i>Rebuild in minutes</i>"]
%% Invisible links enforce left-to-right ordering
Setup ~~~ Daily ~~~ Restore
end
%% Bottom: Shared data infrastructure
DATA[("<strong>Data infrastructure</strong><br/>
<span class='compact-list'>• <a href='hdd_borg.html'>HDD/Borg</a><br/>
• <a href='github.html'>GitHub</a><br/>
• <a href='nextcloud.html'>Nextcloud</a></span>")]
%% External connections
A -.-> WS
WS <-.-> DATA
%% Node styles
classDef ansible fill:#fff3bf,stroke:#f08c00,stroke-width:2px,color:#1e293b;
classDef phase fill:#ffffff,stroke:#94a3b8,stroke-width:1px,color:#1e293b,text-align:left;
classDef storage fill:#f0fdfa,stroke:#0d9488,stroke-width:2px,color:#115e59,text-align:left;
class A ansible;
class Setup,Daily,Restore phase;
class DATA storage;
%% Workstation container
style WS fill:#eff6ff,stroke:#2563eb,stroke-width:2px
linkStyle default stroke:#94a3b8,stroke-width:1.5px
workstation-setup
This repository documents reproducible Fedora workstation and server-oriented (non-GUI) research environments used by FS-ISE.
The workstation and cloud stacks are tested/supported on Fedora 44 x86_64. Their preflight role rejects other distributions, Fedora major versions, and architectures before running installation or configuration roles. Use the lab stack for Fedora Workstation and the cloud stack for an existing server-oriented (non-GUI) system.
The workstation stack includes:
- Base: Fedora Workstation 44 x86_64, with a debloated GNOME configuration
- Sync & Backup: Vorta/Borg, Nextcloud, Git + LFS
- Development: SSH, Docker, Visual Studio Code, Python, R, RStudio
- Research: LaTeX, Pandoc tooling, Quarto, Obsidian
- Documents: OCR, GROBID, Recoll
- Productivity & Media: Thunderbird, Chrome, GIMP, Audacity, OBS Studio
- Security: KeePassXC, ClamAV, VeraCrypt
We use Ansible to translate the following pragmatic principles into a reproducible workstation setup:
- make new machines transparent and reproducible,
- share setup knowledge as reviewed documentation and code,
- minimize configuration drift between machines,
- automate installation and configuration where possible, and
- keep room for explicit manual steps when accounts, credentials, or lab-specific choices cannot be automated safely.
Research work often depends on fast-moving open-source software, custom tools, and local services. Ansible is the mechanism used here to turn that changing setup knowledge into a programmatic desired state: packages, configuration files, services, and checks can be reviewed in Git, applied to a new machine, and reapplied during maintenance. The diagram shows how the same repository connects initial setup, recurring updates, backup/sync, and data restoration.
Workstation setup is a recurring configuration-management task. The same packages, defaults, accounts, and documentation links need to be applied consistently across notebooks and external drives. Ansible is useful here because the desired setup can be documented as code, reviewed in Git, rerun after changes, and reused as the setup evolves.
See how Uber uses Ansible playbooks for daily backup, generation, and push workflows in its corporate network setup: How Ansible Automation Powers the Uber Corporate Network at a Global Scale.