Skrypt do backupów na serwer FTP/SFTP

DBanaszewski | 2020-11-23 14:17:57 UTC | #1

Skrypt do wykonywania backupów

Według regulaminu usługi serwer VPS, pkt. 6.1.2:

Użytkownik jest zobowiązany wykonywać w sposób regularny kopie danych przechowywanych w
Usłudze;

więc przychodzę z odsieczą :slight_smile:

Oto prosty skrypt do wykonywania kopii zapasowych na zewnętrzny hosting z dostępem FTP/SFTP (przykładowo wystarczy w2.lvlup.pro).

Informacja

Jeżeli wykonujesz wszystkie te polecenia na koncie root, przedrostek sudo jest niepotrzebny.

Co trzeba zainstalować?

Dużo skrypt nie wymaga:

sudo apt install tar gzip ftp cron

Konfiguracja

Aby skonfigurować skrypt musimy otworzyć go za pomocą programu np. Notepad++ (w Windows) lub vim (w Linux)
Następnie widzimy następujący obraz:

image|603x444

W polu host piszemy adres IP hostingu FTP - przykładowo w2.lvlup.pro
W polu username wpisz swoją nazwę użytkownika (subkonto z w2.lvlup.pro będzie posiadało małpę, np. [email protected])
W polu password wpisz swoje hasło - najlepiej, aby nie zawierało znaków typu " czy '.
W polu path wpisz folder (tylko jeden, niestety), a prawidłowo dokładną ścieżkę np. /home/andrzej/
W polu partition wpisz “adres” partycji dysku
W polu maxusage wpisz maksymalny limit zajętości dysku - na pełnym nie zrobimy backup’u :stuckouttongue:

Automatyczne wykonywanie się skryptu

Musimy przenieść skrypt w miejsce dla wszystkich skryptów/aplikacji.
Wykonaj to tak:

sudo mv backup.sh /usr/bin/

Następnie musimy nadać uprawnienia do wykonywania skryptu:

sudo chmod +x /usr/bin/backup.sh

Teraz musimy edytować crona przy pomocy:

sudo crontab -e

Teraz musimy wybrać swój ulubiony edytor - wpisujemy jakąś cyferkę.
Moim ulubionym edytorem jest vim. Teraz dodajemy zadanie do cron’a:

0 7 * * * sync; bash /usr/bin/backup.sh

Po dodaniu tej linijki, zapisujemy plik. Skrypt będzie wykonywał się codziennie o 7:00 (rano). Możemy to zmienić według własnego

Wygląd mojego przykładu:
image|366x24

Zapisujemy i gotowe.

Ręczne wykonywanie skryptu

Jeżeli ktoś potrzebuje zrobić backup raz na tydzień, może to zrobić w cron’ie lub ręcznie. Wtedy wystarczy uruchomić skrypt normalnie.

Metoda krótsza

sudo bash backup.sh

Metoda dłuższa

Musimy nadać uprawnienia do uruchomienia:

sudo chmod +x backup.sh

A następnie uruchamiamy:

sudo ./backup.sh

Download

Skrypt znajduje się w repozytorium.
Bezpośredni link: klik

Pozdrawiam :)


Jebanany | 2018-01-23 18:41:32 UTC | #2

Myślę, że warto nawet katalog do tymczasowego pakowania /tmp/backup/ dodać do zmiennych, ale domyślnie wpisać tę ścieżkę.

Pomyśl też o możliwości wyświetlania każdego kroku. W sensie, po każdej operacji echo aktualnie ukończonego zadania.

Może jeszcze sprawdzenie czy jest odpowiednia ilość miejsca na dysku na spakowanie plików?


DBanaszewski | 2018-01-23 18:43:13 UTC | #3

Dzięki za pomysły, co do sprawdzania dysku, mam gotowy skrypt, ale muszę go przetestować, czy nie ma w nim błędów. Postaram się na dniach opublikować aktualizację ;)


anon10657637 | 2018-01-23 18:49:59 UTC | #4

Wsparcie SSH, zmień trzymanie kodu na jakiś VCS, to co @Jebanany napisał i będzie git :stuckouttongue:


