summaryrefslogtreecommitdiff
path: root/www/posts/git/atom.xml
blob: 0ada83f15710984516f12b063b5ccb0501832b84 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title type="text">The Home of David T. Sadler - All Posts About Git</title>
    <id>https://davidtsadler.com/posts/git/atom.xml</id>
    <link rel="alternate" type="text/html" href="https://davidtsadler.com/posts/git/"/>
    <link rel="self" type="application/atom+xml" href="https://davidtsadler.com/posts/git/atom.xml"/>
    <updated>2021-06-13T12:00:00Z</updated>
    <entry>
    <title type="text">Backing Up a Git Repository</title>
    <id>https://davidtsadler.com/posts/git/2021-06-13/backing-up-a-git-repository/</id>
    <link rel="alternate" type="text/html" href="https://davidtsadler.com/posts/git/2021-06-13/backing-up-a-git-repository/"/>
    <author><name>David T. Sadler.</name></author>
    <published>2021-06-13T12:00:00Z</published>
    <updated>2021-06-13T12:00:00Z</updated>
    <content type="html">&lt;h1&gt;Backing Up a Git Repository&lt;/h1&gt;&lt;blockquote&gt;Sun 13th June 2021 By David T. Sadler.&lt;/blockquote&gt;&lt;p&gt;Below is a quick and dirty way in which I backup all my repositories that are hosted at git.davidtsadler.com.&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;shell&quot;&gt;#!/bin/sh

DATE_PREFIX=$(date +%Y%m%d)

BACKUP_DIRECTORY=/tmp

BACKUP_FILE=&amp;quot;${BACKUP_DIRECTORY}/${DATE_PREFIX}-repositories.tar.gz&amp;quot;

