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: unknownYour 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