Git auf dem Root Server

Git-Server

Nachdem ich von meinem EX40 Server Abschied genommen habe und auf einen EX41 umgestiegen bin, muss ich mal wieder Git auf dem Root Server einrichten. Das ist eigentlich keine große Sache, aber es kann auch nicht schaden, die Einrichtung mal zu dokumentieren. Ich verwende hier die authorized_keys-Methode zur Authentifizierung des Benutzers.

Zuerst erstelle ich den git Benutzer incl. $home und .ssh-Verzeichnis für meinen git user.

Dazu melde ich mich als root auf dem OpenSuse Root Server an und führe folgende Befehle aus:

openSUSE-421-64-minimal:~ # useradd git
openSUSE-421-64-minimal:~ # mkdir /home/git
openSUSE-421-64-minimal:~ # chown -R git:users /home/git
openSUSE-421-64-minimal:~ # su - git
git@openSUSE-421-64-minimal:~> pwd
/home/git
git@openSUSE-421-64-minimal:~> id
uid=1001(git) gid=100(users) groups=100(users)
git@openSUSE-421-64-minimal:~> mkdir .ssh

So weit so gut. Nun kann ich meinen öffentlichen SSH-Schlüssel zu der authorized_keys-Datei des git users hinzuzufügen. Ich besitze schon ein Schlüssel-Paar, aber mal angenommen, ich müsste ein neues Paar generieren, würde ich das wie folgt machen:

git@openSUSE-421-64-minimal:~> ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/git/.ssh/id_rsa.
Your public key has been saved in /home/git/.ssh/id_rsa.pub.
The key fingerprint is:
be:44:38:7f:37:3c:8e:c8:36:45:fe:5a:44:32:c9:1f [MD5] git@openSUSE-421-64-minimal
The key's randomart image is:
+--[ RSA 4096]----+
|                 |
| FYI     . .     |
|          = E    |
|       .  .= .   |
|    x o So  o    |
|       =  oo     |
|        +...*    |
|       oo+ =.o   |
|       .+.o..    |
+--[MD5]----------+

Dieser Befehl erzeugt die folgenden 2 Dateien:

git@openSUSE-421-64-minimal:~> find . -type f
./.ssh/id_rsa
./.ssh/id_rsa.pub

Die Datei id_rsa ist der private Teil des Schlüssels und die Datei id_rsa.pub ist der öffentliche Teil des Schlüssels. Die Passphrase dient der Sicherheit. Mit ihrer Hilfe wird der Schlüssel mit einem Passwort verschlüsselt und kann nicht einfach so verwendet werden, falls er doch mal in die falschen Hände fällt. Wer es nicht so mit den Security Zeugs hat, kann die Passphrase auch einfach leer lassen. Nun kann der öffentliche Teil des Schlüssels in die authorized_keys eingetragen werden. Das geht mit den folgenden Befehlen.

git@openSUSE-421-64-minimal:~> umask 077
git@openSUSE-421-64-minimal:~> cat ~/.ssh/id_rsa.pub > .ssh/authorized_keys

Mit umask legt man fest, mit welchen Berechtigungen die Datei angelegt wird und mit cat … wird der Inhalt der Datei id_rsa.pub in die authorized_keys kopiert. Dies funktioniert nur, wenn die Datei leer ist oder nicht existiert. Anderenfalls muss man >> statt > verwenden. Dann wird der Schlüssel an die Datei angehängt. Da ich aber nur ganz alleine auf meinen Git Server zugreife, brauche ich mich darum nicht kümmern.

Wenn ich alles richtig gemacht habe, dann sehe ich folgendes, wenn ich mit ls die Datei aufliste.

git@openSUSE-421-64-minimal:~> ls -altr .ssh/authorized_keys
-rw------- 1 git users 753 Jan  5 15:31 .ssh/authorized_keys

Nur der User git hat die Berechtigung die Datei zu lesen und zu schreiben. Weder die Gruppe users noch alle anderen User auf dem System dürfen irgendwie auf die Datei zugreifen (Ausnahme ist root – der darf immer alles).

Nun ist die Vorbereitung des Users git abgeschlossen. Ich habe auch mal darüber nachgedacht, ob ich per ssh-Konfiguration die Kompression der ssh-Verbindung einrichte, aber bisher habe ich nie Performance Probleme gehabt. Aber hier zur Info noch die beiden Config-Parameter, mit der die Kompression der ssh Verbindung aktiviert wird.

Datei: .ssh/config

Compression yes
CompressionLevel 9

Die git Installation ist sehr unspektakulär. Einfach als user root folgenden Befehl ausführen:

openSUSE-421-64-minimal:~ # zypper in git

Jetzt wird git inkl. aller Abhängigkeiten installiert und nach ein paar Sekunden kann man den Befehl git auf der Konsole ausführen.

openSUSE-421-64-minimal:~ # git
usage: git [--version] [--help] [-C ] [-c name=value]
           [--exec-path[=]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=] [--work-tree=] [--namespace=]
            []

These are common Git commands used in various situations:

start a working area (see also: git help tutorial)
   clone      Clone a repository into a new directory
   init       Create an empty Git repository or reinitialize an existing one

work on the current change (see also: git help everyday)
   add        Add file contents to the index
   mv         Move or rename a file, a directory, or a symlink
   reset      Reset current HEAD to the specified state
   rm         Remove files from the working tree and from the index