BACKUP_FILES=&amp;quot;${BACKUP_DIRECTORY}/*-repositories.tar.gz&amp;quot;

REPOSITORIES=/home/git/*.git

tar -czf $BACKUP_FILE $REPOSITORIES

find $BACKUP_FILES -mtime +3 -delete

exit 0&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;All it does it tar and gzip any .git directories found under /home/git. It also removes any backups that are more than three days old.&lt;/p&gt;&lt;p&gt;This script has been saved as /usr/bin/backup_repositories and is ran daily via cron.&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;cron&quot;&gt;0 3 * * * /usr/bin/backup_repositories &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It is important to know that this backup strategy is far from ideal for repositories that are heavily used as you run the high risk of trying to backup a repository as users are pushing to it. As git updates a repository in two phases this will lead to a backup that may not contain all the data and so won't be suitable for restoring. However its fine for my purposes since I'm the only user and it's unlikely that I will be making changes during the time the backup is running.&lt;/p&gt;&lt;h3&gt;Links&lt;/h3&gt;&lt;a href=&quot;/posts/git/2021-05-29/setting-up-a-self-host-git-server/&quot;&gt;2021-05-29 - Setting up a Self Hosted Git Server&lt;/a&gt;&lt;a href=&quot;/posts/git/&quot;&gt;Git - Read More Posts.&lt;/a&gt;&lt;p&gt;I don't have comments as I don't want to manage them. You can however contact me at the below address if you want to.&lt;/p&gt;&lt;a href=&quot;mailto:david@davidtsadler.com&quot;&gt;Email david@davidtsadler.com&lt;/a&gt;&lt;h3&gt;License&lt;/h3&gt;&lt;a href=&quot;https://creativecommons.org/licenses/by-sa/4.0/&quot;&gt;The contents of this site is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.&lt;/a&gt;&lt;p&gt;Copyright © 2021 David T. Sadler.&lt;/p&gt;&lt;a href=&quot;/&quot;&gt;Return to Homepage.&lt;/a&gt;</content>
</entry><entry>
    <title type="text">Setting up a Self Hosted Git Server</title>
    <id>https://davidtsadler.com/posts/git/2021-05-29/setting-up-a-self-host-git-server/</id>
    <link rel="alternate" type="text/html" href="https://davidtsadler.com/posts/git/2021-05-29/setting-up-a-self-host-git-server/"/>
    <author><name>David T. Sadler.</name></author>
    <published>2021-05-29T12:00:00Z</published>
    <updated>2021-05-29T12:00:00Z</updated>
    <content type="html">&lt;h1&gt;Setting up a Self Hosted Git Server&lt;/h1&gt;&lt;blockquote&gt;Sat 29th May 2021 By David T. Sadler.&lt;/blockquote&gt;&lt;p&gt;I've always liked the idea of self hosting some of my git repositories. After a bit of research I found that it involves.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Installing git.&lt;/li&gt;&lt;li&gt;Creating a git user.&lt;/li&gt;&lt;li&gt;Setting up ssh so that I can log into the sever securely as the git user.&lt;/li&gt;&lt;li&gt;Creating a test repository on the server.&lt;/li&gt;&lt;li&gt;Creating a test project on my local machine.&lt;/li&gt;&lt;li&gt;Pushing the test project to the git sever.&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Installing Git&lt;/h2&gt;&lt;p&gt;Since its an Ubuntu server installing git is as simple as.&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;shell&quot;&gt;$ sudo apt install git-core&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Creating a User&lt;/h2&gt;&lt;p&gt;The git user will serve two purposes.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The repositories will be stored in the user's home directory.&lt;/li&gt;&lt;li&gt;The user account will contain the public ssh keys of remote users that can access the repositories.&lt;/li&gt;&lt;/ul&gt;&lt;pre&gt;&lt;code class=&quot;shell&quot;&gt;$ sudo adduser --system --shell /usr/bin/git-shell --group --disabled-password --home /home/git git&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;--system Creates a system user user. Not strictly required but since this is not a normal user account I prefer to use this option.&lt;/li&gt;&lt;li&gt;--shell /usr/bin/git-shell Restrict the git user to only git related activities. This also prevents remote users from obtaining a shell by logging in via ssh. Note that git-shell does not prevent normal git operations, such as pull and push, from working over ssh.&lt;/li&gt;&lt;li&gt;--group Creates a group that is the same name as the user.&lt;/li&gt;&lt;li&gt;--disabled-password Prevent logging in with a password. The use of ssh keys is still allowed.&lt;/li&gt;&lt;li&gt;--home /home/git The home directory for the user.&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Setting up SSH&lt;/h2&gt;&lt;p&gt;On my local machine git will use ssh to connect to the remote server as the git user. In order to do this I will need to copy my public ssh key to the git user account.&lt;/p&gt;&lt;p&gt;The below commands create the required .ssh directory and authorized_keys file with the correct permissions.&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;shell&quot;&gt;$ sudo mkdir /home/git/.ssh
$ sudo chown git:git /home/git/.ssh
$ sudo chmod 700 /home/git/.ssh
$ sudo touch /home/git/.ssh/authorized_keys
$ sudo chown git:git /home/git/.ssh/authorized_keys
$ sudo chmod 600 /home/git/.ssh/authorized_keys&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now I can copy the public ssh key of anyone who needs access to the repositories. There are a few ways of doing this and I tend to just edit the authorized_keys file and manually copy and paste the keys into it. &lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;shell&quot;&gt;$ sudo vim /home/git/.ssh/authorized_keys&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Note that to prevent ssh port forwarding via the git user account I prepend the no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty options to the key.&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;shell&quot;&gt;$ sudo cat /home/git/.ssh/authorized_keys

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4LojG6rs6h
PB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4kYjh6541N
YsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9EzSdfd8AcC
IicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myivO7TCUSBd
LQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPqdAv8JggJ
ICUvax2T9va5 gsg-keypair&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On my local machine I can test ssh access.&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;shell&quot;&gt;$ ssh git.davidtsadler.com

fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The message that comes back indicates that ssh is working and that the git-shell is been used.&lt;/p&gt;&lt;h2&gt;Creating a Test Repository&lt;/h2&gt;&lt;p&gt;An empty repository is setup by running git init with the --bare option. I also ensure that the git user owns the repository and that main will be the default branch when its checked out.&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;shell&quot;&gt;$ sudo git init --bare /home/git/test.git/
$ sudo chown -R git:git /home/git/test.git/
$ sudo git --git-dir=/home/git/test.git/ symbolic-ref HEAD refs/heads/main&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Creating a Test Project&lt;/h2&gt;&lt;p&gt;Back on my local machine I can create a test project and push it to the remote server.&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;shell&quot;&gt;$ mkdir test
$ cd test
$ git init
$ touch readme
$ git add .
$ git commit -m 'Initial commit'
$ git remote add origin git@git.davidtsadler.com:test.git
$ git push origin main&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I can also test that I can clone the repository.&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;shell&quot;&gt;rm -rf test
git clone git@git.davidtsadler.com:test.git&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;Links&lt;/h3&gt;&lt;a href=&quot;/posts/git/&quot;&gt;Git - Read More Posts.&lt;/a&gt;&lt;p&gt;I don't have comments as I don't want to manage them. You can however contact me at the below address if you want to.&lt;/p&gt;&lt;a href=&quot;mailto:david@davidtsadler.com&quot;&gt;Email david@davidtsadler.com&lt;/a&gt;&lt;h3&gt;License&lt;/h3&gt;&lt;a href=&quot;https://creativecommons.org/licenses/by-sa/4.0/&quot;&gt;The contents of this site is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.&lt;/a&gt;&lt;p&gt;Copyright © 2021 David T. Sadler.&lt;/p&gt;&lt;a href=&quot;/&quot;&gt;Return to Homepage.&lt;/a&gt;</content>
</entry>
</feed>