From f74045e3b938925859f1ad2c84f97a0d91c8679b Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 11 May 2021 02:47:53 +0200 Subject: [PATCH 01/48] brand as default --- deployment/kubernetes/values.yaml.dist | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/deployment/kubernetes/values.yaml.dist b/deployment/kubernetes/values.yaml.dist index 52890e5..5357a22 100644 --- a/deployment/kubernetes/values.yaml.dist +++ b/deployment/kubernetes/values.yaml.dist @@ -6,7 +6,7 @@ BACKEND: # Change all the below if needed # DOCKER_IMAGE_REPO - change that to your branded docker image # Label is appended based on .Chart.appVersion - DOCKER_IMAGE_REPO: "ocelotsocialnetwork/backend" + DOCKER_IMAGE_REPO: "ocelotsocialnetwork/backend-branded" CLIENT_URI: "https://staging.ocelot.social" JWT_SECRET: "b/&&7b78BF&fv/Vd" MAPBOX_TOKEN: "pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g" @@ -32,7 +32,7 @@ WEBAPP: # Change all the below if needed # DOCKER_IMAGE_REPO - change that to your branded docker image # Label is appended based on .Chart.appVersion - DOCKER_IMAGE_REPO: "ocelotsocialnetwork/webapp" + DOCKER_IMAGE_REPO: "ocelotsocialnetwork/webapp-branded" WEBSOCKETS_URI: "wss://staging.ocelot.social/api/graphql" # Most likely you don't need to change this @@ -76,7 +76,7 @@ MAINTENANCE: # Change all the below if needed # DOCKER_IMAGE_REPO - change that to your branded docker image # Label is appended based on .Chart.appVersion - DOCKER_IMAGE_REPO: "ocelotsocialnetwork/maintenance" + DOCKER_IMAGE_REPO: "ocelotsocialnetwork/maintenance-branded" # Most likely you don't need to change this REVISIONS_HISTORY_LIMIT: "25" From 1d1b5751b973f8ac3218eee03c708f6687a5c350 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Sat, 27 Feb 2021 04:50:57 +0100 Subject: [PATCH 02/48] branding - texts --- branding/constants/emails.js | 4 ++-- branding/constants/links.js | 10 +++++----- branding/constants/metadata.js | 10 +++++----- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/branding/constants/emails.js b/branding/constants/emails.js index 54e7bbf..a4af6cd 100644 --- a/branding/constants/emails.js +++ b/branding/constants/emails.js @@ -1,4 +1,4 @@ export default { - SUPPORT: 'hello@ocelot.social', - MODERATION: 'hello@ocelot.social', + SUPPORT: 'team@wir.social', + MODERATION: 'team@wir.social', } diff --git a/branding/constants/links.js b/branding/constants/links.js index 070ffa1..2f56115 100644 --- a/branding/constants/links.js +++ b/branding/constants/links.js @@ -1,7 +1,7 @@ export default { - ORGANIZATION: 'https://ocelot.social', - DONATE: 'https://ocelot-social.herokuapp.com/donations', - IMPRINT: 'https://ocelot-social.herokuapp.com/imprint', - DATA_PRIVACY: 'https://ocelot-social.herokuapp.com/imprint', - FAQ: 'https://ocelot-social.herokuapp.com/#kontakt', + ORGANIZATION: 'https://webcraft-media.de', + DONATE: 'https://webcraft-media.de/donate-for-wir-social.html', + IMPRINT: 'https://www.webcraft-media.de/#!impressum', + DATA_PRIVACY: 'https://www.webcraft-media.de/#!datenschutz', + FAQ: 'https://www.webcraft-media.de/#!contact', } diff --git a/branding/constants/metadata.js b/branding/constants/metadata.js index 55dfe23..0233c83 100644 --- a/branding/constants/metadata.js +++ b/branding/constants/metadata.js @@ -1,8 +1,8 @@ export default { - APPLICATION_NAME: 'ocelot.social', - APPLICATION_SHORT_NAME: 'ocelot', - APPLICATION_DESCRIPTION: 'Ocelot Social Community', + APPLICATION_NAME: 'wir.social', + APPLICATION_SHORT_NAME: 'wir', + APPLICATION_DESCRIPTION: 'Wir Social Community', COOKIE_NAME: 'ocelot-social-token', - ORGANIZATION_NAME: 'busFaktor e.V.', - ORGANIZATION_JURISDICTION: 'Somewhere', + ORGANIZATION_NAME: 'Webcraft-Media', + ORGANIZATION_JURISDICTION: 'Deutschland', } From 708b01521a562c12d78ca67d67e5a339db3a82fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 11 May 2021 13:10:03 +0200 Subject: [PATCH 03/48] Replace ocelot logos 619x593 with 600x570 like the others --- .gitignore | 1 + branding/static/img/custom/password-reset.svg | 10 +++++----- branding/static/img/custom/welcome.svg | 10 +++++----- 3 files changed, 11 insertions(+), 10 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e43b0f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store diff --git a/branding/static/img/custom/password-reset.svg b/branding/static/img/custom/password-reset.svg index 68c94d4..b130e75 100644 --- a/branding/static/img/custom/password-reset.svg +++ b/branding/static/img/custom/password-reset.svg @@ -1,7 +1,7 @@ - - + + @@ -18,7 +18,7 @@ - + @@ -39,7 +39,7 @@ - + @@ -59,7 +59,7 @@ - + diff --git a/branding/static/img/custom/welcome.svg b/branding/static/img/custom/welcome.svg index 68c94d4..b130e75 100644 --- a/branding/static/img/custom/welcome.svg +++ b/branding/static/img/custom/welcome.svg @@ -1,7 +1,7 @@ - - + + @@ -18,7 +18,7 @@ - + @@ -39,7 +39,7 @@ - + @@ -59,7 +59,7 @@ - + From 0344a1b4cc3ba1d2d9c49e3bee7dcc4ea63c9107 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 11 May 2021 16:03:41 +0200 Subject: [PATCH 04/48] =?UTF-8?q?Implement=20use=20of=20package.json=20've?= =?UTF-8?q?rsion'=20etc.=20for=20'$=20docker=20build=20=E2=80=A6'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/publish.yml | 12 +++++++++--- docker/webapp.Dockerfile | 3 ++- package.json | 5 ++++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 3a28d0c..fe37236 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -61,10 +61,16 @@ jobs: ########################################################################## - name: ENV - VERSION run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV + - name: ENV - BUILD_NUMBER + run: echo "BUILD_NUMBER=$(node -p -e "require('./package.json').build-number")" >> $GITHUB_ENV + - name: ENV - DOCKER_ORGANISATION_SOURCE + run: echo "DOCKER_ORGANISATION_SOURCE=$(node -p -e "require('./package.json').docker-organisation-source")" >> $GITHUB_ENV + - name: ENV - DOCKER_ORGANISATION_PUSH + run: echo "DOCKER_ORGANISATION_PUSH=$(node -p -e "require('./package.json').docker-organisation-push")" >> $GITHUB_ENV - name: ENV - BUILD_DATE run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}.${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV + run: echo "BUILD_VERSION=${VERSION}-${BUILD_NUMBER}" >> $GITHUB_ENV - name: ENV - BUILD_COMMIT run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV ########################################################################## @@ -72,8 +78,8 @@ jobs: ########################################################################## - name: webapp | Build `branded` image run: | - docker build --target branded -t "ocelotsocialnetwork/webapp-branded:latest" -t "ocelotsocialnetwork/webapp-branded:${VERSION}" -t "ocelotsocialnetwork/webapp-branded:${BUILD_VERSION}" -f docker/webapp.Dockerfile . - docker save "ocelotsocialnetwork/webapp-branded" > /tmp/webapp-branded.tar + docker build --target branded -t "${DOCKER_ORGANISATION_PUSH}/webapp-branded:latest" -t "${DOCKER_ORGANISATION_PUSH}/webapp-branded:${VERSION}" -t "${DOCKER_ORGANISATION_PUSH}/webapp-branded:${BUILD_VERSION}" -f docker/webapp.Dockerfile --build-arg APP_IMAGE=${DOCKER_ORGANISATION_SOURCE}/webapp:${BUILD_VERSION} . + docker save "${DOCKER_ORGANISATION_PUSH}/webapp-branded" > /tmp/webapp-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 with: diff --git a/docker/webapp.Dockerfile b/docker/webapp.Dockerfile index cec47cc..58516f3 100644 --- a/docker/webapp.Dockerfile +++ b/docker/webapp.Dockerfile @@ -1,7 +1,8 @@ ################################################################################## # BRANDED ######################################################################## ################################################################################## -FROM ocelotsocialnetwork/webapp:latest as branded +ARG APP_IMAGE=ocelotsocialnetwork/webapp:latest +FROM $APP_IMAGE as branded # Copy public constants to the docker image branding it COPY branding/static/ static/ diff --git a/package.json b/package.json index adb67e8..b483e1f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,9 @@ { "name": "ocelot-social-branded", - "version": "0.0.6", + "version": "1.0.2", + "build-number": "79", + "docker-organisation-source": "ocelotsocialnetwork", + "docker-organisation-push": "ocelotsocialnetwork", "description": "Ocelot Social Branded", "author": "ocelot.social Community", "license": "MIT", From 1afe893fb6a2ceac5ab5f97a863591fe1023cdc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 11 May 2021 16:50:52 +0200 Subject: [PATCH 05/48] Build branded Neo4j as well --- .github/workflows/publish.yml | 39 ++++++++++++++++++++++++++++++++++- docker/neo4j.Dockerfile | 9 ++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 docker/neo4j.Dockerfile diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index fe37236..878bd1b 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -6,6 +6,43 @@ on: - master jobs: + ############################################################################## + # JOB: DOCKER BUILD COMMUNITY NEO4J ########################################## + ############################################################################## + build_production_neo4j: + name: Docker Build Branded - Neo4j Community + runs-on: ubuntu-latest + #needs: [nothing] + steps: + ########################################################################## + # CHECKOUT CODE ########################################################## + ########################################################################## + - name: Checkout code + uses: actions/checkout@v2 + ########################################################################## + # SET ENVS ############################################################### + ########################################################################## + - name: ENV - VERSION + run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV + - name: ENV - BUILD_DATE + run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV + - name: ENV - BUILD_VERSION + run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV + - name: ENV - BUILD_COMMIT + run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV + ########################################################################## + # BUILD NEO4J DOCKER IMAGE (community-branded) ########################### + ########################################################################## + - name: Neo4j | Build `community-branded` image + run: | + docker build --target community-branded -t "ocelotsocialnetwork/neo4j-community-branded:latest" -t "ocelotsocialnetwork/neo4j-community-branded:${VERSION}" -t "ocelotsocialnetwork/neo4j-community-branded:${BUILD_VERSION}" -f docker/neo4j.Dockerfile . + docker save "ocelotsocialnetwork/neo4j-community-branded" > /tmp/neo4j-community-branded.tar + - name: Upload Artifact + uses: actions/upload-artifact@v2 + with: + name: docker-neo4j-community-branded + path: /tmp/neo4j-community-branded.tar + ############################################################################## # JOB: DOCKER BUILD BRANDED BACKEND ########################################## ############################################################################## @@ -27,7 +64,7 @@ jobs: - name: ENV - BUILD_DATE run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}.${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV + run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV - name: ENV - BUILD_COMMIT run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV ########################################################################## diff --git a/docker/neo4j.Dockerfile b/docker/neo4j.Dockerfile new file mode 100644 index 0000000..f303154 --- /dev/null +++ b/docker/neo4j.Dockerfile @@ -0,0 +1,9 @@ +################################################################################## +# COMMUNITY ###################################################################### +################################################################################## +FROM ocelotsocialnetwork/neo4j:latest as community-branded + +################################################################################## +# ENTERPRISE ##################################################################### +################################################################################## +FROM ocelotsocialnetwork/neo4j-enterprise:latest as enterprise-branded From b57e1f23e2da6172f9fb16a3a0051a5b6d5f15ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 11 May 2021 17:27:31 +0200 Subject: [PATCH 06/48] Refine Helm charts --- deployment/kubernetes/Chart.yaml | 6 +++--- deployment/kubernetes/README.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/deployment/kubernetes/Chart.yaml b/deployment/kubernetes/Chart.yaml index e7f36a7..14a8032 100644 --- a/deployment/kubernetes/Chart.yaml +++ b/deployment/kubernetes/Chart.yaml @@ -5,9 +5,9 @@ version: "1.0.0" # The appVersion defines which docker image is pulled. # Having it set to latest will pull the latest build on dockerhub. # You are free to define a specific version here tho. -# e.g. appVersion: "0.6.10" -# Be aware that this requires all dockers to have the same version available. -appVersion: "latest" +# e.g. appVersion: "1.0.2-79" +# Be aware that this requires all your apps to have the same docker image version available. +appVersion: "1.0.2-79" description: The Helm chart for ocelot.social home: https://ocelot.social sources: diff --git a/deployment/kubernetes/README.md b/deployment/kubernetes/README.md index e71eced..c48da6d 100644 --- a/deployment/kubernetes/README.md +++ b/deployment/kubernetes/README.md @@ -1,6 +1,6 @@ # Helm installation of Ocelot.social -Deploying Ocelot.social with Helm is very straight forward. All you have to do is to change certain parameters, like domain names and API keys, then you just install our provided Helm chart to your cluster. +Deploying *ocelot.social* with Helm is very straight forward. All you have to do is to change certain parameters, like domain names and API keys, then you just install our provided Helm chart to your cluster. ## Configuration From ef1b2e7b7f566c31cd2d10f8e1b8c87d2bae5e4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 12 May 2021 08:52:39 +0200 Subject: [PATCH 07/48] Refactor to Ulf's suggestions --- .github/workflows/publish.yml | 30 +++++++++++++----------------- deployment/kubernetes/Chart.yaml | 4 ++-- package.json | 5 ++--- 3 files changed, 17 insertions(+), 22 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 878bd1b..f6d521a 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,9 +1,10 @@ name: ocelot.social publish branded CI -on: - push: - branches: - - master +# Wolle on: +# push: +# branches: +# - master +on: [push] jobs: ############################################################################## @@ -98,25 +99,20 @@ jobs: ########################################################################## - name: ENV - VERSION run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV - - name: ENV - BUILD_NUMBER - run: echo "BUILD_NUMBER=$(node -p -e "require('./package.json').build-number")" >> $GITHUB_ENV - - name: ENV - DOCKER_ORGANISATION_SOURCE - run: echo "DOCKER_ORGANISATION_SOURCE=$(node -p -e "require('./package.json').docker-organisation-source")" >> $GITHUB_ENV - - name: ENV - DOCKER_ORGANISATION_PUSH - run: echo "DOCKER_ORGANISATION_PUSH=$(node -p -e "require('./package.json').docker-organisation-push")" >> $GITHUB_ENV - - name: ENV - BUILD_DATE - run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV + - name: ENV - OCELOT_DOCKER_VERSION_TAG + run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelot-docker-version-tag")" >> $GITHUB_ENV + - name: ENV - DOCKER_ORGANISATION + run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').docker-organisation")" >> $GITHUB_ENV + # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}-${BUILD_NUMBER}" >> $GITHUB_ENV - - name: ENV - BUILD_COMMIT - run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV + run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV ########################################################################## # BUILD WEBAPP DOCKER IMAGE (build) ###################################### ########################################################################## - name: webapp | Build `branded` image run: | - docker build --target branded -t "${DOCKER_ORGANISATION_PUSH}/webapp-branded:latest" -t "${DOCKER_ORGANISATION_PUSH}/webapp-branded:${VERSION}" -t "${DOCKER_ORGANISATION_PUSH}/webapp-branded:${BUILD_VERSION}" -f docker/webapp.Dockerfile --build-arg APP_IMAGE=${DOCKER_ORGANISATION_SOURCE}/webapp:${BUILD_VERSION} . - docker save "${DOCKER_ORGANISATION_PUSH}/webapp-branded" > /tmp/webapp-branded.tar + docker build --target branded -t "${DOCKER_ORGANISATION}/webapp-branded:latest" -t "${DOCKER_ORGANISATION}/webapp-branded:${BUILD_VERSION}" -f docker/webapp.Dockerfile --build-arg APP_IMAGE=ocelotsocialnetwork/webapp:${OCELOT_DOCKER_VERSION_TAG} . + docker save "${DOCKER_ORGANISATION}/webapp-branded" > /tmp/webapp-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 with: diff --git a/deployment/kubernetes/Chart.yaml b/deployment/kubernetes/Chart.yaml index 14a8032..5b953e3 100644 --- a/deployment/kubernetes/Chart.yaml +++ b/deployment/kubernetes/Chart.yaml @@ -5,9 +5,9 @@ version: "1.0.0" # The appVersion defines which docker image is pulled. # Having it set to latest will pull the latest build on dockerhub. # You are free to define a specific version here tho. -# e.g. appVersion: "1.0.2-79" +# e.g. appVersion: "latest" or "1.0.2-3-ocelot.social1.0.2-79" # Be aware that this requires all your apps to have the same docker image version available. -appVersion: "1.0.2-79" +appVersion: "latest" description: The Helm chart for ocelot.social home: https://ocelot.social sources: diff --git a/package.json b/package.json index b483e1f..7b6a8de 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,8 @@ { "name": "ocelot-social-branded", "version": "1.0.2", - "build-number": "79", - "docker-organisation-source": "ocelotsocialnetwork", - "docker-organisation-push": "ocelotsocialnetwork", + "ocelot-docker-version-tag": "1.0.2-79", + "docker-organisation": "ocelotsocialnetwork", "description": "Ocelot Social Branded", "author": "ocelot.social Community", "license": "MIT", From 278317095aff70e6341d1cec0863945ef6f054fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 12 May 2021 09:03:06 +0200 Subject: [PATCH 08/48] Fix package.json entries --- .github/workflows/publish.yml | 4 ++-- package.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index f6d521a..820d2a0 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -100,9 +100,9 @@ jobs: - name: ENV - VERSION run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV - name: ENV - OCELOT_DOCKER_VERSION_TAG - run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelot-docker-version-tag")" >> $GITHUB_ENV + run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV - name: ENV - DOCKER_ORGANISATION - run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').docker-organisation")" >> $GITHUB_ENV + run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - name: ENV - BUILD_VERSION run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV diff --git a/package.json b/package.json index 7b6a8de..e73be6c 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "ocelot-social-branded", "version": "1.0.2", - "ocelot-docker-version-tag": "1.0.2-79", - "docker-organisation": "ocelotsocialnetwork", + "ocelotDockerVersionTag": "1.0.2-79", + "dockerOrganisation": "ocelotsocialnetwork", "description": "Ocelot Social Branded", "author": "ocelot.social Community", "license": "MIT", From 272a485f673210abdedae0ab4a60173bc6a01cc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 12 May 2021 11:30:16 +0200 Subject: [PATCH 09/48] Add the other docker images --- .github/workflows/publish.yml | 89 ++++++++++++++++++++++++++++------- docker/backend.Dockerfile | 5 +- docker/maintenance.Dockerfile | 5 +- docker/neo4j.Dockerfile | 4 +- docker/webapp.Dockerfile | 2 +- 5 files changed, 81 insertions(+), 24 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 820d2a0..bd80ce3 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -27,8 +27,13 @@ jobs: run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV - name: ENV - BUILD_DATE run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV + - name: ENV - OCELOT_DOCKER_VERSION_TAG + run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV + - name: ENV - DOCKER_ORGANISATION + run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV + # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV + run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV - name: ENV - BUILD_COMMIT run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV ########################################################################## @@ -36,8 +41,8 @@ jobs: ########################################################################## - name: Neo4j | Build `community-branded` image run: | - docker build --target community-branded -t "ocelotsocialnetwork/neo4j-community-branded:latest" -t "ocelotsocialnetwork/neo4j-community-branded:${VERSION}" -t "ocelotsocialnetwork/neo4j-community-branded:${BUILD_VERSION}" -f docker/neo4j.Dockerfile . - docker save "ocelotsocialnetwork/neo4j-community-branded" > /tmp/neo4j-community-branded.tar + docker build --target community-branded -t "${DOCKER_ORGANISATION}/neo4j-community-branded:latest" -t "${DOCKER_ORGANISATION}/neo4j-community-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/neo4j-community-branded:${BUILD_VERSION}" -f docker/neo4j.Dockerfile --build-arg APP_IMAGE=ocelotsocialnetwork/neo4j:${OCELOT_DOCKER_VERSION_TAG} . + docker save "${DOCKER_ORGANISATION}/neo4j-community-branded" > /tmp/neo4j-community-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 with: @@ -64,8 +69,13 @@ jobs: run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV - name: ENV - BUILD_DATE run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV + - name: ENV - OCELOT_DOCKER_VERSION_TAG + run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV + - name: ENV - DOCKER_ORGANISATION + run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV + # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV + run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV - name: ENV - BUILD_COMMIT run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV ########################################################################## @@ -73,8 +83,8 @@ jobs: ########################################################################## - name: backend | Build `branded` image run: | - docker build --target branded -t "ocelotsocialnetwork/backend-branded:latest" -t "ocelotsocialnetwork/backend-branded:${VERSION}" -t "ocelotsocialnetwork/backend-branded:${BUILD_VERSION}" -f docker/backend.Dockerfile . - docker save "ocelotsocialnetwork/backend-branded" > /tmp/backend-branded.tar + docker build --target branded -t "${DOCKER_ORGANISATION}/backend-branded:latest" -t "${DOCKER_ORGANISATION}/backend-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/backend-branded:${BUILD_VERSION}" -f docker/backend.Dockerfile --build-arg APP_IMAGE=ocelotsocialnetwork/backend:${OCELOT_DOCKER_VERSION_TAG} . + docker save "${DOCKER_ORGANISATION}/backend-branded" > /tmp/backend-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 with: @@ -99,6 +109,8 @@ jobs: ########################################################################## - name: ENV - VERSION run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV + - name: ENV - BUILD_DATE + run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV - name: ENV - OCELOT_DOCKER_VERSION_TAG run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV - name: ENV - DOCKER_ORGANISATION @@ -106,12 +118,14 @@ jobs: # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - name: ENV - BUILD_VERSION run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV + - name: ENV - BUILD_COMMIT + run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV ########################################################################## # BUILD WEBAPP DOCKER IMAGE (build) ###################################### ########################################################################## - name: webapp | Build `branded` image run: | - docker build --target branded -t "${DOCKER_ORGANISATION}/webapp-branded:latest" -t "${DOCKER_ORGANISATION}/webapp-branded:${BUILD_VERSION}" -f docker/webapp.Dockerfile --build-arg APP_IMAGE=ocelotsocialnetwork/webapp:${OCELOT_DOCKER_VERSION_TAG} . + docker build --target branded -t "${DOCKER_ORGANISATION}/webapp-branded:latest" -t "${DOCKER_ORGANISATION}/webapp-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/webapp-branded:${BUILD_VERSION}" -f docker/webapp.Dockerfile --build-arg APP_IMAGE=ocelotsocialnetwork/webapp:${OCELOT_DOCKER_VERSION_TAG} . docker save "${DOCKER_ORGANISATION}/webapp-branded" > /tmp/webapp-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 @@ -139,8 +153,13 @@ jobs: run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV - name: ENV - BUILD_DATE run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV + - name: ENV - OCELOT_DOCKER_VERSION_TAG + run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV + - name: ENV - DOCKER_ORGANISATION + run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV + # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}.${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV + run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV - name: ENV - BUILD_COMMIT run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV ########################################################################## @@ -148,8 +167,8 @@ jobs: ########################################################################## - name: maintenance | Build `branded` image run: | - docker build --target branded -t "ocelotsocialnetwork/maintenance-branded:latest" -t "ocelotsocialnetwork/maintenance-branded:${VERSION}" -t "ocelotsocialnetwork/maintenance-branded:${BUILD_VERSION}" -f docker/maintenance.Dockerfile . - docker save "ocelotsocialnetwork/maintenance-branded" > /tmp/maintenance-branded.tar + docker build --target branded -t "${DOCKER_ORGANISATION}/maintenance-branded:latest" -t "${DOCKER_ORGANISATION}/maintenance-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/maintenance-branded:${BUILD_VERSION}" -f docker/maintenance.Dockerfile --build-arg APP_IMAGE=ocelotsocialnetwork/maintenance:${OCELOT_DOCKER_VERSION_TAG} . + docker save "${DOCKER_ORGANISATION}/maintenance-branded" > /tmp/maintenance-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 with: @@ -173,8 +192,33 @@ jobs: - name: Checkout code uses: actions/checkout@v2 ########################################################################## + # SET ENVS ############################################################### + ########################################################################## + - name: ENV - VERSION + run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV + - name: ENV - BUILD_DATE + run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV + - name: ENV - OCELOT_DOCKER_VERSION_TAG + run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV + - name: ENV - DOCKER_ORGANISATION + run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV + # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" + - name: ENV - BUILD_VERSION + run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV + - name: ENV - BUILD_COMMIT + run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV + ########################################################################## # DOWNLOAD DOCKER IMAGES ################################################# ########################################################################## + # Neo4j Community + - name: Download Docker Image (Neo4j Community) + uses: actions/download-artifact@v2 + with: + name: docker-neo4j-community-branded + path: /tmp + - name: Load Docker Image + run: docker load < /tmp/neo4j-community-branded.tar + # Backend - name: Download Docker Image (Backend) uses: actions/download-artifact@v2 with: @@ -182,13 +226,15 @@ jobs: path: /tmp - name: Load Docker Image run: docker load < /tmp/backend-branded.tar - - name: Download Docker Image (WebApp) + # Webapp + - name: Download Docker Image (Webapp) uses: actions/download-artifact@v2 with: name: docker-webapp-branded path: /tmp - name: Load Docker Image run: docker load < /tmp/webapp-branded.tar + # Maintenance - name: Download Docker Image (Maintenance) uses: actions/download-artifact@v2 with: @@ -201,12 +247,14 @@ jobs: ########################################################################## - name: login to dockerhub run: echo "${DOCKERHUB_TOKEN}" | docker login -u "${DOCKERHUB_USERNAME}" --password-stdin - - name: Push backend - run: docker push --all-tags ocelotsocialnetwork/backend-branded - - name: Push webapp - run: docker push --all-tags ocelotsocialnetwork/webapp-branded - - name: Push maintenance - run: docker push --all-tags ocelotsocialnetwork/maintenance-branded + - name: Push Neo4j Community + run: docker push --all-tags ${DOCKER_ORGANISATION}/neo4j-community-branded + - name: Push Backend + run: docker push --all-tags ${DOCKER_ORGANISATION}/backend-branded + - name: Push Webapp + run: docker push --all-tags ${DOCKER_ORGANISATION}/webapp-branded + - name: Push Maintenance + run: docker push --all-tags ${DOCKER_ORGANISATION}/maintenance-branded ############################################################################## # JOB: GITHUB TAG LATEST VERSION ############################################# @@ -230,8 +278,13 @@ jobs: run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV - name: ENV - BUILD_DATE run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV + - name: ENV - OCELOT_DOCKER_VERSION_TAG + run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV + - name: ENV - DOCKER_ORGANISATION + run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV + # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}.${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV + run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV - name: ENV - BUILD_COMMIT run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV ########################################################################## diff --git a/docker/backend.Dockerfile b/docker/backend.Dockerfile index db234aa..9b68fb8 100644 --- a/docker/backend.Dockerfile +++ b/docker/backend.Dockerfile @@ -1,8 +1,9 @@ ################################################################################## # BRANDED ######################################################################## ################################################################################## -FROM ocelotsocialnetwork/backend:latest as branded +ARG APP_IMAGE=ocelotsocialnetwork/backend:latest +FROM $APP_IMAGE as branded -# Copy public constants to the docker image branding it +# Copy public constants to the docker image and branding it COPY branding/constants/links.js src/config/ COPY branding/constants/metadata.js src/config/ diff --git a/docker/maintenance.Dockerfile b/docker/maintenance.Dockerfile index 585947c..8b05fe7 100644 --- a/docker/maintenance.Dockerfile +++ b/docker/maintenance.Dockerfile @@ -1,8 +1,9 @@ ################################################################################## # BRANDED ######################################################################## ################################################################################## -FROM ocelotsocialnetwork/maintenance:latest as branded +ARG APP_IMAGE=ocelotsocialnetwork/maintenance:latest +FROM $APP_IMAGE as branded -# Copy public constants to the docker image branding it +# Copy public constants to the docker image and branding it COPY branding/static/ static/ COPY branding/constants/ constants/ diff --git a/docker/neo4j.Dockerfile b/docker/neo4j.Dockerfile index f303154..dff5209 100644 --- a/docker/neo4j.Dockerfile +++ b/docker/neo4j.Dockerfile @@ -1,7 +1,9 @@ +ARG APP_IMAGE=ocelotsocialnetwork/neo4j:latest + ################################################################################## # COMMUNITY ###################################################################### ################################################################################## -FROM ocelotsocialnetwork/neo4j:latest as community-branded +FROM $APP_IMAGE as community-branded ################################################################################## # ENTERPRISE ##################################################################### diff --git a/docker/webapp.Dockerfile b/docker/webapp.Dockerfile index 58516f3..bfdb899 100644 --- a/docker/webapp.Dockerfile +++ b/docker/webapp.Dockerfile @@ -4,6 +4,6 @@ ARG APP_IMAGE=ocelotsocialnetwork/webapp:latest FROM $APP_IMAGE as branded -# Copy public constants to the docker image branding it +# Copy public constants to the docker image and branding it COPY branding/static/ static/ COPY branding/constants/ constants/ From 3fe2ec64507565c38ca81ae45869c81afc6302f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 12 May 2021 12:04:20 +0200 Subject: [PATCH 10/48] Use correct Neo4j docker image --- deployment/kubernetes/values.yaml.dist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/kubernetes/values.yaml.dist b/deployment/kubernetes/values.yaml.dist index 5357a22..d20e2bc 100644 --- a/deployment/kubernetes/values.yaml.dist +++ b/deployment/kubernetes/values.yaml.dist @@ -47,7 +47,7 @@ WEBAPP: NEO4J: # Most likely you don't need to change this REVISIONS_HISTORY_LIMIT: "25" - DOCKER_IMAGE_REPO: "ocelotsocialnetwork/neo4j" + DOCKER_IMAGE_REPO: "ocelotsocialnetwork/neo4j-community-branded" DOCKER_IMAGE_PULL_POLICY: "Always" CONTAINER_RESTART_POLICY: "Always" CONTAINER_TERMINATION_GRACE_PERIOD_SECONDS: "30" From c0a1028eb7fce888f96fbd2f52a7531c074a5822 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 12 May 2021 12:53:15 +0200 Subject: [PATCH 11/48] Rename *.yaml.dist files to *.template.yaml --- .../{dns.values.yaml.dist => dns.values.template.yaml} | 2 ++ .../{nginx.values.yaml.dist => nginx.values.template.yaml} | 2 ++ .../kubernetes/{values.yaml.dist => values.template.yaml} | 4 +++- 3 files changed, 7 insertions(+), 1 deletion(-) rename deployment/kubernetes/{dns.values.yaml.dist => dns.values.template.yaml} (74%) rename deployment/kubernetes/{nginx.values.yaml.dist => nginx.values.template.yaml} (68%) rename deployment/kubernetes/{values.yaml.dist => values.template.yaml} (97%) diff --git a/deployment/kubernetes/dns.values.yaml.dist b/deployment/kubernetes/dns.values.template.yaml similarity index 74% rename from deployment/kubernetes/dns.values.yaml.dist rename to deployment/kubernetes/dns.values.template.yaml index 16d2975..09539e3 100644 --- a/deployment/kubernetes/dns.values.yaml.dist +++ b/deployment/kubernetes/dns.values.template.yaml @@ -1,3 +1,5 @@ +# please duplicate template file and rename to "dns.values.yaml" and fill in your value + provider: digitalocean digitalocean: # create the API token at https://cloud.digitalocean.com/account/api/tokens diff --git a/deployment/kubernetes/nginx.values.yaml.dist b/deployment/kubernetes/nginx.values.template.yaml similarity index 68% rename from deployment/kubernetes/nginx.values.yaml.dist rename to deployment/kubernetes/nginx.values.template.yaml index 06dad81..8035104 100644 --- a/deployment/kubernetes/nginx.values.yaml.dist +++ b/deployment/kubernetes/nginx.values.template.yaml @@ -1,3 +1,5 @@ +# please duplicate template file and rename to "nginx.values.yaml" and fill in your value + controller: kind: DaemonSet hostNetwork: true diff --git a/deployment/kubernetes/values.yaml.dist b/deployment/kubernetes/values.template.yaml similarity index 97% rename from deployment/kubernetes/values.yaml.dist rename to deployment/kubernetes/values.template.yaml index d20e2bc..21bcd9c 100644 --- a/deployment/kubernetes/values.yaml.dist +++ b/deployment/kubernetes/values.template.yaml @@ -1,4 +1,6 @@ -# Change all the below if needed +# please duplicate template file and rename to "values.yaml" and fill in your value + +# change all the below if needed PUBLIC_REGISTRATION: false INVITE_REGISTRATION: false From 050d0c3ea89ebb078bd7f3b82c4582758f56d288 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Fri, 14 May 2021 12:27:33 +0200 Subject: [PATCH 12/48] Refine README and values.template.yaml --- .github/workflows/publish.yml | 10 +- deployment/kubernetes/README.md | 130 +++++++++++++++------ deployment/kubernetes/values.template.yaml | 25 ++-- 3 files changed, 115 insertions(+), 50 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index bd80ce3..76ac7e2 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,10 +1,10 @@ name: ocelot.social publish branded CI -# Wolle on: -# push: -# branches: -# - master -on: [push] +on: + push: + branches: + - master +# on: [push] # for testing while developing jobs: ############################################################################## diff --git a/deployment/kubernetes/README.md b/deployment/kubernetes/README.md index c48da6d..ce0ff19 100644 --- a/deployment/kubernetes/README.md +++ b/deployment/kubernetes/README.md @@ -1,40 +1,54 @@ -# Helm installation of Ocelot.social +# Helm Installation Of Ocelot.Social Deploying *ocelot.social* with Helm is very straight forward. All you have to do is to change certain parameters, like domain names and API keys, then you just install our provided Helm chart to your cluster. ## Configuration -You can customize the network with your configuration by changing the `values.yaml`, all variables will be available as environment variables in your deployed kubernetes pods. For more details refer to the `values.yaml.dist` file. +You can customize the network with your configuration by duplicate the `values.template.yaml` to a new `values.yaml` file and change it to your need. All included variables will be available as environment variables in your deployed kubernetes pods. -Besides the `values.yaml.dist` file we provide a `nginx.values.yaml.dist` and `dns.values.yaml.dist`. The `nginx.values.yaml` is the configuration for the ingress-nginx helm chart, while the `dns.values.yaml` file is for automatically updating the dns values on digital ocean and therefore optional. - -As hinted above you should copy the given files and rename them accordingly. Then go ahead and modify the values in the newly created files accordingly. +Besides the `values.template.yaml` file we provide a `nginx.values.template.yaml` and `dns.values.template.yaml` for a similar procedure. The new `nginx.values.yaml` is the configuration for the ingress-nginx Helm chart, while the `dns.values.yaml` file is for automatically updating the dns values on digital ocean and therefore optional. ## Installation -Due to the many limitations of Helm you still have to do several manual steps. Those occur before you run the actual ocelot helm chart. Obviously it is expected of you to have `helm` and `kubectl` installed. For Digital Ocean you might require `doctl` aswell. +Due to the many limitations of Helm you still have to do several manual steps. Those occur before you run the actual *ocelot.social* Helm chart. Obviously it is expected of you to have `helm` and `kubectl` installed. For Digital Ocean you might require `doctl` aswell. ### Cert Manager (https) Please refer to [cert-manager.io docs](https://cert-manager.io/docs/installation/kubernetes/) for more details. +***ATTENTION:*** *Be with the Terminal in your repository in the folder of this README.* + 1. Create Namespace ```bash -kubectl --kubeconfig=/../kubeconfig.yaml create namespace cert-manager +# kubeconfig.yaml set globaly +$ kubectl create namespace cert-manager +# or kubeconfig.yaml in your repo, then adjust +$ kubectl --kubeconfig=/../kubeconfig.yaml create namespace cert-manager ``` -2. Add Helm Repo & update +2. Add Helm repository and update ```bash -helm repo add jetstack https://charts.jetstack.io -helm repo update +$ helm repo add jetstack https://charts.jetstack.io +$ helm repo update ``` 3. Install Cert-Manager Helm chart + ```bash -# this can not be included sine the CRDs cant be installed properly via helm... -helm --kubeconfig=/../kubeconfig.yaml \ +# option 1 +# this can't be applied via kubectl to our cluster since the CRDs can't be installed properly this way ... +# $ kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.3.1/cert-manager.crds.yaml + +# option 2 +# kubeconfig.yaml set globaly +$ helm install cert-manager jetstack/cert-manager \ + --namespace cert-manager \ + --version v1.1.0 \ + --set installCRDs=true +# or kubeconfig.yaml in your repo, then adjust +$ helm --kubeconfig=/../kubeconfig.yaml \ install cert-manager jetstack/cert-manager \ --namespace cert-manager \ --version v1.1.0 \ @@ -43,15 +57,20 @@ helm --kubeconfig=/../kubeconfig.yaml \ ### Ingress-Nginx -1. Add Helm Repo & update +1. Add Helm repository and update + ```bash -helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx -helm repo update +$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx +$ helm repo update ``` 2. Install ingress-nginx + ```bash -helm --kubeconfig=/../kubeconfig.yaml install ingress-nginx ingress-nginx/ingress-nginx -f nginx.values.yaml +# kubeconfig.yaml set globaly +$ helm install ingress-nginx ingress-nginx/ingress-nginx -f nginx.values.yaml +# or kubeconfig.yaml in your repo, then adjust +$ helm --kubeconfig=/../kubeconfig.yaml install ingress-nginx ingress-nginx/ingress-nginx -f nginx.values.yaml ``` ### Digital Ocean Firewall @@ -61,56 +80,101 @@ This is only necessary if you run Digital Ocean without load balancer ([see here 1. Authenticate towards DO with your local `doctl` You will need a DO token for that. + ```bash -doctl auth init +# without doctl context +$ doctl auth init +# with doctl new context to be filled in +$ doctl auth init --context ``` +You will need an API token, which you can generate in the control panel at . + 2. Generate DO firewall + +Fill in the `CLUSTER_UUID` and `your-domain` (Get the `CLUSTER_UUID` value from the dashboard or the ID column from doctl kubernetes cluster list.): + ```bash -doctl compute firewall create \ +# without doctl context +$ doctl compute firewall create \ --inbound-rules="protocol:tcp,ports:80,address:0.0.0.0/0,address:::/0 protocol:tcp,ports:443,address:0.0.0.0/0,address:::/0" \ ---tag-names=k8s:1ebf0cdc-86c9-4384-936b-40010b71d049 \ ---name=my-domain-http-https +--tag-names=k8s: \ +--name=-http-https +# with doctl context to be filled in +$ doctl compute firewall create \ +--inbound-rules="protocol:tcp,ports:80,address:0.0.0.0/0,address:::/0 protocol:tcp,ports:443,address:0.0.0.0/0,address:::/0" \ +--tag-names=k8s: \ +--name=-http-https --context +``` + +To get informations about your success use this command. (Fill in the `ID` you got at creation.): + +```bash +# without doctl context +$ doctl compute firewall get +# with doctl context to be filled in +$ doctl compute firewall get --context ``` ### DNS -This chart is only necessary (recommended is more precise) if you run Digital Ocean without load balancer. -You need to generate a token for the `dns.values.yaml`. +This chart is only necessary (recommended is more precise) if you run Digital Ocean without load balancer. +You need to generate an access token with read + write for the `dns.values.yaml` at and fill it in. + +1. Add Helm repository and update -1. Add Helm Repo & update ```bash -helm repo add bitnami https://charts.bitnami.com/bitnami -helm repo update +$ helm repo add bitnami https://charts.bitnami.com/bitnami +$ helm repo update ``` 2. Install DNS + ```bash -helm --kubeconfig=/../kubeconfig.yaml install dns bitnami/external-dns -f dns.values.yaml +# kubeconfig.yaml set globaly +$ helm install dns bitnami/external-dns -f dns.values.yaml +# or kubeconfig.yaml in your repo, then adjust +$ helm --kubeconfig=/../kubeconfig.yaml install dns bitnami/external-dns -f dns.values.yaml ``` -### Ocelot.social +### Ocelot.Social All commands for ocelot need to be executed in the kubernetes folder. Therefore `cd deployment/kubernetes/` is expected to be run before every command. Furthermore the given commands will install ocelot into the default namespace. This can be modified to by attaching `--namespace not.default`. #### Install + +Only run once for the first time of installation: + ```bash -helm --kubeconfig=/../kubeconfig.yaml install ocelot ./ +# kubeconfig.yaml set globaly +$ helm install ocelot ./ +# or kubeconfig.yaml in your repo, then adjust +$ helm --kubeconfig=/../kubeconfig.yaml install ocelot ./ ``` -#### Upgrade +#### Upgrade & Update + +Run for all upgrades and updates: + ```bash -helm --kubeconfig=/../kubeconfig.yaml upgrade ocelot ./ +# kubeconfig.yaml set globaly +$ helm upgrade ocelot ./ +# or kubeconfig.yaml in your repo, then adjust +$ helm --kubeconfig=/../kubeconfig.yaml upgrade ocelot ./ ``` #### Uninstall + Be aware that if you uninstall ocelot the formerly bound volumes become unbound. Those volumes contain all data from uploads and database. You have to manually free their reference in order to bind them again when reinstalling. Once unbound from their former container references they should automatically be rebound (considering the sizes did not change) ```bash -helm --kubeconfig=/../kubeconfig.yaml uninstall ocelot +# kubeconfig.yaml set globaly +$ helm uninstall ocelot +# or kubeconfig.yaml in your repo, then adjust +$ helm --kubeconfig=/../kubeconfig.yaml uninstall ocelot ``` -## Error reporting +## Error Reporting 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 @@ -125,4 +189,4 @@ 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). On our kubernetes cluster we get "mult-attach" errors for persistent volumes. -Apparently Digital Ocean's kubernetes clusters do not fulfill the requirements. \ No newline at end of file +Apparently Digital Ocean's kubernetes clusters do not fulfill the requirements. diff --git a/deployment/kubernetes/values.template.yaml b/deployment/kubernetes/values.template.yaml index 21bcd9c..a525a3b 100644 --- a/deployment/kubernetes/values.template.yaml +++ b/deployment/kubernetes/values.template.yaml @@ -5,11 +5,12 @@ PUBLIC_REGISTRATION: false INVITE_REGISTRATION: false BACKEND: - # Change all the below if needed + # change all the below if needed # DOCKER_IMAGE_REPO - change that to your branded docker image - # Label is appended based on .Chart.appVersion + # label is appended based on .Chart.appVersion DOCKER_IMAGE_REPO: "ocelotsocialnetwork/backend-branded" CLIENT_URI: "https://staging.ocelot.social" + # create a new one for your network JWT_SECRET: "b/&&7b78BF&fv/Vd" MAPBOX_TOKEN: "pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g" PRIVATE_KEY_PASSPHRASE: "a7dsf78sadg87ad87sfagsadg78" @@ -21,7 +22,7 @@ BACKEND: SMTP_IGNORE_TLS: 'true' SMTP_SECURE: 'false' - # Most likely you don't need to change this + # most likely you don't need to change this MIN_READY_SECONDS: "15" PROGRESS_DEADLINE_SECONDS: "60" REVISIONS_HISTORY_LIMIT: "25" @@ -31,9 +32,9 @@ BACKEND: STORAGE_UPLOADS: "25Gi" WEBAPP: - # Change all the below if needed + # change all the below if needed # DOCKER_IMAGE_REPO - change that to your branded docker image - # Label is appended based on .Chart.appVersion + # label is appended based on .Chart.appVersion DOCKER_IMAGE_REPO: "ocelotsocialnetwork/webapp-branded" WEBSOCKETS_URI: "wss://staging.ocelot.social/api/graphql" @@ -47,7 +48,7 @@ WEBAPP: DOCKER_IMAGE_PULL_POLICY: "Always" NEO4J: - # Most likely you don't need to change this + # most likely you don't need to change this REVISIONS_HISTORY_LIMIT: "25" DOCKER_IMAGE_REPO: "ocelotsocialnetwork/neo4j-community-branded" DOCKER_IMAGE_PULL_POLICY: "Always" @@ -75,9 +76,9 @@ NEO4J: DBMS_SECURITY_PROCEDURES_UNRESTRICTED: "algo.*,apoc.*" MAINTENANCE: - # Change all the below if needed + # change all the below if needed # DOCKER_IMAGE_REPO - change that to your branded docker image - # Label is appended based on .Chart.appVersion + # label is appended based on .Chart.appVersion DOCKER_IMAGE_REPO: "ocelotsocialnetwork/maintenance-branded" # Most likely you don't need to change this @@ -87,7 +88,7 @@ MAINTENANCE: DOCKER_IMAGE_PULL_POLICY: "Always" LETSENCRYPT: - # Change all the below if needed + # change all the below if needed # ISSUER is used by cert-manager to set up certificates with the given provider. # change it to "letsencrypt-production" once you are ready to have valid cetrificates. # Be aware that the is an issuing limit with letsencrypt, so a dry run with staging might be wise @@ -98,14 +99,14 @@ LETSENCRYPT: - "www.staging.ocelot.social" NGINX: - # Most likely you don't need to change this + # most likely you don't need to change this PROXY_BODY_SIZE: "10m" STORAGE: - # Change all the below if needed + # change all the below if needed PROVISIONER: "dobs.csi.digitalocean.com" - # Most likely you don't need to change this + # most likely you don't need to change this RECLAIM_POLICY: "Retain" VOLUME_BINDING_MODE: "Immediate" ALLOW_VOLUME_EXPANSION: true \ No newline at end of file From d478a5af7e8908952663ad4742bdb4b1a4ae249c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Fri, 14 May 2021 13:07:50 +0200 Subject: [PATCH 13/48] Correct needs for 'upload_to_dockerhub' --- .github/workflows/publish.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 76ac7e2..6c455c7 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -10,7 +10,7 @@ jobs: ############################################################################## # JOB: DOCKER BUILD COMMUNITY NEO4J ########################################## ############################################################################## - build_production_neo4j: + build_branded_neo4j: name: Docker Build Branded - Neo4j Community runs-on: ubuntu-latest #needs: [nothing] @@ -181,7 +181,7 @@ jobs: upload_to_dockerhub: name: Upload to Dockerhub runs-on: ubuntu-latest - needs: [build_branded_backend,build_branded_webapp,build_branded_maintenance] + needs: [build_branded_neo4j,build_branded_backend,build_branded_webapp,build_branded_maintenance] env: DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} From 825b05f43ee63f6250497edfa0e6c84a663fdc14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Fri, 14 May 2021 13:12:53 +0200 Subject: [PATCH 14/48] Fix comments --- docker/backend.Dockerfile | 2 +- docker/maintenance.Dockerfile | 2 +- docker/webapp.Dockerfile | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker/backend.Dockerfile b/docker/backend.Dockerfile index 9b68fb8..0021950 100644 --- a/docker/backend.Dockerfile +++ b/docker/backend.Dockerfile @@ -4,6 +4,6 @@ ARG APP_IMAGE=ocelotsocialnetwork/backend:latest FROM $APP_IMAGE as branded -# Copy public constants to the docker image and branding it +# Copy public constants to the docker image and brand it COPY branding/constants/links.js src/config/ COPY branding/constants/metadata.js src/config/ diff --git a/docker/maintenance.Dockerfile b/docker/maintenance.Dockerfile index 8b05fe7..29ea4fd 100644 --- a/docker/maintenance.Dockerfile +++ b/docker/maintenance.Dockerfile @@ -4,6 +4,6 @@ ARG APP_IMAGE=ocelotsocialnetwork/maintenance:latest FROM $APP_IMAGE as branded -# Copy public constants to the docker image and branding it +# Copy public constants to the docker image and brand it COPY branding/static/ static/ COPY branding/constants/ constants/ diff --git a/docker/webapp.Dockerfile b/docker/webapp.Dockerfile index bfdb899..fef4796 100644 --- a/docker/webapp.Dockerfile +++ b/docker/webapp.Dockerfile @@ -4,6 +4,6 @@ ARG APP_IMAGE=ocelotsocialnetwork/webapp:latest FROM $APP_IMAGE as branded -# Copy public constants to the docker image and branding it +# Copy public constants to the docker image and brand it COPY branding/static/ static/ COPY branding/constants/ constants/ From 936743d8b533a7de75c71dda1347a01393afe2ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Fri, 14 May 2021 20:37:49 +0200 Subject: [PATCH 15/48] Refine comments and default Docker image names --- docker/backend.Dockerfile | 4 ++-- docker/maintenance.Dockerfile | 4 ++-- docker/neo4j.Dockerfile | 2 +- docker/webapp.Dockerfile | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docker/backend.Dockerfile b/docker/backend.Dockerfile index 0021950..ef39c14 100644 --- a/docker/backend.Dockerfile +++ b/docker/backend.Dockerfile @@ -1,9 +1,9 @@ ################################################################################## # BRANDED ######################################################################## ################################################################################## -ARG APP_IMAGE=ocelotsocialnetwork/backend:latest +ARG APP_IMAGE=ocelotsocialnetwork/backend-branded:latest FROM $APP_IMAGE as branded -# Copy public constants to the docker image and brand it +# copy public constants into the Docker image to brand it COPY branding/constants/links.js src/config/ COPY branding/constants/metadata.js src/config/ diff --git a/docker/maintenance.Dockerfile b/docker/maintenance.Dockerfile index 29ea4fd..0f273b0 100644 --- a/docker/maintenance.Dockerfile +++ b/docker/maintenance.Dockerfile @@ -1,9 +1,9 @@ ################################################################################## # BRANDED ######################################################################## ################################################################################## -ARG APP_IMAGE=ocelotsocialnetwork/maintenance:latest +ARG APP_IMAGE=ocelotsocialnetwork/maintenance-branded:latest FROM $APP_IMAGE as branded -# Copy public constants to the docker image and brand it +# copy public constants into the Docker image to brand it COPY branding/static/ static/ COPY branding/constants/ constants/ diff --git a/docker/neo4j.Dockerfile b/docker/neo4j.Dockerfile index dff5209..2220b6b 100644 --- a/docker/neo4j.Dockerfile +++ b/docker/neo4j.Dockerfile @@ -1,4 +1,4 @@ -ARG APP_IMAGE=ocelotsocialnetwork/neo4j:latest +ARG APP_IMAGE=ocelotsocialnetwork/neo4j-community-branded:latest ################################################################################## # COMMUNITY ###################################################################### diff --git a/docker/webapp.Dockerfile b/docker/webapp.Dockerfile index fef4796..c530a1f 100644 --- a/docker/webapp.Dockerfile +++ b/docker/webapp.Dockerfile @@ -1,9 +1,9 @@ ################################################################################## # BRANDED ######################################################################## ################################################################################## -ARG APP_IMAGE=ocelotsocialnetwork/webapp:latest +ARG APP_IMAGE=ocelotsocialnetwork/webapp-branded:latest FROM $APP_IMAGE as branded -# Copy public constants to the docker image and brand it +# copy public constants into the Docker image to brand it COPY branding/static/ static/ COPY branding/constants/ constants/ From 6cc5f1dff678bbd38d0a128863c50c7521393205 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 17 May 2021 09:26:09 +0200 Subject: [PATCH 16/48] Add README and LICENSE --- LICENSE.md | 11 +++++++++ README.md | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 LICENSE.md create mode 100644 README.md diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..de16611 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,11 @@ +# LICENSE + +MIT License + +Copyright \(c\) 2021 by the [ocelot.social community](https://github.com/Ocelot-Social-Community) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files \(the "Software"\), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..253130c --- /dev/null +++ b/README.md @@ -0,0 +1,66 @@ +# Ocelot-Social-Deploy-Rebranding + +This repository is an in use template to rebrand, configure, and deploy [ocelot.social](https://github.com/Ocelot-Social-Community/Ocelot-Social) networks. + + + + + + + +

