Bumps the npm_and_yarn group with 1 update in the /app directory: [vue-i18n](https://github.com/intlify/vue-i18n/tree/HEAD/packages/vue-i18n). Bumps the npm_and_yarn group with 1 update in the /packages/constants directory: [zod](https://github.com/colinhacks/zod). Updates `vue-i18n` from 11.3.0 to 11.4.14 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/intlify/vue-i18n/releases">vue-i18n's releases</a>.</em></p> <blockquote> <h2>v11.4.14</h2> <!-- raw HTML omitted --> <h2>What's Changed</h2> <h3>🔒 Security Fixes</h3> <ul> <li>fix(shared): neutralize srcdoc attribute in sanitizeTranslatedHtml by <a href="https://github.com/kazupon"><code>@kazupon</code></a> in <a href="https://redirect.github.com/intlify/vue-i18n/pull/2679">intlify/vue-i18n#2679</a></li> <li>fix(core-base): escape both list and named values with escapeParameter by <a href="https://github.com/kazupon"><code>@kazupon</code></a> in <a href="https://redirect.github.com/intlify/vue-i18n/pull/2680">intlify/vue-i18n#2680</a></li> <li>fix: ignore locales named after Object.prototype properties by <a href="https://github.com/kazupon"><code>@kazupon</code></a> in <a href="https://redirect.github.com/intlify/vue-i18n/pull/2681">intlify/vue-i18n#2681</a></li> </ul> <h3>👕 Refactoring</h3> <ul> <li>refactor(core-base): extract the resolved message format check by <a href="https://github.com/kazupon"><code>@kazupon</code></a> in <a href="https://redirect.github.com/intlify/vue-i18n/pull/2674">intlify/vue-i18n#2674</a></li> <li>refactor(vue-i18n-core): remove dead branches in getCoreContext() by <a href="https://github.com/kazupon"><code>@kazupon</code></a> in <a href="https://redirect.github.com/intlify/vue-i18n/pull/2675">intlify/vue-i18n#2675</a></li> <li>refactor(vue-i18n-core): share the fallbackContext handling in the composer by <a href="https://github.com/kazupon"><code>@kazupon</code></a> in <a href="https://redirect.github.com/intlify/vue-i18n/pull/2676">intlify/vue-i18n#2676</a></li> <li>refactor(vue-i18n-core): simplify flat JSON handling in setLocaleMessage / mergeLocaleMessage by <a href="https://github.com/kazupon"><code>@kazupon</code></a> in <a href="https://redirect.github.com/intlify/vue-i18n/pull/2677">intlify/vue-i18n#2677</a></li> <li>refactor(core-base): give the compile cache a proper type by <a href="https://github.com/kazupon"><code>@kazupon</code></a> in <a href="https://redirect.github.com/intlify/vue-i18n/pull/2678">intlify/vue-i18n#2678</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/intlify/vue-i18n/compare/v11.4.13...v11.4.14">https://github.com/intlify/vue-i18n/compare/v11.4.13...v11.4.14</a></p> <h2>v11.4.13</h2> <!-- raw HTML omitted --> <h2>What's Changed</h2> <h3>⚡ Improvement Features</h3> <ul> <li>fix(core-base): map locale unions without the UnionToTuple round-trip by <a href="https://github.com/kazupon"><code>@kazupon</code></a> in <a href="https://redirect.github.com/intlify/vue-i18n/pull/2651">intlify/vue-i18n#2651</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/intlify/vue-i18n/compare/v11.4.12...v11.4.13">https://github.com/intlify/vue-i18n/compare/v11.4.12...v11.4.13</a></p> <h2>v11.4.12</h2> <!-- raw HTML omitted --> <h2>What's Changed</h2> <h3>🐛 Bug Fixes</h3> <ul> <li>fix(core-base): cache locale chains by fallback identity by <a href="https://github.com/kazupon"><code>@kazupon</code></a> in <a href="https://redirect.github.com/intlify/vue-i18n/pull/2635">intlify/vue-i18n#2635</a></li> <li>fix(vue-i18n-core): sync the core context when inheritLocale is enabled by <a href="https://github.com/kazupon"><code>@kazupon</code></a> in <a href="https://redirect.github.com/intlify/vue-i18n/pull/2636">intlify/vue-i18n#2636</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/intlify/vue-i18n/compare/v11.4.10...v11.4.12">https://github.com/intlify/vue-i18n/compare/v11.4.10...v11.4.12</a></p> <h2>v11.4.10</h2> <!-- raw HTML omitted --> <h2>What's Changed</h2> <h3>🐛 Bug Fixes</h3> <ul> <li>fix(core-base): avoid throwing on AST keys in devtools groupId by <a href="https://github.com/kazupon"><code>@kazupon</code></a> in <a href="https://redirect.github.com/intlify/vue-i18n/pull/2603">intlify/vue-i18n#2603</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/intlify/vue-i18n/compare/v11.4.9...v11.4.10">https://github.com/intlify/vue-i18n/compare/v11.4.9...v11.4.10</a></p> <h2>v11.4.9</h2> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/intlify/vue-i18n/blob/v11.4.14/CHANGELOG.md">vue-i18n's changelog</a>.</em></p> <blockquote> <h1>v11.4.14 (2026-10-10T11:06:13.502Z)</h1> <p>This changelog is generated by <a href="https://github.com/intlify/vue-i18n/releases/tag/v11.4.14">GitHub Releases</a></p> <!-- raw HTML omitted --> <h2>What's Changed</h2> <h3>🔒 Security Fixes</h3> <ul> <li>fix(shared): neutralize srcdoc attribute in sanitizeTranslatedHtml by <a href="https://github.com/kazupon"><code>@kazupon</code></a> in <a href="https://redirect.github.com/intlify/vue-i18n/pull/2679">intlify/vue-i18n#2679</a></li> <li>fix(core-base): escape both list and named values with escapeParameter by <a href="https://github.com/kazupon"><code>@kazupon</code></a> in <a href="https://redirect.github.com/intlify/vue-i18n/pull/2680">intlify/vue-i18n#2680</a></li> <li>fix: ignore locales named after Object.prototype properties by <a href="https://github.com/kazupon"><code>@kazupon</code></a> in <a href="https://redirect.github.com/intlify/vue-i18n/pull/2681">intlify/vue-i18n#2681</a></li> </ul> <h3>👕 Refactoring</h3> <ul> <li>refactor(core-base): extract the resolved message format check by <a href="https://github.com/kazupon"><code>@kazupon</code></a> in <a href="https://redirect.github.com/intlify/vue-i18n/pull/2674">intlify/vue-i18n#2674</a></li> <li>refactor(vue-i18n-core): remove dead branches in getCoreContext() by <a href="https://github.com/kazupon"><code>@kazupon</code></a> in <a href="https://redirect.github.com/intlify/vue-i18n/pull/2675">intlify/vue-i18n#2675</a></li> <li>refactor(vue-i18n-core): share the fallbackContext handling in the composer by <a href="https://github.com/kazupon"><code>@kazupon</code></a> in <a href="https://redirect.github.com/intlify/vue-i18n/pull/2676">intlify/vue-i18n#2676</a></li> <li>refactor(vue-i18n-core): simplify flat JSON handling in setLocaleMessage / mergeLocaleMessage by <a href="https://github.com/kazupon"><code>@kazupon</code></a> in <a href="https://redirect.github.com/intlify/vue-i18n/pull/2677">intlify/vue-i18n#2677</a></li> <li>refactor(core-base): give the compile cache a proper type by <a href="https://github.com/kazupon"><code>@kazupon</code></a> in <a href="https://redirect.github.com/intlify/vue-i18n/pull/2678">intlify/vue-i18n#2678</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/intlify/vue-i18n/compare/v11.4.13...v11.4.14">https://github.com/intlify/vue-i18n/compare/v11.4.13...v11.4.14</a></p> <h1>v11.4.13 (2026-10-02T11:01:59.781Z)</h1> <p>This changelog is generated by <a href="https://github.com/intlify/vue-i18n/releases/tag/v11.4.13">GitHub Releases</a></p> <!-- raw HTML omitted --> <h2>What's Changed</h2> <h3>⚡ Improvement Features</h3> <ul> <li>fix(core-base): map locale unions without the UnionToTuple round-trip by <a href="https://github.com/kazupon"><code>@kazupon</code></a> in <a href="https://redirect.github.com/intlify/vue-i18n/pull/2651">intlify/vue-i18n#2651</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/intlify/vue-i18n/compare/v11.4.12...v11.4.13">https://github.com/intlify/vue-i18n/compare/v11.4.12...v11.4.13</a></p> <h1>v11.4.12 (2026-09-16T14:30:30.396Z)</h1> <p>This changelog is generated by <a href="https://github.com/intlify/vue-i18n/releases/tag/v11.4.12">GitHub Releases</a></p> <!-- raw HTML omitted --> <h2>What's Changed</h2> <h3>🐛 Bug Fixes</h3> <ul> <li>fix(core-base): cache locale chains by fallback identity by <a href="https://github.com/kazupon"><code>@kazupon</code></a> in <a href="https://redirect.github.com/intlify/vue-i18n/pull/2635">intlify/vue-i18n#2635</a></li> <li>fix(vue-i18n-core): sync the core context when inheritLocale is enabled by <a href="https://github.com/kazupon"><code>@kazupon</code></a> in <a href="https://redirect.github.com/intlify/vue-i18n/pull/2636">intlify/vue-i18n#2636</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/intlify/vue-i18n/commit/6bb9ebdeae4955cafb53e82bc461199f6186f573"><code>6bb9ebd</code></a> release: v11.4.14</li> <li><a href="https://github.com/intlify/vue-i18n/commit/f6b3e75a16f43f4d9a7a567b1b36cd638e880831"><code>f6b3e75</code></a> release: v11.4.13</li> <li><a href="https://github.com/intlify/vue-i18n/commit/87f3745072ca15cbd2d1eb8d030aed10639b0e3e"><code>87f3745</code></a> release: v11.4.12</li> <li><a href="https://github.com/intlify/vue-i18n/commit/87510e2f9344e0734bfe9fbc7e0a2c509042e159"><code>87510e2</code></a> release: v11.4.10</li> <li><a href="https://github.com/intlify/vue-i18n/commit/5128bf00a1e23fb1defb01ea80622dd6fedd1e21"><code>5128bf0</code></a> release: v11.4.9</li> <li><a href="https://github.com/intlify/vue-i18n/commit/de2393bae16676a8a7c293bb493415e3085a521a"><code>de2393b</code></a> release: v11.4.8</li> <li><a href="https://github.com/intlify/vue-i18n/commit/ceb0548cb421b8aaf237fecda0394d8fd3d75da7"><code>ceb0548</code></a> release: v11.4.7</li> <li><a href="https://github.com/intlify/vue-i18n/commit/913bbfee3d0fe1b0ff321f9670ee7de5c0a5ae51"><code>913bbfe</code></a> release: v11.4.6</li> <li><a href="https://github.com/intlify/vue-i18n/commit/6b97bfd57387b440d31e76af665cea4a5cdbd8d3"><code>6b97bfd</code></a> release: v11.4.5</li> <li><a href="https://github.com/intlify/vue-i18n/commit/99fd4bcaf9e38b39857653eecf53b5038a6e8a49"><code>99fd4bc</code></a> release: v11.4.4</li> <li>Additional commits viewable in <a href="https://github.com/intlify/vue-i18n/commits/v11.4.14/packages/vue-i18n">compare view</a></li> </ul> </details> <br /> Updates `zod` from 3.25.76 to 4.6.7 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/colinhacks/zod/releases">zod's releases</a>.</em></p> <blockquote> <h2>v4.6.7</h2> <h2>Commits:</h2> <ul> <li>b500a2ee95134f81d74da7911d7378dd2853d042 4.6.7</li> </ul> <h2>v4.6.6</h2> <blockquote> <p>Six malicious commits pushed to <code>main</code> on September 21 with a compromised git credential were reverted the same day in <a href="https://redirect.github.com/colinhacks/zod/issues/6620">#6620</a> and have since been removed from the history of <code>main</code>. None were ever published to npm. The npm provenance for 4.6.6 names 284243fb, the pre-rewrite copy of 9c219833 with identical contents.</p> </blockquote> <h2>Commits:</h2> <ul> <li>0cd3af5e9f50ad11bbcd4407a46a21b8848ba574 docs: load the en locale directly in Zod Mini</li> <li>9d5e60f162997b764b40d45aa02481888db50dea docs: import locales from zod/locales, not z.locales</li> <li>34a626f307871ecbb0123947559328dc52ed5e3e docs: tighten the z.locales tree-shaking note</li> <li>74304ce5b5796b5edb9a88ceb8e170b6ea3e82df release: stage npm versions instead of publishing them (<a href="https://redirect.github.com/colinhacks/zod/issues/6622">#6622</a>)</li> <li>b2ef983e0711ff6517d6020b021071e2e5653efa docs: add Code for Japan to bronze sponsors</li> <li>8fb2faf0584828a6a027d8279db36f6f52784462 docs: crop the Code for Japan logo and list it first in bronze</li> <li>bacad518c41610d654658172d325874bf0ee6290 docs: square the Code for Japan logo to match the other bronze tiles</li> <li>c42596bd1c87e941d7241d10e012c5c196adcc10 release: hold the run on the release-approval environment until the staged versions are approved (<a href="https://redirect.github.com/colinhacks/zod/issues/6638">#6638</a>)</li> <li>a2ba4a67986a3e6b2b131be30084a2f460d9ea67 fix(types): declare record output and input as members, not base type arguments (<a href="https://redirect.github.com/colinhacks/zod/issues/6645">#6645</a>)</li> <li>a0ebf970f2d752e5f58527cd2942ff48be4f46bd fix(v4): check array, set and map size bounds before parsing elements (<a href="https://redirect.github.com/colinhacks/zod/issues/6652">#6652</a>)</li> <li>529f78dd9431b07f49647fee3aa0819b3f8b66b7 4.6.6</li> <li>9c219833c3a3764fa1f1ea9c5ecec8254a63c0b1 ci: stage at verbose so a failed OIDC token exchange says why</li> </ul> <h2>v4.6.5</h2> <h2>Commits:</h2> <ul> <li>d2b135cfb7a3582b9eb515756b9166bcb9521f4a docs: add the 4.6.x patch highlights to the 4.6 post</li> <li>f1448f7cee00df9fe1e9ad84a000aa1828cc8bc1 docs: fold the 4.6.x patch highlights into the 4.6 post's own sections</li> <li>de65a5cb39ed22a507fac935788f718fa88d104f docs: lead the properties section with the check and add a Zod Mini tab (<a href="https://redirect.github.com/colinhacks/zod/issues/6598">#6598</a>)</li> <li>56222cd1532c07bcb91b67df529cab4c0a215330 feat(instanceof): key the .properties() shape off the instance type (<a href="https://redirect.github.com/colinhacks/zod/issues/6600">#6600</a>)</li> <li>ca0229a404818290e6cdcfefcd7eb2d04bcbb543 Revert "feat: add z.currencyCode() over a vendored ISO 4217 list, refreshed weekly by CI (<a href="https://redirect.github.com/colinhacks/zod/issues/6595">#6595</a>)"</li> <li>cc4cd4ee9c52fcaa10964e48cc144541e41a5ed9 Revert "Revert "feat: add z.currencyCode() over a vendored ISO 4217 list, refreshed weekly by CI (<a href="https://redirect.github.com/colinhacks/zod/issues/6595">#6595</a>)""</li> <li>0f3f5ee3ca56c7574bf849e54f79e9a6e02562ee 4.6.5</li> <li>59bbc03e10c636b9eb3c393dfeb552819774ec21 chore: re-pin the integration peers to the workspace zod after the 4.6.5 bump</li> </ul> <h2>v4.6.4</h2> <p>A patch on top of <a href="https://github.com/colinhacks/zod/releases/tag/v4.6.3">4.6.3</a>.</p> <ul> <li><a href="https://github.com/colinhacks/zod/commit/d6bc1e30"><code>d6bc1e30</code></a> feat: add <code>z.currencyCode()</code> over a vendored ISO 4217 list, refreshed weekly by CI (<a href="https://redirect.github.com/colinhacks/zod/pull/6595">#6595</a>)</li> <li><a href="https://github.com/colinhacks/zod/commit/ad32d751"><code>ad32d751</code></a> perf: <code>z.url()</code> rejects an invalid URL with <code>URL.canParse()</code> instead of a throwing constructor, about 50x faster; fewer allocations on the validation path (<a href="https://redirect.github.com/colinhacks/zod/pull/6588">#6588</a>)</li> <li><a href="https://github.com/colinhacks/zod/commit/2bb08717"><code>2bb08717</code></a> chore: re-pin the integration peers to the workspace zod after the 4.6.4 bump</li> <li><a href="https://github.com/colinhacks/zod/commit/f6e1701a"><code>f6e1701a</code></a> chore(deps): bump next to 15.5.25 and vite to 7.3.6 (<a href="https://redirect.github.com/colinhacks/zod/pull/6153">#6153</a>)</li> </ul> <h2>v4.6.3</h2> <p>A patch on top of <a href="https://github.com/colinhacks/zod/releases/tag/v4.6.2">4.6.2</a>.</p> <ul> <li><a href="https://github.com/colinhacks/zod/commit/413cce9a"><code>413cce9a</code></a> fix(v4): make z.properties() a check again (<a href="https://redirect.github.com/colinhacks/zod/pull/6594">#6594</a>) — removes the standalone <code>z.properties()</code> schema from 4.6.0; <code>z.instanceof().properties()</code> and <code>.check(...z.properties())</code> are unchanged</li> <li><a href="https://github.com/colinhacks/zod/commit/75d63ee1"><code>75d63ee1</code></a> docs: show only the <code>.properties()</code> method form in the 4.6 post</li> <li><a href="https://github.com/colinhacks/zod/commit/46da9572"><code>46da9572</code></a> docs: match the error-message examples to what the parsers emit</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/colinhacks/zod/commit/b500a2ee95134f81d74da7911d7378dd2853d042"><code>b500a2e</code></a> 4.6.7</li> <li><a href="https://github.com/colinhacks/zod/commit/9c219833c3a3764fa1f1ea9c5ecec8254a63c0b1"><code>9c21983</code></a> ci: stage at verbose so a failed OIDC token exchange says why</li> <li><a href="https://github.com/colinhacks/zod/commit/529f78dd9431b07f49647fee3aa0819b3f8b66b7"><code>529f78d</code></a> 4.6.6</li> <li><a href="https://github.com/colinhacks/zod/commit/a0ebf970f2d752e5f58527cd2942ff48be4f46bd"><code>a0ebf97</code></a> fix(v4): check array, set and map size bounds before parsing elements (<a href="https://redirect.github.com/colinhacks/zod/issues/6652">#6652</a>)</li> <li><a href="https://github.com/colinhacks/zod/commit/a2ba4a67986a3e6b2b131be30084a2f460d9ea67"><code>a2ba4a6</code></a> fix(types): declare record output and input as members, not base type argumen...</li> <li><a href="https://github.com/colinhacks/zod/commit/c42596bd1c87e941d7241d10e012c5c196adcc10"><code>c42596b</code></a> release: hold the run on the release-approval environment until the staged ve...</li> <li><a href="https://github.com/colinhacks/zod/commit/bacad518c41610d654658172d325874bf0ee6290"><code>bacad51</code></a> docs: square the Code for Japan logo to match the other bronze tiles</li> <li><a href="https://github.com/colinhacks/zod/commit/8fb2faf0584828a6a027d8279db36f6f52784462"><code>8fb2faf</code></a> docs: crop the Code for Japan logo and list it first in bronze</li> <li><a href="https://github.com/colinhacks/zod/commit/b2ef983e0711ff6517d6020b021071e2e5653efa"><code>b2ef983</code></a> docs: add Code for Japan to bronze sponsors</li> <li><a href="https://github.com/colinhacks/zod/commit/74304ce5b5796b5edb9a88ceb8e170b6ea3e82df"><code>74304ce</code></a> release: stage npm versions instead of publishing them (<a href="https://redirect.github.com/colinhacks/zod/issues/6622">#6622</a>)</li> <li>Additional commits viewable in <a href="https://github.com/colinhacks/zod/compare/v3.25.76...v4.6.7">compare view</a></li> </ul> </details> <details> <summary>Maintainer changes</summary> <p>This version was pushed to npm by <a href="https://www.npmjs.com/~GitHub%20Actions">GitHub Actions</a>, a new releaser for zod since your current version.</p> </details> <br /> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/linux-odyssey/linux-odyssey/network/alerts). </details>
Linux Odyssey
TLDR
bun install
cp .env.sample .env
docker compose up -d
bun run dev
Requirements
- Bun: v1.3+
- Docker
Known Issues
- MongoDB requires x86 architecture to run for v5+ versions. You can track this issue for updates.
Windows user please refer to docs/windows-setup.md for setup instructions.
Installation
git clone https://github.com/lancatlin/linux-odyssey.git
cd linux-odyssey
bun install
Project Structures
- app: frontend
- server: backend
- quests: tutorials scripts for each quest
- packages: other packages
- analytics: admin dashboard to analyze collected data
- constants: some shared config values for app and server
- container: the script run in container to capture users' command
- file-graph: the algorithm to construct and modify file graph, used in both app and server
- models: definitions of MondoDB collections (data schema)
- utils: other utility code shared between packages
- game (in the future): core logic of game playing, will be extracted from server
Configuration
The configuration is stored in the .env file. You can copy from the sample file.
cp .env.sample .env
Docker Setup
Docker compose files explaination
- docker-compose.yml: The one used for development. It sets up MongoDB and builds base quest image.
- docker-compose.prod.yml: The one used for production deployment. It has a Nginx service, a backend, a database, an analytics service, and creates isolated networks for player containers.
- docker-compose.testing.yml: Similar to production config, but sets up an one-time environment for end-to-end testing.
Common Development Setup
This sets up a development database, and running development server for frontend and backend.
Pull the latest images:
docker compose pull
Start the containers:
docker compose up -d
This will start the db. it will automatically restarts by Docker.
Building quest images:
docker compose build base
Build Quest Images in Details
In each quest folder, there is a game.yml file, which is the quest definition.
If you want to include additional files, put them in a home folder. The files in home will be copied to the user's home on container creation automatically.
quests/
├── Dockerfile # Base image
├── entrypoint.sh # Entrypoint for the container
├── discover
│ └── game.yml
├── helloworld
│ ├── Dockerfile # Overwrite the image
│ ├── game.yml
│ └── home # Include additional files
│ └── forgotten_scroll.txt
├── read
│ └── game.yml
└── spell
├── Dockerfile
├── game.yml
└── home
└── ancient_scroll.txt
An optional Dockerfile can overwrite the base image. You can use this to install additional dependencies or modify the environment.
Customized entrypoint.sh for each quest is not yet supported.
To build all quests:
bun run build:quests
The base image is built with docker-compose, so you can use docker compose build base to rebuild it. Once you rebuild the base image, you have to rebuild all quests.
Optional: Mounting Host Directory
To update the home content of a quest, simply re-create a new session will do. The home content is mounted and copied on container creation.
To further improve the development experience, we can mount the host directory to the container in the pattern:
/path/to/linux-odyssey/quests/${quest_id}/home:/home/commander
You can edit the files on your host, and the changes will be reflected in the container. This is disabled by default. To enable it, you can set the following environment variables:
MOUNT_QUEST=true
Optional: Mounting terminal service & cmd-hook
To make the development of terminal services & cmd-hook smoother, we can enable MOUNT_CLI to mount the local binaries into container.
MOUNT_CLI
And you can run air inside of services/terminal-service or services/cmd-hook to get auto recompiling.
Development
Copy .env.sample to .env and customize it for your needs.
Run dev server (frontend, backend):
bun run dev
To develop analytics dashboard:
bun run analytics
The default username and password is alex and Alex1234.
Testing
Unit tests:
bun run test
Run Cypress locally, using the current development containers:
docker compose up -d
bun run test:e2e
Run Cypress in container, create brand-new containers along with it:
./docker-scripts.sh test
# or with building
./docker-scripts.sh test --build
# tearing off the containers
./docker-scripts.sh down
Deployment
Create production env
cp .env.prod.sample .env.prod
Edit .env.prod
BASE_URL=https://yourdomain.com # IMPORTANT to make login work
SECRET_KEY=xxxx # Change it to something safe!
Start the service
# Build the images (only allowed for maintainers)
docker compose -f docker-compose.prod.yml build
docker compose -f docker-compose.prod.yml push
# Server side
docker compose -f docker-compose.prod.yml pull
bun run build:quests
docker compose -f docker-compose.prod.yml up -d
Necessary Configuration
To enable social login, you should have OAuth client token in a .env file:
You can copy from .env.sample
YOU MUST CHANGE THE SECRET_KEY in .env file.
SECRET_KEY=your-secret-key
You can generate a random key by running
bun run setup