DBanaszewski | 2018-01-23 18:51:56 UTC | #5

Co do SSH, to zrobił bym “gałąź” - w sensie dodałbym jakiś argument np. -ssh.
Ogólnie mam plan usunąć konfigurację, a dodać argumenty czy coś takiego.


Timo | 2018-01-23 19:08:03 UTC | #6

Connected to w2.lvlup.pro.
220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
220-You are user number 8 of 50 allowed.
220-Local time is now 20:06. Server port: 21.
220-This is a private system - No anonymous login
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
331 User [email protected] OK. Password required
530 Login authentication failed
Login failed.
Local directory now /tmp/backup
local: 2018-01-2320-06-34.tar.gz remote: 2018-01-2320-06-34.tar.gz
530 You aren’t logged in
ftp: bind: Address already in use
221-Goodbye. You uploaded 0 and downloaded 0 kbytes.
221 Logout.
Kopia zostala wykonana!


DBanaszewski | 2018-01-23 19:10:53 UTC | #7

Hmmm… wygląda na błędny login lub/i hasło - spróbuj się zalogować z innego konta - sprawdź czy nie wdała się gdzieś spacja ;)


Timo | 2018-01-23 19:12:25 UTC | #8

Zapewniam cię, że hasło jest poprawne i login też.
Spróbuję na koncie głównym - bez @ w loginie.


Timo | 2018-01-23 19:13:44 UTC | #9

Przy łączeniu przez konto główne poprawnie wrzuciło pliki.
Miałem kiedyś taki skrypt, który nie działał przy korzystaniu z @ w loginie - do w2.


DBanaszewski | 2018-01-23 19:16:12 UTC | #10

Spróbuj dodać cudzysłów.
Przykład: “[email protected]” ;)

Nie wiem czy działa, ale warto sprawdzić ;)


Timo | 2018-01-23 19:17:49 UTC | #11

:scream: :joy: :heart:


Jebanany | 2018-01-23 19:22:06 UTC | #12

[quote=”Timo, post:6, topic:5106”]
530 Login authentication failed
[/quote]

FTP nie oszukuje, coś zostało błędnie podane.


Timo | 2018-01-23 19:24:00 UTC | #13

Błąd rozwiązaliśmy:
[quote=”DBanaszewski, post:10, topic:5106”]
Spróbuj dodać cudzysłów.

Przykład: “[email protected]” :wink:
[/quote]
Pewnie coś błędnie czytało.
Użyłem cudzysłowie i działa :D


Toranktto | 2018-01-23 19:47:14 UTC | #14

Według mnie warto zmienić shebang na “#!/usr/bin/env bash” z racji tego że na Unixach bash instalowany jest domyślnie w innej lokalizacji (przykładowo w Solarisie ‘/usr/bin/bash’, w NetBSD ‘/usr/pkg/bin/bash’ a we FreeBSD i HP-UX - ‘/usr/local/bin/bash’).


MTGmati | 2018-01-23 22:52:54 UTC | #15

Przyda się. Czekam na opcje z SSH :wink:


DoreK | 2018-01-24 23:04:41 UTC | #16

Również czekam, być może kupię jakieś konto SFTP w lvlup na backupy ;)
Mam też pytanie - w proxmox zauważyłem pewien przycisk do utworzenia kopii. Jak on działa i czy w ogóle działa (nie miałem okazji tego sprawdzić jeszcze)? :P


DBanaszewski | 2018-01-25 05:32:06 UTC | #17

Nie, nie działa :confused:
(Znaczy się działa, ale nie ma miejsca na tegp typu kopie)


helczyna | 2018-01-26 06:38:19 UTC | #18

Z tego co przeczytałem to kopie tworzą się bez limitu. Mój dysk na w2.lvlup.pro na ten przykład jest mały. Warto dodać limit kopii zapasowych i usuwać starsze kopie. Ja z tym nie będę nadążać.


DBanaszewski | 2018-01-26 11:06:11 UTC | #19

Nowa aktualizacja!

Dzisiaj wyszła nowa, mała aktualizacja.