+ Ocelot-Social +

+ + + +## Usage + +Fork this repository and configure as well as rebrand it for your own [ocelot.social](https://github.com/Ocelot-Social-Community/Ocelot-Social) network. + +- [Configure And Rebrand](https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding) + +Afterwards you can [deploy](deployment/README.md) it on your server: + +- [Kubernetes with Helm](deployment/kubernetes/README.md) + +## Developer Chat + +Join our friendly open-source community on [Discord](https://discordapp.com/invite/DFSjPaX) :heart_eyes_cat: +Just introduce yourself at `#introduce-yourself` and mention `@@Mentor` to get you onboard :neckbeard: +Check out the [contribution guideline](./CONTRIBUTING.md), too! + +We give write permissions to every developer who asks for it. Just text us on +[Discord](https://discord.gg/6ub73U3). + +## Technology Stack + +- [Kubernetes](https://kubernetes.io) +- [Helm](https://helm.sh) +- [Docker](https://www.docker.com) + + + +## License + +See the [LICENSE](LICENSE.md) file for license rights and limitations (MIT). From cc728e829f40efa50bbd0217ede47061242e64fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 17 May 2021 13:31:06 +0200 Subject: [PATCH 17/48] Revert apps default DockerHub image names --- docker/backend.Dockerfile | 2 +- docker/maintenance.Dockerfile | 2 +- docker/neo4j.Dockerfile | 2 +- docker/webapp.Dockerfile | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docker/backend.Dockerfile b/docker/backend.Dockerfile index ef39c14..3a1618d 100644 --- a/docker/backend.Dockerfile +++ b/docker/backend.Dockerfile @@ -1,7 +1,7 @@ ################################################################################## # BRANDED ######################################################################## ################################################################################## -ARG APP_IMAGE=ocelotsocialnetwork/backend-branded:latest +ARG APP_IMAGE=ocelotsocialnetwork/backend:latest FROM $APP_IMAGE as branded # copy public constants into the Docker image to brand it diff --git a/docker/maintenance.Dockerfile b/docker/maintenance.Dockerfile index 0f273b0..1da296d 100644 --- a/docker/maintenance.Dockerfile +++ b/docker/maintenance.Dockerfile @@ -1,7 +1,7 @@ ################################################################################## # BRANDED ######################################################################## ################################################################################## -ARG APP_IMAGE=ocelotsocialnetwork/maintenance-branded:latest +ARG APP_IMAGE=ocelotsocialnetwork/maintenance:latest FROM $APP_IMAGE as branded # copy public constants into the Docker image to brand it diff --git a/docker/neo4j.Dockerfile b/docker/neo4j.Dockerfile index 2220b6b..dff5209 100644 --- a/docker/neo4j.Dockerfile +++ b/docker/neo4j.Dockerfile @@ -1,4 +1,4 @@ -ARG APP_IMAGE=ocelotsocialnetwork/neo4j-community-branded:latest +ARG APP_IMAGE=ocelotsocialnetwork/neo4j:latest ################################################################################## # COMMUNITY ###################################################################### diff --git a/docker/webapp.Dockerfile b/docker/webapp.Dockerfile index c530a1f..157072b 100644 --- a/docker/webapp.Dockerfile +++ b/docker/webapp.Dockerfile @@ -1,7 +1,7 @@ ################################################################################## # BRANDED ######################################################################## ################################################################################## -ARG APP_IMAGE=ocelotsocialnetwork/webapp-branded:latest +ARG APP_IMAGE=ocelotsocialnetwork/webapp:latest FROM $APP_IMAGE as branded # copy public constants into the Docker image to brand it From eafc02c8693a30adc110bf4d0d228ef2398b6698 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 17 May 2021 13:31:36 +0200 Subject: [PATCH 18/48] Refine organization description --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e73be6c..a2b6100 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "1.0.2", "ocelotDockerVersionTag": "1.0.2-79", "dockerOrganisation": "ocelotsocialnetwork", - "description": "Ocelot Social Branded", + "description": "ocelot.social Branded", "author": "ocelot.social Community", "license": "MIT", "private": false, From 9d370c19217cd2cf8d0d169d5f791bde0fc0a4c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 19 May 2021 11:07:07 +0200 Subject: [PATCH 19/48] Adjust to new logo structure - Rename logo 'logo-horizontal--dummy' to dummy to get small caps in the next step. --- branding/constants/links.js | 1 + branding/constants/logos.js | 10 +++ branding/constants/metadata.js | 1 + .../img/custom/Logo-Horizontal-Dark.svg | 48 ----------- ...izontal.svg => logo-horizontal--dummy.svg} | 2 +- .../custom/{sign-up.svg => logo-squared.svg} | 2 +- branding/static/img/custom/logout.svg | 82 ------------------- branding/static/img/custom/password-reset.svg | 82 ------------------- .../static/img/custom/under-maintenance.svg | 82 ------------------- branding/static/img/custom/welcome.svg | 82 ------------------- docker/backend.Dockerfile | 1 + 11 files changed, 15 insertions(+), 378 deletions(-) create mode 100644 branding/constants/logos.js delete mode 100644 branding/static/img/custom/Logo-Horizontal-Dark.svg rename branding/static/img/custom/{Logo-Horizontal.svg => logo-horizontal--dummy.svg} (99%) rename branding/static/img/custom/{sign-up.svg => logo-squared.svg} (99%) delete mode 100644 branding/static/img/custom/logout.svg delete mode 100644 branding/static/img/custom/password-reset.svg delete mode 100644 branding/static/img/custom/under-maintenance.svg delete mode 100644 branding/static/img/custom/welcome.svg diff --git a/branding/constants/links.js b/branding/constants/links.js index 070ffa1..cdccbae 100644 --- a/branding/constants/links.js +++ b/branding/constants/links.js @@ -1,3 +1,4 @@ +// this file is duplicated in `backend/src/config/links.js` and `webapp/constants/links.js` and replaced on rebranding export default { ORGANIZATION: 'https://ocelot.social', DONATE: 'https://ocelot-social.herokuapp.com/donations', diff --git a/branding/constants/logos.js b/branding/constants/logos.js new file mode 100644 index 0000000..d093c7b --- /dev/null +++ b/branding/constants/logos.js @@ -0,0 +1,10 @@ +// this file is duplicated in `backend/src/config/logos.js` and `webapp/constants/logos.js` and replaced on rebranding +// this are the paths in the webapp +export default { + LOGO_HEADER_PATH: '/img/custom/logo-horizontal.svg', + LOGO_SIGNUP_PATH: '/img/custom/logo-squared.svg', + LOGO_WELCOME_PATH: '/img/custom/logo-squared.svg', + LOGO_LOGOUT_PATH: '/img/custom/logo-squared.svg', + LOGO_PASSWORD_RESET_PATH: '/img/custom/logo-squared.svg', + LOGO_MAINTENACE_RESET_PATH: '/img/custom/logo-squared.svg', +} diff --git a/branding/constants/metadata.js b/branding/constants/metadata.js index 55dfe23..e5f32c7 100644 --- a/branding/constants/metadata.js +++ b/branding/constants/metadata.js @@ -1,3 +1,4 @@ +// this file is duplicated in `backend/src/config/metadata.js` and `webapp/constants/metadata.js` and replaced on rebranding export default { APPLICATION_NAME: 'ocelot.social', APPLICATION_SHORT_NAME: 'ocelot', diff --git a/branding/static/img/custom/Logo-Horizontal-Dark.svg b/branding/static/img/custom/Logo-Horizontal-Dark.svg deleted file mode 100644 index deba991..0000000 --- a/branding/static/img/custom/Logo-Horizontal-Dark.svg +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/branding/static/img/custom/Logo-Horizontal.svg b/branding/static/img/custom/logo-horizontal--dummy.svg similarity index 99% rename from branding/static/img/custom/Logo-Horizontal.svg rename to branding/static/img/custom/logo-horizontal--dummy.svg index 27b522b..d821c83 100644 --- a/branding/static/img/custom/Logo-Horizontal.svg +++ b/branding/static/img/custom/logo-horizontal--dummy.svg @@ -1,6 +1,6 @@ - + diff --git a/branding/static/img/custom/sign-up.svg b/branding/static/img/custom/logo-squared.svg similarity index 99% rename from branding/static/img/custom/sign-up.svg rename to branding/static/img/custom/logo-squared.svg index b130e75..15f420c 100644 --- a/branding/static/img/custom/sign-up.svg +++ b/branding/static/img/custom/logo-squared.svg @@ -1,6 +1,6 @@ - + diff --git a/branding/static/img/custom/logout.svg b/branding/static/img/custom/logout.svg deleted file mode 100644 index b130e75..0000000 --- a/branding/static/img/custom/logout.svg +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/branding/static/img/custom/password-reset.svg b/branding/static/img/custom/password-reset.svg deleted file mode 100644 index b130e75..0000000 --- a/branding/static/img/custom/password-reset.svg +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/branding/static/img/custom/under-maintenance.svg b/branding/static/img/custom/under-maintenance.svg deleted file mode 100644 index b130e75..0000000 --- a/branding/static/img/custom/under-maintenance.svg +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/branding/static/img/custom/welcome.svg b/branding/static/img/custom/welcome.svg deleted file mode 100644 index b130e75..0000000 --- a/branding/static/img/custom/welcome.svg +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docker/backend.Dockerfile b/docker/backend.Dockerfile index 3a1618d..8851242 100644 --- a/docker/backend.Dockerfile +++ b/docker/backend.Dockerfile @@ -6,4 +6,5 @@ FROM $APP_IMAGE as branded # copy public constants into the Docker image to brand it COPY branding/constants/links.js src/config/ +COPY branding/constants/logos.js src/config/ COPY branding/constants/metadata.js src/config/ From ac85a971919a7ac9448043a102e1008b34c6e890 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 19 May 2021 11:10:01 +0200 Subject: [PATCH 20/48] Rename logo 'logo-horizontal.svg' to small caps, remove dummy --- .../custom/{logo-horizontal--dummy.svg => logo-horizontal.svg} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename branding/static/img/custom/{logo-horizontal--dummy.svg => logo-horizontal.svg} (100%) diff --git a/branding/static/img/custom/logo-horizontal--dummy.svg b/branding/static/img/custom/logo-horizontal.svg similarity index 100% rename from branding/static/img/custom/logo-horizontal--dummy.svg rename to branding/static/img/custom/logo-horizontal.svg From 981c48a782889e93a65254783a5dd7409e0723de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 19 May 2021 11:10:33 +0200 Subject: [PATCH 21/48] Release v1.0.3 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a2b6100..5931cf7 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ocelot-social-branded", - "version": "1.0.2", - "ocelotDockerVersionTag": "1.0.2-79", + "version": "1.0.3", + "ocelotDockerVersionTag": "1.0.3-81", "dockerOrganisation": "ocelotsocialnetwork", "description": "ocelot.social Branded", "author": "ocelot.social Community", From 71f250ceb65e024297bea21c72ca1bc0fde71e99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 19 May 2021 17:12:48 +0200 Subject: [PATCH 22/48] Upgrade ocelot.social build number to 1.0.3-82 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5931cf7..1ad10ae 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ocelot-social-branded", "version": "1.0.3", - "ocelotDockerVersionTag": "1.0.3-81", + "ocelotDockerVersionTag": "1.0.3-82", "dockerOrganisation": "ocelotsocialnetwork", "description": "ocelot.social Branded", "author": "ocelot.social Community", From 06fafb8ceed257d76dae131d655f6f436135736f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 25 May 2021 16:59:27 +0200 Subject: [PATCH 23/48] Change logo file name in main Readme.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 253130c..5f5ca6b 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ This repository is an in use template to rebrand, configure, and deploy [ocelot.