examine the history and state (see also: git help revisions)
   bisect     Use binary search to find the commit that introduced a bug
   grep       Print lines matching a pattern
   log        Show commit logs
   show       Show various types of objects
   status     Show the working tree status

grow, mark and tweak your common history
   branch     List, create, or delete branches
   checkout   Switch branches or restore working tree files
   commit     Record changes to the repository
   diff       Show changes between commits, commit and working tree, etc
   merge      Join two or more development histories together
   rebase     Forward-port local commits to the updated upstream head
   tag        Create, list, delete or verify a tag object signed with GPG

collaborate (see also: git help workflows)
   fetch      Download objects and refs from another repository
   pull       Fetch from and integrate with another repository or a local branch
   push       Update remote refs along with associated objects

'git help -a' and 'git help -g' list available subcommands and some
concept guides. See 'git help ' or 'git help '
to read about a specific subcommand or concept.

Zypper schlägt mir auch noch vor, die folgenden beiden Pakete zu installieren, was ich aber erst mal nicht mache, da ich mich damit noch nie beschäftigt habe und auch nicht genau weiß, ob die mit meiner Systemkonfiguration kompatibel sind.

The following 2 packages are suggested, but will not be installed:
  git-daemon git-web

Immerhin kann ich mit dem zypper se Befehl etwas mehr Infos zu den Paketen bekommen

openSUSE-421-64-minimal:~ # zypper se git-daemon git-web
Loading repository data...
Reading installed packages...

S | Name       | Summary                            | Type
--+------------+------------------------------------+--------
  | git-daemon | Simple Server for Git Repositories | package
  | git-web    | Git Web Interface                  | package

Aber das nur am Rande. Nun geht es erst mal weiter mit der Installation des Git Root-Servers. Allerdings ist nun schon alles fertig und der Server steht. Für einen Test lege ich nun noch ein Test-Repository an mit dem ich überprüfen kann, ob alles funktioniert hat. Das mache ich wie folgt:

git@openSUSE-421-64-minimal:~> id
uid=1001(git) gid=100(users) groups=100(users)
git@openSUSE-421-64-minimal:~> mkdir test.git
git@openSUSE-421-64-minimal:~> cd test.git/
git@openSUSE-421-64-minimal:~/test.git> git --bare init
Initialized empty Git repository in /home/git/test.git/

Auf dem entfernten Rechner (In meinem Fall der Rechner vor dem ich sitze 🙂 ) führe ich nun folgende Befehle aus:

$ git init
Initialized empty Git repository in D:/tmp/git test/.git/

$ vi readme.txt

$ git add .

$ git commit -m 'initial commit'
[master (root-commit) fce65d5] initial commit
 Committer: unknown 
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:

    git config --global user.name "Your Name"
    git config --global user.email you@example.com

After doing this, you may fix the identity used for this commit with:

    git commit --amend --reset-author

 1 file changed, 2 insertions(+)
 create mode 100644 readme.txt

OK, ich muss noch Name und E-Mail in die Config eintragen. Das mache ich auch und dann ist aber der erste commit fertig 🙂

$ git config --global user.name Michael

$ git config --global user.email M.Jentsch@web.de

$ git commit --amend --reset-author
[master d1683c2] initial commit
 1 file changed, 2 insertions(+)
 create mode 100644 readme.txt

Eingecheckt habe ich nun, aber auf dem Server ist noch nichts zu finden. Aber das ist auch kein Wunder, denn ich habe weder angegeben, wo mein Remote Repository ist noch habe ich meinen privaten Schlüssel in meinem $HOME Verzeichnis abgelegt. Dies kann ich aber mit folgenden Befehlen erledigen.

$ git remote add origin git@mein-toller-git-root-server.de:/home/git/test.git

$ git push origin master
The authenticity of host 'mein-toller-git-root-server.de (47.11.308.15)' can't be established.
ECDSA key fingerprint is 88:bc:3d:c5:5b:xf:bd:c0:3f:51:50:65:a9:4a:7a:01.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'mein-toller-git-root-server.de,47.11.308.15' (ECDSA) to the list of known hosts.
.....

Alternativ kann man statt der authorized_keys Methode kann man sich auch einfach mit User und Passwort. Ich bevorzuge aber die authorized_keys Methode und verzichte daher auf ein Passwort was man in der /etc/shadow Datei auch sehen kann.

Zum Schuss noch ein kleines Shall Script zum Anlegen von Git Repositories, dass ich mir auf die schnelle gebastelt habe.

openSUSE-421-64-minimal:/home/git # cat create_repo.sh
#!/bin/sh
# set -x

if [ $USER != "git" ]; then
        echo "###################################################"
        echo "# Sorry, you are not user git.                    #"
        echo "###################################################"
        exit 1
fi

cd /home/git

if [ -z "$1" ]
then
        echo "###################################################"
        echo "# create-repo.sh: Execute with repo name          #"
        echo "#                                                 #"
        echo "# Example:                                        #"
        echo "#                                                 #"
        echo "# create-repo.sh test                             #"
        echo "###################################################"
        exit 1
else
        if [ -d "$1.git" ]
        then
                echo ""
                echo "Error create-repo.sh: $1.git exists"
                echo ""
        else
                echo "OK"
                mkdir $1.git
                cd $1.git
                git --bare init
                echo "OK create-repo.sh"
                echo "New repository URL: git@git.1br.de:$1.git"
        fi
fi
Meine Apps im Google Play-Strore Jetzt bei Google Play