Changelog:
- usunięto zbędne linie kodu
- dodano mały system sprawdzania zajętości dysku
- dodano nowe opcje w konfiguracji

Zmienna partycja odpowiada za adres partycji (np. /dev/vda1) - wymagane jest do sprawdzenia zajętości dysku. Adres można uzyskać poprzez wpisanie komendy df. Adres znajduje się w lubryce System plików lub File system (zależy od wybranego języka). Owa partycja musi być zamontowana na / (lubryka zamont. na lub monuted on).

Zmienna maxprocent odpowiada za maksymalną ilość % zajętości dysku. Powyżej danej liczby % zajętości dysku, kopia nie wykona się.

Ogólem dodano propozycję wyświetlania każdego kroku i sprawdzania odpowiedniej ilości miejsca na dysku @Jebanany’ego.

Co do opcji z SSH jest jeszcze w trakcie dopracowywania - będzie opierała się na scp lub na sftp.

Co do propozycji @helczyna - nie ma takiej możliwości - możesz sam na hostingu WWW utworzyć zadanie cron, które będzie usuwało starsze kopie. Obecnie sam po prostu kasuję kopie po 3 dniach.


Nieznajomy11 | 2018-01-26 11:11:58 UTC | #20

To ja tylko podrzucę przykładową komendę na czyszczenie:

find SCIEŻKA -mtime +ILOŚĆ_DNI -exec rm {} \;

DBanaszewski | 2018-01-26 11:14:31 UTC | #21

Nie jest to komenda na czyszczenie poprzez protokół FTP ;)
Co do opcji z SSH to mi się akurat przyda ;)


Nieznajomy11 | 2018-01-26 11:27:43 UTC | #22

Ktoś używa jeszcze ftp?


DBanaszewski | 2018-01-26 11:28:39 UTC | #23

Ten skrypt ;)


DBanaszewski | 2018-01-26 13:10:30 UTC | #24

Nowa aktualizacja!

Przed chwilą wydałem aktualizację :)

Changelog:
- dodano możliwość wgrywania backup’ów na serwer SSH
- usunięto zbędny kod

Teraz, aby przesłać kopię na serwer SSH musimy dodać dopiskę -s lub --ssh (przykład: sudo backup.sh -s).
Jeżeli chcesz wysłać ową kopię na serwer FTP musimy dodać dopiskę -f lub --ftp (przykład: sudo backup.sh -f).

Jeżeli ma ktoś problemy lub pytania to zapraszam do rozmowy tutaj lub na priv ;)

UWAGA! Skrypt nie działa na systemach innych niż Ubuntu, Debian i inne, debianopochodne (wszystkie systemy, które używają apt.)


Jebanany | 2018-01-26 14:36:48 UTC | #25

Jeśli masz serwer na backupy, to tańsze rozwiązania nie udostępniają protokołu SFTP.


anon10657637 | 2018-01-26 15:15:22 UTC | #26

A ten jak zwierzę dalej trzyma na swoim hoście, a nie jak człowiek w jakimś VCS by móc obserwować postęp i zmiany w kodzie.


Toranktto | 2018-01-26 16:16:26 UTC | #27

Nie uważasz że używanie systemu kontroli wersji do jednoplikowego, prostego skryptu to jak wyskakiwanie z karabinem maszynowym do muchy? :P


anon10657637 | 2018-01-26 16:47:21 UTC | #28

Nie.


DBanaszewski | 2018-01-27 16:37:12 UTC | #29

Skrypt został przeniesiony na Github w celu zapewnienia 99.(9)% dostępności (zawsze może Github wywalić ) - https://goo.gl/QTTZVA.

Wersja wget:

wget https://goo.gl/QTTZVA -O backup.sh

helczyna | 2018-02-23 22:36:36 UTC | #30

Screenshot 2018-02-23 23-35-59|690x112
Github ci wywalić…


happi | 2018-02-24 10:02:03 UTC | #31

https://gist.github.com/DBanaszewski/96066b6b869af6a9c4dec90c2cd3bbe3


DBanaszewski | 2018-02-24 10:10:27 UTC | #32

wget https://goo.gl/fgiPKN -O backup.sh