- Ocelot-Social + Ocelot-Social

+ + + + + +

+ wir.social +

+ + + + + +## Developer Chat + +Join our friendly open-source community on [Discord](https://discordapp.com/invite/DFSjPaX) :heart_eyes_cat: +Just introduce yourself at `#introduce-yourself` and mention `@@Mentor` to get you onboard :neckbeard: +Check out the [contribution guideline](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/CONTRIBUTING.md), too! + +We give write permissions to every developer who asks for it. Just text us on +[Discord](https://discord.gg/6ub73U3). + +## Technology Stack + +- [Kubernetes](https://kubernetes.io) +- [Helm](https://helm.sh) +- [Docker](https://www.docker.com) + + + +## License + +See the [LICENSE](LICENSE.md) file for license rights and limitations (MIT). From 7fab09d2845092c231021e1c5978451960df40f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 25 May 2021 17:14:40 +0200 Subject: [PATCH 26/48] Create LICENSE.md --- LICENSE.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 LICENSE.md diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..de16611 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,11 @@ +# LICENSE + +MIT License + +Copyright \(c\) 2021 by the [ocelot.social community](https://github.com/Ocelot-Social-Community) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files \(the "Software"\), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. From 4a588729d663522e4513afa887ca47da69b515a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 25 May 2021 17:15:50 +0200 Subject: [PATCH 27/48] Create .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e43b0f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store From 56a211dc813c1edaf09ae0f5b955719d0339cea2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 25 May 2021 17:59:04 +0200 Subject: [PATCH 28/48] Brand one of two logos --- branding/static/img/custom/logo-squared.svg | 83 +-------------------- 1 file changed, 1 insertion(+), 82 deletions(-) diff --git a/branding/static/img/custom/logo-squared.svg b/branding/static/img/custom/logo-squared.svg index 15f420c..fdfa6ca 100644 --- a/branding/static/img/custom/logo-squared.svg +++ b/branding/static/img/custom/logo-squared.svg @@ -1,82 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file From cd4ebf6100dc8957bfaf2740e52a76eaf78abed3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 25 May 2021 18:33:31 +0200 Subject: [PATCH 29/48] Update package.json to wir.social - Try first DockerHub push on 'wirsocial' for testing. --- .github/workflows/publish.yml | 11 ++++++----- package.json | 8 ++++---- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 6c455c7..dcf1eb3 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,10 +1,11 @@ name: ocelot.social publish branded CI -on: - push: - branches: - - master -# on: [push] # for testing while developing +# on: +# push: +# branches: +# - master +# Wolle +on: [push] # for testing while developing jobs: ############################################################################## diff --git a/package.json b/package.json index 1ad10ae..aa51e1f 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,14 @@ { - "name": "ocelot-social-branded", + "name": "wir.social", "version": "1.0.3", "ocelotDockerVersionTag": "1.0.3-82", - "dockerOrganisation": "ocelotsocialnetwork", - "description": "ocelot.social Branded", + "dockerOrganisation": "wirsocial", + "description": "wir.social ocelot.social Network", "author": "ocelot.social Community", "license": "MIT", "private": false, "repository": { "type": "git", - "url": "https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding.git" + "url": "https://github.com/wir-social/wir-social.git" } } From 1f89baa843f40b7da714b880bec53ed5950af1ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Sun, 30 May 2021 20:37:36 +0200 Subject: [PATCH 30/48] Refine comment --- .github/workflows/publish.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 6c455c7..0937a1e 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -31,7 +31,7 @@ jobs: run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV - name: ENV - DOCKER_ORGANISATION run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV - # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" + # this is based on the node Docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - name: ENV - BUILD_VERSION run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV - name: ENV - BUILD_COMMIT @@ -73,7 +73,7 @@ jobs: run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV - name: ENV - DOCKER_ORGANISATION run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV - # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" + # this is based on the node Docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - name: ENV - BUILD_VERSION run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV - name: ENV - BUILD_COMMIT @@ -115,7 +115,7 @@ jobs: run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV - name: ENV - DOCKER_ORGANISATION run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV - # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" + # this is based on the node Docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - name: ENV - BUILD_VERSION run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV - name: ENV - BUILD_COMMIT @@ -157,7 +157,7 @@ jobs: run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV - name: ENV - DOCKER_ORGANISATION run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV - # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" + # this is based on the node Docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - name: ENV - BUILD_VERSION run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV - name: ENV - BUILD_COMMIT @@ -202,7 +202,7 @@ jobs: run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV - name: ENV - DOCKER_ORGANISATION run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV - # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" + # this is based on the node Docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - name: ENV - BUILD_VERSION run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV - name: ENV - BUILD_COMMIT @@ -282,7 +282,7 @@ jobs: run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV - name: ENV - DOCKER_ORGANISATION run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV - # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" + # this is based on the node Docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - name: ENV - BUILD_VERSION run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV - name: ENV - BUILD_COMMIT From 4ba0d4dc60e369c94015dffb1f87c7d321bcfd08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Sun, 30 May 2021 20:37:54 +0200 Subject: [PATCH 31/48] Refine comment --- .github/workflows/publish.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index dcf1eb3..810f51c 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -32,7 +32,7 @@ jobs: run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV - name: ENV - DOCKER_ORGANISATION run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV - # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" + # this is based on the node Docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - name: ENV - BUILD_VERSION run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV - name: ENV - BUILD_COMMIT @@ -74,7 +74,7 @@ jobs: run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV - name: ENV - DOCKER_ORGANISATION run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV - # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" + # this is based on the node Docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - name: ENV - BUILD_VERSION run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV - name: ENV - BUILD_COMMIT @@ -116,7 +116,7 @@ jobs: run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV - name: ENV - DOCKER_ORGANISATION run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV - # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" + # this is based on the node Docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - name: ENV - BUILD_VERSION run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV - name: ENV - BUILD_COMMIT @@ -158,7 +158,7 @@ jobs: run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV - name: ENV - DOCKER_ORGANISATION run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV - # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" + # this is based on the node Docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - name: ENV - BUILD_VERSION run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV - name: ENV - BUILD_COMMIT @@ -203,7 +203,7 @@ jobs: run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV - name: ENV - DOCKER_ORGANISATION run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV - # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" + # this is based on the node Docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - name: ENV - BUILD_VERSION run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV - name: ENV - BUILD_COMMIT @@ -283,7 +283,7 @@ jobs: run: echo "OCELOT_DOCKER_VERSION_TAG=$(node -p -e "require('./package.json').ocelotDockerVersionTag")" >> $GITHUB_ENV - name: ENV - DOCKER_ORGANISATION run: echo "DOCKER_ORGANISATION=$(node -p -e "require('./package.json').dockerOrganisation")" >> $GITHUB_ENV - # this is oriented on the node docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" + # this is based on the node Docker version tag "node:12.19.0-alpine3.10" and looks like "app-branded:1.0.2-3-ocelot.social1.0.2-79" - name: ENV - BUILD_VERSION run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}-ocelot.social${OCELOT_DOCKER_VERSION_TAG}" >> $GITHUB_ENV - name: ENV - BUILD_COMMIT From a03830d5c6380ff93332bb3a4fe901c4ffeb61d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 31 May 2021 15:57:50 +0200 Subject: [PATCH 32/48] Correct Discord link --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 253130c..b7aaa85 100644 --- a/README.md +++ b/README.md @@ -38,12 +38,12 @@ Afterwards you can [deploy](deployment/README.md) it on your server: ## Developer Chat -Join our friendly open-source community on [Discord](https://discordapp.com/invite/DFSjPaX) :heart_eyes_cat: +Join our friendly open-source community on [Discord](https://discord.gg/AJSX9DCSUA) :heart_eyes_cat: Just introduce yourself at `#introduce-yourself` and mention `@@Mentor` to get you onboard :neckbeard: Check out the [contribution guideline](./CONTRIBUTING.md), too! We give write permissions to every developer who asks for it. Just text us on -[Discord](https://discord.gg/6ub73U3). +[Discord](https://discord.gg/AJSX9DCSUA). ## Technology Stack From f5426739445bf71e7d95ce269385747d7cb49778 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 31 May 2021 15:59:18 +0200 Subject: [PATCH 33/48] Correct Discord link --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0577826..549ebf9 100644 --- a/README.md +++ b/README.md @@ -41,12 +41,12 @@ Afterwards you can [deploy](deployment/README.md) it on your server: ## Developer Chat -Join our friendly open-source community on [Discord](https://discordapp.com/invite/DFSjPaX) :heart_eyes_cat: +Join our friendly open-source community on [Discord](https://discord.gg/AJSX9DCSUA) :heart_eyes_cat: Just introduce yourself at `#introduce-yourself` and mention `@@Mentor` to get you onboard :neckbeard: Check out the [contribution guideline](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/CONTRIBUTING.md), too! We give write permissions to every developer who asks for it. Just text us on -[Discord](https://discord.gg/6ub73U3). +[Discord](https://discord.gg/AJSX9DCSUA). ## Technology Stack From ccaec4ac23e20106f76033b6496f68ede7a0e55a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 1 Jun 2021 09:47:16 +0200 Subject: [PATCH 34/48] Replace horizontal logo by new wir.social --- .../static/img/custom/logo-horizontal.svg | 128 ++++++++---------- 1 file changed, 55 insertions(+), 73 deletions(-) diff --git a/branding/static/img/custom/logo-horizontal.svg b/branding/static/img/custom/logo-horizontal.svg index d821c83..7487d99 100644 --- a/branding/static/img/custom/logo-horizontal.svg +++ b/branding/static/img/custom/logo-horizontal.svg @@ -1,80 +1,62 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + From 7b09df848ba8c7706cd13a58e87149106151d497 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 3 Jun 2021 07:36:55 +0200 Subject: [PATCH 35/48] Extend and change links --- branding/constants/links.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/branding/constants/links.js b/branding/constants/links.js index 070ffa1..1f551d2 100644 --- a/branding/constants/links.js +++ b/branding/constants/links.js @@ -1,7 +1,12 @@ export default { ORGANIZATION: 'https://ocelot.social', - DONATE: 'https://ocelot-social.herokuapp.com/donations', - IMPRINT: 'https://ocelot-social.herokuapp.com/imprint', - DATA_PRIVACY: 'https://ocelot-social.herokuapp.com/imprint', - FAQ: 'https://ocelot-social.herokuapp.com/#kontakt', + SUPPORT: 'https://ocelot.social', + + // on null or empty string internal imprint is used, see 'webapp/locales/html/' + DONATE: 'https://ocelot-social.herokuapp.com/donations', // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly + IMPRINT: 'https://ocelot-social.herokuapp.com/imprint', // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly + TERMS_AND_CONDITIONS: null, + CODE_OF_CONDUCT: null, + DATA_PRIVACY: null, + FAQ: 'https://ocelot.social', } From 9bfc8e8753f7297f91b868c64e804a5738c46afd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 3 Jun 2021 07:54:47 +0200 Subject: [PATCH 36/48] Extend and change links --- branding/constants/links.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/branding/constants/links.js b/branding/constants/links.js index 1046e3f..a334f73 100644 --- a/branding/constants/links.js +++ b/branding/constants/links.js @@ -1,8 +1,13 @@ // this file is duplicated in `backend/src/config/links.js` and `webapp/constants/links.js` and replaced on rebranding export default { ORGANIZATION: 'https://webcraft-media.de', + SUPPORT: 'https://webcraft-media.de', + + // on null or empty string internal imprint is used, see 'webapp/locales/html/' DONATE: 'https://webcraft-media.de/donate-for-wir-social.html', IMPRINT: 'https://www.webcraft-media.de/#!impressum', DATA_PRIVACY: 'https://www.webcraft-media.de/#!datenschutz', + TERMS_AND_CONDITIONS: null, + CODE_OF_CONDUCT: null, FAQ: 'https://www.webcraft-media.de/#!contact', } From bd0a70ad542350dfc8b6ce50635dccce094256c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 3 Jun 2021 17:24:02 +0200 Subject: [PATCH 37/48] Add locales to branding, especial translated html files --- branding/locales/html/de/code-of-conduct.html | 3 +++ branding/locales/html/de/data-privacy.html | 3 +++ branding/locales/html/de/faq.html | 3 +++ branding/locales/html/de/imprint.html | 3 +++ branding/locales/html/de/terms-and-conditions.html | 3 +++ branding/locales/html/en/code-of-conduct.html | 3 +++ branding/locales/html/en/data-privacy.html | 3 +++ branding/locales/html/en/faq.html | 3 +++ branding/locales/html/en/imprint.html | 3 +++ branding/locales/html/en/terms-and-conditions.html | 3 +++ docker/maintenance.Dockerfile | 1 + docker/webapp.Dockerfile | 1 + 12 files changed, 32 insertions(+) create mode 100644 branding/locales/html/de/code-of-conduct.html create mode 100644 branding/locales/html/de/data-privacy.html create mode 100644 branding/locales/html/de/faq.html create mode 100644 branding/locales/html/de/imprint.html create mode 100644 branding/locales/html/de/terms-and-conditions.html create mode 100644 branding/locales/html/en/code-of-conduct.html create mode 100644 branding/locales/html/en/data-privacy.html create mode 100644 branding/locales/html/en/faq.html create mode 100644 branding/locales/html/en/imprint.html create mode 100644 branding/locales/html/en/terms-and-conditions.html diff --git a/branding/locales/html/de/code-of-conduct.html b/branding/locales/html/de/code-of-conduct.html new file mode 100644 index 0000000..dda9c27 --- /dev/null +++ b/branding/locales/html/de/code-of-conduct.html @@ -0,0 +1,3 @@ + + +

