diff --git a/.gitignore b/.gitignore index 928dae262..a0a08dcaa 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ yarn-error.log* .yarn-integrity .eslintcache kubeconfig.yaml +backup-cron-job.log node_modules/ cypress/videos diff --git a/deployment/deployment.md b/deployment/deployment.md index ebcc2f6ca..88b4f39de 100644 --- a/deployment/deployment.md +++ b/deployment/deployment.md @@ -109,7 +109,7 @@ The backups will be saved into your networks folders `backup` folder in a new fo ⚠️ *Attention: Please check carefully whether really the oldest backups have been deleted. As shells on different systems behave differently with regard to the commands used in this script.* -Install automated backups by a cron job. +Install automated backups by a [cron job](https://en.wikipedia.org/wiki/Cron). Be aware of having the bash shell installed to run the script. The environment variables for the automated backups are described above. @@ -131,3 +131,7 @@ In the editor add the line: ``` This way the terminal output is written into a log file named `backup-cron-job.log` located in the deployment folder. + +Be aware that the server datetime can differ from your local time. +Especially by the change between summer and winter time, because servers usually have UTC. +Find out the actual difference by running the command `date` on your server. diff --git a/deployment/scripts/cluster.backup.sh b/deployment/scripts/cluster.backup.sh index 93c29dd92..784bb1844 100755 --- a/deployment/scripts/cluster.backup.sh +++ b/deployment/scripts/cluster.backup.sh @@ -9,7 +9,7 @@ SCRIPT_PATH=$(realpath $0) SCRIPT_DIR=$(dirname $SCRIPT_PATH) # check CONFIGURATION -if [[ -z ${CONFIGURATION} ]]; then +if [[ -z "$CONFIGURATION" ]] || [[ $CONFIGURATION == "" ]]; then echo "!!! You must provide a CONFIGURATION via environment variable !!!" exit 1 fi @@ -27,13 +27,16 @@ mkdir -p ${BACKUP_FOLDER} ${SCRIPT_DIR}/cluster.neo4j.sh maintenance on # database backup +echo "Dumping database ..." kubectl --kubeconfig=${KUBECONFIG} -n default exec -it \ $(kubectl --kubeconfig=${KUBECONFIG} -n default get pods | grep ocelot-neo4j | awk '{ print $1 }') \ - -- neo4j-admin dump --database=neo4j --to=/var/lib/neo4j/$BACKUP_DATE-neo4j-dump + -- neo4j-admin dump --to=/var/lib/neo4j/$BACKUP_DATE-neo4j-dump # copy neo4j backup to local drive +echo "Coping database ..." kubectl --kubeconfig=${KUBECONFIG} cp \ default/$(kubectl --kubeconfig=${KUBECONFIG} -n default get pods | grep ocelot-neo4j |awk '{ print $1 }'):/var/lib/neo4j/$BACKUP_DATE-neo4j-dump $BACKUP_FOLDER/neo4j-dump # copy image data +echo "Coping public uploads ..." kubectl --kubeconfig=${KUBECONFIG} cp \ default/$(kubectl --kubeconfig=${KUBECONFIG} -n default get pods | grep ocelot-backend |awk '{ print $1 }'):/app/public/uploads $BACKUP_FOLDER/public-uploads diff --git a/deployment/scripts/cluster.maintenance.sh b/deployment/scripts/cluster.maintenance.sh index b64994e9b..780b81bd6 100755 --- a/deployment/scripts/cluster.maintenance.sh +++ b/deployment/scripts/cluster.maintenance.sh @@ -5,7 +5,7 @@ SCRIPT_PATH=$(realpath $0) SCRIPT_DIR=$(dirname $SCRIPT_PATH) # check CONFIGURATION -if [ -z ${CONFIGURATION} ]; then +if [[ -z "$CONFIGURATION" ]] || [[ $CONFIGURATION == "" ]]; then echo "You must provide a `CONFIGURATION` via environment variable" exit 1 fi @@ -16,9 +16,11 @@ KUBECONFIG=${KUBECONFIG:-${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubeco case $1 in on) + echo "Network maintenance: on" kubectl --kubeconfig=${KUBECONFIG} patch ingress ingress-ocelot-webapp --type merge --patch-file ${SCRIPT_DIR}/../src/kubernetes/patches/patch.ingress.maintenance.on.yaml ;; off) + echo "Network maintenance: off" kubectl --kubeconfig=${KUBECONFIG} patch ingress ingress-ocelot-webapp --type merge --patch-file ${SCRIPT_DIR}/../src/kubernetes/patches/patch.ingress.maintenance.off.yaml ;; *) diff --git a/deployment/scripts/cluster.neo4j.sh b/deployment/scripts/cluster.neo4j.sh index 41ebe4227..3b284c0b7 100755 --- a/deployment/scripts/cluster.neo4j.sh +++ b/deployment/scripts/cluster.neo4j.sh @@ -5,7 +5,7 @@ SCRIPT_PATH=$(realpath $0) SCRIPT_DIR=$(dirname $SCRIPT_PATH) # check CONFIGURATION -if [ -z ${CONFIGURATION} ]; then +if [[ -z "$CONFIGURATION" ]] || [[ $CONFIGURATION == "" ]]; then echo "You must provide a `CONFIGURATION` via environment variable" exit 1 fi @@ -21,20 +21,24 @@ case $1 in ${SCRIPT_DIR}/cluster.maintenance.sh on # set Neo4j in offline mode (maintenance) + echo "Neo4j maintenance: on" kubectl --kubeconfig=${KUBECONFIG} get deployment ocelot-neo4j -o json \ | jq '.spec.template.spec.containers[] += {"command": ["tail", "-f", "/dev/null"]}' \ | kubectl --kubeconfig=${KUBECONFIG} apply -f - # wait for the container to restart + echo "Wait 60s ..." sleep 60 ;; off) # set Neo4j in online mode + echo "Neo4j maintenance: off" kubectl --kubeconfig=${KUBECONFIG} get deployment ocelot-neo4j -o json \ | jq 'del(.spec.template.spec.containers[].command)' \ | kubectl --kubeconfig=${KUBECONFIG} apply -f - # wait for the container to restart + echo "Wait 60s ..." sleep 60 # maintenance mode off diff --git a/deployment/scripts/clusters.backup-multiple-servers.sh b/deployment/scripts/clusters.backup-multiple-servers.sh index 3dfcb1d79..e81165457 100755 --- a/deployment/scripts/clusters.backup-multiple-servers.sh +++ b/deployment/scripts/clusters.backup-multiple-servers.sh @@ -17,7 +17,7 @@ source ${SCRIPT_DIR}/../.env set +a # check BACKUP_CONFIGURATIONS -if [[ -z ${BACKUP_CONFIGURATIONS} ]]; then +if [[ -z "$BACKUP_CONFIGURATIONS" ]] || [[ $BACKUP_CONFIGURATIONS == "" ]]; then #%! echo "You must provide a BACKUP_CONFIGURATIONS via environment variable" printf "!!! You must provide a BACKUP_CONFIGURATIONS via environment variable !!!\n" exit 1 diff --git a/deployment/src/kubernetes/Backup.md b/deployment/src/kubernetes/Backup.md index 9f41ee7f4..bfae50776 100644 --- a/deployment/src/kubernetes/Backup.md +++ b/deployment/src/kubernetes/Backup.md @@ -137,7 +137,7 @@ $ kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-neo4j # bash: enter bash of Neo4j $ kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-neo4j | awk '{ print $1 }') -- bash # generate Dump -neo4j% neo4j-admin dump --database=neo4j --to=/var/lib/neo4j/$(date +%F)-neo4j-dump +neo4j% neo4j-admin dump --to=/var/lib/neo4j/$(date +%F)-neo4j-dump # exit bash neo4j% exit @@ -145,6 +145,8 @@ neo4j% exit $ kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-neo4j | awk '{ print $1 }') -- ls ``` +If you need a specific database name, add the option `--database=` to the command `neo4j-admin dump`. + Lets copy the dump backup ```bash diff --git a/docker-compose.yml b/docker-compose.yml index 78cee69b3..7954e2bab 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -111,10 +111,12 @@ services: # settings reference: https://neo4j.com/docs/operations-manual/4.4/docker/ref-settings/ # TODO: This sounds scary for a production environment - NEO4J_AUTH=none + # - NEO4J_dbms_default__database=graph.db + # - NEO4J_dbms_default__database=neo4j - NEO4J_dbms_security_procedures_unrestricted=algo.*,apoc.* - NEO4J_dbms_allow__format__migration=true - NEO4J_dbms_allow__upgrade=true - # Uncomment following line for Neo4j Enterprise version instead of Community version + # uncomment following line for Neo4j Enterprise version instead of Community version # TODO: clarify if that is the only thing needed to unlock the Enterprise version # - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes # TODO: Remove the playground from production diff --git a/neo4j/README.md b/neo4j/README.md index 9b8a460ec..fa2773d6c 100644 --- a/neo4j/README.md +++ b/neo4j/README.md @@ -1,4 +1,4 @@ -# Neo4J +# Neo4j 4.4 Human Connection is a social network. Using a graph based database which can model nodes and edges natively - a network - feels like an obvious choice. We @@ -16,8 +16,7 @@ docker-compose up ``` You can access Neo4J through [http://localhost:7474/](http://localhost:7474/) -for an interactive cypher shell and a visualization of the graph. - +for an interactive Cypher shell and a visualization of the graph. ## Installation Without Docker @@ -51,7 +50,7 @@ in `backend/.env`. Start Neo4J and confirm the database is running at [http://localhost:7474](http://localhost:7474). -## Operations on Neo4j +## Operations on Neo4j 4.4 ### Docker or Docker Compose @@ -68,13 +67,15 @@ To create a dump in Neo4j running in a Docker container: # connect to the Docker containers Neo4j terminal $ docker exec -it neo4j bash # generate Dump -neo4j% neo4j-admin dump --database=neo4j --to=/var/lib/neo4j/$(date +%F)-neo4j-dump +neo4j% neo4j-admin dump --to=/var/lib/neo4j/$(date +%F)-neo4j-dump # exit bash neo4j% exit # copy the dump out of the running Docker container $ docker cp :/var/lib/neo4j/neo4j-dump /$(date +%F)-neo4j-dump ``` +If you need a specific database name, add the option `--database=` to the command `neo4j-admin dump`. + ### Import Neo4j Dump To import a dump into Neo4j running in a Docker container: @@ -88,11 +89,13 @@ $ docker cp /neo4j-dump :/var/lib # connect to the Docker containers Neo4j terminal $ docker exec -it neo4j bash # to load the dump into the database we need the following command in this terminal -neo4j% neo4j-admin load --expand-commands --database=neo4j --from /var/lib/neo4j/$(date +%F)-neo4j-dump --force +neo4j% neo4j-admin load --from /var/lib/neo4j/$(date +%F)-neo4j-dump --force # leave the terminal by entering neo4j% exit ``` +If you need a specific database name, add the option `--database=` to the command `neo4j-admin load`. + ## Commands Here we describe some rarely used Cypher commands for Neo4j that are needed from time to time: @@ -143,7 +146,7 @@ $ kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-backen ***Cypher commands to show indexes and constraints*** ```bash -# in browser command line or cypher shell +# in browser command line or Cypher shell # show all indexes and constraints $ :schema @@ -158,7 +161,7 @@ $ CALL db.constraints(); ***Cypher commands to create and drop indexes and constraints*** ```bash -# in browser command line or cypher shell +# in browser command line or Cypher shell # create indexes $ CALL db.index.fulltext.createNodeIndex("post_fulltext_search",["Post"],["title", "content"]); @@ -171,3 +174,21 @@ $ DROP CONSTRAINT ON ( image:Image ) ASSERT image.url IS UNIQUE # drop all indexes and constraints $ CALL apoc.schema.assert({},{},true) YIELD label, key RETURN * ; ``` + +### Database Management Commands + +***Cypher commands to manage databases*** + +```bash +# in browser command line or Cypher shell + +# show the default database +$ SHOW DEFAULT DATABASE +# show all databases +$ SHOW DATABASES +``` + +To set the default database by configuration, use `NEO4J_dbms_default__database` as an environment variable when starting Neo4j 4.4, see [Docker specific configuration settings](). + +If a database with this name does not exist, an empty database with this name is created and all other databases remain. +You can switch back to an existing database without damaging it.