For folks who need to self host this app, I created a comprehensive tutorial.
Create a fresh server, update and upgrade the system, install docker and docker compose with this one command.
sudo apt-get update -y &&
sudo apt-get upgrade -y &&
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release &&
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg &&
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null &&
sudo apt-get update -y &&
sudo apt-get install -y docker-ce &&
sudo usermod -aG docker $USER &&
sudo curl -L https://github.com/docker/compose/releases/download/v2.26.1/docker-compose-uname -s-uname -m -o /usr/local/bin/docker-compose &&
sudo chmod +x /usr/local/bin/docker-compose && \
Clone the Repo
git clone https://github.com/langgenius/dify.git
Customize the .env file
cd dify/docker
cp .env.example .env
I only customized the following variables.
APP_WEB_URL=your_domain_name
NGINX_HTTPS_ENABLED=true
NGINX_SSL_CERT_FILENAME=cert.pem
NGINX_SSL_CERT_KEY_FILENAME=key.pem
Ctrl S to save, Ctrl X to exit the nano editor.
cd -
Create SSL Certificate
Create ssl certificate at Cloudflare (open SSL/TSL tab and open Original Server)
nano dify/docker/nginx/ssl/cert.pem
Copy and paste the Cloudflare certificate, then Ctrl S, Ctrl X
nano dify/docker/nginx/ssl/key.pem
Copy and paste the Cloudflare SSL key, then Ctrl S, Ctrl X
Deploy
cd dify/docker
docker compose up -d
Upgrade
cd dify/docker
docker compose down
git pull origin main
docker compose pull
docker compose up -d
Setting Up Automated Backups for Dify Using Restic and Cloudflare R2
Step 1: Install Restic
Connect to your server via SSH.
Update your package list and install Restic:sudo apt update
sudo apt install restic
Step 2: Prepare Your Cloudflare R2 Bucket
Create a new R2 bucket in your Cloudflare account if you haven't already.
Note down the following information from your Cloudflare R2 setup:
Bucket name
Access Key ID
Secret Access Key
R2 Endpoint URL
Step 3: Create the Backup Script
Create a new directory for the Restic script:
mkdir -p /root/restic
Create and open the backup script using nano:
nano /root/restic/backup.sh
Copy and paste the following content into the file:
#!/bin/bash
# Set environment variables for Restic
export RESTIC_REPOSITORY="s3:YOUR_R2_ENDPOINT_URL/YOUR_BUCKET_NAME"
export AWS_ACCESS_KEY_ID="YOUR_ACCESS_KEY_ID"
export AWS_SECRET_ACCESS_KEY="YOUR_SECRET_ACCESS_KEY"
# Set the backup source
BACKUP_SOURCE="/root/dify/docker/volumes"
# Perform the backup
restic backup $BACKUP_SOURCE
# Prune old snapshots (keep last 7 daily, last 4 weekly, and last 12 monthly backups)
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --prune
# Check the repository for errors
restic check
Replace the following placeholders with your actual Cloudflare R2 information:
YOUR_R2_ENDPOINT_URL: Your Cloudflare R2 endpoint URL
YOUR_BUCKET_NAME: Your R2 bucket name
YOUR_ACCESS_KEY_ID: Your R2 Access Key ID
YOUR_SECRET_ACCESS_KEY: Your R2 Secret Access Key
Save the file and exit nano:
Press Ctrl + X
When prompted to save, press Y
Press Enter to confirm the file name
Make the script executable:
chmod +x /root/restic/backup.sh
Secure the script (as it contains sensitive information):
chmod 700 /root/restic/backup.sh
Step 4: Initialize the Restic Repository
Set the environment variables (replace with your actual R2 information):
export RESTIC_REPOSITORY="s3:YOUR_R2_ENDPOINT_URL/YOUR_BUCKET_NAME"
export AWS_ACCESS_KEY_ID="YOUR_ACCESS_KEY_ID"
export AWS_SECRET_ACCESS_KEY="YOUR_SECRET_ACCESS_KEY"
Initialize the Restic repository:
restic init
Step 5: Set Up Daily Backups
Open the crontab file:
crontab -e
If prompted to select an editor, choose nano by entering the corresponding number.
Add the following line at the end of the file to run the backup daily at 3 AM:
0 3 * * * /root/restic/backup.sh > /root/restic/backup.log 2>&1
Save the file and exit nano:
Press Ctrl + X
When prompted to save, press Y
Press Enter to confirm
Verifying the Setup
To ensure everything is set up correctly:
Run the backup script manually:
/root/restic/backup.sh
Check the Restic repository for snapshots:
restic snapshots
Restoring from a Backup
To restore your data:
List available snapshots:
restic snapshots
Restore the latest snapshot:
restic restore latest --target /path/to/restore
Replace /path/to/restore with the directory where you want to restore the data.
Done.