Ich bin der Inhalt vom Verhaltenskodex

diff --git a/branding/locales/html/de/data-privacy.html b/branding/locales/html/de/data-privacy.html new file mode 100644 index 0000000..3e1cc4d --- /dev/null +++ b/branding/locales/html/de/data-privacy.html @@ -0,0 +1,3 @@ + + +

Das hier wäre der Inhalt der Datenschutzbestimmungen

diff --git a/branding/locales/html/de/faq.html b/branding/locales/html/de/faq.html new file mode 100644 index 0000000..6b04c72 --- /dev/null +++ b/branding/locales/html/de/faq.html @@ -0,0 +1,3 @@ + + +

Hier stehen die FAQs

diff --git a/branding/locales/html/de/imprint.html b/branding/locales/html/de/imprint.html new file mode 100644 index 0000000..4cd4eaf --- /dev/null +++ b/branding/locales/html/de/imprint.html @@ -0,0 +1,3 @@ + + +

Ich bin das Impressum

diff --git a/branding/locales/html/de/terms-and-conditions.html b/branding/locales/html/de/terms-and-conditions.html new file mode 100644 index 0000000..87bdaf6 --- /dev/null +++ b/branding/locales/html/de/terms-and-conditions.html @@ -0,0 +1,3 @@ + + +

