mirror of https://github.com/requarks/wiki
parent
ded41321f2
commit
07aefe4268
@ -0,0 +1,200 @@
|
||||
# AGENTS.md
|
||||
|
||||
## Project
|
||||
|
||||
This repository is the Wiki.js application used for the Shadows Over Westgate wiki.
|
||||
|
||||
The active custom theme is `westgate`, located under `client/themes/westgate`. The goal is to match the Shadows Over Westgate NodeBB theme as closely as Wiki.js permits, ideally 1:1 in visual language, interaction polish, and atmosphere while respecting Wiki.js architecture.
|
||||
|
||||
## Local Environment
|
||||
|
||||
- Wiki repo: `/home/vicky/Projects/nwnee-shadowsoverwestgate/wiki`
|
||||
- NodeBB theme reference repo: `/home/vicky/Projects/nodebb-dev/nodebb-theme-westgate`
|
||||
- NodeBB theme instructions: `/home/vicky/Projects/nodebb-dev/nodebb-theme-westgate/AGENTS.md`
|
||||
- This Wiki.js checkout targets Wiki.js 2.x and Node `>=20`, as declared in `package.json`.
|
||||
- Wiki.js assets are built through webpack from the repo root.
|
||||
|
||||
## Theme Direction
|
||||
|
||||
Use the NodeBB Westgate theme as the source of truth.
|
||||
|
||||
The visual target is black velvet silk, darkness, vampirism, decadence, and decay.
|
||||
|
||||
Use this palette direction:
|
||||
|
||||
- Plum and near-black as the dominant base.
|
||||
- Muted gold for accents, borders, small highlights, and important affordances.
|
||||
- Red only sparingly, preferably as a subtle detail or state color.
|
||||
- Avoid bright, playful, clinical, or flat SaaS-style treatment.
|
||||
- Favor depth, restraint, texture, and rich contrast over loud ornament.
|
||||
|
||||
Before adding new visual language, inspect the NodeBB reference files in `/home/vicky/Projects/nodebb-dev/nodebb-theme-westgate`, especially:
|
||||
|
||||
- `____live-copy.css`
|
||||
- `____wikijs-live-copy.scss`
|
||||
- `____bootstrap-overrides.scss`
|
||||
|
||||
`____live-copy.css` is the clearest reference for the slick gradient treatment. Port that direction into Wiki.js foreground elements such as page chrome, navigation, panels, buttons, cards, tables, forms, alerts, active states, borders, and links. Keep the wiki readable and usable; do not turn the whole page into a decorative gradient background.
|
||||
|
||||
## Wiki.js Theme Rules
|
||||
|
||||
Follow the current Wiki.js theme model:
|
||||
|
||||
- Theme metadata lives in `client/themes/westgate/theme.yml`.
|
||||
- Theme styles live in `client/themes/westgate/scss/app.scss`.
|
||||
- Theme-specific JavaScript lives in `client/themes/westgate/js/app.js`.
|
||||
- Theme Vue components live in `client/themes/westgate/components/`.
|
||||
- `client/themes/westgate/components/page.vue` is the mandatory theme entry component.
|
||||
- `client/themes/westgate/js/app.js` and `client/themes/westgate/scss/app.scss` are mandatory entry files, even if one is temporarily empty.
|
||||
- `client/themes/westgate/thumbnail.png` is the theme preview image.
|
||||
- The active theme components are bundled from `client/themes/<siteConfig.theme>/components/` by `client/client-app.js`.
|
||||
- `Page` and `NavFooter` are registered as theme components in `client/client-app.js`.
|
||||
- Other page-level behavior and app chrome may come from shared Wiki.js components under `client/components/`.
|
||||
- Folder names for themes must be lowercase and avoid spaces or special characters. Keep this theme folder named `westgate`.
|
||||
- This checkout's page component and admin UI use `off` as the hidden table-of-contents value, even though some upstream theme metadata examples use `hidden`.
|
||||
|
||||
Official Wiki.js theme docs: https://docs.requarks.io/dev/themes
|
||||
|
||||
The theme must be built together with the application components. Styling only the theme SCSS is often insufficient because Wiki.js renders a mix of:
|
||||
|
||||
- Theme components in `client/themes/westgate/components/`.
|
||||
- Shared Vue components in `client/components/`.
|
||||
- Server Pug views in `server/views/`.
|
||||
- Global SCSS in `client/scss/`.
|
||||
- Vuetify-generated markup and utility classes.
|
||||
|
||||
Prefer changes in `client/themes/westgate` when the behavior or markup is theme-owned. Touch shared `client/components`, `client/scss`, or `server/views` only when the rendered Wiki.js surface cannot be matched from the theme layer alone.
|
||||
|
||||
Wiki.js officially treats custom themes as a developer workflow: they are manually compiled as part of the application bundle, not installed or switched like downloadable packages.
|
||||
|
||||
The top black navigation header is shared across the wiki, admin, editor, profile, and other app surfaces. Official docs say the header cannot be customized as part of a normal content-page theme. Prefer styling it from SCSS only when needed for visual parity; do not assume it can be replaced from `client/themes/westgate/components`.
|
||||
|
||||
When editing `client/themes/westgate/components/page.vue`, keep the `props` object and `created()` method intact. Wiki.js uses them to persist page data to the store, and changing them can break page rendering across the application.
|
||||
|
||||
Do not modify `client/themes/default` unless the task explicitly asks to update the default theme or compare behavior. Use it as a reference for expected component structure.
|
||||
|
||||
## Current Files Of Interest
|
||||
|
||||
- `client/themes/westgate/theme.yml`: Westgate theme metadata and theme props.
|
||||
- `client/themes/westgate/scss/app.scss`: main Westgate visual layer.
|
||||
- `client/themes/westgate/js/app.js`: theme-specific browser behavior.
|
||||
- `client/themes/westgate/components/page.vue`: main wiki page layout for the theme.
|
||||
- `client/themes/westgate/components/nav-sidebar.vue`: page contents/sidebar navigation component.
|
||||
- `client/themes/westgate/components/nav-footer.vue`: footer navigation component.
|
||||
- `client/themes/westgate/components/tabset.vue`: theme tabset component.
|
||||
- `client/client-app.js`: global Vue registration, including theme component imports.
|
||||
- `client/scss/`: global Wiki.js and Vuetify styling layers.
|
||||
- `server/views/`: Pug views that host rendered Vue app pages.
|
||||
- `dev/webpack/webpack.dev.js` and `dev/webpack/webpack.prod.js`: asset build configuration.
|
||||
|
||||
## Working Practices
|
||||
|
||||
- Keep edits scoped to the wiki project unless the task explicitly names the NodeBB theme repo.
|
||||
- Treat `/home/vicky/Projects/nodebb-dev/nodebb-theme-westgate` as visual reference material, not as a target for wiki edits.
|
||||
- Prefer existing Wiki.js, Vue 2, Vuetify, Pug, SCSS, and local theme patterns over introducing new frameworks.
|
||||
- Keep selectors maintainable and tied to Wiki.js/Vuetify structure where possible.
|
||||
- Avoid broad global overrides unless they are intentional theme-wide tokens, resets, or Vuetify corrections.
|
||||
- Avoid unrelated formatting churn.
|
||||
- Preserve accessibility: readable contrast, visible focus states, keyboard-usable controls, meaningful hover/active states, and no text hidden purely for visual effect unless there is an accessible alternative.
|
||||
- When porting NodeBB styling, translate the visual intent to Wiki.js markup instead of copying selectors that only make sense in NodeBB.
|
||||
- When editing Vue components, keep template, script, and style behavior aligned with the default Wiki.js component unless a Westgate-specific override is intentional.
|
||||
- Keep `theme.yml` prop keys unique and meaningful; avoid duplicate YAML keys.
|
||||
|
||||
## Build And Validation
|
||||
|
||||
Run commands from `/home/vicky/Projects/nwnee-shadowsoverwestgate/wiki`.
|
||||
|
||||
Prefer the devcontainer / Docker Compose workflow for this project. Host-side Node commands may fail because dependencies are expected to live inside the `wiki-app` container.
|
||||
|
||||
Dev container workflow:
|
||||
|
||||
- Compose file: `dev/containers/docker-compose.yml`.
|
||||
- App container: `wiki-app`.
|
||||
- Database container: `wiki-db`.
|
||||
- Adminer container: `wiki-adminer`.
|
||||
- Workspace inside the app container: `/wiki`.
|
||||
- The host repo is bind-mounted into `/wiki`.
|
||||
- `node_modules` is container-local via the `/wiki/node_modules` volume and should not be expected on the host.
|
||||
- Wiki.js is exposed at `http://localhost:3000`.
|
||||
- Adminer is exposed at `http://localhost:3001`.
|
||||
- Local Postgres is exposed on host port `15432`, container port `5432`.
|
||||
- Container config lives at `dev/containers/config.yml`; copy it to `config.yml` inside `/wiki` if needed.
|
||||
|
||||
Common host commands:
|
||||
|
||||
- `docker compose -f dev/containers/docker-compose.yml up -d --build`: build and start the dev database, app, and Adminer containers.
|
||||
- `docker exec -it wiki-app bash`: open a shell in the Wiki.js app container.
|
||||
|
||||
Common container commands from `/wiki`:
|
||||
|
||||
- `yarn install`: install dependencies into the container-local `node_modules` volume.
|
||||
- `cp dev/containers/config.yml config.yml`: use the dev Postgres config.
|
||||
- `yarn dev`: official Wiki.js development workflow; theme changes automatically rebuild client assets and live-reload while it is running. During active visual iteration, prefer this live reload loop instead of repeatedly running `yarn build`.
|
||||
- `yarn build` or `npm run build`: production webpack build for app, legacy, setup, theme SCSS, theme JS, and Vue components.
|
||||
- `yarn test` or `npm run test`: eslint, pug-lint, and jest.
|
||||
|
||||
Dev database settings from inside Docker:
|
||||
|
||||
- Type: `postgres`
|
||||
- Host: `db`
|
||||
- Port: `5432`
|
||||
- Database: `wiki`
|
||||
- User: `wikijs`
|
||||
- Password: `wikijsrocks`
|
||||
|
||||
Common commands:
|
||||
|
||||
- `yarn dev`: official Wiki.js development workflow; theme changes automatically rebuild client assets.
|
||||
- `npm run watch`: development webpack build for app, legacy, setup, theme SCSS, theme JS, and Vue components.
|
||||
- `npm run build`: production webpack build for app, legacy, setup, theme SCSS, theme JS, and Vue components.
|
||||
- `npm run dev`: Wiki.js development server workflow.
|
||||
- `npm run start`: start the Wiki.js server.
|
||||
- `npm run test`: eslint, pug-lint, and jest.
|
||||
|
||||
Important build note:
|
||||
|
||||
- The Westgate theme is not just a standalone stylesheet. It depends on the theme Vue components and shared Wiki.js components being bundled together. After changing `client/themes/westgate/components`, `client/themes/westgate/scss`, `client/themes/westgate/js`, `client/components`, `client/scss`, or `server/views`, rebuild the webpack assets.
|
||||
- If `yarn dev` is already running, use its live reload / automatic rebuild capability during iteration; a separate `yarn build` is not normally needed until final production-style validation.
|
||||
- Production build output includes the generated `assets` folder and generated views under `server/views`.
|
||||
- The active custom theme is selected from the database `settings` table, `theming` row, JSON `theme` property. For this project it should be `westgate`; restart Wiki.js after changing it.
|
||||
|
||||
Validation checklist when practical:
|
||||
|
||||
- Build assets inside the `wiki-app` container with `yarn build`, or run `yarn dev` during iterative work.
|
||||
- Verify that the active wiki theme is `westgate`.
|
||||
- Check desktop and mobile widths.
|
||||
- Check representative page content: headings, paragraphs, links, tables, code blocks, blockquotes, tags, page metadata, table of contents/sidebar, footer navigation, and edit controls.
|
||||
- Check shared app surfaces affected by theme work: login, register, profile, search, not found, unauthorized, and editor/new-page flows when relevant.
|
||||
- Use Playwright for rendered route checks and screenshots when the wiki server is running.
|
||||
|
||||
If validation cannot be run, report what changed and what still needs to be checked in the running wiki.
|
||||
|
||||
## Current Tasks
|
||||
|
||||
Complete and update as needed. Future-dated tasks and possibilities go into Future Tasks.
|
||||
|
||||
Statuses:
|
||||
|
||||
1. `[x]` marks total completion.
|
||||
2. `[-]` marks partial completion: not exact specification.
|
||||
3. `[ ]` marks incomplete.
|
||||
4. `[?]` marks uncertainty or exception: treat as incomplete, expand as needed, and keep in scope.
|
||||
|
||||
Complete the following:
|
||||
|
||||
- [-] Bring the Wiki.js Westgate theme into close visual parity with the NodeBB Westgate theme. Continued with shared chrome, search, auth, menu, table, media, focus, content-surface polish, and multiple geometry cleanup passes in `client/themes/westgate/scss/app.scss`.
|
||||
- [x] Build the theme together with Wiki.js components after theme/component changes. `yarn build` completed successfully on April 22, 2026.
|
||||
- [ ] Validate the rendered wiki on desktop and mobile against the NodeBB visual direction. Pending because the Wiki.js server was not running on `localhost:3000` in the current container and Playwright is not installed here.
|
||||
- [-] Reduce boxes-within-boxes across the Westgate theme. Removed card styling from structural page columns, softened sidebar cards/TOC rows, restored pilcrow anchors as overlay markers that do not indent headings, and simplified top nav/search/editor title input borders from SCSS. Continue checking the shared `nav-header` and editor title/search wrappers; exact 1:1 alignment may require editing shared Vue markup in `client/components/common/nav-header.vue` if SCSS cannot fully undo Vuetify wrapper nesting.
|
||||
- [-] Improve editor/read-view parity. Markdown editor line-card striping was fixed by exempting CodeMirror line elements from global code-block styling. The WYSIWYG/preview pane still does not show the same gold heading/pilcrow marker behavior as the read view; treat this as optional unless visual parity there becomes a priority.
|
||||
- [ ] Re-check body/header separation on real content pages. Current SCSS reduces page title height and tightens page body spacing, but screenshots should be reviewed after live reload to decide whether page title and article content should become one continuous component or remain separate Wiki.js regions.
|
||||
- [-] Fix current layout overlap regression. Removed the negative sticky side-rail offset from `client/themes/westgate/components/page.vue`, because it caused the TOC/sidebar column to overlap the top page chrome and content region. Continue checking for remaining overlap after live reload.
|
||||
- [-] Document VPS deployment. `README.md` was cleared and rewritten as a Wiki.js 2.x VPS deployment guide for this custom theme, using the repo's `dev/build/Dockerfile` custom image path. It references official Wiki.js installation, Docker, and requirements docs. Validate commands against the real production repo URL, hostname, and volume names before first live deployment.
|
||||
- [-] Last geometry simplification pass before handoff. Added explicit Westgate classes to the breadcrumb toolbar/body container, removed inline page title height, flattened breadcrumb boxes, removed most side-rail/card borders, and simplified the content panel edges. Remaining navbar/search double-border issues likely come from shared Vuetify/nav-header wrapper markup and should be handled in `client/components/common/nav-header.vue` by the next pass rather than by piling on more SCSS overrides.
|
||||
|
||||
## Future Tasks
|
||||
|
||||
Tasks to be considered in the future, not implemented immediately. Keep them in scope when making decisions.
|
||||
|
||||
- [ ] Consider a light mode/dark mode toggle only if it can retain the core Westgate identity.
|
||||
- [ ] Consider extracting repeated Westgate SCSS tokens/mixins if theme styling continues to grow.
|
||||
@ -1,527 +1,303 @@
|
||||
<div align="center">
|
||||
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://static.requarks.io/logo/wikijs-full-darktheme.svg">
|
||||
<img alt="Wiki.js" src="https://static.requarks.io/logo/wikijs-full.svg" width="600">
|
||||
</picture>
|
||||
|
||||
[](https://github.com/Requarks/wiki/releases)
|
||||
[](https://github.com/requarks/wiki/blob/master/LICENSE)
|
||||
[](http://standardjs.com/)
|
||||
[](https://github.com/Requarks/wiki/actions/workflows/build.yml)
|
||||
[](https://github.com/users/NGPixel/sponsorship)
|
||||
[](https://opencollective.com/wikijs)
|
||||
[](https://github.com/Requarks/wiki/releases)
|
||||
[](https://hub.docker.com/r/requarks/wiki/)
|
||||
[](https://discord.gg/rcxt9QS2jd)
|
||||
[](https://bsky.app/profile/js.wiki)
|
||||
[](https://t.me/wiki_js)
|
||||
[](https://www.reddit.com/r/wikijs/)
|
||||
|
||||
##### A modern, lightweight and powerful wiki app built on NodeJS
|
||||
|
||||
</div>
|
||||
|
||||
- **[Official Website](https://js.wiki/)**
|
||||
- **[Documentation](https://docs.requarks.io/)**
|
||||
- [Requirements](https://docs.requarks.io/install/requirements)
|
||||
- [Installation](https://docs.requarks.io/install)
|
||||
- [Demo](https://docs.requarks.io/demo)
|
||||
- [Changelog](https://github.com/requarks/wiki/releases)
|
||||
- [Feature Requests](https://feedback.js.wiki/wiki)
|
||||
- Chat with us on [Discord](https://discord.gg/rcxt9QS2jd)
|
||||
- [Translations](https://docs.requarks.io/dev/translations) *(We need your help!)*
|
||||
- [Special Thanks](#special-thanks)
|
||||
- [Contribute](#contributors)
|
||||
|
||||
[Follow our Twitter feed](https://twitter.com/requarks) to learn about upcoming updates and new releases!
|
||||
|
||||
<h2 align="center">Donate</h2>
|
||||
|
||||
<div align="center">
|
||||
|
||||
Wiki.js is an open source project that has been made possible due to the generous contributions by community [backers](https://js.wiki/about). If you are interested in supporting this project, please consider [becoming a sponsor](https://github.com/users/NGPixel/sponsorship), [becoming a patron](https://www.patreon.com/requarks), donating to our [OpenCollective](https://opencollective.com/wikijs), via [Paypal](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=FLV5X255Z9CJU&source=url) or via Ethereum (`0xe1d55c19ae86f6bcbfb17e7f06ace96bdbb22cb5`).
|
||||
|
||||
[](https://github.com/users/NGPixel/sponsorship)
|
||||
[](https://www.patreon.com/requarks)
|
||||
[](https://opencollective.com/wikijs)
|
||||
[](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=FLV5X255Z9CJU&source=url)
|
||||
[](https://etherscan.io/address/0xe1d55c19ae86f6bcbfb17e7f06ace96bdbb22cb5)
|
||||
[](https://checkout.opennode.com/p/2553c612-f863-4407-82b3-1a7685268747)
|
||||
[](https://wikijs.threadless.com)
|
||||
|
||||
</div>
|
||||
|
||||
<h2 align="center">Gold Tier Sponsors</h2>
|
||||
|
||||
<div align="center">
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td align="center" valign="middle" width="444">
|
||||
<a href="https://trans-zero.com/" target="_blank">
|
||||
<img src="https://cdn.js.wiki/images/sponsors/transzero.png">
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<h2 align="center">GitHub Sponsors</h2>
|
||||
|
||||
Support this project by becoming a sponsor. Your name will show up in the Contribute page of all Wiki.js installations as well as here with a link to your website! [[Become a sponsor](https://github.com/users/NGPixel/sponsorship)]
|
||||
|
||||
<div align="center">
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td align="center" valign="middle" width="444">
|
||||
<a href="https://www.stellarhosted.com/" target="_blank">
|
||||
<img src="https://cdn.js.wiki/images/sponsors/stellarhosted.png">
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div align="center">
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td align="center" valign="middle" width="130">
|
||||
<a href="https://acceleanation.com/" target="_blank">
|
||||
<img src="https://avatars.githubusercontent.com/u/41210718?s=200&v=4">
|
||||
</a>
|
||||
</td>
|
||||
<td align="center" valign="middle" width="130">
|
||||
<a href="https://github.com/alexksso" target="_blank">
|
||||
Alexander Casassovici<br />(@alexksso)
|
||||
</a>
|
||||
</td>
|
||||
<td align="center" valign="middle" width="130">
|
||||
<a href="https://github.com/broxen" target="_blank">
|
||||
Broxen<br />(@broxen)
|
||||
</a>
|
||||
</td>
|
||||
<td align="center" valign="middle" width="130">
|
||||
<a href="https://github.com/xDacon" target="_blank">
|
||||
Dacon<br />(@xDacon)
|
||||
</a>
|
||||
</td>
|
||||
<td align="center" valign="middle" width="130">
|
||||
<a href="https://github.com/DonNabla" target="_blank">
|
||||
Maxime Pierre<br />(@DonNabla)
|
||||
</a>
|
||||
</td>
|
||||
<td align="center" valign="middle" width="130">
|
||||
<a href="https://github.com/GigabiteLabs" target="_blank">
|
||||
<img src="https://static.requarks.io/sponsors/gigabitelabs-148x129.png">
|
||||
</a>
|
||||
</td>
|
||||
<td align="center" valign="middle" width="130">
|
||||
<a href="https://www.hostwiki.com/" target="_blank">
|
||||
<img src="https://cdn.js.wiki/images/sponsors/hostwiki.png">
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="middle" width="130">
|
||||
<a href="https://github.com/JayDaley" target="_blank">
|
||||
Jay Daley<br />(@JayDaley)
|
||||
</a>
|
||||
</td>
|
||||
<td align="center" valign="middle" width="130">
|
||||
<a href="https://github.com/idokka" target="_blank">
|
||||
Oleksii<br />(@idokka)
|
||||
</a>
|
||||
</td>
|
||||
<td align="center" valign="middle" width="130">
|
||||
<a href="https://www.openhost-network.com/" target="_blank">
|
||||
<img src="https://avatars.githubusercontent.com/u/114218287?s=200&v=4">
|
||||
</a>
|
||||
</td>
|
||||
<td align="center" valign="middle" width="130">
|
||||
<a href="https://www.prevo.ch/" target="_blank">
|
||||
<img src="https://avatars.githubusercontent.com/u/114394792?v=4">
|
||||
</a>
|
||||
</td>
|
||||
<td align="center" valign="middle" width="130">
|
||||
<a href="https://github.com/shanekearney" target="_blank">
|
||||
Shane Kearney<br />(@shanekearney)
|
||||
</a>
|
||||
</td>
|
||||
<td align="center" valign="middle" width="130">
|
||||
<a href="http://www.taicep.org/" target="_blank">
|
||||
<img src="https://avatars.githubusercontent.com/u/160072306?v=4">
|
||||
</a>
|
||||
</td>
|
||||
<td align="center" valign="middle" width="130"></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<table><tbody><tr><td>
|
||||
<img width="441" height="1" />
|
||||
|
||||
- Akira Suenami ([@a-suenami](https://github.com/a-suenami))
|
||||
- Armin Reiter ([@arminreiter](https://github.com/arminreiter))
|
||||
- Arnaud Marchand ([@snuids](https://github.com/snuids))
|
||||
- Brian Douglass ([@bhdouglass](https://github.com/bhdouglass))
|
||||
- Bryon Vandiver ([@asterick](https://github.com/asterick))
|
||||
- Cameron Steele ([@ATechAdventurer](https://github.com/ATechAdventurer))
|
||||
- Charlie Schliesser ([@charlie-s](https://github.com/charlie-s))
|
||||
- Cloud Data Hosting LLC ([@CloudDataHostingLLC](https://github.com/CloudDataHostingLLC))
|
||||
- Cole Manning ([@RVRX](https://github.com/RVRX))
|
||||
- CrazyMarvin ([@CrazyMarvin](https://github.com/CrazyMarvin))
|
||||
- Daniel Horner ([@danhorner](https://github.com/danhorner))
|
||||
- David Christian Holin ([@SirGibihm](https://github.com/SirGibihm))
|
||||
- Dragan Espenschied ([@despens](https://github.com/despens))
|
||||
- Elijah Zobenko ([@he110](https://github.com/he110))
|
||||
- Emerson-Perna ([@Emerson-Perna](https://github.com/Emerson-Perna))
|
||||
- Ernie ([@iamernie](https://github.com/iamernie))
|
||||
- Fabio Ferrari ([@devxops](https://github.com/devxops))
|
||||
- Finsa S.p.A. ([@finsaspa](https://github.com/finsaspa))
|
||||
- Florian Moss ([@florianmoss](https://github.com/florianmoss))
|
||||
- GoodCorporateCitizen ([@GoodCorporateCitizen](https://github.com/GoodCorporateCitizen))
|
||||
- HeavenBay ([@HeavenBay](https://github.com/heavenbay))
|
||||
- HikaruEgashira ([@HikaruEgashira](https://github.com/HikaruEgashira))
|
||||
- Ian Hyzy ([@ianhyzy](https://github.com/ianhyzy))
|
||||
- Jaimyn Mayer ([@jabelone](https://github.com/jabelone))
|
||||
- Jay Lee ([@polyglotm](https://github.com/polyglotm))
|
||||
- Kelly Wardrop ([@dropcoded](https://github.com/dropcoded))
|
||||
- Loki ([@binaryloki](https://github.com/binaryloki))
|
||||
- MaFarine ([@MaFarine](https://github.com/MaFarine))
|
||||
- Marcilio Leite Neto ([@marclneto](https://github.com/marclneto))
|
||||
- Mattias Johnson ([@mattiasJohnson](https://github.com/mattiasJohnson))
|
||||
- Max Ricketts-Uy ([@MaxRickettsUy](https://github.com/MaxRickettsUy))
|
||||
- Mickael Asseline ([@PAPAMICA](https://github.com/PAPAMICA))
|
||||
- Mitchell Rowton ([@mrowton](https://github.com/mrowton))
|
||||
|
||||
</td><td>
|
||||
<img width="441" height="1" />
|
||||
|
||||
- M. Scott Ford ([@mscottford](https://github.com/mscottford))
|
||||
- Nick Halase ([@nhalase](https://github.com/nhalase))
|
||||
- Nick Price ([@DominoTree](https://github.com/DominoTree))
|
||||
- Nina Reynolds ([@cutecycle](https://github.com/cutecycle))
|
||||
- Noel Cower ([@nilium](https://github.com/nilium))
|
||||
- Oleksandr Koltsov ([@crambo](https://github.com/crambo))
|
||||
- Phi Zeroth ([@phizeroth](https://github.com/phizeroth))
|
||||
- Philipp Schmitt ([@pschmitt](https://github.com/pschmitt))
|
||||
- Robert Lanzke ([@winkelement](https://github.com/winkelement))
|
||||
- Ruizhe Li ([@liruizhe1995](https://github.com/liruizhe1995))
|
||||
- Sam Martin ([@ABitMoreDepth](https://github.com/ABitMoreDepth))
|
||||
- Sean Coffey ([@seanecoffey](https://github.com/seanecoffey))
|
||||
- Simon Ott ([@ottsimon](https://github.com/ottsimon))
|
||||
- Stephan Kristyn ([@stevek-pro](https://github.com/stevek-pro))
|
||||
- Theodore Chu ([@TheodoreChu](https://github.com/TheodoreChu))
|
||||
- Tim Elmer ([@tim-elmer](https://github.com/tim-elmer))
|
||||
- Tyler Denman ([@tylerguy](https://github.com/tylerguy))
|
||||
- Victor Bilgin ([@vbilgin](https://github.com/vbilgin))
|
||||
- VMO Solutions ([@vmosolutions](https://github.com/vmosolutions))
|
||||
- YazMogg35 ([@YazMogg35](https://github.com/YazMogg35))
|
||||
- Yu Yongwoo ([@uyu423](https://github.com/uyu423))
|
||||
- ameyrakheja ([@ameyrakheja](https://github.com/ameyrakheja))
|
||||
- aniketpanjwani ([@aniketpanjwani](https://github.com/aniketpanjwani))
|
||||
- aytaa ([@aytaa](https://github.com/aytaa))
|
||||
- cesar ([@cesarnr21](https://github.com/cesarnr21))
|
||||
- chaee ([@chaee](https://github.com/chaee))
|
||||
- lwileczek ([@lwileczek](https://github.com/lwileczek))
|
||||
- magicpotato ([@fortheday](https://github.com/fortheday))
|
||||
- motoacs ([@motoacs](https://github.com/motoacs))
|
||||
- muzian666 ([@muzian666](https://github.com/muzian666))
|
||||
- rburckner ([@rburckner](https://github.com/rburckner))
|
||||
- scorpion ([@scorpion](https://github.com/scorpion))
|
||||
- valantien ([@valantien](https://github.com/valantien))
|
||||
|
||||
</td></tr></tbody></table>
|
||||
</div>
|
||||
|
||||
<h2 align="center">OpenCollective Sponsors</h2>
|
||||
|
||||
Support this project by becoming a sponsor. Your logo will show up in the Contribute page of all Wiki.js installations as well as here with a link to your website! [[Become a sponsor](https://opencollective.com/wikijs#sponsor)]
|
||||
|
||||
<div align="center">
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/0/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/0/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/1/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/1/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/2/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/2/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/3/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/3/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/4/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/4/avatar.svg"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/5/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/5/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/6/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/6/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/7/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/7/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/8/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/8/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/9/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/9/avatar.svg"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/10/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/10/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/11/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/11/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/12/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/12/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/13/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/13/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/14/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/14/avatar.svg"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/15/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/15/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/16/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/16/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/17/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/17/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/18/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/18/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/19/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/19/avatar.svg"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/20/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/20/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/21/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/21/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/22/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/22/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/23/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/23/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/24/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/24/avatar.svg"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/25/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/25/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/26/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/26/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/27/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/27/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/28/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/28/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/29/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/29/avatar.svg"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/30/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/30/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/31/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/31/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/32/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/32/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/33/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/33/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/34/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/34/avatar.svg"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/35/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/35/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/36/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/36/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/37/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/37/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/38/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/38/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/39/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/39/avatar.svg"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/40/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/40/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/41/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/41/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/42/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/42/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/43/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/43/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/44/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/44/avatar.svg"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/40/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/45/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/41/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/46/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/42/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/47/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/43/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/48/avatar.svg"></a>
|
||||
</td>
|
||||
<td align="center" valign="middle">
|
||||
<a href="https://opencollective.com/wikijs/sponsor/44/website" target="_blank"><img src="https://opencollective.com/wikijs/sponsor/49/avatar.svg"></a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<h2 align="center">Patreon Backers</h2>
|
||||
|
||||
Thank you to all our patrons! 🙏 [[Become a patron](https://www.patreon.com/requarks)]
|
||||
|
||||
<div align="center">
|
||||
<table><tbody><tr><td>
|
||||
<img width="441" height="1" />
|
||||
|
||||
- Aeternum
|
||||
- Al Romano
|
||||
- Alex Balabanov
|
||||
- Alex Milanov
|
||||
- Alex Zen
|
||||
- Arti Zirk
|
||||
- Ave
|
||||
- Brandon Curtis
|
||||
- Damien Hottelier
|
||||
- Daniel T. Holtzclaw
|
||||
- Dave 'Sri' Seah
|
||||
- djagoo
|
||||
- dz
|
||||
- Douglas Lassance
|
||||
- Ergoflix
|
||||
- Ernie Reid
|
||||
- Etienne
|
||||
- Flemis Jurgenheimer
|
||||
- Florent
|
||||
- Günter Pavlas
|
||||
- hong
|
||||
- Hope
|
||||
- Ian
|
||||
- Imari Childress
|
||||
- Iskander Callos
|
||||
|
||||
</td><td>
|
||||
<img width="441" height="1" />
|
||||
|
||||
- Josh Stewart
|
||||
- Justin Dunsworth
|
||||
- Keir
|
||||
- Loïc CRAMPON
|
||||
- Ludgeir Ibanez
|
||||
- Lyn Matten
|
||||
- Mads Rosendahl
|
||||
- Mark Mansur
|
||||
- Matt Gedigian
|
||||
- Mike Ditton
|
||||
- Nate Figz
|
||||
- Patryk
|
||||
- Paul O'Fallon
|
||||
- Philipp Schürch
|
||||
- Tracey Duffy
|
||||
- Quaxim
|
||||
- Richeir
|
||||
- Sergio Navarro Fernández
|
||||
- Shad Narcher
|
||||
- ShadowVoyd
|
||||
- SmartNET.works
|
||||
- Stepan Sokolovskyi
|
||||
- Zach Crawford
|
||||
- Zach Maynard
|
||||
- 张白驹
|
||||
|
||||
</td></tr></tbody></table>
|
||||
</div>
|
||||
|
||||
<h2 align="center">OpenCollective Backers</h2>
|
||||
|
||||
Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/wikijs#backer)]
|
||||
|
||||
<a href="https://opencollective.com/wikijs#backers" target="_blank"><img src="https://opencollective.com/wikijs/backers.svg?width=890"></a>
|
||||
|
||||
<h2 align="center">Contributors</h2>
|
||||
|
||||
This project exists thanks to all the people who contribute. [[Contribute]](https://github.com/Requarks/wiki/blob/master/.github/CONTRIBUTING.md).
|
||||
<a href="https://github.com/Requarks/wiki/graphs/contributors"><img src="https://opencollective.com/wikijs/contributors.svg?width=890" /></a>
|
||||
|
||||
<h2 align="center">Special Thanks</h2>
|
||||
|
||||

|
||||
[Browserstack](https://www.browserstack.com/) for providing access to their great cross-browser testing tools.
|
||||
|
||||

|
||||
[Cloudflare](https://www.cloudflare.com/) for providing their great CDN, SSL and advanced networking services.
|
||||
|
||||

|
||||
[DigitalOcean](https://m.do.co/c/5f7445bfa4d0) for providing hosting of the Wiki.js documentation site and APIs.
|
||||
|
||||

|
||||
[Icons8](https://icons8.com/) for providing access to their beautiful icon sets.
|
||||
|
||||

|
||||
[Lokalise](https://lokalise.com/) for providing access to their great localization tool.
|
||||
|
||||

|
||||
[MacStadium](https://www.macstadium.com) for providing access to their Mac hardware in the cloud.
|
||||
|
||||

|
||||
[Netlify](https://www.netlify.com) for providing hosting for our website.
|
||||
|
||||

|
||||
[ngrok](https://ngrok.com) for providing access to their great HTTP tunneling services.
|
||||
|
||||

|
||||
[Porkbun](https://www.porkbun.com) for providing domain registration services.
|
||||
# Shadows Over Westgate Wiki.js Deployment Guide
|
||||
|
||||
This repository is a Wiki.js 2.x application checkout with the custom `westgate`
|
||||
theme built into `client/themes/westgate`.
|
||||
|
||||
The important deployment detail: Wiki.js custom themes are compiled into the
|
||||
application bundle. You cannot deploy the stock `ghcr.io/requarks/wiki:2` image
|
||||
and expect this theme to appear. Build this repository into a custom Wiki.js
|
||||
image, then run that image with PostgreSQL.
|
||||
|
||||
Official references:
|
||||
|
||||
- Wiki.js install overview: https://docs.requarks.io/s/en/install
|
||||
- Wiki.js Docker install guide: https://docs.requarks.io/s/en/install/docker
|
||||
- Wiki.js requirements: https://docs.requarks.io/s/en/install/requirements
|
||||
|
||||
## Recommended VPS Shape
|
||||
|
||||
For a small wiki, use a VPS with:
|
||||
|
||||
- Ubuntu 22.04 or 24.04 LTS.
|
||||
- 2 CPU cores if possible. Wiki.js can run on 1 core, but 2 is better.
|
||||
- At least 1 GB RAM; 2 GB is more comfortable.
|
||||
- Enough disk for uploaded assets and database backups.
|
||||
- A DNS record such as `wiki.example.com` pointed at the VPS.
|
||||
|
||||
Wiki.js requires a real domain or subdomain. It is not designed to live under a
|
||||
subpath such as `example.com/wiki`.
|
||||
|
||||
## Install Docker On The VPS
|
||||
|
||||
Use Docker Compose so Wiki.js and PostgreSQL are managed together.
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install -y ca-certificates curl git
|
||||
sudo install -m 0755 -d /etc/apt/keyrings
|
||||
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
||||
sudo chmod a+r /etc/apt/keyrings/docker.gpg
|
||||
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list >/dev/null
|
||||
sudo apt update
|
||||
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
||||
```
|
||||
|
||||
Optional, but convenient:
|
||||
|
||||
```bash
|
||||
sudo usermod -aG docker "$USER"
|
||||
newgrp docker
|
||||
```
|
||||
|
||||
## Clone This Repository
|
||||
|
||||
```bash
|
||||
sudo mkdir -p /opt/westgate
|
||||
sudo chown "$USER":"$USER" /opt/westgate
|
||||
cd /opt/westgate
|
||||
git clone <YOUR_REPO_URL> wiki
|
||||
cd wiki
|
||||
```
|
||||
|
||||
Use the private Shadows Over Westgate repository URL in place of
|
||||
`<YOUR_REPO_URL>`.
|
||||
|
||||
## Create Production Compose Files
|
||||
|
||||
Create a deployment directory outside the checkout:
|
||||
|
||||
```bash
|
||||
sudo mkdir -p /opt/westgate/deploy
|
||||
sudo chown "$USER":"$USER" /opt/westgate/deploy
|
||||
cd /opt/westgate/deploy
|
||||
```
|
||||
|
||||
Create `.env`:
|
||||
|
||||
```bash
|
||||
cat > .env <<'EOF'
|
||||
POSTGRES_DB=wiki
|
||||
POSTGRES_USER=wikijs
|
||||
POSTGRES_PASSWORD=change-this-long-random-password
|
||||
WIKI_IMAGE=westgate-wikijs:latest
|
||||
WIKI_HTTP_PORT=3000
|
||||
EOF
|
||||
```
|
||||
|
||||
Create `docker-compose.yml`:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
db:
|
||||
image: postgres:15-alpine
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
POSTGRES_DB: ${POSTGRES_DB}
|
||||
POSTGRES_USER: ${POSTGRES_USER}
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
volumes:
|
||||
- db-data:/var/lib/postgresql/data
|
||||
|
||||
wiki:
|
||||
image: ${WIKI_IMAGE}
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
- db
|
||||
environment:
|
||||
DB_TYPE: postgres
|
||||
DB_HOST: db
|
||||
DB_PORT: 5432
|
||||
DB_USER: ${POSTGRES_USER}
|
||||
DB_PASS: ${POSTGRES_PASSWORD}
|
||||
DB_NAME: ${POSTGRES_DB}
|
||||
ports:
|
||||
- "${WIKI_HTTP_PORT}:3000"
|
||||
volumes:
|
||||
- wiki-content:/wiki/data/content
|
||||
|
||||
volumes:
|
||||
db-data:
|
||||
wiki-content:
|
||||
```
|
||||
|
||||
This keeps PostgreSQL data and Wiki.js local content in Docker volumes.
|
||||
|
||||
## Build The Custom Westgate Image
|
||||
|
||||
From the repository checkout:
|
||||
|
||||
```bash
|
||||
cd /opt/westgate/wiki
|
||||
docker build -f dev/build/Dockerfile -t westgate-wikijs:latest .
|
||||
```
|
||||
|
||||
That Dockerfile runs the application build, including:
|
||||
|
||||
- `client/themes/westgate/scss/app.scss`
|
||||
- `client/themes/westgate/js/app.js`
|
||||
- `client/themes/westgate/components/`
|
||||
- shared Wiki.js client components and generated server views
|
||||
|
||||
This is the step that makes the custom theme exist in production.
|
||||
|
||||
## Start Wiki.js
|
||||
|
||||
```bash
|
||||
cd /opt/westgate/deploy
|
||||
docker compose up -d
|
||||
docker compose logs -f wiki
|
||||
```
|
||||
|
||||
Open:
|
||||
|
||||
```text
|
||||
http://YOUR_SERVER_IP:3000
|
||||
```
|
||||
|
||||
Complete the first-run Wiki.js setup in the browser.
|
||||
|
||||
## Put It Behind HTTPS
|
||||
|
||||
For a public VPS, put a reverse proxy in front of Wiki.js. Caddy is the simplest:
|
||||
|
||||
```bash
|
||||
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
|
||||
curl -1sLf https://dl.cloudsmith.io/public/caddy/stable/gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
|
||||
curl -1sLf https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt | sudo tee /etc/apt/sources.list.d/caddy-stable.list
|
||||
sudo apt update
|
||||
sudo apt install -y caddy
|
||||
```
|
||||
|
||||
Create `/etc/caddy/Caddyfile`:
|
||||
|
||||
```caddyfile
|
||||
wiki.example.com {
|
||||
reverse_proxy 127.0.0.1:3000
|
||||
}
|
||||
```
|
||||
|
||||
Reload Caddy:
|
||||
|
||||
```bash
|
||||
sudo systemctl reload caddy
|
||||
```
|
||||
|
||||
Caddy will request and renew TLS certificates automatically. Replace
|
||||
`wiki.example.com` with the real wiki hostname.
|
||||
|
||||
If using Caddy, keep the compose port bound to localhost only:
|
||||
|
||||
```yaml
|
||||
ports:
|
||||
- "127.0.0.1:3000:3000"
|
||||
```
|
||||
|
||||
Then restart:
|
||||
|
||||
```bash
|
||||
cd /opt/westgate/deploy
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
## Select The Westgate Theme
|
||||
|
||||
After the first run, sign into Wiki.js as an administrator.
|
||||
|
||||
In the admin interface, choose the `Westgate` theme if it appears in the theme
|
||||
settings. If the admin UI does not expose it cleanly, set it directly in the
|
||||
database.
|
||||
|
||||
Enter PostgreSQL:
|
||||
|
||||
```bash
|
||||
cd /opt/westgate/deploy
|
||||
docker compose exec db psql -U wikijs -d wiki
|
||||
```
|
||||
|
||||
Inspect the theming setting:
|
||||
|
||||
```sql
|
||||
SELECT key, value FROM settings WHERE key = 'theming';
|
||||
```
|
||||
|
||||
The `value` column is JSON. Make sure its `theme` property is `westgate`, then
|
||||
restart Wiki.js:
|
||||
|
||||
```bash
|
||||
docker compose restart wiki
|
||||
```
|
||||
|
||||
The exact JSON shape can vary with Wiki.js settings, so inspect before updating.
|
||||
Do not blindly overwrite unrelated theming settings.
|
||||
|
||||
## Updating The Site
|
||||
|
||||
When this repository changes:
|
||||
|
||||
```bash
|
||||
cd /opt/westgate/wiki
|
||||
git pull
|
||||
docker build -f dev/build/Dockerfile -t westgate-wikijs:latest .
|
||||
cd /opt/westgate/deploy
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
If the database schema changes during a Wiki.js upgrade, watch the logs:
|
||||
|
||||
```bash
|
||||
docker compose logs -f wiki
|
||||
```
|
||||
|
||||
## Backups
|
||||
|
||||
Back up PostgreSQL:
|
||||
|
||||
```bash
|
||||
cd /opt/westgate/deploy
|
||||
docker compose exec db pg_dump -U wikijs wiki > wiki-$(date +%F).sql
|
||||
```
|
||||
|
||||
Back up Docker volumes if you use local file storage:
|
||||
|
||||
```bash
|
||||
docker run --rm \
|
||||
-v deploy_wiki-content:/data:ro \
|
||||
-v "$PWD":/backup \
|
||||
alpine tar czf /backup/wiki-content-$(date +%F).tar.gz -C /data .
|
||||
```
|
||||
|
||||
Keep backups off the VPS as well as on it.
|
||||
|
||||
## Development Notes
|
||||
|
||||
Inside the development container, use:
|
||||
|
||||
```bash
|
||||
yarn dev
|
||||
```
|
||||
|
||||
`yarn dev` live-reloads theme and client changes. During visual iteration, do
|
||||
not repeatedly run `yarn build`. Use `yarn build` for production-style validation
|
||||
or when building the deploy image.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
If the site loads but does not look like Westgate:
|
||||
|
||||
- Confirm the deployed image was built from this repository.
|
||||
- Confirm the active theme setting is `westgate`.
|
||||
- Confirm the browser is not serving stale assets.
|
||||
- Rebuild the image after theme changes.
|
||||
|
||||
If Wiki.js cannot connect to the database:
|
||||
|
||||
- Confirm `DB_HOST` matches the compose service name, usually `db`.
|
||||
- Confirm `POSTGRES_USER`, `POSTGRES_PASSWORD`, and `POSTGRES_DB` match the
|
||||
Wiki.js environment variables.
|
||||
- Check `docker compose logs db` and `docker compose logs wiki`.
|
||||
|
||||
If HTTPS does not work:
|
||||
|
||||
- Confirm DNS points to the VPS.
|
||||
- Confirm ports 80 and 443 are open in the VPS firewall/security group.
|
||||
- Check `sudo journalctl -u caddy -f`.
|
||||
|
||||
Loading…
Reference in new issue