diff --git a/project/service/n8n/Dockerfile b/project/service/n8n/Dockerfile index c29fee4..5967030 100644 --- a/project/service/n8n/Dockerfile +++ b/project/service/n8n/Dockerfile @@ -23,9 +23,21 @@ RUN apk add --no-cache \ # Set environment variable for Puppeteer to find Chromium ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true - RUN npm install puppeteer +# Install restic and rclone for backups +RUN apk add --no-cache \ + restic \ + curl \ + unzip + +# Download and install rclone +RUN curl -O https://downloads.rclone.org/rclone-current-linux-amd64.zip \ + && unzip rclone-current-linux-amd64.zip \ + && cd rclone-*-linux-amd64 \ + && cp rclone /usr/local/bin/ \ + && chmod 755 /usr/local/bin/rclone \ + && cd .. && rm -rf rclone-*-linux-amd64* + # Revert back to non-root (default n8n user) USER node - diff --git a/project/service/n8n/n8n.yml b/project/service/n8n/n8n.yml index dbe045f..052b3b3 100644 --- a/project/service/n8n/n8n.yml +++ b/project/service/n8n/n8n.yml @@ -15,6 +15,7 @@ services: - N8N_BLOCK_ENV_ACCESS_IN_NODE=false - MAM_USERNAME=${N8N_MAM_USERNAME} - MAM_PASSWORD=${N8N_MAM_PASSWORD} + - RESTIC_PASSWORD=${N8N_RESTIC_PASSWORD} - NODES_EXCLUDE=[] - DB_TYPE=postgresdb - DB_POSTGRESDB_HOST=postgres @@ -25,6 +26,10 @@ services: - DB_POSTGRESDB_SCHEMA=public volumes: - ${SERVICE_PATH}/n8n/data:/home/node/.n8n + - ${SERVICE_PATH}/n8n/data/rclone.conf:/home/node/.config/rclone/rclone.conf + - ${PWD}/scripts:/home/node/.n8n/external-scripts + - ${DB_PATH}/postgres/data/backup:/home/node/.n8n/database + - ${EXTERNAL_STORAGE}/:/home/node/.n8n/data labels: # Traefik - "traefik.enable=true" diff --git a/scripts/generate_certificate.sh b/scripts/certificates/generate_certificate.sh similarity index 100% rename from scripts/generate_certificate.sh rename to scripts/certificates/generate_certificate.sh diff --git a/scripts/data-backup/README.md b/scripts/data-backup/README.md new file mode 100644 index 0000000..fc5c019 --- /dev/null +++ b/scripts/data-backup/README.md @@ -0,0 +1,17 @@ +Inspired by the [blog](https://www.ericbette.com/configuring-a-remote-backup-solution-using-restic-and-rclone) + +# List of commands: + +## Installation +- Install restic and rclone baremetal + +## Setting up rclone: +- run: rclone config or follow the instructions on the provider (infomaniak in my case) +- run: rclone listremotes to confirm the server link creation + +## Setting up backup repository with restic +- Save password in env variable, by running: echo export RESTIC_PASSWORD=my_password >> ~/.zshrc +- Initialize repository: restic -r rclone:example-remote:example-repo init +- Run the backup: restic -r rclone:example-remote:example-repo --verbose backup /path/to/backup +- List the snapshots: restic -r rclone:example-remote:example-repo snapshots +- Restore the backup: restic -r rclone:example-remote:example-repo restore latest --target /target --path "/target" diff --git a/scripts/data-backup/backup-infomaniak-calendars-contacts.sh b/scripts/data-backup/backup-infomaniak-calendars-contacts.sh new file mode 100755 index 0000000..aaf63d9 --- /dev/null +++ b/scripts/data-backup/backup-infomaniak-calendars-contacts.sh @@ -0,0 +1,5 @@ +LOG_FILE="/home/node/.n8n/external-scripts/data-backup/logs/log.log" +echo "------------------------------------------------------------------------" >> "$LOG_FILE" +echo "$(date) - Script for calendars-contact started" >> "$LOG_FILE" +restic -r rclone:sb_project_SBI-CW231949:calendars-contacts backup /home/node/.n8n/data/calendars-contacts >> "$LOG_FILE" +restic -r rclone:sb_project_SBI-CW231949:calendars-contacts forget --keep-last 3 --prune >> "$LOG_FILE" diff --git a/scripts/data-backup/backup-infomaniak-databases.sh b/scripts/data-backup/backup-infomaniak-databases.sh new file mode 100755 index 0000000..6ccadeb --- /dev/null +++ b/scripts/data-backup/backup-infomaniak-databases.sh @@ -0,0 +1,5 @@ +LOG_FILE="/home/node/.n8n/external-scripts/data-backup/logs/log.log" +echo "------------------------------------------------------------------------" >> "$LOG_FILE" +echo "$(date) - Script for databases started" >> "$LOG_FILE" +restic -r rclone:sb_project_SBI-CW231949:databases backup /home/node/.n8n/database >> "$LOG_FILE" +restic -r rclone:sb_project_SBI-CW231949:databases forget --keep-last 3 --prune >> "$LOG_FILE" diff --git a/scripts/data-backup/backup-infomaniak-documents.sh b/scripts/data-backup/backup-infomaniak-documents.sh new file mode 100755 index 0000000..b421c80 --- /dev/null +++ b/scripts/data-backup/backup-infomaniak-documents.sh @@ -0,0 +1,6 @@ +LOG_FILE="/home/node/.n8n/external-scripts/data-backup/logs/log.log" +echo "------------------------------------------------------------------------" >> "$LOG_FILE" +echo "$(date) - Script for documents started" >> "$LOG_FILE" +restic -r rclone:sb_project_SBI-CW231949:documents backup /home/node/.n8n/data/documents >> "$LOG_FILE" +restic -r rclone:sb_project_SBI-CW231949:documents forget --keep-last 3 --prune >> "$LOG_FILE" + diff --git a/scripts/data-backup/backup-infomaniak-music.sh b/scripts/data-backup/backup-infomaniak-music.sh new file mode 100755 index 0000000..a661bcc --- /dev/null +++ b/scripts/data-backup/backup-infomaniak-music.sh @@ -0,0 +1,5 @@ +LOG_FILE="/home/node/.n8n/external-scripts/data-backup/logs/log.log" +echo "------------------------------------------------------------------------" >> "$LOG_FILE" +echo "$(date) - Script for music started" >> "$LOG_FILE" +restic -r rclone:sb_project_SBI-CW231949:music backup /home/node/.n8n/data/media/music >> "$LOG_FILE" +restic -r rclone:sb_project_SBI-CW231949:music forget --keep-last 3 --prune >> "$LOG_FILE" diff --git a/scripts/data-backup/backup-infomaniak-notes.sh b/scripts/data-backup/backup-infomaniak-notes.sh new file mode 100755 index 0000000..816bbdd --- /dev/null +++ b/scripts/data-backup/backup-infomaniak-notes.sh @@ -0,0 +1,5 @@ +LOG_FILE="/home/node/.n8n/external-scripts/data-backup/logs/log.log" +echo "------------------------------------------------------------------------" >> "$LOG_FILE" +echo "$(date) - Script for notes started" >> "$LOG_FILE" +restic -r rclone:sb_project_SBI-CW231949:notes backup /home/node/.n8n/data/notes >> "$LOG_FILE" +restic -r rclone:sb_project_SBI-CW231949:notes forget --keep-last 3 --prune >> "$LOG_FILE" diff --git a/scripts/data-backup/backup-infomaniak-passwords.sh b/scripts/data-backup/backup-infomaniak-passwords.sh new file mode 100755 index 0000000..9f6fb11 --- /dev/null +++ b/scripts/data-backup/backup-infomaniak-passwords.sh @@ -0,0 +1,5 @@ +LOG_FILE="/home/node/.n8n/external-scripts/data-backup/logs/log.log" +echo "------------------------------------------------------------------------" >> "$LOG_FILE" +echo "$(date) - Script for passwords started" >> "$LOG_FILE" +restic -r rclone:sb_project_SBI-CW231949:passwords backup /home/node/.n8n/data/passwords >> "$LOG_FILE" +restic -r rclone:sb_project_SBI-CW231949:passwords forget --keep-last 3 --prune >> "$LOG_FILE" diff --git a/scripts/data-backup/backup-infomaniak-pictures.sh b/scripts/data-backup/backup-infomaniak-pictures.sh new file mode 100755 index 0000000..1a178c8 --- /dev/null +++ b/scripts/data-backup/backup-infomaniak-pictures.sh @@ -0,0 +1,5 @@ +LOG_FILE="/home/node/.n8n/external-scripts/data-backup/logs/log.log" +echo "------------------------------------------------------------------------" >> "$LOG_FILE" +echo "$(date) - Script for pictures started" >> "$LOG_FILE" +restic -r rclone:sb_project_SBI-CW231949:pictures backup /home/node/.n8n/data/media/pictures >> "$LOG_FILE" +restic -r rclone:sb_project_SBI-CW231949:pictures forget --keep-last 3 --prune >> "$LOG_FILE" diff --git a/scripts/db_backup_script.sh b/scripts/database-backup/db_backup_script.sh similarity index 100% rename from scripts/db_backup_script.sh rename to scripts/database-backup/db_backup_script.sh diff --git a/scripts/overleaf_backup_script.sh b/scripts/database-backup/overleaf_backup_script.sh similarity index 100% rename from scripts/overleaf_backup_script.sh rename to scripts/database-backup/overleaf_backup_script.sh diff --git a/scripts/mam-login.js b/scripts/mam/mam-login.js similarity index 100% rename from scripts/mam-login.js rename to scripts/mam/mam-login.js