Ich bin der Inhalt der Seite "Nutzungsbedingungen"

diff --git a/branding/locales/html/en/code-of-conduct.html b/branding/locales/html/en/code-of-conduct.html new file mode 100644 index 0000000..b6d8ca5 --- /dev/null +++ b/branding/locales/html/en/code-of-conduct.html @@ -0,0 +1,3 @@ + + +

I am the content of the code of conduct

diff --git a/branding/locales/html/en/data-privacy.html b/branding/locales/html/en/data-privacy.html new file mode 100644 index 0000000..5a6c5d8 --- /dev/null +++ b/branding/locales/html/en/data-privacy.html @@ -0,0 +1,3 @@ + + +

This would be our data privacy section

diff --git a/branding/locales/html/en/faq.html b/branding/locales/html/en/faq.html new file mode 100644 index 0000000..c8a173b --- /dev/null +++ b/branding/locales/html/en/faq.html @@ -0,0 +1,3 @@ + + +

Here are the FAQs

diff --git a/branding/locales/html/en/imprint.html b/branding/locales/html/en/imprint.html new file mode 100644 index 0000000..03fa2f1 --- /dev/null +++ b/branding/locales/html/en/imprint.html @@ -0,0 +1,3 @@ + + +

I am the imprint

diff --git a/branding/locales/html/en/terms-and-conditions.html b/branding/locales/html/en/terms-and-conditions.html new file mode 100644 index 0000000..a93ad66 --- /dev/null +++ b/branding/locales/html/en/terms-and-conditions.html @@ -0,0 +1,3 @@ + + +

