relmio 0.2.4 → 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -1
- package/README.md +72 -12
- package/docs/images/examples/hosted-chat-connected.png +0 -0
- package/docs/images/setup/01-local-sign-in-ready.png +0 -0
- package/docs/images/setup/02-vps-identity-confirmed.png +0 -0
- package/docs/images/setup/03-n8n-detected.png +0 -0
- package/docs/images/setup/04-install-plan.png +0 -0
- package/docs/images/setup/05-bridge-ready.png +0 -0
- package/docs/maintenance.md +13 -1
- package/docs/security.md +8 -2
- package/docs/troubleshooting.md +50 -7
- package/docs/video-outline.md +13 -4
- package/package.json +1 -1
- package/src/ui/app.js +21 -6
- package/src/ui/geist-latin.woff2 +0 -0
- package/src/ui/index.html +452 -386
- package/src/ui/styles.css +691 -434
- package/src/web/server.js +5 -1
package/src/ui/index.html
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
6
|
<meta
|
|
7
7
|
name="description"
|
|
8
|
-
content="Relmio
|
|
8
|
+
content="Relmio verifies a self-hosted n8n VPS and installs a separate private OpenAI-compatible sidecar only after review."
|
|
9
9
|
/>
|
|
10
|
-
<title>Relmio
|
|
10
|
+
<title>Relmio | Private n8n setup</title>
|
|
11
11
|
<link
|
|
12
12
|
rel="icon"
|
|
13
13
|
href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Cpath fill='%23137c74' d='M7 8h19l31 24H41L26 20v10L7 17Z'/%3E%3Cpath fill='%2312211f' d='M7 47l19-13v10l15-12h16L26 56H7Z'/%3E%3C/svg%3E"
|
|
@@ -16,424 +16,490 @@
|
|
|
16
16
|
<script src="/app.js" type="module"></script>
|
|
17
17
|
</head>
|
|
18
18
|
<body>
|
|
19
|
-
|
|
19
|
+
<!--
|
|
20
|
+
THESIS: Relmio makes an invisible relay legible as a verified route, refusing the generic setup card and progress bar.
|
|
21
|
+
OWN-WORLD: Warm paper surfaces, midnight ink, relay teal, graphite seams, and precise signal spines form a compact Patchbay Ledger.
|
|
22
|
+
STORY: Verify the local sign-in, confirm the host, inspect n8n, review every write, then complete the private route.
|
|
23
|
+
FIRST VIEWPORT: A persistent route rail occupies the left while one dominant gate and its current safety boundary occupy the right.
|
|
24
|
+
FORM: Signal Spine adapted for operation, first of three approved compositions, from candidate 5 and seed c4426c7c.
|
|
25
|
+
FINISH: unreviewed and undocumented is unfinished; this build ends with the finish review, the verdict, and DESIGN.md
|
|
26
|
+
-->
|
|
27
|
+
<a class="skip-link" href="#main-content">Skip to the current gate</a>
|
|
20
28
|
|
|
21
29
|
<header class="site-header">
|
|
22
|
-
<
|
|
30
|
+
<a class="brand" href="#main-content" aria-label="Relmio setup home">
|
|
23
31
|
<svg
|
|
24
32
|
class="brand-mark"
|
|
25
33
|
viewBox="0 0 64 64"
|
|
26
34
|
aria-hidden="true"
|
|
27
35
|
focusable="false"
|
|
28
36
|
>
|
|
29
|
-
<path
|
|
30
|
-
<path
|
|
37
|
+
<path class="brand-signal" d="M7 8h19l31 24H41L26 20v10L7 17Z" />
|
|
38
|
+
<path class="brand-ink" d="M7 47l19-13v10l15-12h16L26 56H7Z" />
|
|
31
39
|
</svg>
|
|
32
40
|
<span>Relmio</span>
|
|
33
|
-
</
|
|
34
|
-
<span class="local-badge">
|
|
41
|
+
</a>
|
|
42
|
+
<span class="local-badge">
|
|
43
|
+
<i aria-hidden="true"></i>
|
|
44
|
+
Runs only on this computer
|
|
45
|
+
</span>
|
|
35
46
|
</header>
|
|
36
47
|
|
|
37
|
-
<main id="main-content" class="shell">
|
|
38
|
-
<section class="intro" aria-labelledby="page-title">
|
|
39
|
-
<
|
|
40
|
-
<
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
image, Compose file, container, and workflows stay untouched.
|
|
48
|
+
<main id="main-content" class="wizard-shell">
|
|
49
|
+
<section class="wizard-intro" aria-labelledby="page-title">
|
|
50
|
+
<h1 id="page-title">Five gates. One private sidecar.</h1>
|
|
51
|
+
<p>
|
|
52
|
+
Verify each boundary in order. Relmio leaves your existing n8n
|
|
53
|
+
deployment untouched.
|
|
44
54
|
</p>
|
|
55
|
+
<section class="intro-ledger" aria-label="Setup boundaries">
|
|
56
|
+
<span>
|
|
57
|
+
<strong>Back up first</strong>
|
|
58
|
+
<small>Export your n8n workflows before connecting.</small>
|
|
59
|
+
</span>
|
|
60
|
+
<span>
|
|
61
|
+
<strong>No public port</strong>
|
|
62
|
+
<small>The sidecar stays on the private Docker network.</small>
|
|
63
|
+
</span>
|
|
64
|
+
<span>
|
|
65
|
+
<strong>You approve writes</strong>
|
|
66
|
+
<small>The exact remote plan appears before installation.</small>
|
|
67
|
+
</span>
|
|
68
|
+
</section>
|
|
45
69
|
</section>
|
|
46
70
|
|
|
47
|
-
<
|
|
48
|
-
<
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
<
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
71
|
+
<section class="wizard-layout">
|
|
72
|
+
<aside class="route-rail" aria-labelledby="route-title">
|
|
73
|
+
<header>
|
|
74
|
+
<h2 id="route-title">Your private route</h2>
|
|
75
|
+
<p>Each verified gate extends the signal to the sidecar.</p>
|
|
76
|
+
</header>
|
|
77
|
+
|
|
78
|
+
<nav class="steps" aria-label="Setup progress">
|
|
79
|
+
<ol>
|
|
80
|
+
<li data-step-marker="1" aria-current="step">
|
|
81
|
+
<span class="step-index">1</span>
|
|
82
|
+
<span class="step-copy">
|
|
83
|
+
<strong>Sign in</strong>
|
|
84
|
+
<small>Local credential</small>
|
|
85
|
+
</span>
|
|
86
|
+
</li>
|
|
87
|
+
<li data-step-marker="2">
|
|
88
|
+
<span class="step-index">2</span>
|
|
89
|
+
<span class="step-copy">
|
|
90
|
+
<strong>Verify VPS</strong>
|
|
91
|
+
<small>SSH fingerprint</small>
|
|
92
|
+
</span>
|
|
93
|
+
</li>
|
|
94
|
+
<li data-step-marker="3">
|
|
95
|
+
<span class="step-index">3</span>
|
|
96
|
+
<span class="step-copy">
|
|
97
|
+
<strong>Select n8n</strong>
|
|
98
|
+
<small>Read-only discovery</small>
|
|
99
|
+
</span>
|
|
100
|
+
</li>
|
|
101
|
+
<li data-step-marker="4">
|
|
102
|
+
<span class="step-index">4</span>
|
|
103
|
+
<span class="step-copy">
|
|
104
|
+
<strong>Review plan</strong>
|
|
105
|
+
<small>Every remote write</small>
|
|
106
|
+
</span>
|
|
107
|
+
</li>
|
|
108
|
+
<li data-step-marker="5">
|
|
109
|
+
<span class="step-index">5</span>
|
|
110
|
+
<span class="step-copy">
|
|
111
|
+
<strong>Complete</strong>
|
|
112
|
+
<small>Private endpoint</small>
|
|
113
|
+
</span>
|
|
114
|
+
</li>
|
|
115
|
+
</ol>
|
|
116
|
+
</nav>
|
|
117
|
+
|
|
118
|
+
<section class="rail-boundary" aria-label="Current safety model">
|
|
119
|
+
<strong>Sidecar-only guarantee</strong>
|
|
120
|
+
<p>
|
|
121
|
+
No n8n restart. No n8n rebuild. No host port 10531. The wizard
|
|
122
|
+
writes only under <code>/docker/n8n-openai-oauth</code>.
|
|
99
123
|
</p>
|
|
100
|
-
</
|
|
101
|
-
</
|
|
102
|
-
|
|
103
|
-
<div class="actions">
|
|
104
|
-
<button id="login-button" class="button secondary" type="button">
|
|
105
|
-
Sign in with ChatGPT
|
|
106
|
-
</button>
|
|
107
|
-
<a
|
|
108
|
-
id="login-link"
|
|
109
|
-
class="button secondary"
|
|
110
|
-
target="_blank"
|
|
111
|
-
rel="noopener noreferrer"
|
|
112
|
-
hidden
|
|
113
|
-
>
|
|
114
|
-
Open fresh ChatGPT sign-in
|
|
115
|
-
</a>
|
|
116
|
-
<button id="signin-next" class="button primary" type="button" disabled>
|
|
117
|
-
Continue to VPS
|
|
118
|
-
</button>
|
|
119
|
-
</div>
|
|
120
|
-
</section>
|
|
121
|
-
|
|
122
|
-
<section class="panel" data-step="2" aria-labelledby="vps-title" hidden>
|
|
123
|
-
<div class="panel-heading">
|
|
124
|
-
<span class="step-kicker">Step 2 of 5</span>
|
|
125
|
-
<h2 id="vps-title" tabindex="-1">Connect to your VPS</h2>
|
|
126
|
-
<p>
|
|
127
|
-
Copy the address exactly from Hostinger. Your password is used only
|
|
128
|
-
for this live SSH connection and is never saved.
|
|
129
|
-
</p>
|
|
130
|
-
</div>
|
|
131
|
-
|
|
132
|
-
<form id="vps-form">
|
|
133
|
-
<div class="field-grid">
|
|
134
|
-
<label class="field">
|
|
135
|
-
<span>VPS address</span>
|
|
136
|
-
<input
|
|
137
|
-
id="host"
|
|
138
|
-
name="host"
|
|
139
|
-
inputmode="url"
|
|
140
|
-
autocomplete="off"
|
|
141
|
-
placeholder="your-vps-ip-or-hostname"
|
|
142
|
-
required
|
|
143
|
-
/>
|
|
144
|
-
<small>Use the full IP address—do not add <code>ssh root@</code>.</small>
|
|
145
|
-
</label>
|
|
146
|
-
|
|
147
|
-
<label class="field compact">
|
|
148
|
-
<span>SSH port</span>
|
|
149
|
-
<input
|
|
150
|
-
id="port"
|
|
151
|
-
name="port"
|
|
152
|
-
type="number"
|
|
153
|
-
min="1"
|
|
154
|
-
max="65535"
|
|
155
|
-
value="22"
|
|
156
|
-
required
|
|
157
|
-
/>
|
|
158
|
-
</label>
|
|
159
|
-
|
|
160
|
-
<label class="field compact">
|
|
161
|
-
<span>Username</span>
|
|
162
|
-
<input
|
|
163
|
-
id="username"
|
|
164
|
-
name="username"
|
|
165
|
-
autocomplete="username"
|
|
166
|
-
value="root"
|
|
167
|
-
required
|
|
168
|
-
/>
|
|
169
|
-
<small>
|
|
170
|
-
The current guided setup expects the VPS root account.
|
|
171
|
-
</small>
|
|
172
|
-
</label>
|
|
173
|
-
|
|
174
|
-
<label class="field">
|
|
175
|
-
<span>VPS password</span>
|
|
176
|
-
<input
|
|
177
|
-
id="password"
|
|
178
|
-
name="password"
|
|
179
|
-
type="password"
|
|
180
|
-
autocomplete="current-password"
|
|
181
|
-
disabled
|
|
182
|
-
required
|
|
183
|
-
/>
|
|
184
|
-
<small>
|
|
185
|
-
This unlocks after you confirm the server identity, then clears
|
|
186
|
-
immediately after connecting.
|
|
187
|
-
</small>
|
|
188
|
-
</label>
|
|
189
|
-
</div>
|
|
124
|
+
</section>
|
|
125
|
+
</aside>
|
|
190
126
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
127
|
+
<section class="work-column" aria-label="Current setup gate">
|
|
128
|
+
<section class="status-dock" aria-label="Wizard status">
|
|
129
|
+
<p id="preview-badge" class="preview-badge" hidden>
|
|
130
|
+
<strong>Sanitized preview</strong>
|
|
131
|
+
<span>Sample data only. No live sign-in or VPS writes.</span>
|
|
132
|
+
</p>
|
|
133
|
+
<p id="global-message" class="message" role="status" aria-live="polite">
|
|
134
|
+
Checking your local sign-in…
|
|
135
|
+
</p>
|
|
136
|
+
<p id="global-error" class="error" role="alert" tabindex="-1" hidden></p>
|
|
137
|
+
</section>
|
|
194
138
|
|
|
195
|
-
<
|
|
196
|
-
<
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
<
|
|
139
|
+
<section class="panel" data-step="1" aria-labelledby="signin-title">
|
|
140
|
+
<header class="panel-heading">
|
|
141
|
+
<h2 id="signin-title" tabindex="-1">Use your local ChatGPT sign-in</h2>
|
|
142
|
+
<span>Gate 1 of 5</span>
|
|
143
|
+
<p>
|
|
144
|
+
The OAuth credential stays on this computer until you approve
|
|
145
|
+
its encrypted SSH upload to your VPS.
|
|
146
|
+
</p>
|
|
147
|
+
</header>
|
|
148
|
+
|
|
149
|
+
<section class="status-row" aria-label="Local sign-in status">
|
|
150
|
+
<span id="auth-indicator" class="status-dot" aria-hidden="true"></span>
|
|
200
151
|
<span>
|
|
201
|
-
|
|
202
|
-
|
|
152
|
+
<strong id="auth-title">Checking…</strong>
|
|
153
|
+
<p id="auth-detail">Looking for your local Codex credential.</p>
|
|
154
|
+
<p id="auth-updated" class="credential-time" hidden>
|
|
155
|
+
Credential updated
|
|
156
|
+
<time id="auth-updated-time"></time>
|
|
157
|
+
(local time).
|
|
158
|
+
</p>
|
|
203
159
|
</span>
|
|
204
|
-
</
|
|
205
|
-
</div>
|
|
160
|
+
</section>
|
|
206
161
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
162
|
+
<footer class="actions">
|
|
163
|
+
<button id="login-button" class="button secondary" type="button">
|
|
164
|
+
Sign in with ChatGPT
|
|
165
|
+
</button>
|
|
166
|
+
<a
|
|
167
|
+
id="login-link"
|
|
168
|
+
class="button secondary"
|
|
169
|
+
target="_blank"
|
|
170
|
+
rel="noopener noreferrer"
|
|
171
|
+
hidden
|
|
172
|
+
>
|
|
173
|
+
Open fresh ChatGPT sign-in
|
|
174
|
+
</a>
|
|
175
|
+
<button id="signin-next" class="button primary" type="button" disabled>
|
|
176
|
+
Continue to VPS
|
|
177
|
+
</button>
|
|
178
|
+
</footer>
|
|
179
|
+
</section>
|
|
217
180
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
181
|
+
<section class="panel" data-step="2" aria-labelledby="vps-title" hidden>
|
|
182
|
+
<header class="panel-heading">
|
|
183
|
+
<h2 id="vps-title" tabindex="-1">Verify the VPS before sending a password</h2>
|
|
184
|
+
<span>Gate 2 of 5</span>
|
|
185
|
+
<p>
|
|
186
|
+
Copy the address exactly from Hostinger or your VPS provider.
|
|
187
|
+
Your password is used only for this live SSH connection and is
|
|
188
|
+
never saved.
|
|
189
|
+
</p>
|
|
190
|
+
</header>
|
|
191
|
+
|
|
192
|
+
<form id="vps-form">
|
|
193
|
+
<section class="field-grid">
|
|
194
|
+
<label class="field">
|
|
195
|
+
<span>VPS address</span>
|
|
196
|
+
<input
|
|
197
|
+
id="host"
|
|
198
|
+
name="host"
|
|
199
|
+
inputmode="url"
|
|
200
|
+
autocomplete="off"
|
|
201
|
+
placeholder="your-vps-ip-or-hostname"
|
|
202
|
+
required
|
|
203
|
+
/>
|
|
204
|
+
<small>Use the full IP address. Do not add <code>ssh root@</code>.</small>
|
|
205
|
+
</label>
|
|
206
|
+
|
|
207
|
+
<label class="field compact">
|
|
208
|
+
<span>SSH port</span>
|
|
209
|
+
<input
|
|
210
|
+
id="port"
|
|
211
|
+
name="port"
|
|
212
|
+
type="number"
|
|
213
|
+
min="1"
|
|
214
|
+
max="65535"
|
|
215
|
+
value="22"
|
|
216
|
+
required
|
|
217
|
+
/>
|
|
218
|
+
</label>
|
|
219
|
+
|
|
220
|
+
<label class="field compact">
|
|
221
|
+
<span>Username</span>
|
|
222
|
+
<input
|
|
223
|
+
id="username"
|
|
224
|
+
name="username"
|
|
225
|
+
autocomplete="username"
|
|
226
|
+
value="root"
|
|
227
|
+
required
|
|
228
|
+
/>
|
|
229
|
+
<small>The guided setup currently expects the VPS root account.</small>
|
|
230
|
+
</label>
|
|
231
|
+
|
|
232
|
+
<label class="field">
|
|
233
|
+
<span>VPS password</span>
|
|
234
|
+
<input
|
|
235
|
+
id="password"
|
|
236
|
+
name="password"
|
|
237
|
+
type="password"
|
|
238
|
+
autocomplete="current-password"
|
|
239
|
+
disabled
|
|
240
|
+
required
|
|
241
|
+
/>
|
|
242
|
+
<small>
|
|
243
|
+
This unlocks after host confirmation, then clears as soon
|
|
244
|
+
as the connection attempt finishes.
|
|
245
|
+
</small>
|
|
246
|
+
</label>
|
|
247
|
+
</section>
|
|
248
|
+
|
|
249
|
+
<button id="fingerprint-button" class="button secondary" type="button">
|
|
250
|
+
Check server identity
|
|
251
|
+
</button>
|
|
255
252
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
<
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
<
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
253
|
+
<section id="fingerprint-box" class="fingerprint" hidden>
|
|
254
|
+
<span>SSH fingerprint</span>
|
|
255
|
+
<code id="fingerprint-value"></code>
|
|
256
|
+
<label class="check-row">
|
|
257
|
+
<input id="fingerprint-confirm" type="checkbox" />
|
|
258
|
+
<span>
|
|
259
|
+
This is the VPS I intended to connect to. I checked the
|
|
260
|
+
address carefully.
|
|
261
|
+
</span>
|
|
262
|
+
</label>
|
|
263
|
+
</section>
|
|
264
|
+
|
|
265
|
+
<footer class="actions">
|
|
266
|
+
<button class="button ghost back-button" data-back="1" type="button">
|
|
267
|
+
Back
|
|
268
|
+
</button>
|
|
269
|
+
<button id="connect-button" class="button primary" type="submit" disabled>
|
|
270
|
+
Connect and inspect Docker
|
|
271
|
+
</button>
|
|
272
|
+
</footer>
|
|
273
|
+
</form>
|
|
276
274
|
</section>
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
<
|
|
280
|
-
<
|
|
281
|
-
<
|
|
282
|
-
<
|
|
283
|
-
|
|
284
|
-
|
|
275
|
+
|
|
276
|
+
<section class="panel" data-step="3" aria-labelledby="n8n-title" hidden>
|
|
277
|
+
<header class="panel-heading">
|
|
278
|
+
<h2 id="n8n-title" tabindex="-1">Choose the detected n8n route</h2>
|
|
279
|
+
<span>Gate 3 of 5</span>
|
|
280
|
+
<p>
|
|
281
|
+
Discovery uses read-only Docker commands and does not execute
|
|
282
|
+
anything inside n8n.
|
|
283
|
+
</p>
|
|
284
|
+
</header>
|
|
285
|
+
|
|
286
|
+
<section class="version-strip" aria-label="Detected Docker versions">
|
|
287
|
+
<span>Docker <strong id="docker-version">Pending</strong></span>
|
|
288
|
+
<span>Compose <strong id="compose-version">Pending</strong></span>
|
|
289
|
+
</section>
|
|
290
|
+
|
|
291
|
+
<section class="field-grid single">
|
|
292
|
+
<label class="field">
|
|
293
|
+
<span>Running n8n container</span>
|
|
294
|
+
<select id="container-select"></select>
|
|
295
|
+
</label>
|
|
296
|
+
|
|
297
|
+
<label class="field">
|
|
298
|
+
<span>Shared Docker network</span>
|
|
299
|
+
<select id="network-select"></select>
|
|
300
|
+
<small>The sidecar joins this network. n8n itself is not changed.</small>
|
|
301
|
+
</label>
|
|
302
|
+
</section>
|
|
303
|
+
|
|
304
|
+
<footer class="actions">
|
|
305
|
+
<button class="button ghost back-button" data-back="2" type="button">
|
|
306
|
+
Back
|
|
307
|
+
</button>
|
|
308
|
+
<button id="review-button" class="button primary" type="button">
|
|
309
|
+
Review the exact plan
|
|
310
|
+
</button>
|
|
311
|
+
</footer>
|
|
285
312
|
</section>
|
|
286
|
-
</div>
|
|
287
313
|
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
314
|
+
<section class="panel" data-step="4" aria-labelledby="review-title" hidden>
|
|
315
|
+
<header class="panel-heading">
|
|
316
|
+
<h2 id="review-title" tabindex="-1">Review every remote write</h2>
|
|
317
|
+
<span>Gate 4 of 5</span>
|
|
318
|
+
<p>The VPS has not changed. Confirm the sidecar-only plan below.</p>
|
|
319
|
+
</header>
|
|
320
|
+
|
|
321
|
+
<section class="review-grid">
|
|
322
|
+
<section aria-labelledby="will-title">
|
|
323
|
+
<h3 id="will-title">The wizard will</h3>
|
|
324
|
+
<ul class="check-list">
|
|
325
|
+
<li>Create or update <code>/docker/n8n-openai-oauth</code></li>
|
|
326
|
+
<li>Build and start only the <code>openai-oauth</code> sidecar</li>
|
|
327
|
+
<li>Attach the sidecar to <strong id="review-network">Pending</strong></li>
|
|
328
|
+
<li>
|
|
329
|
+
Use the private hostname
|
|
330
|
+
<code id="review-endpoint">n8n-openai-oauth</code>
|
|
331
|
+
</li>
|
|
332
|
+
<li>Upload the OAuth file with owner-only permissions</li>
|
|
333
|
+
</ul>
|
|
334
|
+
</section>
|
|
335
|
+
<section aria-labelledby="wont-title">
|
|
336
|
+
<h3 id="wont-title">The wizard will not</h3>
|
|
337
|
+
<ul class="no-list">
|
|
338
|
+
<li>Edit or rebuild the n8n image</li>
|
|
339
|
+
<li>Stop, restart, or recreate n8n</li>
|
|
340
|
+
<li>Publish port <code>10531</code></li>
|
|
341
|
+
<li>Create a Traefik route</li>
|
|
342
|
+
</ul>
|
|
343
|
+
</section>
|
|
344
|
+
</section>
|
|
345
|
+
|
|
346
|
+
<label class="check-row approval">
|
|
347
|
+
<input id="install-confirm" type="checkbox" />
|
|
348
|
+
<span>
|
|
349
|
+
I approve this sidecar-only installation and understand
|
|
350
|
+
<code>openai-oauth</code> is an unofficial project.
|
|
351
|
+
</span>
|
|
352
|
+
</label>
|
|
305
353
|
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
<span class="step-kicker">Step 5 of 5</span>
|
|
310
|
-
<h2 id="done-title" tabindex="-1">The private bridge is ready</h2>
|
|
311
|
-
<p>
|
|
312
|
-
Copy the OpenAI credential values first, then use one of the node
|
|
313
|
-
recipes below.
|
|
314
|
-
</p>
|
|
315
|
-
</div>
|
|
316
|
-
|
|
317
|
-
<h3>1. OpenAI credential</h3>
|
|
318
|
-
<dl class="result-list">
|
|
319
|
-
<div>
|
|
320
|
-
<dt>Base URL</dt>
|
|
321
|
-
<dd class="result-value">
|
|
322
|
-
<code id="result-url">http://n8n-openai-oauth:10531/v1</code>
|
|
323
|
-
<button
|
|
324
|
-
class="button secondary copy-value"
|
|
325
|
-
type="button"
|
|
326
|
-
data-copy-target="result-url"
|
|
327
|
-
data-copy-label="Base URL"
|
|
328
|
-
aria-label="Copy Base URL"
|
|
329
|
-
>
|
|
330
|
-
Copy
|
|
354
|
+
<footer class="actions">
|
|
355
|
+
<button class="button ghost back-button" data-back="3" type="button">
|
|
356
|
+
Back
|
|
331
357
|
</button>
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
<div>
|
|
335
|
-
<dt>API key</dt>
|
|
336
|
-
<dd class="result-value">
|
|
337
|
-
<code id="result-key">local-only</code>
|
|
338
|
-
<button
|
|
339
|
-
class="button secondary copy-value"
|
|
340
|
-
type="button"
|
|
341
|
-
data-copy-target="result-key"
|
|
342
|
-
data-copy-label="API key"
|
|
343
|
-
aria-label="Copy API key"
|
|
344
|
-
>
|
|
345
|
-
Copy
|
|
358
|
+
<button id="install-button" class="button primary" type="button" disabled>
|
|
359
|
+
Install the sidecar
|
|
346
360
|
</button>
|
|
347
|
-
</
|
|
348
|
-
</
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
<
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
<
|
|
402
|
-
|
|
403
|
-
<
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
<
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
361
|
+
</footer>
|
|
362
|
+
</section>
|
|
363
|
+
|
|
364
|
+
<section class="panel success-panel" data-step="5" aria-labelledby="done-title" hidden>
|
|
365
|
+
<svg
|
|
366
|
+
class="success-mark"
|
|
367
|
+
viewBox="0 0 32 32"
|
|
368
|
+
aria-hidden="true"
|
|
369
|
+
focusable="false"
|
|
370
|
+
>
|
|
371
|
+
<circle cx="16" cy="16" r="14"></circle>
|
|
372
|
+
<path d="m9.5 16.5 4 4 9-10"></path>
|
|
373
|
+
</svg>
|
|
374
|
+
<header class="panel-heading">
|
|
375
|
+
<h2 id="done-title" tabindex="-1">The private route is ready</h2>
|
|
376
|
+
<span>Gate 5 of 5</span>
|
|
377
|
+
<p>
|
|
378
|
+
Copy the OpenAI credential values first, then use the node
|
|
379
|
+
recipe that matches your n8n workflow.
|
|
380
|
+
</p>
|
|
381
|
+
</header>
|
|
382
|
+
|
|
383
|
+
<h3>1. OpenAI credential</h3>
|
|
384
|
+
<dl class="result-list">
|
|
385
|
+
<div>
|
|
386
|
+
<dt>Base URL</dt>
|
|
387
|
+
<dd class="result-value">
|
|
388
|
+
<code id="result-url">http://n8n-openai-oauth:10531/v1</code>
|
|
389
|
+
<button
|
|
390
|
+
class="button secondary copy-value"
|
|
391
|
+
type="button"
|
|
392
|
+
data-copy-target="result-url"
|
|
393
|
+
data-copy-label="Base URL"
|
|
394
|
+
aria-label="Copy Base URL"
|
|
395
|
+
>
|
|
396
|
+
Copy
|
|
397
|
+
</button>
|
|
398
|
+
</dd>
|
|
399
|
+
</div>
|
|
400
|
+
<div>
|
|
401
|
+
<dt>API key</dt>
|
|
402
|
+
<dd class="result-value">
|
|
403
|
+
<code id="result-key">local-only</code>
|
|
404
|
+
<button
|
|
405
|
+
class="button secondary copy-value"
|
|
406
|
+
type="button"
|
|
407
|
+
data-copy-target="result-key"
|
|
408
|
+
data-copy-label="API key"
|
|
409
|
+
aria-label="Copy API key"
|
|
410
|
+
>
|
|
411
|
+
Copy
|
|
412
|
+
</button>
|
|
413
|
+
</dd>
|
|
414
|
+
</div>
|
|
415
|
+
<div>
|
|
416
|
+
<dt>Organization ID</dt>
|
|
417
|
+
<dd>Leave empty</dd>
|
|
418
|
+
</div>
|
|
419
|
+
<div>
|
|
420
|
+
<dt>Custom header</dt>
|
|
421
|
+
<dd><strong>Off</strong></dd>
|
|
422
|
+
</div>
|
|
423
|
+
</dl>
|
|
424
|
+
|
|
425
|
+
<button id="copy-settings" class="button secondary" type="button">
|
|
426
|
+
Copy credential settings
|
|
427
|
+
</button>
|
|
428
|
+
|
|
429
|
+
<section class="model-box">
|
|
430
|
+
<h3>2. OpenAI Chat Model: AI Agent or Basic LLM Chain</h3>
|
|
431
|
+
<dl class="result-list">
|
|
432
|
+
<div>
|
|
433
|
+
<dt>Model ID</dt>
|
|
434
|
+
<dd class="result-value">
|
|
435
|
+
<code id="result-model">Pending</code>
|
|
436
|
+
<button
|
|
437
|
+
class="button secondary copy-value"
|
|
438
|
+
type="button"
|
|
439
|
+
data-copy-target="result-model"
|
|
440
|
+
data-copy-label="model ID"
|
|
441
|
+
aria-label="Copy model ID"
|
|
442
|
+
>
|
|
443
|
+
Copy
|
|
444
|
+
</button>
|
|
445
|
+
</dd>
|
|
446
|
+
</div>
|
|
447
|
+
<div>
|
|
448
|
+
<dt>Responses API</dt>
|
|
449
|
+
<dd><strong>On</strong> for Chat Model node version 1.3</dd>
|
|
450
|
+
</div>
|
|
451
|
+
</dl>
|
|
452
|
+
<p>All models detected: <span id="result-models">Pending</span></p>
|
|
453
|
+
<p>
|
|
454
|
+
If the Responses API switch is absent, keep the node's default
|
|
455
|
+
Chat Completions behavior. The bridge supports that route too.
|
|
456
|
+
</p>
|
|
457
|
+
</section>
|
|
458
|
+
|
|
459
|
+
<section class="model-box">
|
|
460
|
+
<h3>3. HTTP Request node</h3>
|
|
461
|
+
<dl class="result-list">
|
|
462
|
+
<div>
|
|
463
|
+
<dt>Method</dt>
|
|
464
|
+
<dd><code>POST</code></dd>
|
|
465
|
+
</div>
|
|
466
|
+
<div>
|
|
467
|
+
<dt>URL</dt>
|
|
468
|
+
<dd class="result-value">
|
|
469
|
+
<code id="result-http-url">http://n8n-openai-oauth:10531/v1/responses</code>
|
|
470
|
+
<button
|
|
471
|
+
class="button secondary copy-value"
|
|
472
|
+
type="button"
|
|
473
|
+
data-copy-target="result-http-url"
|
|
474
|
+
data-copy-label="HTTP endpoint"
|
|
475
|
+
aria-label="Copy HTTP endpoint"
|
|
476
|
+
>
|
|
477
|
+
Copy
|
|
478
|
+
</button>
|
|
479
|
+
</dd>
|
|
480
|
+
</div>
|
|
481
|
+
<div>
|
|
482
|
+
<dt>Authentication</dt>
|
|
483
|
+
<dd>None</dd>
|
|
484
|
+
</div>
|
|
485
|
+
</dl>
|
|
486
|
+
</section>
|
|
487
|
+
|
|
488
|
+
<p class="final-note">
|
|
489
|
+
The README includes complete AI Agent, Basic LLM Chain, JSON, and
|
|
490
|
+
importable cURL examples. Start with no built-in tools. You can
|
|
491
|
+
now return to Terminal and press Control+C to close this local
|
|
492
|
+
wizard; the VPS sidecar will keep running.
|
|
493
|
+
</p>
|
|
494
|
+
</section>
|
|
495
|
+
</section>
|
|
430
496
|
</section>
|
|
431
497
|
</main>
|
|
432
498
|
|
|
433
|
-
<footer>
|
|
499
|
+
<footer class="site-footer">
|
|
434
500
|
<p>
|
|
435
501
|
Personal and experimental use only. Keep your OAuth credential private
|
|
436
|
-
and follow OpenAI
|
|
502
|
+
and follow OpenAI's terms and usage policies.
|
|
437
503
|
</p>
|
|
438
504
|
</footer>
|
|
439
505
|
</body>
|