#[SOLVED] Cron for backup 💾
1 messages · Page 1 of 1 (latest)
I've encounter the same issue
What I've done was to add full path to all the files
Like so
/usr/local/bin/docker-compose -f /root/appwrite/docker-compose.yml exec mariadb sh -c 'exec mysqldump --all-databases --add-drop-database -u"$MYSQL_USER" -p"$MYSQL_PASSWORD"' > dump.sql
The reason is that when the task is ran through t cronjob service it can get wrong with the variables etc,
I will try to replicate this! 😁
The main idea is that any file or binary need to have there full path
- docker-compose
/usr/local/bin/docker-compose - Yaml file -
/root/appwrite/docker-compose.yml
currently my backup file looks like this:
cd /home/ubuntu/appwrite
mkdir -p backup
docker-compose exec mariadb sh -c 'exec mysqldump --all-databases --add-drop-database -u"$MYSQL_USER" -p"$MYSQL_PASSWORD"' > ./backup/dump.sql
appwrite_volumes=(uploads cache config certificates functions)
for volume in ${appwrite_volumes[@]}; do
mkdir -p backup && docker run --rm --volumes-from "$(docker-compose ps -q appwrite)" -v $PWD/backup:/backup ubuntu bash -c "cd /storage/$volume && tar cvf /backup/$volume.tar ."
done ```
how would I modify this to work?
#!/bin/bash
cd /home/ubuntu/appwrite
mkdir -p backup
usr/local/bin/docker-compose -f /home/ubuntu/appwrite/docker-compose.yml exec mariadb sh -c 'exec mysqldump --all-databases --add-drop-database -u"$MYSQL_USER" -p"$MYSQL_PASSWORD"' > ./backup/dump.sql
appwrite_volumes=(uploads cache config certificates functions)
for volume in ${appwrite_volumes[@]}; do
mkdir -p backup && docker run --rm --volumes-from "$(docker-compose ps -q appwrite)" -v $PWD/backup:/backup ubuntu bash -c "cd /storage/$volume && tar cvf /backup/$volume.tar ."
done
This is updated version
Try this
It didn't solve the problem I'm still getting the empty dump.sql 😥
Try to run this command alone is it works?
usr/local/bin/docker-compose -f /home/ubuntu/appwrite/docker-compose.yml exec mariadb sh -c 'exec mysqldump --all-databases --add-drop-database -u"$MYSQL_USER" -p"$MYSQL_PASSWORD"' > ./backup/dump.sql
On what user you're running to Cron? ubuntu or root?
On what user you've created the docker?
You can do
$/home/ubuntu/appwrite: ls -lah
To check the ownership
usr/local/bin/docker-compose -f /home/ubuntu/appwrite/docker-compose.yml exec mariadb sh -c 'exec mysqldump --all-databases --add-drop-database -u"$ MYSQL_USER" -p"$MYSQL_PASSWORD"' > ./backup/dump.sql
it works if I run the command "sudo backup.sh" but through crontab it still returns empty dump.sql. the crontab is created with the root user I do the permission for chmod 777 for backup.sh and when running the command ls -lah it shows the docker as root too.
I don't know what to do anymore. 🫤
How did you wrote the line in the crontab?
*/2 * * * * /bin/bash /home/ubuntu/appwrite/backup.sh
Try it one time without the /bin/bash
As such
*/2 * * * * /home/ubuntu/appwrite/backup.sh
doesn't work yet
One more thing to try.
Try to change the first line to sh
#!/bin/sh
cd /home/ubuntu/appwrite
mkdir -p backup
usr/local/bin/docker-compose -f /home/ubuntu/appwrite/docker-compose.yml exec mariadb sh -c 'exec mysqldump --all-databases --add-drop-database -u"$MYSQL_USER" -p"$MYSQL_PASSWORD"' > ./backup/dump.sql
appwrite_volumes=(uploads cache config certificates functions)
for volume in ${appwrite_volumes[@]}; do
mkdir -p backup && docker run --rm --volumes-from "$(docker-compose ps -q appwrite)" -v $PWD/backup:/backup ubuntu bash -c "cd /storage/$volume && tar cvf /backup/$volume.tar ."
done
Still empty, I can't find where I might be going wrong.
It's weird when you're finding the solution do let me know
Just final check you sure that this file & path do exists?
home/ubuntu/appwrite/docker-compose.yml
yes, exist
OK, sorry I've made a mistake
Try this
#!/bin/sh
cd /home/ubuntu/appwrite
mkdir -p backup
/usr/local/bin/docker-compose -f /home/ubuntu/appwrite/docker-compose.yml exec mariadb sh -c 'exec mysqldump --all-databases --add-drop-database -u"$MYSQL_USER" -p"$MYSQL_PASSWORD"' > ./backup/dump.sql
appwrite_volumes=(uploads cache config certificates functions)
for volume in ${appwrite_volumes[@]}; do
mkdir -p backup && docker run --rm --volumes-from "$(docker-compose ps -q appwrite)" -v $PWD/backup:/backup ubuntu bash -c "cd /storage/$volume && tar cvf /backup/$volume.tar ."
done
I continue with the problem. Thank you so much for your time and effort!
did you get it working?
Not yet 🥲
weird...so btw, you shouldn't need to run sudo with docker. you may have missed a post installation step: https://docs.docker.com/engine/install/linux-postinstall/
i tested by adding a cron job for my user (rather than root). the cron job had:
*/5 * * * * cd [path to appwrite folder] && ./backup.sh
I used the original backup.sh script.
I wonder if you have a problem with docker compose for your root account
everything happens normally when I run the backup.sh script directly in cmd
Files are generated
Yes of course. The problem is with cron path
perhaps it would be good to try and get some output. try to update your crontab command to:
cd /home/ubuntu/appwrite && ./backup.sh > /tmp/cron-backup.log 2>&1
./
./app-63ab55ce4321283aa7fe/
./app-63ab55ce4321283aa7fe/63c9aa8377f9fb2109d7/```
I get this error: the input device is not a TTY
the rest is basically the same as normal operation
Interesting that it doesn't work for you though...
You can try adding -T flag to the docker compose command
I no longer get the TTY error and the file is still empty
How did you install docker?
Can you test docker compose version in the script? You can probably comment out everything else while we troubleshoot the docker compose problem
like this link
this is an old docker compose 👀 you need docker compose v2
you should definitely try and uninstall that old compose. maybe it was installed via pip?
@raven bridge @charred raptor after updating everything, docker and docker-compose the problem was solved. I really appreciate your help!
[SOLVED] Cron for backup 💾
checking