I am the content of the page "terms and conditions"

diff --git a/docker/maintenance.Dockerfile b/docker/maintenance.Dockerfile index 1da296d..f045c95 100644 --- a/docker/maintenance.Dockerfile +++ b/docker/maintenance.Dockerfile @@ -7,3 +7,4 @@ FROM $APP_IMAGE as branded # copy public constants into the Docker image to brand it COPY branding/static/ static/ COPY branding/constants/ constants/ +COPY branding/locales/ locales/ diff --git a/docker/webapp.Dockerfile b/docker/webapp.Dockerfile index 157072b..0f10432 100644 --- a/docker/webapp.Dockerfile +++ b/docker/webapp.Dockerfile @@ -7,3 +7,4 @@ FROM $APP_IMAGE as branded # copy public constants into the Docker image to brand it COPY branding/static/ static/ COPY branding/constants/ constants/ +COPY branding/locales/ locales/ From 5240bc9e6748210ad320e9a4e93e16931a53d695 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 3 Jun 2021 19:03:22 +0200 Subject: [PATCH 38/48] Add text line to the rebranded translated html files --- branding/locales/html/de/code-of-conduct.html | 2 ++ branding/locales/html/de/data-privacy.html | 2 ++ branding/locales/html/de/faq.html | 2 ++ branding/locales/html/de/imprint.html | 2 ++ branding/locales/html/de/terms-and-conditions.html | 2 ++ branding/locales/html/en/code-of-conduct.html | 2 ++ branding/locales/html/en/data-privacy.html | 2 ++ branding/locales/html/en/faq.html | 2 ++ branding/locales/html/en/imprint.html | 2 ++ branding/locales/html/en/terms-and-conditions.html | 2 ++ 10 files changed, 20 insertions(+) diff --git a/branding/locales/html/de/code-of-conduct.html b/branding/locales/html/de/code-of-conduct.html index dda9c27..8212ecf 100644 --- a/branding/locales/html/de/code-of-conduct.html +++ b/branding/locales/html/de/code-of-conduct.html @@ -1,3 +1,5 @@

Ich bin der Inhalt vom Verhaltenskodex

+ +Neu gebrandet … diff --git a/branding/locales/html/de/data-privacy.html b/branding/locales/html/de/data-privacy.html index 3e1cc4d..c09c72f 100644 --- a/branding/locales/html/de/data-privacy.html +++ b/branding/locales/html/de/data-privacy.html @@ -1,3 +1,5 @@

Das hier wäre der Inhalt der Datenschutzbestimmungen

+ +Neu gebrandet … diff --git a/branding/locales/html/de/faq.html b/branding/locales/html/de/faq.html index 6b04c72..457fbac 100644 --- a/branding/locales/html/de/faq.html +++ b/branding/locales/html/de/faq.html @@ -1,3 +1,5 @@

Hier stehen die FAQs

+ +Neu gebrandet … diff --git a/branding/locales/html/de/imprint.html b/branding/locales/html/de/imprint.html index 4cd4eaf..d9d0e23 100644 --- a/branding/locales/html/de/imprint.html +++ b/branding/locales/html/de/imprint.html @@ -1,3 +1,5 @@

Ich bin das Impressum

+ +Neu gebrandet … diff --git a/branding/locales/html/de/terms-and-conditions.html b/branding/locales/html/de/terms-and-conditions.html index 87bdaf6..30e3be3 100644 --- a/branding/locales/html/de/terms-and-conditions.html +++ b/branding/locales/html/de/terms-and-conditions.html @@ -1,3 +1,5 @@

Ich bin der Inhalt der Seite "Nutzungsbedingungen"

+ +Neu gebrandet … diff --git a/branding/locales/html/en/code-of-conduct.html b/branding/locales/html/en/code-of-conduct.html index b6d8ca5..7f78e27 100644 --- a/branding/locales/html/en/code-of-conduct.html +++ b/branding/locales/html/en/code-of-conduct.html @@ -1,3 +1,5 @@

I am the content of the code of conduct

+ +Rebranded … diff --git a/branding/locales/html/en/data-privacy.html b/branding/locales/html/en/data-privacy.html index 5a6c5d8..92b8918 100644 --- a/branding/locales/html/en/data-privacy.html +++ b/branding/locales/html/en/data-privacy.html @@ -1,3 +1,5 @@

This would be our data privacy section

+ +Rebranded … diff --git a/branding/locales/html/en/faq.html b/branding/locales/html/en/faq.html index c8a173b..63eed99 100644 --- a/branding/locales/html/en/faq.html +++ b/branding/locales/html/en/faq.html @@ -1,3 +1,5 @@

Here are the FAQs

+ +Rebranded … diff --git a/branding/locales/html/en/imprint.html b/branding/locales/html/en/imprint.html index 03fa2f1..6f50585 100644 --- a/branding/locales/html/en/imprint.html +++ b/branding/locales/html/en/imprint.html @@ -1,3 +1,5 @@

I am the imprint

+ +Rebranded … diff --git a/branding/locales/html/en/terms-and-conditions.html b/branding/locales/html/en/terms-and-conditions.html index a93ad66..8a135e3 100644 --- a/branding/locales/html/en/terms-and-conditions.html +++ b/branding/locales/html/en/terms-and-conditions.html @@ -1,3 +1,5 @@

I am the content of the page "terms and conditions"

