Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/gunnar

assets/gunnar-setup.svg

<svg xmlns="http://www.w3.org/2000/svg" width="1004" height="554" viewBox="0 0 1004 554" font-family="monospace" font-size="13">
  <!-- GENERATED by `cargo xtask svg` from xtask/src/setup_svg.rs. Do not hand-edit:
       every arrow starts on the box the verb is typed against, and moving a line
       instead of the model is how a diagram starts telling an operator to run
       `promote` on the wrong machine. -->
  <style>
    .box{rx:6;ry:6;stroke-width:1.5}
    .dim{fill:#9a948a}
    .hdr{fill:#e8e4da;font-size:15px;font-weight:bold}
    .kick{fill:#9a948a;font-size:11px}
    .name{fill:#e8e4da;font-size:14px;font-weight:bold}
    .verb{font-size:12px;font-weight:bold}
    .note{fill:#9a948a;font-size:11px}
    .flow{stroke:#6fd3f5;stroke-width:1.6;fill:none;marker-end:url(#flow)}
    .flip{stroke:#4fae76;stroke-width:1.6;fill:none;marker-end:url(#flip);stroke-dasharray:4 3}
  </style>
  <defs>
    <marker id="flow" markerWidth="9" markerHeight="9" refX="7" refY="3" orient="auto"><path d="M0,0 L7,3 L0,6 Z" fill="#6fd3f5"/></marker>
    <marker id="flip" markerWidth="9" markerHeight="9" refX="7" refY="3" orient="auto"><path d="M0,0 L7,3 L0,6 Z" fill="#4fae76"/></marker>
  </defs>
  <rect width="1004" height="554" fill="#14110d"/>
  <text x="16" y="28" class="hdr">gunnar — the setup, like installing a stereo</text>
  <text x="16" y="50" class="dim">main device in the middle, speakers beside it, remote in your hand · an arrow starts on the box you type the verb on</text>
  <g transform="translate(-8 8)">
  <text x="300" y="68" class="kick">the remote</text>
  <rect class="box" x="300" y="76" width="280" height="76" fill="#2a2438" stroke="#9a7fc0"/>
  <text x="312" y="100" class="name">gunnar-ui</text>
  <text x="312" y="120" class="dim">gunnar-ui-server + trunk dist</text>
  <text x="312" y="137" class="dim">GUNNAR_UI_CONTROL points here ↓</text>
  <text x="300" y="206" class="kick">the main device</text>
  <rect class="box" x="300" y="214" width="280" height="120" fill="#123448" stroke="#4f9ec0"/>
  <text x="312" y="238" class="name">primary appliance</text>
  <text x="312" y="258" class="dim">writable — clients push here</text>
  <text x="312" y="275" class="dim">git-ssh :2222 · control :50051</text>
  <text x="312" y="292" class="dim">/data survives a reinstall</text>
  <text x="740" y="206" class="kick">the second speaker</text>
  <rect class="box" x="740" y="214" width="256" height="120" fill="#233a2b" stroke="#4fae76"/>
  <text x="752" y="238" class="name">twin (standby)</text>
  <text x="752" y="258" class="dim">a full gunnar, read-only</text>
  <text x="752" y="275" class="dim">takes the main's pushes</text>
  <text x="752" y="292" class="dim">can be promoted</text>
  <text x="740" y="398" class="kick">the rear speaker</text>
  <rect class="box" x="740" y="406" width="256" height="86" fill="#3a3323" stroke="#c0a24f"/>
  <text x="752" y="430" class="name">browse replica</text>
  <text x="752" y="450" class="dim">public repositories only</text>
  <text x="752" y="467" class="dim">never promoted</text>
  <text x="24" y="228" class="kick">you</text>
  <rect class="box" x="24" y="236" width="160" height="76" fill="#22201c" stroke="#9a948a"/>
  <text x="36" y="260" class="name">stock git</text>
  <text x="36" y="280" class="dim">clone · push</text>
  <path class="flow" d="M190,260 L294,260"/>
  <text x="242" y="253" text-anchor="middle" class="verb" fill="#6fd3f5">SSH :2222</text>
  <text x="242" y="275" text-anchor="middle" class="note">clone / push</text>
  <path class="flow" d="M190,300 L294,300"/>
  <text x="242" y="293" text-anchor="middle" class="verb" fill="#6fd3f5">gRPC :50051</text>
  <text x="242" y="315" text-anchor="middle" class="note">control verbs</text>
  <path class="flow" d="M440,158 L440,208"/>
  <text x="450" y="187" text-anchor="start" class="verb" fill="#6fd3f5">gRPC :50051</text>
  <text x="450" y="202" text-anchor="start" class="note">sshsig, no TLS</text>
  <path class="flow" d="M586,244 L734,244"/>
  <text x="660" y="237" text-anchor="middle" class="verb" fill="#6fd3f5">replication add</text>
  <text x="660" y="259" text-anchor="middle" class="note">&lt;name&gt; ssh://…:2222</text>
  <path class="flow" d="M586,292 L734,292"/>
  <text x="660" y="285" text-anchor="middle" class="verb" fill="#6fd3f5">resync</text>
  <text x="660" y="307" text-anchor="middle" class="note">backfill</text>
  <path class="flip" d="M734,330 L586,330"/>
  <text x="660" y="323" text-anchor="middle" class="verb" fill="#4fae76">promote</text>
  <text x="660" y="345" text-anchor="middle" class="note">on the twin</text>
  <path class="flow" d="M470,340 L470,449 L734,449"/>
  <text x="730" y="425" text-anchor="end" class="verb" fill="#6fd3f5">replication add --scope public-only</text>
  <text x="730" y="440" text-anchor="end" class="note">--control &lt;replica&gt;:50051</text>
  <path class="flip" d="M330,340 C330,390 390,390 390,340"/>
  <text x="316" y="382" text-anchor="end" class="verb" fill="#4fae76">abdicate / demote</text>
  <text x="316" y="397" text-anchor="end" class="note">on the old main</text>
  </g>
  <text x="16" y="524" class="dim">the twin is installed from the same medium as the main — `replication standby` on it, `replication add` on the main,</text>
  <text x="16" y="540" class="dim">and `replication list` says: last successful replication: &lt;time&gt;</text>
</svg>