;)


Timo | 2018-02-24 12:37:11 UTC | #33

Zły adres twojej strony na samej górze pliku ;)


Timo | 2018-10-05 23:59:50 UTC | #34

Link nie działa :thinking:


Qmis | 2018-10-06 06:23:11 UTC | #35

https://gist.github.com/DBanaszewski/96066b6b869af6a9c4dec90c2cd3bbe3
@DBanaszewski co tu trzeba dokładnie podać partycja=”dokladnyadrespartycji (np./dev/vda1)” #tutaj wpisz odpowiedni adres partycji (sprawdzisz to przy pomocy df -h)
adres partycji tego serwera co będą robione kopie zapasowe czy adres partycji serwera do kopi


DBanaszewski | 2018-10-06 06:35:50 UTC | #36

[quote=”Qmis, post:35, topic:5106”]
adres partycji tego serwera co będą robione kopie zapasowe czy adres partycji serwera do kopi
[/quote]

Tutaj musisz wpisać adres danej partycji, z której będą robione kopie zapasowe ;)


DBanaszewski | 2018-10-06 08:27:56 UTC | #37

Aktualizacja

Poradnik został zaktualizowany, kod został przeniesiony do mojego repozytorium (link).


DBanaszewski | 2019-01-08 19:57:48 UTC | #38

Aktualizacja

Nastąpiły pewne zmiany, kod wylądował w repozytorium, wszystko jest ok, dalej działa :stuckouttongue:


nitromaxpl | 2019-01-08 20:13:24 UTC | #39

Tego wlanie szukalem :)


Glupikocz | 2019-05-21 13:51:28 UTC | #40

(wpis wycofany przez autora, zostanie automatycznie usunięty za 24 godziny, chyba że zostanie oflagowany)


Glupikocz | 2019-05-24 21:07:29 UTC | #41

Mam pytanie bo do Crontab -e dodałem linijkę
0 5 * * * sync; bash /usr/bin/backup.sh

i skrypt się nie wykonuje o 5 rano każdego dnia ktoś coś?


Dudix | 2019-11-02 15:18:38 UTC | #42

czy backup moze byc na jednym serwerze vps?


JanekJaran | 2019-11-02 15:57:43 UTC | #43

Chcesz robić lokalne kopie zapasowe? To traci sens. Kopie powinny być zdywersyfikowane, najlepiej w różnych hostingach i centrach danych.


Dudix | 2019-11-02 22:26:33 UTC | #44

chce robic backup serwera minecraft nie calego vps :)


DBanaszewski | 2019-11-03 09:24:35 UTC | #45

No inaczej tego backupu nie zrobisz, bo jeżeli backupowanym folderem będzie / = nieskończona pętla backupowania (będzie pakowało backup, który się będzie cały czas powiększał).

Ten skrypt wykonuje tylko kopię zapasową danego folderu.


Nikox | 2019-12-19 05:09:28 UTC | #46

Da się użyć niestandardowego portu FTP?


psycho | 2019-12-19 17:08:32 UTC | #47

Prawdopodobnie wystarczy lekko przerobić skrypt, aby łączył się do odpowiedniego portu.


Axerr | 2020-05-08 01:29:53 UTC | #50

Czy skrypt posiada opcję dodania klucza ssh przy logowaniu?


DBanaszewski | 2020-05-08 06:29:33 UTC | #51

Nie, nie ma, ale postaram się dodać taką funkcję wkrótce :slight_smile:


Dudix | 2020-11-22 18:43:54 UTC | #52

popraw linki


DBanaszewski | 2020-11-25 10:37:41 UTC | #53

Skrypt już jest porzucony.
Może by i działał, ale na pewno przestał być przeze mnie wspierany ;)

Link znalazłem, to podrzucam: https://gist.github.com/dbanaszewski06/64ef9b8f100e030d271230d73f47658d


KrEdEnS | 2020-11-23 14:17:47 UTC | #54

[quote=”DBanaszewski, post:53, topic:5106, full:true”]
Skrypt już jest porzucony.
Może by i działał, ale na pewno przestał być przeze mnie wspierany :wink:
[/quote]