+ +Rebranded … From c3212eaca147fe5ba80088913baaf17acdc5060c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Thu, 3 Jun 2021 19:20:54 +0200 Subject: [PATCH 39/48] Implement 'docker-compose.ocelotsocial-branded.yml' --- docker-compose.ocelotsocial-branded.yml | 80 +++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 docker-compose.ocelotsocial-branded.yml diff --git a/docker-compose.ocelotsocial-branded.yml b/docker-compose.ocelotsocial-branded.yml new file mode 100644 index 0000000..5ea530e --- /dev/null +++ b/docker-compose.ocelotsocial-branded.yml @@ -0,0 +1,80 @@ +# This docker-compose file is just here for testing +version: "3.4" + +services: + ######################################################## + # WEBAPP ############################################### + ######################################################## + webapp: + image: ocelotsocialnetwork/webapp-branded:latest + ports: + - 3000:3000 + networks: + - test-network + depends_on: + - backend + environment: + - HOST=0.0.0.0 + - GRAPHQL_URI=http://backend:4000 + - MAPBOX_TOKEN="pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g" + - WEBSOCKETS_URI=${WEBSOCKETS_URI} + - PUBLIC_REGISTRATION=true + ######################################################## + # BACKEND ############################################## + ######################################################## + backend: + image: ocelotsocialnetwork/backend-branded:latest + networks: + - test-network + depends_on: + - neo4j + ports: + - 4000:4000 + environment: + - NEO4J_URI=bolt://neo4j:7687 + - GRAPHQL_URI=http://backend:4000 + - CLIENT_URI=http://localhost:3000 + - JWT_SECRET=b/&&7b78BF&fv/Vd + - MAPBOX_TOKEN=pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g + - PRIVATE_KEY_PASSPHRASE=a7dsf78sadg87ad87sfagsadg78 + - EMAIL_SUPPORT=support@wir.social + - EMAIL_DEFAULT_SENDER=info@wir.social + - PUBLIC_REGISTRATION=true + - SMTP_USERNAME=${SMTP_USERNAME} + - SMTP_PASSWORD=${SMTP_PASSWORD} + - SMTP_HOST=mailserver + - SMTP_PORT=25 + - SMTP_IGNORE_TLS=true + ######################################################## + # NEO4J ################################################ + ######################################################## + neo4j: + image: ocelotsocialnetwork/neo4j-community-branded:latest + networks: + - test-network + environment: + - NEO4J_AUTH=none + - NEO4J_dbms_security_procedures_unrestricted=algo.*,apoc.* + - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes + ports: + - 7687:7687 + ######################################################## + # MAINTENANCE ########################################## + ######################################################## + maintenance: + image: ocelotsocialnetwork/maintenance-branded:latest + networks: + - test-network + ports: + - 5000:80 + ######################################################## + # MAILSERVER TO FAKE SMTP ############################## + ######################################################## + mailserver: + image: djfarrelly/maildev + ports: + - 1080:80 + networks: + - test-network +networks: + test-network: \ No newline at end of file From f0a01fa42aab9cd8eadf777553c9d73db29f4fe4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 7 Jun 2021 18:07:09 +0200 Subject: [PATCH 40/48] Add comment and lineend --- deployment/kubernetes/values.template.yaml | 2 +- docker-compose.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deployment/kubernetes/values.template.yaml b/deployment/kubernetes/values.template.yaml index a525a3b..f8669d1 100644 --- a/deployment/kubernetes/values.template.yaml +++ b/deployment/kubernetes/values.template.yaml @@ -20,7 +20,7 @@ BACKEND: SMTP_PASSWORD: "devops@ocelot.social" SMTP_PORT: "465" SMTP_IGNORE_TLS: 'true' - SMTP_SECURE: 'false' + SMTP_SECURE: 'false' # true for 465, false for other ports # most likely you don't need to change this MIN_READY_SECONDS: "15" diff --git a/docker-compose.yml b/docker-compose.yml index b680fd9..3604d1a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -62,4 +62,4 @@ services: networks: - test-network networks: - test-network: \ No newline at end of file + test-network: From bab552ae8692b82f62f8a7569e09e8d76302f52d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 7 Jun 2021 20:17:13 +0200 Subject: [PATCH 41/48] Overtake the tested changes from sender.fm --- .github/workflows/publish.yml | 16 +++---- branding/constants/links.js | 13 ++++-- branding/constants/metadata.js | 4 +- branding/locales/html/de/code-of-conduct.html | 5 +++ branding/locales/html/de/data-privacy.html | 5 +++ branding/locales/html/de/faq.html | 5 +++ branding/locales/html/de/imprint.html | 5 +++ .../locales/html/de/terms-and-conditions.html | 5 +++ branding/locales/html/en/code-of-conduct.html | 5 +++ branding/locales/html/en/data-privacy.html | 5 +++ branding/locales/html/en/faq.html | 5 +++ branding/locales/html/en/imprint.html | 5 +++ .../locales/html/en/terms-and-conditions.html | 5 +++ docker-compose.yml | 25 +++++++++++ docker/backend.Dockerfile | 40 +++++++++++++++-- docker/maintenance.Dockerfile | 34 ++++++++++++-- docker/neo4j.Dockerfile | 6 ++- docker/webapp.Dockerfile | 45 +++++++++++++++++-- package.json | 2 +- 19 files changed, 209 insertions(+), 26 deletions(-) create mode 100644 branding/locales/html/de/code-of-conduct.html create mode 100644 branding/locales/html/de/data-privacy.html create mode 100644 branding/locales/html/de/faq.html create mode 100644 branding/locales/html/de/imprint.html create mode 100644 branding/locales/html/de/terms-and-conditions.html create mode 100644 branding/locales/html/en/code-of-conduct.html create mode 100644 branding/locales/html/en/data-privacy.html create mode 100644 branding/locales/html/en/faq.html create mode 100644 branding/locales/html/en/imprint.html create mode 100644 branding/locales/html/en/terms-and-conditions.html diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 0937a1e..b450000 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -4,7 +4,7 @@ on: push: branches: - master -# on: [push] # for testing while developing + - 14-new-deployment-with-base-and-code # for testing while developing jobs: ############################################################################## @@ -41,7 +41,7 @@ jobs: ########################################################################## - name: Neo4j | Build `community-branded` image run: | - docker build --target community-branded -t "${DOCKER_ORGANISATION}/neo4j-community-branded:latest" -t "${DOCKER_ORGANISATION}/neo4j-community-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/neo4j-community-branded:${BUILD_VERSION}" -f docker/neo4j.Dockerfile --build-arg APP_IMAGE=ocelotsocialnetwork/neo4j:${OCELOT_DOCKER_VERSION_TAG} . + docker build --target community-branded -t "${DOCKER_ORGANISATION}/neo4j-community-branded:latest" -t "${DOCKER_ORGANISATION}/neo4j-community-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/neo4j-community-branded:${BUILD_VERSION}" -f docker/neo4j.Dockerfile --build-arg "APP_IMAGE_TAG=${OCELOT_DOCKER_VERSION_TAG}" . docker save "${DOCKER_ORGANISATION}/neo4j-community-branded" > /tmp/neo4j-community-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 @@ -81,9 +81,9 @@ jobs: ########################################################################## # BUILD BACKEND DOCKER IMAGE (branded) ################################ ########################################################################## - - name: backend | Build `branded` image + - name: Backend | Build `branded` image run: | - docker build --target branded -t "${DOCKER_ORGANISATION}/backend-branded:latest" -t "${DOCKER_ORGANISATION}/backend-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/backend-branded:${BUILD_VERSION}" -f docker/backend.Dockerfile --build-arg APP_IMAGE=ocelotsocialnetwork/backend:${OCELOT_DOCKER_VERSION_TAG} . + docker build --target branded -t "${DOCKER_ORGANISATION}/backend-branded:latest" -t "${DOCKER_ORGANISATION}/backend-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/backend-branded:${BUILD_VERSION}" -f docker/backend.Dockerfile --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_DOCKER_VERSION_TAG}-code" --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_DOCKER_VERSION_TAG}-base" . docker save "${DOCKER_ORGANISATION}/backend-branded" > /tmp/backend-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 @@ -123,9 +123,9 @@ jobs: ########################################################################## # BUILD WEBAPP DOCKER IMAGE (build) ###################################### ########################################################################## - - name: webapp | Build `branded` image + - name: Webapp | Build `branded` image run: | - docker build --target branded -t "${DOCKER_ORGANISATION}/webapp-branded:latest" -t "${DOCKER_ORGANISATION}/webapp-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/webapp-branded:${BUILD_VERSION}" -f docker/webapp.Dockerfile --build-arg APP_IMAGE=ocelotsocialnetwork/webapp:${OCELOT_DOCKER_VERSION_TAG} . + docker build --target branded -t "${DOCKER_ORGANISATION}/webapp-branded:latest" -t "${DOCKER_ORGANISATION}/webapp-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/webapp-branded:${BUILD_VERSION}" -f docker/webapp.Dockerfile --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_DOCKER_VERSION_TAG}-code" --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_DOCKER_VERSION_TAG}-base" . docker save "${DOCKER_ORGANISATION}/webapp-branded" > /tmp/webapp-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 @@ -165,9 +165,9 @@ jobs: ########################################################################## # BUILD MAINTENANCE DOCKER IMAGE (build) ################################# ########################################################################## - - name: maintenance | Build `branded` image + - name: Maintenance | Build `branded` image run: | - docker build --target branded -t "${DOCKER_ORGANISATION}/maintenance-branded:latest" -t "${DOCKER_ORGANISATION}/maintenance-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/maintenance-branded:${BUILD_VERSION}" -f docker/maintenance.Dockerfile --build-arg APP_IMAGE=ocelotsocialnetwork/maintenance:${OCELOT_DOCKER_VERSION_TAG} . + docker build --target branded -t "${DOCKER_ORGANISATION}/maintenance-branded:latest" -t "${DOCKER_ORGANISATION}/maintenance-branded:${VERSION}" -t "${DOCKER_ORGANISATION}/maintenance-branded:${BUILD_VERSION}" -f docker/maintenance.Dockerfile --build-arg "APP_IMAGE_TAG_CODE=${OCELOT_DOCKER_VERSION_TAG}-code" --build-arg "APP_IMAGE_TAG_BASE=${OCELOT_DOCKER_VERSION_TAG}-base" . docker save "${DOCKER_ORGANISATION}/maintenance-branded" > /tmp/maintenance-branded.tar - name: Upload Artifact uses: actions/upload-artifact@v2 diff --git a/branding/constants/links.js b/branding/constants/links.js index cdccbae..6b945a5 100644 --- a/branding/constants/links.js +++ b/branding/constants/links.js @@ -1,8 +1,13 @@ // this file is duplicated in `backend/src/config/links.js` and `webapp/constants/links.js` and replaced on rebranding export default { ORGANIZATION: 'https://ocelot.social', - DONATE: 'https://ocelot-social.herokuapp.com/donations', - IMPRINT: 'https://ocelot-social.herokuapp.com/imprint', - DATA_PRIVACY: 'https://ocelot-social.herokuapp.com/imprint', - FAQ: 'https://ocelot-social.herokuapp.com/#kontakt', + SUPPORT: 'https://ocelot.social', + + // on null or empty strings internal imprint is used, see 'webapp/locales/html/' + DONATE: 'https://ocelot-social.herokuapp.com/donations', // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly + IMPRINT: 'https://ocelot-social.herokuapp.com/imprint', // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly + TERMS_AND_CONDITIONS: null, + CODE_OF_CONDUCT: null, + DATA_PRIVACY: null, + FAQ: 'https://ocelot.social', } diff --git a/branding/constants/metadata.js b/branding/constants/metadata.js index e5f32c7..3d09066 100644 --- a/branding/constants/metadata.js +++ b/branding/constants/metadata.js @@ -1,9 +1,9 @@ // this file is duplicated in `backend/src/config/metadata.js` and `webapp/constants/metadata.js` and replaced on rebranding export default { APPLICATION_NAME: 'ocelot.social', - APPLICATION_SHORT_NAME: 'ocelot', + APPLICATION_SHORT_NAME: 'ocelot.social', APPLICATION_DESCRIPTION: 'Ocelot Social Community', COOKIE_NAME: 'ocelot-social-token', ORGANIZATION_NAME: 'busFaktor e.V.', - ORGANIZATION_JURISDICTION: 'Somewhere', + ORGANIZATION_JURISDICTION: 'Deutschland', } diff --git a/branding/locales/html/de/code-of-conduct.html b/branding/locales/html/de/code-of-conduct.html new file mode 100644 index 0000000..028650a --- /dev/null +++ b/branding/locales/html/de/code-of-conduct.html @@ -0,0 +1,5 @@ + + +

Ich bin der Inhalt vom Verhaltenskodex

+
+

Neu gebrandet …

diff --git a/branding/locales/html/de/data-privacy.html b/branding/locales/html/de/data-privacy.html new file mode 100644 index 0000000..25047fb --- /dev/null +++ b/branding/locales/html/de/data-privacy.html @@ -0,0 +1,5 @@ + + +

Das hier wäre der Inhalt der Datenschutzbestimmungen

+
+

Neu gebrandet …

diff --git a/branding/locales/html/de/faq.html b/branding/locales/html/de/faq.html new file mode 100644 index 0000000..214d481 --- /dev/null +++ b/branding/locales/html/de/faq.html @@ -0,0 +1,5 @@ + + +

Hier stehen die FAQs

+
+

Neu gebrandet …

diff --git a/branding/locales/html/de/imprint.html b/branding/locales/html/de/imprint.html new file mode 100644 index 0000000..174f61a --- /dev/null +++ b/branding/locales/html/de/imprint.html @@ -0,0 +1,5 @@ + + +

Ich bin das Impressum

+
+

Neu gebrandet …

diff --git a/branding/locales/html/de/terms-and-conditions.html b/branding/locales/html/de/terms-and-conditions.html new file mode 100644 index 0000000..4e0aaeb --- /dev/null +++ b/branding/locales/html/de/terms-and-conditions.html @@ -0,0 +1,5 @@ + + +

Ich bin der Inhalt der Seite "Nutzungsbedingungen"

+
+

Neu gebrandet …

diff --git a/branding/locales/html/en/code-of-conduct.html b/branding/locales/html/en/code-of-conduct.html new file mode 100644 index 0000000..b0065de --- /dev/null +++ b/branding/locales/html/en/code-of-conduct.html @@ -0,0 +1,5 @@ + + +

I am the content of the code of conduct

+
+

Rebranded …

diff --git a/branding/locales/html/en/data-privacy.html b/branding/locales/html/en/data-privacy.html new file mode 100644 index 0000000..2be9cf5 --- /dev/null +++ b/branding/locales/html/en/data-privacy.html @@ -0,0 +1,5 @@ + + +

This would be our data privacy section

+
+

Rebranded …

diff --git a/branding/locales/html/en/faq.html b/branding/locales/html/en/faq.html new file mode 100644 index 0000000..f8f0897 --- /dev/null +++ b/branding/locales/html/en/faq.html @@ -0,0 +1,5 @@ + + +

Here are the FAQs

+
+

Rebranded …

diff --git a/branding/locales/html/en/imprint.html b/branding/locales/html/en/imprint.html new file mode 100644 index 0000000..ae192da --- /dev/null +++ b/branding/locales/html/en/imprint.html @@ -0,0 +1,5 @@ + + +

I am the imprint

+
+

Rebranded …

diff --git a/branding/locales/html/en/terms-and-conditions.html b/branding/locales/html/en/terms-and-conditions.html new file mode 100644 index 0000000..6ebc0be --- /dev/null +++ b/branding/locales/html/en/terms-and-conditions.html @@ -0,0 +1,5 @@ + + +

I am the content of the page "terms and conditions"

+
+

Rebranded …

