mirror of
https://github.com/Ocelot-Social-Community/Ocelot-Social.git
synced 2025-12-12 23:35:58 +00:00
Merge branch 'master' into 6847-upgrade-cert-manager-version
This commit is contained in:
commit
1036c20e04
3
.github/workflows/check-documentation.yml
vendored
3
.github/workflows/check-documentation.yml
vendored
@ -28,12 +28,13 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@master
|
uses: actions/checkout@master
|
||||||
|
- name: Remove old documentation files
|
||||||
|
run: rm -rf ./deployment/src/old/ # workaround until https://github.com/gaurav-nelson/github-action-markdown-link-check/pull/183 has been done
|
||||||
- name: Check Markdown Links
|
- name: Check Markdown Links
|
||||||
uses: gaurav-nelson/github-action-markdown-link-check@master
|
uses: gaurav-nelson/github-action-markdown-link-check@master
|
||||||
with:
|
with:
|
||||||
use-quiet-mode: 'yes'
|
use-quiet-mode: 'yes'
|
||||||
use-verbose-mode: 'no'
|
use-verbose-mode: 'no'
|
||||||
# at any .md file change take the chance to check the links in all .md files
|
|
||||||
check-modified-files-only: 'no'
|
check-modified-files-only: 'no'
|
||||||
config-file: '.github/workflows/mlc_config.json'
|
config-file: '.github/workflows/mlc_config.json'
|
||||||
base-branch: 'master'
|
base-branch: 'master'
|
||||||
|
|||||||
2
.github/workflows/mlc_config.json
vendored
2
.github/workflows/mlc_config.json
vendored
@ -3,7 +3,7 @@
|
|||||||
"retryOn429": true,
|
"retryOn429": true,
|
||||||
"retryCount": 2,
|
"retryCount": 2,
|
||||||
"fallbackRetryDelay": "30s",
|
"fallbackRetryDelay": "30s",
|
||||||
"aliveStatusCodes": [200, 206],
|
"aliveStatusCodes": [200, 206, 303, 403],
|
||||||
"ignorePatterns": [
|
"ignorePatterns": [
|
||||||
{
|
{
|
||||||
"pattern": "^(https:\/\/github.com\/Ocelot-Social-Community\/Ocelot-Social\/pull\/|http:\/\/localhost)"
|
"pattern": "^(https:\/\/github.com\/Ocelot-Social-Community\/Ocelot-Social\/pull\/|http:\/\/localhost)"
|
||||||
|
|||||||
11
.vuepress/config.js
Normal file
11
.vuepress/config.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import { defineUserConfig } from 'vuepress'
|
||||||
|
import meta from './config/meta'
|
||||||
|
import theme from './config/theme'
|
||||||
|
import plugins from './config/plugins'
|
||||||
|
|
||||||
|
export default defineUserConfig({
|
||||||
|
pagePatterns: ['**/*.md', '!.vuepress', '!node_modules', '!backend/node_modules', '!webapp/node_modules', '!deployment/src/old'],
|
||||||
|
...meta,
|
||||||
|
theme,
|
||||||
|
plugins,
|
||||||
|
})
|
||||||
8
.vuepress/config/meta.js
Normal file
8
.vuepress/config/meta.js
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
export default {
|
||||||
|
base: '/',
|
||||||
|
title: 'Ocelot.Social Documentation',
|
||||||
|
description: 'Ocelot.Social Documentation',
|
||||||
|
head: [
|
||||||
|
['meta', {name: 'viewport', content: 'width=device-width,initial-scale=1'}],
|
||||||
|
],
|
||||||
|
}
|
||||||
18
.vuepress/config/plugins.js
Normal file
18
.vuepress/config/plugins.js
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import { searchProPlugin } from 'vuepress-plugin-search-pro'
|
||||||
|
|
||||||
|
export default [
|
||||||
|
searchProPlugin({
|
||||||
|
indexContent: true,
|
||||||
|
autoSuggestions: true,
|
||||||
|
customFields: [
|
||||||
|
{
|
||||||
|
getter: (page) => page.frontmatter.category,
|
||||||
|
formatter: "Category: $content",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
getter: (page) => page.frontmatter.tag,
|
||||||
|
formatter: "Tag: $content",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})
|
||||||
|
]
|
||||||
82
.vuepress/config/theme.js
Normal file
82
.vuepress/config/theme.js
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
import path from 'path'
|
||||||
|
import fs from 'fs'
|
||||||
|
import { hopeTheme } from 'vuepress-theme-hope'
|
||||||
|
|
||||||
|
export default hopeTheme({
|
||||||
|
favicon: 'favicon.ico',
|
||||||
|
logo: '/logo.svg',
|
||||||
|
docsRepo: 'https://github.com/Ocelot-Social-Community/Ocelot-Social',
|
||||||
|
docsBranch: 'master',
|
||||||
|
docsDir: '.',
|
||||||
|
editLink: true,
|
||||||
|
lastUpdated: false,
|
||||||
|
contributors: false,
|
||||||
|
print: false,
|
||||||
|
pure: true,
|
||||||
|
displayFooter: true,
|
||||||
|
footer: 'CC BY busFaktor() e.V. & Authors',
|
||||||
|
sidebar: generateSidebar('../../SUMMARY.md'),
|
||||||
|
navbar: [
|
||||||
|
{ text: 'Home', link: '/' },
|
||||||
|
{
|
||||||
|
text: 'Github',
|
||||||
|
link: 'https://github.com/Ocelot-Social-Community/Ocelot-Social'
|
||||||
|
},
|
||||||
|
],
|
||||||
|
plugins: {
|
||||||
|
mdEnhance: {
|
||||||
|
tabs: true,
|
||||||
|
imgSize: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
function generateSidebar(summaryFileName) {
|
||||||
|
const summaryFile = path.resolve(__dirname, summaryFileName)
|
||||||
|
|
||||||
|
try {
|
||||||
|
return getSummaryData(summaryFile)
|
||||||
|
} catch (err) {
|
||||||
|
console.error(`Error generating sidebar from file ${summaryFileName}:`, err)
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSummaryData(file) {
|
||||||
|
const lines = fs.readFileSync(file, 'utf8').split('\n')
|
||||||
|
const sidebarStructure = []
|
||||||
|
let currentParent = null
|
||||||
|
|
||||||
|
lines.forEach((line, i) => {
|
||||||
|
const level = line.search(/\S|$/) / 2
|
||||||
|
const match = line.match(/^\s*\*\s*\[([^\]]+)\]\(([^)]+)\)/)
|
||||||
|
|
||||||
|
if (match) {
|
||||||
|
const newEntry = { text: match[1], link: `/${match[2]}`, children: [] }
|
||||||
|
if (level === 0) {
|
||||||
|
sidebarStructure.push(newEntry)
|
||||||
|
currentParent = sidebarStructure[sidebarStructure.length - 1]
|
||||||
|
} else {
|
||||||
|
let parent = currentParent
|
||||||
|
|
||||||
|
for (let i = 1; i < level; i++) {
|
||||||
|
parent = parent.children[parent.children.length - 1]
|
||||||
|
}
|
||||||
|
|
||||||
|
parent.children.push(newEntry)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
sidebarStructure.forEach(removeEmptyArrays)
|
||||||
|
return sidebarStructure
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeEmptyArrays(item) {
|
||||||
|
if (item.children && item.children.length === 0) {
|
||||||
|
delete item.children;
|
||||||
|
} else if (item.children) {
|
||||||
|
item.children.forEach(removeEmptyArrays);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
BIN
.vuepress/public/favicon.ico
Normal file
BIN
.vuepress/public/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.4 KiB |
65
.vuepress/public/logo.svg
Normal file
65
.vuepress/public/logo.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 28 KiB |
@ -1,10 +1,10 @@
|
|||||||
# CONTRIBUTING
|
# CONTRIBUTING
|
||||||
|
|
||||||
Thank you so much for thinking of contributing to the [ocelot.social](https://ocelot.social) project! It's awesome you're here, we really appreciate it. :-\)
|
Thank you so much for thinking of contributing to the <!-- [ -->ocelot.social<!-- ](https://ocelot.social) --> project! It's awesome you're here, we really appreciate it. :-\)
|
||||||
|
|
||||||
## Getting Set Up
|
## Getting Set Up
|
||||||
|
|
||||||
Instructions for how to install all the necessary software and some code guidelines can be found in our main [Readme](/README.md) or in our [documentation](/SUMMARY.md).
|
Instructions for how to install all the necessary software and some code guidelines can be found in our main [Readme](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/README.md) or in our [documentation](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/SUMMARY.md).
|
||||||
|
|
||||||
To get you started we recommend that you join forces with a regular contributor. Please join [our Discord instance](https://discord.gg/AJSX9DCSUA) to chat with developers or just get in touch directly on an issue on either [Github](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues) or [Zenhub](https://app.zenhub.com/workspaces/ocelotsocial-5fb21ff922cb410015dd6535/board?filterLogic=any&repos=301151089):
|
To get you started we recommend that you join forces with a regular contributor. Please join [our Discord instance](https://discord.gg/AJSX9DCSUA) to chat with developers or just get in touch directly on an issue on either [Github](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues) or [Zenhub](https://app.zenhub.com/workspaces/ocelotsocial-5fb21ff922cb410015dd6535/board?filterLogic=any&repos=301151089):
|
||||||
|
|
||||||
@ -36,7 +36,7 @@ Every pull request needs to:
|
|||||||
|
|
||||||
## Contribution Flow For Open Source Contributors
|
## Contribution Flow For Open Source Contributors
|
||||||
|
|
||||||
See [contributing in main README.md](/README.md#contributing)
|
See [contributing in main README.md](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/README.md#contributing)
|
||||||
|
|
||||||
## The Team
|
## The Team
|
||||||
|
|
||||||
@ -48,6 +48,9 @@ You can talk to our core team on [Discord](https://discord.gg/AJSX9DCSUA). And o
|
|||||||
* Moriz (@Mogge)
|
* Moriz (@Mogge)
|
||||||
* Wolle (@Tirokk)
|
* Wolle (@Tirokk)
|
||||||
* Alex (@ogerly)
|
* Alex (@ogerly)
|
||||||
|
* Hannes (@elweyn5803)
|
||||||
|
* Mathias (@mahula)
|
||||||
|
* Markus (@maeckes#1133)
|
||||||
|
|
||||||
<!-- * Robert (@roschaefer)
|
<!-- * Robert (@roschaefer)
|
||||||
* Matt (@mattwr18)
|
* Matt (@mattwr18)
|
||||||
|
|||||||
20
README.md
20
README.md
@ -2,15 +2,17 @@
|
|||||||
|
|
||||||
[](https://github.com/Ocelot-Social-Community/Ocelot-Social/actions)
|
[](https://github.com/Ocelot-Social-Community/Ocelot-Social/actions)
|
||||||
[](https://github.com/Ocelot-Social-Community/Ocelot-Social/actions)
|
[](https://github.com/Ocelot-Social-Community/Ocelot-Social/actions)
|
||||||
[](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/LICENSE.md)
|
[](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/LICENSE.md)
|
||||||
[](https://discord.gg/AJSX9DCSUA)
|
[](https://discord.gg/AJSX9DCSUA)
|
||||||
[](https://www.codetriage.com/ocelot-social-community/ocelot-social)
|
[](https://www.codetriage.com/ocelot-social-community/ocelot-social)
|
||||||
|
|
||||||
[Ocelot.social](https://ocelot.social) is free and open source software program code to run social networks. Its development is supported by a community of programmers and interested network operators.
|
<!-- [ -->Ocelot.social<!-- ](<https://ocelot.social>) --> is free and open source software program code to run social networks. Its development is supported by a community of programmers and interested network operators.
|
||||||
|
|
||||||
<!-- markdownlint-disable MD033 -->
|
<!-- markdownlint-disable MD033 -->
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://ocelot.social" target="_blank"><img src="webapp/static/img/custom/logo-squared.svg" alt="ocelot.social" width="40%" height="40%"></a>
|
<!-- <a href="https://ocelot.social" target="_blank"> -->
|
||||||
|
<img src="https://raw.githubusercontent.com/Ocelot-Social-Community/Ocelot-Social/master/webapp/static/img/custom/logo-squared.svg" alt="ocelot.social" width="40%" height="40%">
|
||||||
|
<!-- </a> -->
|
||||||
</p>
|
</p>
|
||||||
<!-- markdownlint-enable MD033 -->
|
<!-- markdownlint-enable MD033 -->
|
||||||
|
|
||||||
@ -67,13 +69,13 @@ Try out our live demo network, see [here](#live-demo-and-developer-logins).
|
|||||||
If you're wondering how you could help, there are plenty of ways, e.g.:
|
If you're wondering how you could help, there are plenty of ways, e.g.:
|
||||||
|
|
||||||
- Spread the good word about ocelot.social to make it more popular:
|
- Spread the good word about ocelot.social to make it more popular:
|
||||||
- Add the link [ocelot.social](https://ocelot.social) to your website.
|
- Add the link <!-- [ -->ocelot.social<!-- ](https://ocelot.social)--> to your website.
|
||||||
- Give ocelot.social a Like at <https://alternativeto.net/software/ocelot-social/>.
|
- Give ocelot.social a Like at <https://alternativeto.net/software/ocelot-social/>.
|
||||||
- Star our project on GitHub at <https://github.com/Ocelot-Social-Community/Ocelot-Social/>.
|
- Star our project on GitHub at <https://github.com/Ocelot-Social-Community/Ocelot-Social/>.
|
||||||
- Promote it on your social networks.
|
- Promote it on your social networks.
|
||||||
- Tell your friends about it by word-of-mouth.
|
- Tell your friends about it by word-of-mouth.
|
||||||
- Write a press article on ocelot.social or contact the editorial office of your local news page or radio station.
|
- Write a press article on ocelot.social or contact the editorial office of your local news page or radio station.
|
||||||
- Take a [good first issue](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) or issues that need help. Make sure to read [CONTRIBUTING.md](/CONTRIBUTING.md) first though.
|
- Take a [good first issue](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) or issues that need help. Make sure to read [CONTRIBUTING.md](./CONTRIBUTING.md) first though.
|
||||||
- Testing and [reporting](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/new/choose) bugs.
|
- Testing and [reporting](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/new/choose) bugs.
|
||||||
- Translating: Please [contact us](#contact).
|
- Translating: Please [contact us](#contact).
|
||||||
- Reviewing and testing pull requests.
|
- Reviewing and testing pull requests.
|
||||||
@ -138,11 +140,11 @@ $ cd Ocelot-Social
|
|||||||
|
|
||||||
### Live Demo and Developer Logins
|
### Live Demo and Developer Logins
|
||||||
|
|
||||||
**Try out our deployed [development environment](https://stage.ocelot.social).**
|
**Try out our deployed <!-- [ -->development environment<!--](https://stage.ocelot.social)-->.**
|
||||||
|
|
||||||
Visit our staging networks:
|
Visit our staging networks:
|
||||||
|
|
||||||
- central staging network: [stage.ocelot.social](https://stage.ocelot.social)
|
- central staging network: <!-- [ -->stage.ocelot.social<!-- ](https://stage.ocelot.social)-->
|
||||||
<!-- - rebranded staging network: [rebrand.ocelot.social](https://stage.ocelot.social). -->
|
<!-- - rebranded staging network: [rebrand.ocelot.social](https://stage.ocelot.social). -->
|
||||||
|
|
||||||
#### Login
|
#### Login
|
||||||
@ -249,7 +251,7 @@ $ yarn locales --fix
|
|||||||
$ yarn test
|
$ yarn test
|
||||||
```
|
```
|
||||||
|
|
||||||
Check out our [contribution guideline](./CONTRIBUTING.md), too!
|
Check out our [contribution guideline](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/CONTRIBUTING.md), too!
|
||||||
|
|
||||||
#### Developer Chat
|
#### Developer Chat
|
||||||
|
|
||||||
@ -303,7 +305,7 @@ Locale Icons made by [Freepik](http://www.freepik.com/) from [www.flaticon.com](
|
|||||||
Browser compatibility testing with [BrowserStack](https://www.browserstack.com/).
|
Browser compatibility testing with [BrowserStack](https://www.browserstack.com/).
|
||||||
|
|
||||||
<!-- markdownlint-disable MD033 -->
|
<!-- markdownlint-disable MD033 -->
|
||||||
<img alt="BrowserStack Logo" src=".gitbook/assets/browserstack-logo.svg" width="256">
|
<img alt="BrowserStack Logo" src="https://raw.githubusercontent.com/Ocelot-Social-Community/Ocelot-Social/master/.gitbook/assets/browserstack-logo.svg" width="256">
|
||||||
<!-- markdownlint-enable MD033 -->
|
<!-- markdownlint-enable MD033 -->
|
||||||
|
|
||||||
### License
|
### License
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
# Table of contents
|
# Table of contents
|
||||||
|
|
||||||
* [Introduction](README.md)
|
* [Introduction](README.md)
|
||||||
* [Edit this Documentation](edit-this-documentation.md)
|
|
||||||
* [Neo4J](neo4j/README.md)
|
* [Neo4J](neo4j/README.md)
|
||||||
* [Backend](backend/README.md)
|
* [Backend](backend/README.md)
|
||||||
* [GraphQL](backend/graphql.md)
|
* [GraphQL](backend/graphql.md)
|
||||||
@ -19,4 +18,5 @@
|
|||||||
* [Contributing](CONTRIBUTING.md)
|
* [Contributing](CONTRIBUTING.md)
|
||||||
* [Feature Specification](cypress/features.md)
|
* [Feature Specification](cypress/features.md)
|
||||||
* [Code of Conduct](CODE_OF_CONDUCT.md)
|
* [Code of Conduct](CODE_OF_CONDUCT.md)
|
||||||
|
* [Documentation](documentation.md)
|
||||||
* [License](LICENSE.md)
|
* [License](LICENSE.md)
|
||||||
|
|||||||
@ -83,8 +83,8 @@ More details about our GraphQL playground and how to use it with ocelot.social c
|
|||||||
|
|
||||||
Database indexes and constraints need to be created and upgraded when the database and the backend are running:
|
Database indexes and constraints need to be created and upgraded when the database and the backend are running:
|
||||||
|
|
||||||
{% tabs %}
|
::: tabs
|
||||||
{% tab title="Docker" %}
|
@tab:active Docker
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# in main folder while docker-compose is running
|
# in main folder while docker-compose is running
|
||||||
@ -102,8 +102,7 @@ $ docker compose exec backend /bin/sh -c "yarn prod:migrate init"
|
|||||||
$ docker exec backend yarn run db:migrate up
|
$ docker exec backend yarn run db:migrate up
|
||||||
```
|
```
|
||||||
|
|
||||||
{% endtab %}
|
@tab Without Docker
|
||||||
{% tab title="Without Docker" %}
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# in folder backend/ while database is running
|
# in folder backend/ while database is running
|
||||||
@ -116,16 +115,15 @@ yarn run db:migrate init
|
|||||||
yarn run db:migrate up
|
yarn run db:migrate up
|
||||||
```
|
```
|
||||||
|
|
||||||
{% endtab %}
|
:::
|
||||||
{% endtabs %}
|
|
||||||
|
|
||||||
#### Seed Database
|
#### Seed Database
|
||||||
|
|
||||||
If you want your backend to return anything else than an empty response, you
|
If you want your backend to return anything else than an empty response, you
|
||||||
need to seed your database:
|
need to seed your database:
|
||||||
|
|
||||||
{% tabs %}
|
::: tabs
|
||||||
{% tab title="Docker" %}
|
@tab:active Docker
|
||||||
|
|
||||||
In another terminal run:
|
In another terminal run:
|
||||||
|
|
||||||
@ -147,8 +145,7 @@ $ docker exec backend yarn run db:migrate init
|
|||||||
$ docker exec backend yarn run db:migrate up
|
$ docker exec backend yarn run db:migrate up
|
||||||
```
|
```
|
||||||
|
|
||||||
{% endtab %}
|
@tab Without Docker
|
||||||
{% tab title="Without Docker" %}
|
|
||||||
|
|
||||||
Run:
|
Run:
|
||||||
|
|
||||||
@ -164,16 +161,15 @@ To reset the database run:
|
|||||||
$ yarn run db:reset
|
$ yarn run db:reset
|
||||||
```
|
```
|
||||||
|
|
||||||
{% endtab %}
|
:::
|
||||||
{% endtabs %}
|
|
||||||
|
|
||||||
### Data migrations
|
### Data migrations
|
||||||
|
|
||||||
Although Neo4J is schema-less,you might find yourself in a situation in which
|
Although Neo4J is schema-less,you might find yourself in a situation in which
|
||||||
you have to migrate your data e.g. because your data modeling has changed.
|
you have to migrate your data e.g. because your data modeling has changed.
|
||||||
|
|
||||||
{% tabs %}
|
::: tabs
|
||||||
{% tab title="Docker" %}
|
@tab:active Docker
|
||||||
|
|
||||||
Generate a data migration file:
|
Generate a data migration file:
|
||||||
|
|
||||||
@ -190,8 +186,7 @@ To run the migration:
|
|||||||
$ docker exec backend yarn run db:migrate up
|
$ docker exec backend yarn run db:migrate up
|
||||||
```
|
```
|
||||||
|
|
||||||
{% endtab %}
|
@tab Without Docker
|
||||||
{% tab title="Without Docker" %}
|
|
||||||
|
|
||||||
Generate a data migration file:
|
Generate a data migration file:
|
||||||
|
|
||||||
@ -208,16 +203,15 @@ To run the migration:
|
|||||||
$ yarn run db:migrate up
|
$ yarn run db:migrate up
|
||||||
```
|
```
|
||||||
|
|
||||||
{% endtab %}
|
:::
|
||||||
{% endtabs %}
|
|
||||||
|
|
||||||
## Testing
|
## Testing
|
||||||
|
|
||||||
**Beware**: We have no multiple database setup at the moment. We clean the
|
**Beware**: We have no multiple database setup at the moment. We clean the
|
||||||
database after each test, running the tests will wipe out all your data!
|
database after each test, running the tests will wipe out all your data!
|
||||||
|
|
||||||
{% tabs %}
|
::: tabs
|
||||||
{% tab title="Docker" %}
|
@tab:active Docker
|
||||||
|
|
||||||
Run the unit tests:
|
Run the unit tests:
|
||||||
|
|
||||||
@ -226,9 +220,7 @@ Run the unit tests:
|
|||||||
$ docker exec backend yarn run test
|
$ docker exec backend yarn run test
|
||||||
```
|
```
|
||||||
|
|
||||||
{% endtab %}
|
@tab Without Docker
|
||||||
|
|
||||||
{% tab title="Without Docker" %}
|
|
||||||
|
|
||||||
Run the unit tests:
|
Run the unit tests:
|
||||||
|
|
||||||
@ -237,5 +229,4 @@ Run the unit tests:
|
|||||||
$ yarn run test
|
$ yarn run test
|
||||||
```
|
```
|
||||||
|
|
||||||
{% endtab %}
|
:::
|
||||||
{% endtabs %}
|
|
||||||
|
|||||||
@ -100,13 +100,11 @@
|
|||||||
"@typescript-eslint/eslint-plugin": "^5.57.1",
|
"@typescript-eslint/eslint-plugin": "^5.57.1",
|
||||||
"@typescript-eslint/parser": "^5.57.1",
|
"@typescript-eslint/parser": "^5.57.1",
|
||||||
"apollo-server-testing": "~2.11.0",
|
"apollo-server-testing": "~2.11.0",
|
||||||
"chai": "~4.3.8",
|
|
||||||
"cucumber": "~6.0.5",
|
|
||||||
"eslint": "^8.37.0",
|
"eslint": "^8.37.0",
|
||||||
"eslint-config-prettier": "^9.0.0",
|
"eslint-config-prettier": "^9.0.0",
|
||||||
"eslint-config-standard": "^17.0.0",
|
"eslint-config-standard": "^17.0.0",
|
||||||
"eslint-import-resolver-typescript": "^3.6.1",
|
"eslint-import-resolver-typescript": "^3.6.1",
|
||||||
"eslint-plugin-import": "^2.27.5",
|
"eslint-plugin-import": "^2.29.0",
|
||||||
"eslint-plugin-jest": "^27.2.1",
|
"eslint-plugin-jest": "^27.2.1",
|
||||||
"eslint-plugin-n": "^15.7.0",
|
"eslint-plugin-n": "^15.7.0",
|
||||||
"eslint-plugin-prettier": "^4.2.1",
|
"eslint-plugin-prettier": "^4.2.1",
|
||||||
|
|||||||
@ -1,35 +1,11 @@
|
|||||||
import Factory, { cleanDatabase } from '../db/factories'
|
import Factory, { cleanDatabase } from '../db/factories'
|
||||||
import { getDriver, getNeode } from '../db/neo4j'
|
import { getDriver, getNeode } from '../db/neo4j'
|
||||||
import decode from './decode'
|
import decode from './decode'
|
||||||
|
import encode from './encode'
|
||||||
|
|
||||||
const driver = getDriver()
|
const driver = getDriver()
|
||||||
const neode = getNeode()
|
const neode = getNeode()
|
||||||
|
|
||||||
// here is the decoded JWT token:
|
|
||||||
// {
|
|
||||||
// role: 'user',
|
|
||||||
// locationName: null,
|
|
||||||
// name: 'Jenny Rostock',
|
|
||||||
// about: null,
|
|
||||||
// avatar: 'https://s3.amazonaws.com/uifaces/faces/twitter/sasha_shestakov/128.jpg',
|
|
||||||
// id: 'u3',
|
|
||||||
// email: 'user@example.org',
|
|
||||||
// slug: 'jenny-rostock',
|
|
||||||
// iat: 1550846680,
|
|
||||||
// exp: 1637246680,
|
|
||||||
// aud: 'http://localhost:3000',
|
|
||||||
// iss: 'http://localhost:4000',
|
|
||||||
// sub: 'u3'
|
|
||||||
// }
|
|
||||||
// !!! if the token expires go into the GraphQL Playground in the browser at 'http://localhost:4000' with a running backend and a seeded Neo4j database
|
|
||||||
// now do the login mutation:
|
|
||||||
// mutation {
|
|
||||||
// login(email:"user@example.org", password:"1234")
|
|
||||||
// }
|
|
||||||
// replace this token here with the one you received as the result
|
|
||||||
export const validAuthorizationHeader =
|
|
||||||
'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6InUzIiwibmFtZSI6Ikplbm55IFJvc3RvY2siLCJzbHVnIjoiamVubnktcm9zdG9jayIsImlhdCI6MTYzNzY0NDMwMCwiZXhwIjoxNzAwNzU5NTAwLCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjMwMDAiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjQwMDAiLCJzdWIiOiJ1MyJ9.ispIfRfgkXuYoIhKx7x2jPxgvHDJVv1ogMycLmfUnsk'
|
|
||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
await cleanDatabase()
|
await cleanDatabase()
|
||||||
})
|
})
|
||||||
@ -75,14 +51,8 @@ describe('decode', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
describe('given valid JWT Bearer token', () => {
|
describe('given valid JWT Bearer token', () => {
|
||||||
beforeEach(() => {
|
|
||||||
authorizationHeader = validAuthorizationHeader
|
|
||||||
})
|
|
||||||
|
|
||||||
it('returns null', returnsNull)
|
|
||||||
|
|
||||||
describe('and corresponding user in the database', () => {
|
describe('and corresponding user in the database', () => {
|
||||||
let user
|
let user, validAuthorizationHeader
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
user = await Factory.build(
|
user = await Factory.build(
|
||||||
'user',
|
'user',
|
||||||
@ -99,10 +69,11 @@ describe('decode', () => {
|
|||||||
email: 'user@example.org',
|
email: 'user@example.org',
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
validAuthorizationHeader = encode(await user.toJson())
|
||||||
})
|
})
|
||||||
|
|
||||||
it('returns user object without email', async () => {
|
it('returns user object without email', async () => {
|
||||||
await expect(decode(driver, authorizationHeader)).resolves.toMatchObject({
|
await expect(decode(driver, validAuthorizationHeader)).resolves.toMatchObject({
|
||||||
role: 'user',
|
role: 'user',
|
||||||
name: 'Jenny Rostock',
|
name: 'Jenny Rostock',
|
||||||
id: 'u3',
|
id: 'u3',
|
||||||
@ -113,7 +84,7 @@ describe('decode', () => {
|
|||||||
it('sets `lastActiveAt`', async () => {
|
it('sets `lastActiveAt`', async () => {
|
||||||
let user = await neode.first('User', { id: 'u3' })
|
let user = await neode.first('User', { id: 'u3' })
|
||||||
await expect(user.toJson()).resolves.not.toHaveProperty('lastActiveAt')
|
await expect(user.toJson()).resolves.not.toHaveProperty('lastActiveAt')
|
||||||
await decode(driver, authorizationHeader)
|
await decode(driver, validAuthorizationHeader)
|
||||||
user = await neode.first('User', { id: 'u3' })
|
user = await neode.first('User', { id: 'u3' })
|
||||||
await expect(user.toJson()).resolves.toMatchObject({
|
await expect(user.toJson()).resolves.toMatchObject({
|
||||||
lastActiveAt: expect.any(String),
|
lastActiveAt: expect.any(String),
|
||||||
@ -129,7 +100,7 @@ describe('decode', () => {
|
|||||||
await expect(user.toJson()).resolves.toMatchObject({
|
await expect(user.toJson()).resolves.toMatchObject({
|
||||||
lastActiveAt: '2019-10-03T23:33:08.598Z',
|
lastActiveAt: '2019-10-03T23:33:08.598Z',
|
||||||
})
|
})
|
||||||
await decode(driver, authorizationHeader)
|
await decode(driver, validAuthorizationHeader)
|
||||||
user = await neode.first('User', { id: 'u3' })
|
user = await neode.first('User', { id: 'u3' })
|
||||||
await expect(user.toJson()).resolves.toMatchObject({
|
await expect(user.toJson()).resolves.toMatchObject({
|
||||||
// should be a different time by now ;)
|
// should be a different time by now ;)
|
||||||
@ -152,6 +123,15 @@ describe('decode', () => {
|
|||||||
|
|
||||||
it('returns null', returnsNull)
|
it('returns null', returnsNull)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('and NO corresponding user in the database', () => {
|
||||||
|
beforeEach(async () => {
|
||||||
|
await cleanDatabase()
|
||||||
|
authorizationHeader = validAuthorizationHeader
|
||||||
|
})
|
||||||
|
|
||||||
|
it('returns null', returnsNull)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -14,9 +14,9 @@ The following features will be implemented. This gets done in three steps:
|
|||||||
2. In a second step we will make our prototype publicly available with an advanced feature set including the technology and organizational structure to drive a bigger public social network.
|
2. In a second step we will make our prototype publicly available with an advanced feature set including the technology and organizational structure to drive a bigger public social network.
|
||||||
3. In a third step all the remaining features will be implemented to build the full product.
|
3. In a third step all the remaining features will be implemented to build the full product.
|
||||||
|
|
||||||
### User Account
|
The implemented features can be found [here](https://github.com/Ocelot-Social-Community/Ocelot-Social/tree/master/cypress/e2e)
|
||||||
|
|
||||||
[Cucumber Features](https://github.com/Ocelot-Social-Community/Ocelot-Social/tree/master/cypress/integration/user_account)
|
### User Account
|
||||||
|
|
||||||
* Sign-up
|
* Sign-up
|
||||||
* Agree to Data Privacy Statement
|
* Agree to Data Privacy Statement
|
||||||
@ -34,8 +34,6 @@ The following features will be implemented. This gets done in three steps:
|
|||||||
|
|
||||||
### User Profile
|
### User Profile
|
||||||
|
|
||||||
[Cucumber Features](https://github.com/Ocelot-Social-Community/Ocelot-Social/tree/master/cypress/integration/user_profile)
|
|
||||||
|
|
||||||
* Upload and Change Avatar
|
* Upload and Change Avatar
|
||||||
* Upload and Change Profile Picture
|
* Upload and Change Profile Picture
|
||||||
* Edit Social Media Accounts
|
* Edit Social Media Accounts
|
||||||
@ -46,8 +44,6 @@ The following features will be implemented. This gets done in three steps:
|
|||||||
|
|
||||||
### Dashboard
|
### Dashboard
|
||||||
|
|
||||||
[Clickdummy](https://preview.uxpin.com/24a2ab8adcd84f9a763d87ed27251351225e0ecd#/pages/99768919/simulate/sitemap?mode=i)
|
|
||||||
|
|
||||||
* Show Link to own Profile
|
* Show Link to own Profile
|
||||||
* Show Friends Widget
|
* Show Friends Widget
|
||||||
* Show Favorites Widget
|
* Show Favorites Widget
|
||||||
@ -59,8 +55,6 @@ The following features will be implemented. This gets done in three steps:
|
|||||||
|
|
||||||
### Posts
|
### Posts
|
||||||
|
|
||||||
[Cucumber Features](https://github.com/Ocelot-Social-Community/Ocelot-Social/tree/master/cypress/integration/post)
|
|
||||||
|
|
||||||
* Creating Posts
|
* Creating Posts
|
||||||
* Persistent Links
|
* Persistent Links
|
||||||
* Upload Teaser Picture for Post
|
* Upload Teaser Picture for Post
|
||||||
@ -85,8 +79,6 @@ The following features will be implemented. This gets done in three steps:
|
|||||||
|
|
||||||
### Notifications
|
### Notifications
|
||||||
|
|
||||||
[Cucumber features](https://github.com/Ocelot-Social-Community/Ocelot-Social/tree/master/cypress/integration/notifications)
|
|
||||||
|
|
||||||
* User @-mentionings
|
* User @-mentionings
|
||||||
* Notify authors for comments
|
* Notify authors for comments
|
||||||
* Administrative notifications to all users
|
* Administrative notifications to all users
|
||||||
@ -108,8 +100,6 @@ The following features will be implemented. This gets done in three steps:
|
|||||||
|
|
||||||
### Blacklist
|
### Blacklist
|
||||||
|
|
||||||
[Video](https://www.youtube.com/watch?v=-uDvvmN8hLQ)
|
|
||||||
|
|
||||||
* Blacklist Users
|
* Blacklist Users
|
||||||
* Blacklist specific Terms
|
* Blacklist specific Terms
|
||||||
* Blacklist Tags
|
* Blacklist Tags
|
||||||
@ -117,8 +107,6 @@ The following features will be implemented. This gets done in three steps:
|
|||||||
|
|
||||||
### Search
|
### Search
|
||||||
|
|
||||||
[Cucumber Features](https://github.com/Ocelot-Social-Community/Ocelot-Social/tree/master/cypress/integration/search)
|
|
||||||
|
|
||||||
* Search for Categories
|
* Search for Categories
|
||||||
* Search for Tags
|
* Search for Tags
|
||||||
* Fulltext Search
|
* Fulltext Search
|
||||||
@ -238,8 +226,6 @@ Shows automatically related actions for existing post.
|
|||||||
|
|
||||||
### Moderation
|
### Moderation
|
||||||
|
|
||||||
[Cucumber Features](https://github.com/Ocelot-Social-Community/Ocelot-Social/tree/master/cypress/integration/moderation)
|
|
||||||
|
|
||||||
* Report Button for users for doubtful Content
|
* Report Button for users for doubtful Content
|
||||||
* Moderator Panel
|
* Moderator Panel
|
||||||
* List of reported Content \(later replaced by User-Moderation\)
|
* List of reported Content \(later replaced by User-Moderation\)
|
||||||
@ -250,8 +236,6 @@ Shows automatically related actions for existing post.
|
|||||||
|
|
||||||
### Administration
|
### Administration
|
||||||
|
|
||||||
[Cucumber Features](https://github.com/Ocelot-Social-Community/Ocelot-Social/tree/master/cypress/integration/administration)
|
|
||||||
|
|
||||||
* Provide Admin-Interface to send Users Invite Code
|
* Provide Admin-Interface to send Users Invite Code
|
||||||
* Static Pages for Data Privacy Statement ...
|
* Static Pages for Data Privacy Statement ...
|
||||||
* Create, edit and delete Announcements
|
* Create, edit and delete Announcements
|
||||||
@ -265,8 +249,6 @@ Shows automatically related actions for existing post.
|
|||||||
|
|
||||||
### Internationalization
|
### Internationalization
|
||||||
|
|
||||||
[Cucumber Features](https://github.com/Ocelot-Social-Community/Ocelot-Social/tree/master/cypress/integration/internationalization)
|
|
||||||
|
|
||||||
* Frontend UI
|
* Frontend UI
|
||||||
* Backend Error Messages
|
* Backend Error Messages
|
||||||
|
|
||||||
|
|||||||
@ -9,8 +9,6 @@
|
|||||||
$ export DOCKER_DEFAULT_PLATFORM=linux/amd64
|
$ export DOCKER_DEFAULT_PLATFORM=linux/amd64
|
||||||
```
|
```
|
||||||
|
|
||||||
For even more informations, see [Docker More Closely](#docker-more-closely)
|
|
||||||
|
|
||||||
### Docker Compose Override File For Apple M1 Platform
|
### Docker Compose Override File For Apple M1 Platform
|
||||||
|
|
||||||
For Docker compose `up` or `build` commands, you can use our Apple M1 override file that specifies the M1 platform:
|
For Docker compose `up` or `build` commands, you can use our Apple M1 override file that specifies the M1 platform:
|
||||||
@ -27,7 +25,3 @@ $ docker compose -f docker-compose.ocelotsocial-branded.yml -f docker-compose.ap
|
|||||||
# only once: init admin user and create indexes and constraints in Neo4j database
|
# only once: init admin user and create indexes and constraints in Neo4j database
|
||||||
$ docker compose exec backend /bin/sh -c "yarn prod:migrate init"
|
$ docker compose exec backend /bin/sh -c "yarn prod:migrate init"
|
||||||
```
|
```
|
||||||
|
|
||||||
## Docker More Closely In Main Code
|
|
||||||
|
|
||||||
To get more informations about the Apple M1 platform and to analyze the Docker builds etc. you find our documentation in our main code, [here](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/DOCKER_MORE_CLOSELY.md).
|
|
||||||
|
|||||||
@ -11,7 +11,7 @@ $ minikube dashboard
|
|||||||
|
|
||||||
This will give you an overview. Some of the steps below need some timing to make resources available to other dependent deployments. Keeping an eye on the dashboard is a great way to check that.
|
This will give you an overview. Some of the steps below need some timing to make resources available to other dependent deployments. Keeping an eye on the dashboard is a great way to check that.
|
||||||
|
|
||||||
Follow the installation instruction for [Kubernetes with Helm](./kubernetes/README.md).
|
Follow the installation instruction for [Kubernetes with Helm](./src/kubernetes/README.md).
|
||||||
|
|
||||||
If all the pods and services have settled and everything looks green in your
|
If all the pods and services have settled and everything looks green in your
|
||||||
minikube dashboard, expose the services you want on your host system.
|
minikube dashboard, expose the services you want on your host system.
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
# Ocelot.Social Deploy And Rebranding
|
# Ocelot.Social Deploy And Rebranding
|
||||||
|
|
||||||
[](https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/actions)
|
[](https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/actions)
|
||||||
[](https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/blob/LICENSE.md)
|
[](https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/blob/master/LICENSE.md)
|
||||||
[](https://discord.gg/AJSX9DCSUA)
|
[](https://discord.gg/AJSX9DCSUA)
|
||||||
[](https://www.codetriage.com/ocelot-social-community/ocelot-social-deploy-rebranding)
|
[](https://www.codetriage.com/ocelot-social-community/ocelot-social-deploy-rebranding)
|
||||||
|
|
||||||
@ -10,17 +10,19 @@ The forked original repository is [stage.ocelot.social](https://github.com/Ocelo
|
|||||||
|
|
||||||
<!-- markdownlint-disable MD033 -->
|
<!-- markdownlint-disable MD033 -->
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://ocelot.social" target="_blank"><img src="../webapp/static/img/custom/logo-squared.svg" alt="ocelot.social" width="40%" height="40%"></a>
|
<!-- <a href="https://ocelot.social" target="_blank"> -->
|
||||||
|
<img src="../webapp/static/img/custom/logo-squared.svg" alt="ocelot.social" width="40%" height="40%">
|
||||||
|
<!-- </a> -->
|
||||||
</p>
|
</p>
|
||||||
<!-- markdownlint-enable MD033 -->
|
<!-- markdownlint-enable MD033 -->
|
||||||
|
|
||||||
## Live demo
|
## Live demo
|
||||||
|
|
||||||
__Try out our deployed [development environment](https://stage.ocelot.social).__
|
__Try out our deployed <!-- [ -->development environment<!-- ](https://stage.ocelot.social)-->.__
|
||||||
|
|
||||||
Visit our staging networks:
|
Visit our staging networks:
|
||||||
|
|
||||||
- central staging network: [stage.ocelot.social](https://stage.ocelot.social)
|
- central staging network: <!-- [ -->stage.ocelot.social<!-- ](https://stage.ocelot.social)-->
|
||||||
<!-- - rebranded staging network: [rebrand.ocelot.social](https://stage.ocelot.social). -->
|
<!-- - rebranded staging network: [rebrand.ocelot.social](https://stage.ocelot.social). -->
|
||||||
|
|
||||||
Logins:
|
Logins:
|
||||||
@ -39,16 +41,18 @@ Fork this repository to configure and rebrand it for your own [ocelot.social](ht
|
|||||||
|
|
||||||
Write your own data into the main configuration file:
|
Write your own data into the main configuration file:
|
||||||
|
|
||||||
- [package.json](/package.json)
|
- [package.json](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/package.json)
|
||||||
|
|
||||||
Since all deployment methods described here depend on [Docker](https://docker.com) and [DockerHub](https://hub.docker.com), you need to create your own organisation on DockerHub and put its name in the [package.json](/package.json) file as your `dockerOrganisation`.
|
Since all deployment methods described here depend on [Docker](https://docker.com) and [DockerHub](https://hub.docker.com), you need to create your own organisation on DockerHub and put its name in the [package.json](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/package.json) file as your `dockerOrganisation`.
|
||||||
|
|
||||||
### Configure And Branding
|
### Configure And Branding
|
||||||
|
|
||||||
The next step is:
|
The next step is:
|
||||||
|
|
||||||
- [Set Environment Variables and Configurations](./deployment-values.md)
|
- [Set Environment Variables and Configurations](./deployment-values.md)
|
||||||
|
<!-- markdown-link-check-disable -->
|
||||||
- [Configure And Branding](./configurations/stage.ocelot.social/branding/README.md)
|
- [Configure And Branding](./configurations/stage.ocelot.social/branding/README.md)
|
||||||
|
<!-- markdown-link-check-enable -->
|
||||||
|
|
||||||
### Optional: Locally Testing Configuration And Branding
|
### Optional: Locally Testing Configuration And Branding
|
||||||
|
|
||||||
@ -71,7 +75,7 @@ For the maintenance page have a look in your browser at `http://localhost:5000/`
|
|||||||
|
|
||||||
### Push Changes To GitHub
|
### Push Changes To GitHub
|
||||||
|
|
||||||
Before merging these changes into the "master" branch on your GitHub fork repository, you need to configure the GitHub repository secrets. This is necessary to [publish](/.github/workflows/publish.yml) the Docker images by pushing them via GitHub actions to repositories belonging to your DockerHub organisation.
|
Before merging these changes into the "master" branch on your GitHub fork repository, you need to configure the GitHub repository secrets. This is necessary to [publish](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/.github/workflows/publish.yml) the Docker images by pushing them via GitHub actions to repositories belonging to your DockerHub organisation.
|
||||||
|
|
||||||
First, go to your DockerHub profile under `Account Settings` and click on the `Security` tab. There you create an access token called `<your-organisation>-access-token` and copy the token to a safe place.
|
First, go to your DockerHub profile under `Account Settings` and click on the `Security` tab. There you create an access token called `<your-organisation>-access-token` and copy the token to a safe place.
|
||||||
|
|
||||||
@ -100,9 +104,9 @@ See the login details and browser addresses above.
|
|||||||
|
|
||||||
### Deployment
|
### Deployment
|
||||||
|
|
||||||
Afterwards you can [deploy](/deployment/deployment.md) it on your server:
|
Afterwards you can [deploy](./deployment.md) it on your server:
|
||||||
|
|
||||||
- [Kubernetes with Helm](/deployment/kubernetes/README.md)
|
- [Kubernetes with Helm](./src/kubernetes/README.md)
|
||||||
|
|
||||||
## Developer Chat
|
## Developer Chat
|
||||||
|
|
||||||
@ -131,7 +135,7 @@ Browser compatibility testing with [BrowserStack](https://www.browserstack.com/)
|
|||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
See the [LICENSE](/LICENSE.md) file for license rights and limitations (MIT).
|
See the [LICENSE](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/LICENSE.md) file for license rights and limitations (MIT).
|
||||||
|
|
||||||
|
|
||||||
We need `DOCKER_BUILDKIT=0` for this to work.
|
We need `DOCKER_BUILDKIT=0` for this to work.
|
||||||
@ -1 +1 @@
|
|||||||
Subproject commit fdc2e52fa444b300e1c4736600bc0e9ae3314222
|
Subproject commit a930f11d8f2d0c11136ff0bf9188aaab9cabc5d1
|
||||||
@ -4,14 +4,14 @@ Before you start the deployment you have to do preparations.
|
|||||||
|
|
||||||
## Deployment Preparations
|
## Deployment Preparations
|
||||||
|
|
||||||
Since all deployment methods described here depend on [Docker](https://docker.com) and [DockerHub](https://hub.docker.com), you need to create your own organisation on DockerHub and put its name in the [package.json](/package.json) file as your `dockerOrganisation`.
|
Since all deployment methods described here depend on [Docker](https://docker.com) and [DockerHub](https://hub.docker.com), you need to create your own organisation on DockerHub and put its name in the [package.json](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/package.json) file as your `dockerOrganisation`.
|
||||||
Read more details in the [main README](/README.md) under [Usage](/README.md#usage).
|
Read more details in the [main README](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/README.md) under [Usage](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/README.md#usage).
|
||||||
|
|
||||||
## Deployment Methods
|
## Deployment Methods
|
||||||
|
|
||||||
You have the following options for a deployment:
|
You have the following options for a deployment:
|
||||||
|
|
||||||
- [Kubernetes with Helm](./kubernetes/README.md)
|
- [Kubernetes with Helm](./src/kubernetes/README.md)
|
||||||
|
|
||||||
## After Deployment
|
## After Deployment
|
||||||
|
|
||||||
|
|||||||
@ -68,17 +68,17 @@ Take one of the IPs of perhaps two or more droplets in your cluster from the lis
|
|||||||
To understand what makes sense to do when managing your DNS with DigitalOcean, you need to know how DNS works:
|
To understand what makes sense to do when managing your DNS with DigitalOcean, you need to know how DNS works:
|
||||||
|
|
||||||
DNS means `Domain Name System`. It resolves domains like `example.com` into an IP like `123.123.123.123`.
|
DNS means `Domain Name System`. It resolves domains like `example.com` into an IP like `123.123.123.123`.
|
||||||
DigitalOcean is not a domain registrar, but provides a DNS management service. If you use DigitalOcean's DNS management service, you can configure [your cluster](/deployment/kubernetes/README.md#dns) to always resolve the domain to the correct IP and automatically update it for that.
|
DigitalOcean is not a domain registrar, but provides a DNS management service. If you use DigitalOcean's DNS management service, you can configure [your cluster](./README.md#dns) to always resolve the domain to the correct IP and automatically update it for that.
|
||||||
The IPs of the DigitalOcean machines are not necessarily stable, so the cluster's DNS service will update the DNS records managed by DigitalOcean to the new IP as needed.
|
The IPs of the DigitalOcean machines are not necessarily stable, so the cluster's DNS service will update the DNS records managed by DigitalOcean to the new IP as needed.
|
||||||
|
|
||||||
***CAUTION:** If you are using an external DNS, you currently have to do this manually, which can cause downtime.*
|
***CAUTION:** If you are using an external DNS, you currently have to do this manually, which can cause downtime.*
|
||||||
|
|
||||||
## Deploy
|
## Deploy
|
||||||
|
|
||||||
Yeah, you're done here. Back to [Deployment with Helm for Kubernetes](/deployment/src/kubernetes/README.md).
|
Yeah, you're done here. Back to [Deployment with Helm for Kubernetes](./README.md).
|
||||||
|
|
||||||
## Backups On DigitalOcean
|
## Backups On DigitalOcean
|
||||||
|
|
||||||
You can and should do [backups](/deployment/kubernetes/Backup.md) with Kubernetes for sure.
|
You can and should do [backups](./Backup.md) with Kubernetes for sure.
|
||||||
|
|
||||||
Additional to backup and copying the Neo4j database dump and the backend images you can do a volume snapshot on DigitalOcean at the moment you have the database in sleep mode.
|
Additional to backup and copying the Neo4j database dump and the backend images you can do a volume snapshot on DigitalOcean at the moment you have the database in sleep mode.
|
||||||
|
|||||||
@ -9,7 +9,7 @@ Please contact us if you are interested in options not listed below.
|
|||||||
|
|
||||||
Managed Kubernetes:
|
Managed Kubernetes:
|
||||||
|
|
||||||
- [DigitalOcean](/deployment/src/kubernetes/DigitalOcean.md)
|
- [DigitalOcean](./DigitalOcean.md)
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
@ -165,7 +165,7 @@ $ doctl compute firewall get <ID> --context <context-name>
|
|||||||
|
|
||||||
***ATTENTION:** This seems not to work at all so we leave it away at the moment*
|
***ATTENTION:** This seems not to work at all so we leave it away at the moment*
|
||||||
|
|
||||||
***TODO:** I thought this is necessary if we use the DigitalOcean DNS management service? See [Manage DNS With DigitalOcean](/deployment/kubernetes/DigitalOcean.md#manage-dns-with-digitalocean)*
|
***TODO:** I thought this is necessary if we use the DigitalOcean DNS management service? See [Manage DNS With DigitalOcean](./DigitalOcean.md#manage-dns-with-digitalocean)*
|
||||||
|
|
||||||
This chart is only necessary (recommended is more precise) if you run DigitalOcean without load balancer.
|
This chart is only necessary (recommended is more precise) if you run DigitalOcean without load balancer.
|
||||||
You need to generate an access token with read + write for the `dns.values.yaml` at <https://cloud.digitalocean.com/account/api/tokens> and fill it in.
|
You need to generate an access token with read + write for the `dns.values.yaml` at <https://cloud.digitalocean.com/account/api/tokens> and fill it in.
|
||||||
@ -280,9 +280,9 @@ helm uninstall ocelot \
|
|||||||
|
|
||||||
## Backups
|
## Backups
|
||||||
|
|
||||||
You can and should do [backups](/deployment/kubernetes/Backup.md) with Kubernetes for sure.
|
You can and should do [backups](./Backup.md) with Kubernetes for sure.
|
||||||
|
|
||||||
## Error Reporting
|
<!-- ## Error Reporting
|
||||||
|
|
||||||
We use [Sentry](https://github.com/getsentry/sentry) for error reporting in both
|
We use [Sentry](https://github.com/getsentry/sentry) for error reporting in both
|
||||||
our backend and web frontend. You can either use a hosted or a self-hosted
|
our backend and web frontend. You can either use a hosted or a self-hosted
|
||||||
@ -297,7 +297,7 @@ If you are lucky enough to have a kubernetes cluster with the required hardware
|
|||||||
support, try this [helm chart](https://github.com/helm/charts/tree/master/stable/sentry).
|
support, try this [helm chart](https://github.com/helm/charts/tree/master/stable/sentry).
|
||||||
|
|
||||||
On our kubernetes cluster we get "mult-attach" errors for persistent volumes.
|
On our kubernetes cluster we get "mult-attach" errors for persistent volumes.
|
||||||
Apparently DigitalOcean's kubernetes clusters do not fulfill the requirements.
|
Apparently DigitalOcean's kubernetes clusters do not fulfill the requirements. -->
|
||||||
|
|
||||||
## Kubernetes Commands (Without Helm) To Deploy New Docker Images To A Kubernetes Cluster
|
## Kubernetes Commands (Without Helm) To Deploy New Docker Images To A Kubernetes Cluster
|
||||||
|
|
||||||
|
|||||||
@ -23,13 +23,12 @@ CAUTION: It seems that the behaviour of DigitalOcean has changed and the load ba
|
|||||||
And to create a load balancer costs money. Please refine the following documentation if required.
|
And to create a load balancer costs money. Please refine the following documentation if required.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
{% tabs %}
|
::: tabs
|
||||||
{% tab title="Without Load Balancer" %}
|
@tab:active Without Load Balancer
|
||||||
|
|
||||||
A solution without a load balance you can find [here](../no-loadbalancer/README.md).
|
A solution without a load balance you can find [here](../no-loadbalancer/README.md).
|
||||||
|
|
||||||
{% endtab %}
|
@tab With DigitalOcean Load Balancer
|
||||||
{% tab title="With DigitalOcean Load Balancer" %}
|
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
CAUTION: It seems that the behaviour of DigitalOcean has changed and the load balancer is not created automatically anymore.
|
CAUTION: It seems that the behaviour of DigitalOcean has changed and the load balancer is not created automatically anymore.
|
||||||
@ -44,8 +43,7 @@ address. On DigitalOcean, this is how it should look like:
|
|||||||
If the load balancer isn't created automatically you have to create it your self on DigitalOcean under Networks.
|
If the load balancer isn't created automatically you have to create it your self on DigitalOcean under Networks.
|
||||||
In case you don't need a DigitalOcean load balancer (which costs money by the way) have a look in the tab `Without Load Balancer`.
|
In case you don't need a DigitalOcean load balancer (which costs money by the way) have a look in the tab `Without Load Balancer`.
|
||||||
|
|
||||||
{% endtab %}
|
:::
|
||||||
{% endtabs %}
|
|
||||||
|
|
||||||
Check the ingress server is working correctly:
|
Check the ingress server is working correctly:
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,6 @@
|
|||||||
# Edit this Documentation
|
# Documentation
|
||||||
|
|
||||||
|
## Edit this Documentation
|
||||||
|
|
||||||
Find the [**table of contents** for this documentation on GitHub](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/SUMMARY.md) and navigate to the file you need to update.
|
Find the [**table of contents** for this documentation on GitHub](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/SUMMARY.md) and navigate to the file you need to update.
|
||||||
|
|
||||||
@ -10,15 +12,15 @@ If you are ready, fill in the **Propose file change** at the end of the webpage.
|
|||||||
|
|
||||||
After that you have to compare your change branch to our `master` branch with a pull request. Here make a comment which issue you have fixed. (If you are working on one of our [open issues](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues) please include the number.)
|
After that you have to compare your change branch to our `master` branch with a pull request. Here make a comment which issue you have fixed. (If you are working on one of our [open issues](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues) please include the number.)
|
||||||
|
|
||||||
## Markdown your documentation
|
### Markdown your documentation
|
||||||
|
|
||||||
To design your documentation see the syntax description at GitBook:
|
To design your documentation see the syntax description at GitBook:
|
||||||
|
|
||||||
[https://toolchain.gitbook.com/syntax/markdown.html](https://toolchain.gitbook.com/syntax/markdown.html)
|
[https://toolchain.gitbook.com/syntax/markdown.html](https://toolchain.gitbook.com/syntax/markdown.html)
|
||||||
|
|
||||||
### Some quick Examples
|
#### Some quick Examples
|
||||||
|
|
||||||
#### Headlines
|
##### Headlines
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
# Main Headline
|
# Main Headline
|
||||||
@ -26,21 +28,19 @@ To design your documentation see the syntax description at GitBook:
|
|||||||
### Small Headlines
|
### Small Headlines
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Tabs
|
##### Tabs
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
{% tabs %}
|
::: tabs
|
||||||
{% tab title="XXX" %}
|
@tab:active First tab's title <!-- this tab is setactive -->
|
||||||
XXX
|
|
||||||
{% endtab %}
|
@tab Second tab's title
|
||||||
{% tab title="XXX" %}
|
|
||||||
XXX
|
:::
|
||||||
{% endtab %}
|
|
||||||
…
|
|
||||||
{% endtabs %}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Commands
|
|
||||||
|
##### Commands
|
||||||
|
|
||||||
~~~markdown
|
~~~markdown
|
||||||
```<LANGUAGE> (for text highlighting)
|
```<LANGUAGE> (for text highlighting)
|
||||||
@ -48,33 +48,34 @@ XXX
|
|||||||
```
|
```
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
#### Links
|
##### Links
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
[XXX](https://XXX)
|
[XXX](https://XXX)
|
||||||
```
|
```
|
||||||
|
For the documentation to work in both frameworks - Github and Vuepress - please use absolute path for Github internal documentation links (e.g. /README.md over ../../README.mdetc.)
|
||||||
|
|
||||||
#### Screenshots or other Images
|
##### Screenshots or other Images
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||

|

|
||||||
```
|
```
|
||||||
|
|
||||||
#### Hints for ToDos
|
##### Hints for ToDos
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
{% hint style="info" %} TODO: XXX {% endhint %}
|
{% hint style="info" %} TODO: XXX {% endhint %}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Host the Screenshots
|
### Host the Screenshots
|
||||||
|
|
||||||
### Host on Ocelot-Social \(GitHub\) Repository
|
#### Host on Ocelot-Social \(GitHub\) Repository
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
TODO: How to host on Ocelot-Social \(GitHub\) repository ...
|
TODO: How to host on Ocelot-Social \(GitHub\) repository ...
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### Quick Solution
|
#### Quick Solution
|
||||||
|
|
||||||
To quickly host the screenshots go to:
|
To quickly host the screenshots go to:
|
||||||
|
|
||||||
@ -88,27 +89,41 @@ Right click on it and choose kind of **Open link in new tab**.
|
|||||||
|
|
||||||
Copy the URL and paste it were you need it.
|
Copy the URL and paste it were you need it.
|
||||||
|
|
||||||
## Screenshot Modification
|
### Screenshot Modification
|
||||||
|
|
||||||
### Add an Arrow or some other Marking Stuff
|
#### Add an Arrow or some other Marking Stuff
|
||||||
|
|
||||||
{% tabs %}
|
::: tabs
|
||||||
{% tab title="macOS" %}
|
@tab:active macOS
|
||||||
|
|
||||||
#### In the Preview App
|
##### In the Preview App
|
||||||
|
|
||||||
Got to: **Menu** + **Tools** \(GER: Werkzeuge\) + **Annotate** \(GER: Anmerkungen\) + etc.
|
Got to: **Menu** + **Tools** \(GER: Werkzeuge\) + **Annotate** \(GER: Anmerkungen\) + etc.
|
||||||
{% endtab %}
|
|
||||||
|
|
||||||
{% tab title="Windows" %}
|
@tab Windows
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
TODO: How to modify screenshots in Windows ...
|
TODO: How to modify screenshots in Windows ...
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
{% endtab %}
|
{% endtab %}
|
||||||
|
|
||||||
{% tab title="Linux" %}
|
@tab Linux
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
TODO: How to modify screenshots in Linux ...
|
TODO: How to modify screenshots in Linux ...
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
{% endtab %}
|
:::
|
||||||
{% endtabs %}
|
|
||||||
|
## Deploy this Documentation
|
||||||
|
|
||||||
|
TODO
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# set configured Node version
|
||||||
|
nvm use
|
||||||
|
|
||||||
|
# install Vuepress
|
||||||
|
npm install
|
||||||
|
|
||||||
|
# run vuepress
|
||||||
|
npm run docs:dev
|
||||||
|
```
|
||||||
16644
package-lock.json
generated
Normal file
16644
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
14
package.json
14
package.json
@ -4,7 +4,6 @@
|
|||||||
"description": "Free and open source software program code available to run social networks.",
|
"description": "Free and open source software program code available to run social networks.",
|
||||||
"author": "ocelot.social Community",
|
"author": "ocelot.social Community",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"private": false,
|
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/Ocelot-Social-Community/Ocelot-Social.git"
|
"url": "https://github.com/Ocelot-Social-Community/Ocelot-Social.git"
|
||||||
@ -27,10 +26,10 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"db:seed": "cd backend && yarn run db:seed",
|
"db:seed": "cd backend && yarn run db:seed",
|
||||||
"db:reset": "cd backend && yarn run db:reset",
|
"db:reset": "cd backend && yarn run db:reset",
|
||||||
|
"docs:build": "NODE_OPTIONS=--openssl-legacy-provider vuepress build .",
|
||||||
|
"docs:dev": "NODE_OPTIONS=--openssl-legacy-provider vuepress dev .",
|
||||||
"cypress:run": "cypress run --e2e --browser electron --config-file ./cypress/cypress.config.js",
|
"cypress:run": "cypress run --e2e --browser electron --config-file ./cypress/cypress.config.js",
|
||||||
"cypress:open": "cypress open --e2e --browser electron --config-file ./cypress/cypress.config.js",
|
"cypress:open": "cypress open --e2e --browser electron --config-file ./cypress/cypress.config.js",
|
||||||
"cucumber:setup": "cd backend && yarn run dev",
|
|
||||||
"cucumber": "wait-on tcp:4000 && cucumber-js --require-module @babel/register --exit",
|
|
||||||
"release": "yarn version --no-git-tag-version --no-commit-hooks --no-commit && auto-changelog --latest-version $(node -p -e \"require('./package.json').version\") && cd backend && yarn version --no-git-tag-version --no-commit-hooks --no-commit --new-version $(node -p -e \"require('./../package.json').version\") && cd ../webapp && yarn version --no-git-tag-version --no-commit-hooks --no-commit --new-version $(node -p -e \"require('./../package.json').version\") && cd ../webapp/maintenance/source && yarn version --no-git-tag-version --no-commit-hooks --no-commit --new-version $(node -p -e \"require('./../../../package.json').version\")"
|
"release": "yarn version --no-git-tag-version --no-commit-hooks --no-commit && auto-changelog --latest-version $(node -p -e \"require('./package.json').version\") && cd backend && yarn version --no-git-tag-version --no-commit-hooks --no-commit --new-version $(node -p -e \"require('./../package.json').version\") && cd ../webapp && yarn version --no-git-tag-version --no-commit-hooks --no-commit --new-version $(node -p -e \"require('./../package.json').version\") && cd ../webapp/maintenance/source && yarn version --no-git-tag-version --no-commit-hooks --no-commit --new-version $(node -p -e \"require('./../../../package.json').version\")"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@ -39,12 +38,12 @@
|
|||||||
"@babel/register": "^7.22.15",
|
"@babel/register": "^7.22.15",
|
||||||
"@badeball/cypress-cucumber-preprocessor": "^19.1.1",
|
"@badeball/cypress-cucumber-preprocessor": "^19.1.1",
|
||||||
"@cypress/browserify-preprocessor": "^3.0.2",
|
"@cypress/browserify-preprocessor": "^3.0.2",
|
||||||
|
"@cucumber/cucumber": "10.0.1",
|
||||||
"@faker-js/faker": "8.3.1",
|
"@faker-js/faker": "8.3.1",
|
||||||
"auto-changelog": "^2.3.0",
|
"auto-changelog": "^2.3.0",
|
||||||
"bcryptjs": "^2.4.3",
|
"bcryptjs": "^2.4.3",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
"cucumber": "^6.0.5",
|
"cypress": "^13.6.0",
|
||||||
"cypress": "^13.5.1",
|
|
||||||
"cypress-network-idle": "^1.14.2",
|
"cypress-network-idle": "^1.14.2",
|
||||||
"date-fns": "^2.25.0",
|
"date-fns": "^2.25.0",
|
||||||
"dotenv": "^16.3.1",
|
"dotenv": "^16.3.1",
|
||||||
@ -60,6 +59,11 @@
|
|||||||
"slug": "^8.2.3",
|
"slug": "^8.2.3",
|
||||||
"wait-on": "^7.2.0"
|
"wait-on": "^7.2.0"
|
||||||
},
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"vuepress": "^2.0.0-rc.0",
|
||||||
|
"vuepress-plugin-search-pro": "^2.0.0-rc.0",
|
||||||
|
"vuepress-theme-hope": "^2.0.0-rc.0"
|
||||||
|
},
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
"set-value": "^2.0.1",
|
"set-value": "^2.0.1",
|
||||||
"nan": "2.17.0"
|
"nan": "2.17.0"
|
||||||
|
|||||||
@ -59,8 +59,8 @@ We ensure the quality of our frontend code by using
|
|||||||
|
|
||||||
For more information see our [frontend testing guide](testing.md). Use these commands to run the tests:
|
For more information see our [frontend testing guide](testing.md). Use these commands to run the tests:
|
||||||
|
|
||||||
{% tabs %}
|
::: tabs
|
||||||
{% tab title="With Docker" %}
|
@tab:active With Docker
|
||||||
|
|
||||||
After starting the application following the above guidelines, open new terminal windows for each of these commands:
|
After starting the application following the above guidelines, open new terminal windows for each of these commands:
|
||||||
|
|
||||||
@ -81,9 +81,7 @@ $ docker-compose exec webapp yarn storybook
|
|||||||
|
|
||||||
You can then visit the Storybook playground on `http://localhost:3002`
|
You can then visit the Storybook playground on `http://localhost:3002`
|
||||||
|
|
||||||
{% endtab %}
|
@tab title Without Docker
|
||||||
|
|
||||||
{% tab title="Without Docker" %}
|
|
||||||
|
|
||||||
After starting the application following the above guidelines, open new terminal windows and navigate to the `/webapp` directory for each of these commands:
|
After starting the application following the above guidelines, open new terminal windows and navigate to the `/webapp` directory for each of these commands:
|
||||||
|
|
||||||
@ -109,8 +107,7 @@ $ yarn storybook
|
|||||||
|
|
||||||
You can then visit the Storybook playground on `http://localhost:3002`
|
You can then visit the Storybook playground on `http://localhost:3002`
|
||||||
|
|
||||||
{% endtab %}
|
:::
|
||||||
{% endtabs %}
|
|
||||||
|
|
||||||
## Maintenance Mode
|
## Maintenance Mode
|
||||||
|
|
||||||
|
|||||||
@ -8,8 +8,8 @@ The maintenance mode shows a translatable page that tells the user that we are r
|
|||||||
|
|
||||||
At the moment the maintenance mode can only be locally tested with Docker-Compose.
|
At the moment the maintenance mode can only be locally tested with Docker-Compose.
|
||||||
|
|
||||||
{% tabs %}
|
::: tabs
|
||||||
{% tab title="Locally Without Docker" %}
|
@tab:active Locally Without Docker
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
TODO: Implement a locally running maintenance mode! Without Docker …
|
TODO: Implement a locally running maintenance mode! Without Docker …
|
||||||
@ -25,8 +25,7 @@ $ yarn generate:maintenance
|
|||||||
… is unfortunatelly **not(!)** working at the moment.
|
… is unfortunatelly **not(!)** working at the moment.
|
||||||
This is because the code is rewritten to be easy usable for Docker-Compose. Therefore we lost this possibility.
|
This is because the code is rewritten to be easy usable for Docker-Compose. Therefore we lost this possibility.
|
||||||
|
|
||||||
{% endtab %}
|
@tab Locally With Docker
|
||||||
{% tab title="Locally With Docker" %}
|
|
||||||
|
|
||||||
To get the maintenance mode running use the command:
|
To get the maintenance mode running use the command:
|
||||||
|
|
||||||
@ -37,3 +36,5 @@ $ docker-compose up
|
|||||||
|
|
||||||
And the maintenance mode page or service will be started as well in an own container.
|
And the maintenance mode page or service will be started as well in an own container.
|
||||||
In the browser you can reach it under `http://localhost:3001/`.
|
In the browser you can reach it under `http://localhost:3001/`.
|
||||||
|
|
||||||
|
:::
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user