A bunch of documentation updates
This commit is contained in:
@@ -131,38 +131,12 @@
|
||||
</div>
|
||||
<div class="cm-header-nav__links">
|
||||
<div class="cm-header-nav__links-inner">
|
||||
<a href="#" data-path="/home" class="cm-header-nav__link" data-nav-id="home"><span class="material-icons-outlined">home</span><span class="cm-header-nav__label">Home</span></a>
|
||||
<a href="#" data-path="/" class="cm-header-nav__link" data-nav-id="home" target="_blank" rel="noopener noreferrer"><span class="material-icons-outlined">home</span><span class="cm-header-nav__label">Home</span></a>
|
||||
<a href="#" data-path="/campaigns" class="cm-header-nav__link" data-nav-id="campaigns"><span class="material-icons-outlined">send</span><span class="cm-header-nav__label">Campaigns</span></a>
|
||||
<a href="#" data-path="/map" class="cm-header-nav__link" data-nav-id="map"><span class="material-icons-outlined">place</span><span class="cm-header-nav__label">Map</span></a>
|
||||
<div class="cm-header-nav__dropdown">
|
||||
<span class="cm-header-nav__link cm-header-nav__dropdown-trigger">
|
||||
<span class="material-icons-outlined">apps</span>
|
||||
<span class="cm-header-nav__label">Scheduling</span>
|
||||
<span class="material-icons-outlined cm-header-nav__chevron">expand_more</span>
|
||||
</span>
|
||||
<div class="cm-header-nav__dropdown-menu">
|
||||
<a href="#" data-path="/shifts" class="cm-header-nav__dropdown-item" data-nav-id="shifts"><span class="material-icons-outlined">schedule</span><span>Shifts</span></a>
|
||||
<a href="#" data-path="/events" class="cm-header-nav__dropdown-item" data-nav-id="events"><span class="material-icons-outlined">event</span><span>Calendar</span></a>
|
||||
<a href="#" data-path="/polls" class="cm-header-nav__dropdown-item" data-nav-id="polls"><span class="material-icons-outlined">bar_chart</span><span>Polls</span></a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="#" data-path="/gallery" class="cm-header-nav__link" data-nav-id="gallery"><span class="material-icons-outlined">play_circle</span><span class="cm-header-nav__label">Gallery</span></a>
|
||||
<div class="cm-header-nav__dropdown">
|
||||
<span class="cm-header-nav__link cm-header-nav__dropdown-trigger">
|
||||
<span class="material-icons-outlined">account_balance_wallet</span>
|
||||
<span class="cm-header-nav__label">Commerce</span>
|
||||
<span class="material-icons-outlined cm-header-nav__chevron">expand_more</span>
|
||||
</span>
|
||||
<div class="cm-header-nav__dropdown-menu">
|
||||
<a href="#" data-path="/pricing" class="cm-header-nav__dropdown-item" data-nav-id="pricing"><span class="material-icons-outlined">attach_money</span><span>Pricing</span></a>
|
||||
<a href="#" data-path="/shop" class="cm-header-nav__dropdown-item" data-nav-id="shop"><span class="material-icons-outlined">shopping_bag</span><span>Shop</span></a>
|
||||
<a href="#" data-path="/donate" class="cm-header-nav__dropdown-item" data-nav-id="donate"><span class="material-icons-outlined">favorite_border</span><span>Donate</span></a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="#" data-path="/wall-of-fame" class="cm-header-nav__link" data-nav-id="wall-of-fame"><span class="material-icons-outlined">emoji_events</span><span class="cm-header-nav__label">Wall of Fame</span></a>
|
||||
<a href="#" data-path="/pages" class="cm-header-nav__link" data-nav-id="pages"><span class="material-icons-outlined">description</span><span class="cm-header-nav__label">Pages</span></a>
|
||||
<a href="/" class="cm-header-nav__link" data-nav-id="landing"><span class="material-icons-outlined">language</span><span class="cm-header-nav__label">Website</span></a>
|
||||
<a href="/docs/" class="cm-header-nav__link" data-nav-id="docs"><span class="material-icons-outlined">menu_book</span><span class="cm-header-nav__label">Docs</span></a>
|
||||
<a href="#" data-path="/events" class="cm-header-nav__link" data-nav-id="events" target="_blank" rel="noopener noreferrer"><span class="material-icons-outlined">event</span><span class="cm-header-nav__label">Events</span></a>
|
||||
<a href="#" data-path="/pricing" class="cm-header-nav__link" data-nav-id="pricing"><span class="material-icons-outlined">attach_money</span><span class="cm-header-nav__label">Pricing</span></a>
|
||||
<a href="#" data-path="/shop" class="cm-header-nav__link" data-nav-id="shop"><span class="material-icons-outlined">shopping_bag</span><span class="cm-header-nav__label">Shop</span></a>
|
||||
<a href="#" data-path="/donate" class="cm-header-nav__link" data-nav-id="donate"><span class="material-icons-outlined">favorite_border</span><span class="cm-header-nav__label">Donate</span></a>
|
||||
<label for="__search" class="cm-header-nav__utility" title="Search">
|
||||
<span class="material-icons-outlined">search</span>
|
||||
</label>
|
||||
@@ -213,38 +187,12 @@
|
||||
<span>Docs Navigation</span>
|
||||
</button>
|
||||
<div class="cm-header-nav__mobile-divider"></div>
|
||||
<a href="#" data-path="/home" class="cm-header-nav__mobile-link" data-nav-id="home"><span class="material-icons-outlined">home</span><span>Home</span></a>
|
||||
<a href="#" data-path="/" class="cm-header-nav__mobile-link" data-nav-id="home" target="_blank" rel="noopener noreferrer"><span class="material-icons-outlined">home</span><span>Home</span></a>
|
||||
<a href="#" data-path="/campaigns" class="cm-header-nav__mobile-link" data-nav-id="campaigns"><span class="material-icons-outlined">send</span><span>Campaigns</span></a>
|
||||
<a href="#" data-path="/map" class="cm-header-nav__mobile-link" data-nav-id="map"><span class="material-icons-outlined">place</span><span>Map</span></a>
|
||||
<div class="cm-header-nav__mobile-group" data-group-id="scheduling">
|
||||
<span class="cm-header-nav__mobile-link cm-header-nav__mobile-group-trigger" role="button">
|
||||
<span class="material-icons-outlined">apps</span>
|
||||
<span style="flex:1">Scheduling</span>
|
||||
<span class="material-icons-outlined cm-header-nav__mobile-chevron">expand_more</span>
|
||||
</span>
|
||||
<div class="cm-header-nav__mobile-group-children">
|
||||
<a href="#" data-path="/shifts" class="cm-header-nav__mobile-link" data-nav-id="shifts" style="padding-left:48px"><span class="material-icons-outlined">schedule</span><span>Shifts</span></a>
|
||||
<a href="#" data-path="/events" class="cm-header-nav__mobile-link" data-nav-id="events" style="padding-left:48px"><span class="material-icons-outlined">event</span><span>Calendar</span></a>
|
||||
<a href="#" data-path="/polls" class="cm-header-nav__mobile-link" data-nav-id="polls" style="padding-left:48px"><span class="material-icons-outlined">bar_chart</span><span>Polls</span></a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="#" data-path="/gallery" class="cm-header-nav__mobile-link" data-nav-id="gallery"><span class="material-icons-outlined">play_circle</span><span>Gallery</span></a>
|
||||
<div class="cm-header-nav__mobile-group" data-group-id="commerce">
|
||||
<span class="cm-header-nav__mobile-link cm-header-nav__mobile-group-trigger" role="button">
|
||||
<span class="material-icons-outlined">account_balance_wallet</span>
|
||||
<span style="flex:1">Commerce</span>
|
||||
<span class="material-icons-outlined cm-header-nav__mobile-chevron">expand_more</span>
|
||||
</span>
|
||||
<div class="cm-header-nav__mobile-group-children">
|
||||
<a href="#" data-path="/pricing" class="cm-header-nav__mobile-link" data-nav-id="pricing" style="padding-left:48px"><span class="material-icons-outlined">attach_money</span><span>Pricing</span></a>
|
||||
<a href="#" data-path="/shop" class="cm-header-nav__mobile-link" data-nav-id="shop" style="padding-left:48px"><span class="material-icons-outlined">shopping_bag</span><span>Shop</span></a>
|
||||
<a href="#" data-path="/donate" class="cm-header-nav__mobile-link" data-nav-id="donate" style="padding-left:48px"><span class="material-icons-outlined">favorite_border</span><span>Donate</span></a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="#" data-path="/wall-of-fame" class="cm-header-nav__mobile-link" data-nav-id="wall-of-fame"><span class="material-icons-outlined">emoji_events</span><span>Wall of Fame</span></a>
|
||||
<a href="#" data-path="/pages" class="cm-header-nav__mobile-link" data-nav-id="pages"><span class="material-icons-outlined">description</span><span>Pages</span></a>
|
||||
<a href="/" class="cm-header-nav__mobile-link" data-nav-id="landing"><span class="material-icons-outlined">language</span><span>Website</span></a>
|
||||
<a href="/docs/" class="cm-header-nav__mobile-link" data-nav-id="docs"><span class="material-icons-outlined">menu_book</span><span>Docs</span></a>
|
||||
<a href="#" data-path="/events" class="cm-header-nav__mobile-link" data-nav-id="events" target="_blank" rel="noopener noreferrer"><span class="material-icons-outlined">event</span><span>Events</span></a>
|
||||
<a href="#" data-path="/pricing" class="cm-header-nav__mobile-link" data-nav-id="pricing"><span class="material-icons-outlined">attach_money</span><span>Pricing</span></a>
|
||||
<a href="#" data-path="/shop" class="cm-header-nav__mobile-link" data-nav-id="shop"><span class="material-icons-outlined">shopping_bag</span><span>Shop</span></a>
|
||||
<a href="#" data-path="/donate" class="cm-header-nav__mobile-link" data-nav-id="donate"><span class="material-icons-outlined">favorite_border</span><span>Donate</span></a>
|
||||
<div class="cm-header-nav__mobile-divider"></div>
|
||||
<a href="#" data-path="/login" class="cm-header-nav__mobile-link" id="cm-mobile-signin-link">
|
||||
<span class="material-icons-outlined">login</span>
|
||||
@@ -1477,6 +1425,23 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="One-Line Install">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#installer-flags" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
Installer Flags
|
||||
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
@@ -1747,6 +1712,34 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="Verifying Installation">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#manual-checks" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
Manual checks
|
||||
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#clean-reset-before-reinstall" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
Clean reset before reinstall
|
||||
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
@@ -2640,6 +2633,23 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="One-Line Install">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#installer-flags" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
Installer Flags
|
||||
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
@@ -2910,6 +2920,34 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="Verifying Installation">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#manual-checks" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
Manual checks
|
||||
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#clean-reset-before-reinstall" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
Clean reset before reinstall
|
||||
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
@@ -3103,19 +3141,48 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
||||
<p>This script:</p>
|
||||
<ol>
|
||||
<li>Checks prerequisites (Docker, Docker Compose, OpenSSL)</li>
|
||||
<li><strong>Checks host port availability</strong> — aborts early if any of the ~14 required ports (3000, 4000, 9090, 3030, etc.) are already in use. Prints culprit-specific hints (e.g. cockpit.socket on :9090)</li>
|
||||
<li>Verifies at least 10 GB free disk</li>
|
||||
<li>Downloads the latest release package from Gitea</li>
|
||||
<li>Extracts to <code>~/changemaker.lite/</code></li>
|
||||
<li>Launches the configuration wizard (<code>config.sh</code>)</li>
|
||||
</ol>
|
||||
<p>After the wizard completes, start everything with <code>docker compose up -d</code>.</p>
|
||||
<p>After the wizard completes, start everything with <code>docker compose up -d</code>, then verify with <code>bash scripts/test-deployment.sh --wait 60</code>.</p>
|
||||
<h4 id="installer-flags">Installer Flags<a class="headerlink" href="#installer-flags" title="Permanent link">¶</a></h4>
|
||||
<p>The installer accepts a few options for non-default setups. Download the script first, inspect it, then run with flags:</p>
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-4-1"><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a>curl<span class="w"> </span>-fsSLO<span class="w"> </span>https://gitea.bnkops.com/admin/changemaker.lite/raw/branch/main/scripts/install.sh
|
||||
</span><span id="__span-4-2"><a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a>bash<span class="w"> </span>install.sh<span class="w"> </span>--help
|
||||
</span></code></pre></div>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Flag</th>
|
||||
<th>Purpose</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>--dir DIR</code></td>
|
||||
<td>Install into a directory other than <code>~/changemaker.lite</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--version TAG</code></td>
|
||||
<td>Pin a specific release (e.g. <code>v2.9.10</code>) instead of latest</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--tarball FILE</code></td>
|
||||
<td>Use a local tarball — skip the Gitea download entirely</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3 id="manual-download">Manual Download<a class="headerlink" href="#manual-download" title="Permanent link">¶</a></h3>
|
||||
<p>If you prefer not to pipe to bash:</p>
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-4-1"><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="c1"># Download latest release</span>
|
||||
</span><span id="__span-4-2"><a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a>curl<span class="w"> </span>-LO<span class="w"> </span>https://gitea.bnkops.com/admin/changemaker.lite/releases/latest/download/changemaker-lite-latest.tar.gz
|
||||
</span><span id="__span-4-3"><a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a>tar<span class="w"> </span>xzf<span class="w"> </span>changemaker-lite-latest.tar.gz
|
||||
</span><span id="__span-4-4"><a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a><span class="nb">cd</span><span class="w"> </span>changemaker-lite
|
||||
</span><span id="__span-4-5"><a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a>bash<span class="w"> </span>config.sh
|
||||
</span><span id="__span-4-6"><a id="__codelineno-4-6" name="__codelineno-4-6" href="#__codelineno-4-6"></a>docker<span class="w"> </span>compose<span class="w"> </span>up<span class="w"> </span>-d
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-5-1"><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="c1"># Download latest release</span>
|
||||
</span><span id="__span-5-2"><a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a>curl<span class="w"> </span>-LO<span class="w"> </span>https://gitea.bnkops.com/admin/changemaker.lite/releases/latest/download/changemaker-lite-latest.tar.gz
|
||||
</span><span id="__span-5-3"><a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a>tar<span class="w"> </span>xzf<span class="w"> </span>changemaker-lite-latest.tar.gz
|
||||
</span><span id="__span-5-4"><a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a><span class="nb">cd</span><span class="w"> </span>changemaker-lite
|
||||
</span><span id="__span-5-5"><a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a>bash<span class="w"> </span>config.sh
|
||||
</span><span id="__span-5-6"><a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a>docker<span class="w"> </span>compose<span class="w"> </span>up<span class="w"> </span>-d
|
||||
</span></code></pre></div>
|
||||
<h3 id="whats-different-from-source-install">What's Different from Source Install<a class="headerlink" href="#whats-different-from-source-install" title="Permanent link">¶</a></h3>
|
||||
<table>
|
||||
@@ -3130,7 +3197,7 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {
|
||||
<tr>
|
||||
<td><strong>Download size</strong></td>
|
||||
<td>~200 MB (full repo)</td>
|
||||
<td>~2 MB (config + scripts)</td>
|
||||
<td>~15 MB (config, compose, MkDocs content)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>First startup</strong></td>
|
||||
@@ -3247,6 +3314,10 @@ Use <strong>source install</strong> when you want to modify the platform code or
|
||||
<li>At least one <strong>digit</strong></li>
|
||||
<li>Requires password confirmation</li>
|
||||
</ul>
|
||||
<div class="admonition info">
|
||||
<p class="admonition-title">Non-interactive password</p>
|
||||
<p>If you run with <code>-y</code> and omit <code>--admin-password</code>, the wizard generates a strong password and <strong>also writes it to <code>data/admin-credentials.txt</code> with mode 0600</strong>. Retrieve it with <code>cat ~/changemaker.lite/data/admin-credentials.txt</code>, then delete the file once saved elsewhere (e.g. Vaultwarden). Explicit <code>--admin-password</code> is never persisted to disk by <code>config.sh</code>.</p>
|
||||
</div>
|
||||
<h3 id="step-5-secret-generation">Step 5: Secret Generation<a class="headerlink" href="#step-5-secret-generation" title="Permanent link">¶</a></h3>
|
||||
<p>Auto-generates <strong>21 unique secrets</strong> — no placeholder passwords remain after this step:</p>
|
||||
<table>
|
||||
@@ -3389,7 +3460,7 @@ Use <strong>source install</strong> when you want to modify the platform code or
|
||||
<p>Complete tunnel setup is done from the admin GUI at <strong>Settings > Tunnel</strong> after services are running.</p>
|
||||
<h3 id="step-9-cors-origins">Step 9: CORS Origins<a class="headerlink" href="#step-9-cors-origins" title="Permanent link">¶</a></h3>
|
||||
<p>Automatically calculates allowed origins from your domain:</p>
|
||||
<div class="language-text highlight"><pre><span></span><code><span id="__span-5-1"><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a>http://app.DOMAIN,https://app.DOMAIN,http://DOMAIN,https://DOMAIN,http://localhost:3000,http://localhost,http://localhost:4003
|
||||
<div class="language-text highlight"><pre><span></span><code><span id="__span-6-1"><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a>http://app.DOMAIN,https://app.DOMAIN,http://DOMAIN,https://DOMAIN,http://localhost:3000,http://localhost,http://localhost:4003
|
||||
</span></code></pre></div>
|
||||
<h3 id="step-10-nginx-config-generation">Step 10: Nginx Config Generation<a class="headerlink" href="#step-10-nginx-config-generation" title="Permanent link">¶</a></h3>
|
||||
<p>Renders all <code>.conf.template</code> files in <code>nginx/conf.d/</code> by substituting <code>${DOMAIN}</code> with your configured domain. This produces the nginx configuration files that handle subdomain routing.</p>
|
||||
@@ -3504,20 +3575,20 @@ Use <strong>source install</strong> when you want to modify the platform code or
|
||||
<hr />
|
||||
<h2 id="manual-setup-alternative">Manual Setup (Alternative)<a class="headerlink" href="#manual-setup-alternative" title="Permanent link">¶</a></h2>
|
||||
<p>If you prefer to configure by hand instead of using the wizard:</p>
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-6-1"><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a>cp<span class="w"> </span>.env.example<span class="w"> </span>.env
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-7-1"><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a>cp<span class="w"> </span>.env.example<span class="w"> </span>.env
|
||||
</span></code></pre></div>
|
||||
<p>At minimum, set these required secrets:</p>
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-7-1"><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a><span class="c1"># Generate cryptographic secrets</span>
|
||||
</span><span id="__span-7-2"><a id="__codelineno-7-2" name="__codelineno-7-2" href="#__codelineno-7-2"></a><span class="nv">V2_POSTGRES_PASSWORD</span><span class="o">=</span><span class="k">$(</span>openssl<span class="w"> </span>rand<span class="w"> </span>-base64<span class="w"> </span><span class="m">48</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>tr<span class="w"> </span>-dc<span class="w"> </span><span class="s1">'a-zA-Z0-9'</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>head<span class="w"> </span>-c<span class="w"> </span><span class="m">24</span><span class="k">)</span>
|
||||
</span><span id="__span-7-3"><a id="__codelineno-7-3" name="__codelineno-7-3" href="#__codelineno-7-3"></a><span class="nv">REDIS_PASSWORD</span><span class="o">=</span><span class="k">$(</span>openssl<span class="w"> </span>rand<span class="w"> </span>-base64<span class="w"> </span><span class="m">48</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>tr<span class="w"> </span>-dc<span class="w"> </span><span class="s1">'a-zA-Z0-9'</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>head<span class="w"> </span>-c<span class="w"> </span><span class="m">24</span><span class="k">)</span>
|
||||
</span><span id="__span-7-4"><a id="__codelineno-7-4" name="__codelineno-7-4" href="#__codelineno-7-4"></a><span class="nv">JWT_ACCESS_SECRET</span><span class="o">=</span><span class="k">$(</span>openssl<span class="w"> </span>rand<span class="w"> </span>-hex<span class="w"> </span><span class="m">32</span><span class="k">)</span>
|
||||
</span><span id="__span-7-5"><a id="__codelineno-7-5" name="__codelineno-7-5" href="#__codelineno-7-5"></a><span class="nv">JWT_REFRESH_SECRET</span><span class="o">=</span><span class="k">$(</span>openssl<span class="w"> </span>rand<span class="w"> </span>-hex<span class="w"> </span><span class="m">32</span><span class="k">)</span>
|
||||
</span><span id="__span-7-6"><a id="__codelineno-7-6" name="__codelineno-7-6" href="#__codelineno-7-6"></a><span class="nv">JWT_INVITE_SECRET</span><span class="o">=</span><span class="k">$(</span>openssl<span class="w"> </span>rand<span class="w"> </span>-hex<span class="w"> </span><span class="m">32</span><span class="k">)</span>
|
||||
</span><span id="__span-7-7"><a id="__codelineno-7-7" name="__codelineno-7-7" href="#__codelineno-7-7"></a><span class="nv">ENCRYPTION_KEY</span><span class="o">=</span><span class="k">$(</span>openssl<span class="w"> </span>rand<span class="w"> </span>-hex<span class="w"> </span><span class="m">32</span><span class="k">)</span><span class="w"> </span><span class="c1"># must differ from all JWT secrets</span>
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-8-1"><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a><span class="c1"># Generate cryptographic secrets</span>
|
||||
</span><span id="__span-8-2"><a id="__codelineno-8-2" name="__codelineno-8-2" href="#__codelineno-8-2"></a><span class="nv">V2_POSTGRES_PASSWORD</span><span class="o">=</span><span class="k">$(</span>openssl<span class="w"> </span>rand<span class="w"> </span>-base64<span class="w"> </span><span class="m">48</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>tr<span class="w"> </span>-dc<span class="w"> </span><span class="s1">'a-zA-Z0-9'</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>head<span class="w"> </span>-c<span class="w"> </span><span class="m">24</span><span class="k">)</span>
|
||||
</span><span id="__span-8-3"><a id="__codelineno-8-3" name="__codelineno-8-3" href="#__codelineno-8-3"></a><span class="nv">REDIS_PASSWORD</span><span class="o">=</span><span class="k">$(</span>openssl<span class="w"> </span>rand<span class="w"> </span>-base64<span class="w"> </span><span class="m">48</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>tr<span class="w"> </span>-dc<span class="w"> </span><span class="s1">'a-zA-Z0-9'</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>head<span class="w"> </span>-c<span class="w"> </span><span class="m">24</span><span class="k">)</span>
|
||||
</span><span id="__span-8-4"><a id="__codelineno-8-4" name="__codelineno-8-4" href="#__codelineno-8-4"></a><span class="nv">JWT_ACCESS_SECRET</span><span class="o">=</span><span class="k">$(</span>openssl<span class="w"> </span>rand<span class="w"> </span>-hex<span class="w"> </span><span class="m">32</span><span class="k">)</span>
|
||||
</span><span id="__span-8-5"><a id="__codelineno-8-5" name="__codelineno-8-5" href="#__codelineno-8-5"></a><span class="nv">JWT_REFRESH_SECRET</span><span class="o">=</span><span class="k">$(</span>openssl<span class="w"> </span>rand<span class="w"> </span>-hex<span class="w"> </span><span class="m">32</span><span class="k">)</span>
|
||||
</span><span id="__span-8-6"><a id="__codelineno-8-6" name="__codelineno-8-6" href="#__codelineno-8-6"></a><span class="nv">JWT_INVITE_SECRET</span><span class="o">=</span><span class="k">$(</span>openssl<span class="w"> </span>rand<span class="w"> </span>-hex<span class="w"> </span><span class="m">32</span><span class="k">)</span>
|
||||
</span><span id="__span-8-7"><a id="__codelineno-8-7" name="__codelineno-8-7" href="#__codelineno-8-7"></a><span class="nv">ENCRYPTION_KEY</span><span class="o">=</span><span class="k">$(</span>openssl<span class="w"> </span>rand<span class="w"> </span>-hex<span class="w"> </span><span class="m">32</span><span class="k">)</span><span class="w"> </span><span class="c1"># must differ from all JWT secrets</span>
|
||||
</span></code></pre></div>
|
||||
<p>Set your admin credentials (password must meet the 12+ char complexity requirement):</p>
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-8-1"><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a><span class="nv">INITIAL_ADMIN_EMAIL</span><span class="o">=</span>admin@yourdomain.org
|
||||
</span><span id="__span-8-2"><a id="__codelineno-8-2" name="__codelineno-8-2" href="#__codelineno-8-2"></a><span class="nv">INITIAL_ADMIN_PASSWORD</span><span class="o">=</span>YourStrongPassword1
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-9-1"><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a><span class="nv">INITIAL_ADMIN_EMAIL</span><span class="o">=</span>admin@yourdomain.org
|
||||
</span><span id="__span-9-2"><a id="__codelineno-9-2" name="__codelineno-9-2" href="#__codelineno-9-2"></a><span class="nv">INITIAL_ADMIN_PASSWORD</span><span class="o">=</span>YourStrongPassword1
|
||||
</span></code></pre></div>
|
||||
<p>Then configure optional sections:</p>
|
||||
<ul>
|
||||
@@ -3530,7 +3601,7 @@ Use <strong>source install</strong> when you want to modify the platform code or
|
||||
<hr />
|
||||
<h2 id="full-stack-startup">Full Stack Startup<a class="headerlink" href="#full-stack-startup" title="Permanent link">¶</a></h2>
|
||||
<p>After configuration, start the entire platform:</p>
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-9-1"><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a>docker<span class="w"> </span>compose<span class="w"> </span>up<span class="w"> </span>-d
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-10-1"><a id="__codelineno-10-1" name="__codelineno-10-1" href="#__codelineno-10-1"></a>docker<span class="w"> </span>compose<span class="w"> </span>up<span class="w"> </span>-d
|
||||
</span></code></pre></div>
|
||||
<p>That's it. Docker handles the startup order automatically:</p>
|
||||
<ol>
|
||||
@@ -3541,42 +3612,61 @@ Use <strong>source install</strong> when you want to modify the platform code or
|
||||
<li><strong>Init containers</strong> (nocodb-init, listmonk-init, etc.) run once and exit</li>
|
||||
</ol>
|
||||
<p>Watch the startup progress:</p>
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-10-1"><a id="__codelineno-10-1" name="__codelineno-10-1" href="#__codelineno-10-1"></a>docker<span class="w"> </span>compose<span class="w"> </span>logs<span class="w"> </span>-f<span class="w"> </span>api<span class="w"> </span>--tail<span class="w"> </span><span class="m">20</span>
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-11-1"><a id="__codelineno-11-1" name="__codelineno-11-1" href="#__codelineno-11-1"></a>docker<span class="w"> </span>compose<span class="w"> </span>logs<span class="w"> </span>-f<span class="w"> </span>api<span class="w"> </span>--tail<span class="w"> </span><span class="m">20</span>
|
||||
</span></code></pre></div>
|
||||
<p>Once you see <code>Starting server on port 4000</code>, open <strong>http://localhost:3000</strong> and log in.</p>
|
||||
<div class="admonition success">
|
||||
<p class="admonition-title">Quick sanity check</p>
|
||||
<p>Three commands confirm a healthy install — run them in order:</p>
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-12-1"><a id="__codelineno-12-1" name="__codelineno-12-1" href="#__codelineno-12-1"></a>docker<span class="w"> </span>compose<span class="w"> </span>ps<span class="w"> </span><span class="c1"># all core containers healthy?</span>
|
||||
</span><span id="__span-12-2"><a id="__codelineno-12-2" name="__codelineno-12-2" href="#__codelineno-12-2"></a>curl<span class="w"> </span>-s<span class="w"> </span>http://localhost:4000/api/health<span class="w"> </span><span class="c1"># should return {"status":"healthy",...}</span>
|
||||
</span><span id="__span-12-3"><a id="__codelineno-12-3" name="__codelineno-12-3" href="#__codelineno-12-3"></a>bash<span class="w"> </span>scripts/test-deployment.sh<span class="w"> </span>--wait<span class="w"> </span><span class="m">60</span><span class="w"> </span><span class="c1"># end-to-end verifier</span>
|
||||
</span></code></pre></div>
|
||||
<p>If all three pass, you're done. See <a href="#verifying-installation">Verifying Installation</a> below for manual checks if anything fails.</p>
|
||||
</div>
|
||||
<h3 id="include-monitoring">Include Monitoring<a class="headerlink" href="#include-monitoring" title="Permanent link">¶</a></h3>
|
||||
<p>The monitoring stack (Prometheus, Grafana, Alertmanager) uses a Docker Compose profile and isn't included by default:</p>
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-11-1"><a id="__codelineno-11-1" name="__codelineno-11-1" href="#__codelineno-11-1"></a>docker<span class="w"> </span>compose<span class="w"> </span>--profile<span class="w"> </span>monitoring<span class="w"> </span>up<span class="w"> </span>-d
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-13-1"><a id="__codelineno-13-1" name="__codelineno-13-1" href="#__codelineno-13-1"></a>docker<span class="w"> </span>compose<span class="w"> </span>--profile<span class="w"> </span>monitoring<span class="w"> </span>up<span class="w"> </span>-d
|
||||
</span></code></pre></div>
|
||||
<h3 id="start-only-core-services">Start Only Core Services<a class="headerlink" href="#start-only-core-services" title="Permanent link">¶</a></h3>
|
||||
<p>If you prefer a minimal startup (lower resource usage):</p>
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-12-1"><a id="__codelineno-12-1" name="__codelineno-12-1" href="#__codelineno-12-1"></a>docker<span class="w"> </span>compose<span class="w"> </span>up<span class="w"> </span>-d<span class="w"> </span>v2-postgres<span class="w"> </span>redis<span class="w"> </span>api<span class="w"> </span>admin<span class="w"> </span>nginx
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-14-1"><a id="__codelineno-14-1" name="__codelineno-14-1" href="#__codelineno-14-1"></a>docker<span class="w"> </span>compose<span class="w"> </span>up<span class="w"> </span>-d<span class="w"> </span>v2-postgres<span class="w"> </span>redis<span class="w"> </span>api<span class="w"> </span>admin<span class="w"> </span>nginx
|
||||
</span></code></pre></div>
|
||||
<div class="admonition note">
|
||||
<p class="admonition-title">Manual migrations</p>
|
||||
<p>The API container runs migrations and seeding automatically on startup via its
|
||||
entrypoint script. You only need to run them manually if you're developing
|
||||
locally without Docker:</p>
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-13-1"><a id="__codelineno-13-1" name="__codelineno-13-1" href="#__codelineno-13-1"></a><span class="nb">cd</span><span class="w"> </span>api<span class="w"> </span><span class="o">&&</span><span class="w"> </span>npx<span class="w"> </span>prisma<span class="w"> </span>migrate<span class="w"> </span>deploy<span class="w"> </span><span class="o">&&</span><span class="w"> </span>npx<span class="w"> </span>prisma<span class="w"> </span>db<span class="w"> </span>seed
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-15-1"><a id="__codelineno-15-1" name="__codelineno-15-1" href="#__codelineno-15-1"></a><span class="nb">cd</span><span class="w"> </span>api<span class="w"> </span><span class="o">&&</span><span class="w"> </span>npx<span class="w"> </span>prisma<span class="w"> </span>migrate<span class="w"> </span>deploy<span class="w"> </span><span class="o">&&</span><span class="w"> </span>npx<span class="w"> </span>prisma<span class="w"> </span>db<span class="w"> </span>seed
|
||||
</span></code></pre></div>
|
||||
</div>
|
||||
<p>See <a href="../services/">Services Overview</a> for the complete service catalog.</p>
|
||||
<hr />
|
||||
<h2 id="verifying-installation">Verifying Installation<a class="headerlink" href="#verifying-installation" title="Permanent link">¶</a></h2>
|
||||
<p>After starting services, verify everything is healthy:</p>
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-14-1"><a id="__codelineno-14-1" name="__codelineno-14-1" href="#__codelineno-14-1"></a><span class="c1"># Check running containers</span>
|
||||
</span><span id="__span-14-2"><a id="__codelineno-14-2" name="__codelineno-14-2" href="#__codelineno-14-2"></a>docker<span class="w"> </span>compose<span class="w"> </span>ps
|
||||
</span><span id="__span-14-3"><a id="__codelineno-14-3" name="__codelineno-14-3" href="#__codelineno-14-3"></a>
|
||||
</span><span id="__span-14-4"><a id="__codelineno-14-4" name="__codelineno-14-4" href="#__codelineno-14-4"></a><span class="c1"># API health check</span>
|
||||
</span><span id="__span-14-5"><a id="__codelineno-14-5" name="__codelineno-14-5" href="#__codelineno-14-5"></a>curl<span class="w"> </span>-s<span class="w"> </span>http://localhost:4000/api/health<span class="w"> </span><span class="p">|</span><span class="w"> </span>python3<span class="w"> </span>-m<span class="w"> </span>json.tool
|
||||
</span><span id="__span-14-6"><a id="__codelineno-14-6" name="__codelineno-14-6" href="#__codelineno-14-6"></a>
|
||||
</span><span id="__span-14-7"><a id="__codelineno-14-7" name="__codelineno-14-7" href="#__codelineno-14-7"></a><span class="c1"># View API logs</span>
|
||||
</span><span id="__span-14-8"><a id="__codelineno-14-8" name="__codelineno-14-8" href="#__codelineno-14-8"></a>docker<span class="w"> </span>compose<span class="w"> </span>logs<span class="w"> </span>api<span class="w"> </span>--tail<span class="w"> </span><span class="m">20</span>
|
||||
</span><span id="__span-14-9"><a id="__codelineno-14-9" name="__codelineno-14-9" href="#__codelineno-14-9"></a>
|
||||
</span><span id="__span-14-10"><a id="__codelineno-14-10" name="__codelineno-14-10" href="#__codelineno-14-10"></a><span class="c1"># Check for containers in restart loops</span>
|
||||
</span><span id="__span-14-11"><a id="__codelineno-14-11" name="__codelineno-14-11" href="#__codelineno-14-11"></a>docker<span class="w"> </span>compose<span class="w"> </span>ps<span class="w"> </span><span class="p">|</span><span class="w"> </span>grep<span class="w"> </span>-i<span class="w"> </span>restarting
|
||||
<p>Changemaker Lite ships a one-shot deployment verifier. Run it after <code>docker compose up -d</code>:</p>
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-16-1"><a id="__codelineno-16-1" name="__codelineno-16-1" href="#__codelineno-16-1"></a>bash<span class="w"> </span>scripts/test-deployment.sh<span class="w"> </span>--wait<span class="w"> </span><span class="m">60</span>
|
||||
</span></code></pre></div>
|
||||
<p>You should see the API return <code>{"status":"ok"}</code> and all started containers in a "running" state.</p>
|
||||
<p><code>--wait 60</code> gives services time to pass their healthchecks on a cold start (first-run image pulls take ~3 min and health stabilization ~90s — brief unhealthy states during this window are expected). The script checks:</p>
|
||||
<ul>
|
||||
<li>All containers running with healthy healthchecks</li>
|
||||
<li>API <code>/api/health</code> returns <code>"healthy"</code> with database + Redis OK</li>
|
||||
<li>Admin and media API endpoints respond</li>
|
||||
<li>(If <code>--domain yourdomain.org</code> passed) tunnel subdomains return 200/302/403</li>
|
||||
</ul>
|
||||
<p>Any failure is printed with the failing component. If everything passes, your install is ready.</p>
|
||||
<h3 id="manual-checks">Manual checks<a class="headerlink" href="#manual-checks" title="Permanent link">¶</a></h3>
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-17-1"><a id="__codelineno-17-1" name="__codelineno-17-1" href="#__codelineno-17-1"></a>docker<span class="w"> </span>compose<span class="w"> </span>ps<span class="w"> </span><span class="c1"># container status</span>
|
||||
</span><span id="__span-17-2"><a id="__codelineno-17-2" name="__codelineno-17-2" href="#__codelineno-17-2"></a>curl<span class="w"> </span>-s<span class="w"> </span>http://localhost:4000/api/health<span class="w"> </span><span class="p">|</span><span class="w"> </span>python3<span class="w"> </span>-m<span class="w"> </span>json.tool<span class="w"> </span><span class="c1"># API health</span>
|
||||
</span><span id="__span-17-3"><a id="__codelineno-17-3" name="__codelineno-17-3" href="#__codelineno-17-3"></a>docker<span class="w"> </span>compose<span class="w"> </span>logs<span class="w"> </span>api<span class="w"> </span>--tail<span class="w"> </span><span class="m">20</span><span class="w"> </span><span class="c1"># API startup logs</span>
|
||||
</span><span id="__span-17-4"><a id="__codelineno-17-4" name="__codelineno-17-4" href="#__codelineno-17-4"></a>bash<span class="w"> </span>scripts/validate-env.sh<span class="w"> </span><span class="c1"># re-check .env + host ports</span>
|
||||
</span></code></pre></div>
|
||||
<h3 id="clean-reset-before-reinstall">Clean reset before reinstall<a class="headerlink" href="#clean-reset-before-reinstall" title="Permanent link">¶</a></h3>
|
||||
<p>If you need to wipe and start over:</p>
|
||||
<div class="language-bash highlight"><pre><span></span><code><span id="__span-18-1"><a id="__codelineno-18-1" name="__codelineno-18-1" href="#__codelineno-18-1"></a>docker<span class="w"> </span>compose<span class="w"> </span>--profile<span class="w"> </span>monitoring<span class="w"> </span>down<span class="w"> </span>-v<span class="w"> </span>--remove-orphans
|
||||
</span><span id="__span-18-2"><a id="__codelineno-18-2" name="__codelineno-18-2" href="#__codelineno-18-2"></a>bash<span class="w"> </span>scripts/pangolin-teardown.sh<span class="w"> </span>--yes<span class="w"> </span><span class="c1"># wipes the tunnel org (dry-run by default)</span>
|
||||
</span><span id="__span-18-3"><a id="__codelineno-18-3" name="__codelineno-18-3" href="#__codelineno-18-3"></a>sudo<span class="w"> </span>rm<span class="w"> </span>-rf<span class="w"> </span>~/changemaker.lite
|
||||
</span></code></pre></div>
|
||||
<p>For CCP-registered instances, also run <code>bash scripts/ccp-deregister.sh --yes</code> before removing the project directory — otherwise the CCP retains a stale Instance row that blocks re-registration of the same slug.</p>
|
||||
<hr />
|
||||
<h2 id="next-steps">Next Steps<a class="headerlink" href="#next-steps" title="Permanent link">¶</a></h2>
|
||||
<ul>
|
||||
|
||||
Reference in New Issue
Block a user