diff --git a/docker-compose.yml b/docker-compose.yml index 3604d1a..4379459 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,6 +2,9 @@ version: "3.4" services: + ######################################################## + # WEBAPP ############################################### + ######################################################## webapp: build: dockerfile: docker/webapp.Dockerfile @@ -19,6 +22,9 @@ services: - MAPBOX_TOKEN="pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g" - WEBSOCKETS_URI=${WEBSOCKETS_URI} - PUBLIC_REGISTRATION=true + ######################################################## + # BACKEND ############################################## + ######################################################## backend: build: dockerfile: docker/backend.Dockerfile @@ -45,6 +51,9 @@ services: - SMTP_HOST=mailserver - SMTP_PORT=25 - SMTP_IGNORE_TLS=true + ######################################################## + # NEO4J ################################################ + ######################################################## neo4j: image: ocelotsocialnetwork/neo4j:community networks: @@ -55,6 +64,22 @@ services: - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes ports: - 7687:7687 + ######################################################## + # MAINTENANCE ########################################## + ######################################################## + maintenance: + build: + # TODO: Separate from webapp, this must be independent + dockerfile: docker/maintenance.Dockerfile + target: branded + context: . + networks: + - test-network + ports: + - 5000:80 + ######################################################## + # MAILSERVER TO FAKE SMTP ############################## + ######################################################## mailserver: image: djfarrelly/maildev ports: diff --git a/docker/backend.Dockerfile b/docker/backend.Dockerfile index 8851242..91e57b0 100644 --- a/docker/backend.Dockerfile +++ b/docker/backend.Dockerfile @@ -1,10 +1,44 @@ +ARG APP_IMAGE=ocelotsocialnetwork/backend +ARG APP_IMAGE_TAG_BASE=latest-base +ARG APP_IMAGE_TAG_CODE=latest-code +ARG APP_IMAGE_BASE=${APP_IMAGE}:${APP_IMAGE_TAG_BASE} +ARG APP_IMAGE_CODE=${APP_IMAGE}:${APP_IMAGE_TAG_CODE} + ################################################################################## -# BRANDED ######################################################################## +# CODE (branded) ################################################################# ################################################################################## -ARG APP_IMAGE=ocelotsocialnetwork/backend:latest -FROM $APP_IMAGE as branded +FROM $APP_IMAGE_CODE as code # copy public constants into the Docker image to brand it COPY branding/constants/links.js src/config/ COPY branding/constants/logos.js src/config/ COPY branding/constants/metadata.js src/config/ + +################################################################################## +# BUILD ########################################################################## +################################################################################## +FROM code as build + +# yarn install +RUN yarn install --production=false --frozen-lockfile --non-interactive +# yarn build +RUN yarn run build + +################################################################################## +# BRANDED (Does contain only "binary"- and static-files to reduce image size) #### +################################################################################## +FROM $APP_IMAGE_BASE as branded + +# TODO - do all copying with one COPY command to have one layer +# Copy "binary"-files from build image +COPY --from=build ${DOCKER_WORKDIR}/dist ./dist +COPY --from=build ${DOCKER_WORKDIR}/node_modules ./node_modules +# Copy static files # Wolle comment overfluid here? +# TODO - externalize the uploads so we can copy the whole folder +COPY --from=build ${DOCKER_WORKDIR}/public/img/ ./public/img/ +COPY --from=build ${DOCKER_WORKDIR}/public/providers.json ./public/providers.json +# Copy package.json for script definitions (lock file should not be needed) +COPY --from=build ${DOCKER_WORKDIR}/package.json ./package.json + +# Run command +CMD /bin/sh -c "yarn run start" diff --git a/docker/maintenance.Dockerfile b/docker/maintenance.Dockerfile index 1da296d..eeda31f 100644 --- a/docker/maintenance.Dockerfile +++ b/docker/maintenance.Dockerfile @@ -1,9 +1,37 @@ +ARG APP_IMAGE=ocelotsocialnetwork/maintenance +ARG APP_IMAGE_TAG_BASE=latest-base +ARG APP_IMAGE_TAG_CODE=latest-code +ARG APP_IMAGE_BASE=${APP_IMAGE}:${APP_IMAGE_TAG_BASE} +ARG APP_IMAGE_CODE=${APP_IMAGE}:${APP_IMAGE_TAG_CODE} + ################################################################################## -# BRANDED ######################################################################## +# CODE (branded) ################################################################# ################################################################################## -ARG APP_IMAGE=ocelotsocialnetwork/maintenance:latest -FROM $APP_IMAGE as branded +FROM $APP_IMAGE_CODE as code # copy public constants into the Docker image to brand it COPY branding/static/ static/ COPY branding/constants/ constants/ +COPY branding/locales/ locales/ + +################################################################################## +# BUILD ########################################################################## +################################################################################## +FROM code as build + +# yarn install +## unnicely done in $APP_IMAGE_CODE at the moment, see main repo +# RUN yarn install --production=false --frozen-lockfile --non-interactive +# yarn generate +RUN yarn run generate + +################################################################################## +# BRANDED ### TODO # TODO # TODO # TODO # TODO # TODO # TODO # TODO # TODO #### +################################################################################## +# FROM $APP_IMAGE_BASE as branded +FROM nginx:alpine as branded + +COPY --from=build ./app/dist/ /usr/share/nginx/html/ +RUN rm /etc/nginx/conf.d/default.conf +COPY --from=code ./app/maintenance/nginx/custom.conf /etc/nginx/conf.d/ + diff --git a/docker/neo4j.Dockerfile b/docker/neo4j.Dockerfile index dff5209..980c45e 100644 --- a/docker/neo4j.Dockerfile +++ b/docker/neo4j.Dockerfile @@ -1,9 +1,11 @@ -ARG APP_IMAGE=ocelotsocialnetwork/neo4j:latest +ARG APP_IMAGE=ocelotsocialnetwork/neo4j +ARG APP_IMAGE_TAG=latest +ARG APP_IMAGE_COMMUNITY=${APP_IMAGE}:${APP_IMAGE_TAG} ################################################################################## # COMMUNITY ###################################################################### ################################################################################## -FROM $APP_IMAGE as community-branded +FROM $APP_IMAGE_COMMUNITY as community-branded ################################################################################## # ENTERPRISE ##################################################################### diff --git a/docker/webapp.Dockerfile b/docker/webapp.Dockerfile index 157072b..1d7ee67 100644 --- a/docker/webapp.Dockerfile +++ b/docker/webapp.Dockerfile @@ -1,9 +1,48 @@ +ARG APP_IMAGE=ocelotsocialnetwork/webapp +ARG APP_IMAGE_TAG_BASE=latest-base +ARG APP_IMAGE_TAG_CODE=latest-code +ARG APP_IMAGE_BASE=${APP_IMAGE}:${APP_IMAGE_TAG_BASE} +ARG APP_IMAGE_CODE=${APP_IMAGE}:${APP_IMAGE_TAG_CODE} + ################################################################################## -# BRANDED ######################################################################## +# CODE (branded) ################################################################# ################################################################################## -ARG APP_IMAGE=ocelotsocialnetwork/webapp:latest -FROM $APP_IMAGE as branded +FROM $APP_IMAGE_CODE as code # copy public constants into the Docker image to brand it COPY branding/static/ static/ COPY branding/constants/ constants/ +COPY branding/locales/ locales/ + +################################################################################## +# BUILD ########################################################################## +################################################################################## +FROM code as build + +# yarn install +RUN yarn install --production=false --frozen-lockfile --non-interactive +# yarn build +RUN yarn run build + +################################################################################## +# BRANDED (Does contain only "binary"- and static-files to reduce image size) #### +################################################################################## +FROM $APP_IMAGE_BASE as branded + +# TODO - do all copying with one COPY command to have one layer +# Copy "binary"-files from build image +COPY --from=build ${DOCKER_WORKDIR}/.nuxt ./.nuxt +COPY --from=build ${DOCKER_WORKDIR}/node_modules ./node_modules +COPY --from=build ${DOCKER_WORKDIR}/nuxt.config.js ./nuxt.config.js +# Copy static files +# TODO - this seems not be needed anymore for the new rebranding +# TODO - this should be one Folder containign all stuff needed to be copied +COPY --from=build ${DOCKER_WORKDIR}/config/ ./config/ +COPY --from=build ${DOCKER_WORKDIR}/constants ./constants +COPY --from=build ${DOCKER_WORKDIR}/static ./static +COPY --from=build ${DOCKER_WORKDIR}/locales ./locales +# Copy package.json for script definitions (lock file should not be needed) +COPY --from=build ${DOCKER_WORKDIR}/package.json ./package.json + +# Run command +CMD /bin/sh -c "yarn run start" diff --git a/package.json b/package.json index 1ad10ae..3b0724f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ocelot-social-branded", "version": "1.0.3", - "ocelotDockerVersionTag": "1.0.3-82", + "ocelotDockerVersionTag": "1.0.3-97", "dockerOrganisation": "ocelotsocialnetwork", "description": "ocelot.social Branded", "author": "ocelot.social Community", From 92664ee0dfec9c74d4ba7c339018a78fe5cf16ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 7 Jun 2021 21:04:54 +0200 Subject: [PATCH 42/48] Set publish again on master push only --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index b450000..0fde053 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -4,7 +4,7 @@ on: push: branches: - master - - 14-new-deployment-with-base-and-code # for testing while developing + # - 14-new-deployment-with-base-and-code # for testing while developing jobs: ############################################################################## From 862218a2dc75359ec89ae114c8dcf38828a302c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 7 Jun 2021 21:26:50 +0200 Subject: [PATCH 43/48] Correct 'metadata.js' --- branding/constants/metadata.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/branding/constants/metadata.js b/branding/constants/metadata.js index 5a186e2..968cb52 100644 --- a/branding/constants/metadata.js +++ b/branding/constants/metadata.js @@ -1,7 +1,7 @@ // this file is duplicated in `backend/src/config/metadata.js` and `webapp/constants/metadata.js` and replaced on rebranding export default { APPLICATION_NAME: 'wir.social', - APPLICATION_SHORT_NAME: 'wir', + APPLICATION_SHORT_NAME: 'wir.social', APPLICATION_DESCRIPTION: 'Wir Social Community', COOKIE_NAME: 'ocelot-social-token', ORGANIZATION_NAME: 'Webcraft-Media', From 1d38049592b9cc69330459780a1d81399e820ed5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Mon, 7 Jun 2021 21:27:27 +0200 Subject: [PATCH 44/48] Adjust 'docker-compose.wirsocial-branded.yml' to wir.social --- ...al-branded.yml => docker-compose.wirsocial-branded.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename docker-compose.ocelotsocial-branded.yml => docker-compose.wirsocial-branded.yml (91%) diff --git a/docker-compose.ocelotsocial-branded.yml b/docker-compose.wirsocial-branded.yml similarity index 91% rename from docker-compose.ocelotsocial-branded.yml rename to docker-compose.wirsocial-branded.yml index 5ea530e..f13ea72 100644 --- a/docker-compose.ocelotsocial-branded.yml +++ b/docker-compose.wirsocial-branded.yml @@ -6,7 +6,7 @@ services: # WEBAPP ############################################### ######################################################## webapp: - image: ocelotsocialnetwork/webapp-branded:latest + image: wirsocial/webapp-branded:latest ports: - 3000:3000 networks: @@ -23,7 +23,7 @@ services: # BACKEND ############################################## ######################################################## backend: - image: ocelotsocialnetwork/backend-branded:latest + image: wirsocial/backend-branded:latest networks: - test-network depends_on: @@ -49,7 +49,7 @@ services: # NEO4J ################################################ ######################################################## neo4j: - image: ocelotsocialnetwork/neo4j-community-branded:latest + image: wirsocial/neo4j-community-branded:latest networks: - test-network environment: @@ -62,7 +62,7 @@ services: # MAINTENANCE ########################################## ######################################################## maintenance: - image: ocelotsocialnetwork/maintenance-branded:latest + image: wirsocial/maintenance-branded:latest networks: - test-network ports: From aa305df9f37dd24717e77d649854928a01c2a82e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 8 Jun 2021 14:46:30 +0200 Subject: [PATCH 45/48] Rename to 'docker-compose.wirsocial.yml' --- ...-compose.wirsocial-branded.yml => docker-compose.wirsocial.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docker-compose.wirsocial-branded.yml => docker-compose.wirsocial.yml (100%) diff --git a/docker-compose.wirsocial-branded.yml b/docker-compose.wirsocial.yml similarity index 100% rename from docker-compose.wirsocial-branded.yml rename to docker-compose.wirsocial.yml From eeaac9a52ed8b4174c369716a6a89993a5129f09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Tue, 8 Jun 2021 15:30:58 +0200 Subject: [PATCH 46/48] Release v1.0.4 with ocelotDockerVersionTag v1.0.4-100 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index d76e5be..5c4212e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "wir.social", - "version": "1.0.3", - "ocelotDockerVersionTag": "1.0.3-97", + "version": "1.0.4", + "ocelotDockerVersionTag": "1.0.4-100", "dockerOrganisation": "wirsocial", "description": "wir.social Network driven by ocelot.social", "author": "ocelot.social Community", From c721b577640d404d13dca82013f0f5a5d090cde1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Wed, 9 Jun 2021 21:32:45 +0200 Subject: [PATCH 47/48] Implement the wir.social logo for the 'icon.png' and 'favicon.ico' --- branding/static/favicon.ico | Bin 5558 -> 5558 bytes branding/static/icon.png | Bin 21631 -> 41089 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/branding/static/favicon.ico b/branding/static/favicon.ico index 430cef437289d45eaceaa1d096a3674fccbf62cc..8682b2178ed5b3b5ad0aad9a46d2f6f1e21da0a1 100644 GIT binary patch literal 5558 zcmd^@2~d?+mdBZ{si~f-u4ywfi9HpQn4To=D@NlIkthNRC@QF^>>!JRD7fJ+D&ht- zu5A=;H$+qjC_6sj!Gi}pcsw3EvMHOuV~4Q(=IT^PC#0?JbY`li=Bv8(zVE*8-v9r6 z_uO;-=W1#FgVwLK#*Wnzzhkw=zoVt~nUHHtJB(^+>!21ql1g%0DumXkOQgV*#qVQRS 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 diff --git a/branding/static/icon.png b/branding/static/icon.png index 1c81fa5fca1a415323627f025eb8a68fbc2a6b79..b1f51b5f4b925c3a7188738215e8686acd9377e4 100644 GIT binary patch delta 40048 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%0D<2|V|HGGJTO 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 delta 20453 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 Date: Wed, 9 Jun 2021 21:35:27 +0200 Subject: [PATCH 48/48] Set pushing on master branch only --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 27ed699..5773284 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -4,7 +4,7 @@ on: push: branches: - master - - wir-social # for testing while developing + # - wir-social # for testing while developing jobs: ##############################################################################