From bf2f2e1f9263a20fc6171117d621c1cc7e9fa9d3 Mon Sep 17 00:00:00 2001 From: Timo Makinen Date: Wed, 8 Sep 2021 17:10:48 +0000 Subject: [PATCH] backup-server: Initial version of role --- roles/backup-server/files/backup-bitbucket.py | 51 +++++++++++++++ roles/backup-server/tasks/main.yml | 64 +++++++++++++++++++ user.list | 1 + 3 files changed, 116 insertions(+) create mode 100644 roles/backup-server/files/backup-bitbucket.py create mode 100644 roles/backup-server/tasks/main.yml diff --git a/roles/backup-server/files/backup-bitbucket.py b/roles/backup-server/files/backup-bitbucket.py new file mode 100644 index 0000000..15cb651 --- /dev/null +++ b/roles/backup-server/files/backup-bitbucket.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 + +import os +import json +from subprocess import call +from urllib.request import urlopen + +USERS = ["tmakinen"] +BACKUPDIR = "/srv/backup/bitbucket.org" + + +def repolist(username): + f = urlopen(f"https://api.bitbucket.org/2.0/repositories/{username}") + data = json.load(f) + f.close() + + for repo in data["values"]: + yield ( + { + "name": repo["name"], + "scm": repo["scm"], + "wiki": repo["has_wiki"], + "issues": repo["has_issues"], + } + ) + + +def gitbackup(destination, repo): + if not os.path.exists(destination): + os.makedirs(destination) + call(["git", "clone", "--quiet", repo, destination]) + else: + os.chdir(destination) + call(["git", f"--git-dir={destination}/.git", "pull", "--quiet"]) + + +if __name__ == "__main__": + for user in USERS: + for repo in repolist(user): + if repo["scm"] == "git": + gitbackup( + f"{BACKUPDIR}/{user}/{repo['name']}", + f"https://bitbucket.org/{user}/{repo['name']}.git", + ) + if repo["wiki"]: + gitbackup( + f"{BACKUPDIR}/{user}/{repo['name']}-wiki", + f"https://bitbucket.org/{user}/{repo['name']}.git/wiki", + ) + else: + raise NotImplementedError("{repo['scm']} repositories not supported") diff --git a/roles/backup-server/tasks/main.yml b/roles/backup-server/tasks/main.yml new file mode 100644 index 0000000..07a4605 --- /dev/null +++ b/roles/backup-server/tasks/main.yml @@ -0,0 +1,64 @@ +--- +- name: install packages + package: + name: "{{ item }}" + state: installed + with_items: + - git + - rclone + +- name: create backup group + group: + name: backup + gid: 1003 + +- name: create backup user + user: + name: backup + comment: Backup Service + createhome: false + group: backup + home: /var/empty + shell: /bin/sh + uid: 1003 + +- name: create backup directory + file: + path: /export/backup + state: directory + mode: 0755 + owner: root + group: "{{ ansible_wheel }}" + +- name: link backup directory + file: + dest: /srv/backup + src: /export/backup + state: link + owner: root + group: "{{ ansible_wheel }}" + follow: false + +- name: create bitbucket backup directory + file: + path: /export/backup/bitbucket.org + state: directory + mode: 0775 + owner: root + group: backup + +- name: install bitbucket backup script + copy: + dest: /usr/local/sbin/backup-bitbucket + src: backup-bitbucket.py + mode: 0755 + owner: root + group: "{{ ansible_wheel }}" + +- name: add bitbucket backup cron job + cron: + name: bitbucket-backup + job: /usr/local/sbin/backup-bitbucket + hour: "03" + minute: "10" + user: backup diff --git a/user.list b/user.list index 5df9e95..e53db76 100644 --- a/user.list +++ b/user.list @@ -8,3 +8,4 @@ id user group notes ------------------------------------------------------------------------------- 1001 mirror mirror 1002 certbot certbot +1003 backup backup