{"id":1799,"date":"2018-06-03T13:41:32","date_gmt":"2018-06-03T13:41:32","guid":{"rendered":"https:\/\/blog.datentraeger.li\/?p=1799"},"modified":"2018-06-11T07:02:02","modified_gmt":"2018-06-11T07:02:02","slug":"gitea-go-git-frontend","status":"publish","type":"post","link":"https:\/\/blog.datentraeger.li\/?p=1799","title":{"rendered":"gitea: go git frontend"},"content":{"rendered":"<p>Vor langer Zeit hab ich mir mal <a href=\"https:\/\/gogs.io\/\" target=\"blank_\">Gogs<\/a> gebookmarkt, aber nie wirklich weiterverfolgt. Wenn man jedoch ein bisschen recherchiert, ist <a href=\"https:\/\/gitea.io\/\" target=\"blank_\">Gitea<\/a> wohl die <a href=\"https:\/\/blog.gitea.io\/2016\/12\/welcome-to-gitea\/\" target=\"blank_\">bessere Alternative<\/a>.<\/p>\n<p>Auch von den Features her finde ich Gitea ansprechend. Auf Github hat jemand eine <a href=\"https:\/\/github.com\/MartinThoma\/MartinThoma.github.io\/blob\/pelican\/content\/2017-09-06-git-repository-managers.md#repository-managers\" target=\"blank_\">sch\u00f6ne Tabelle erstellt<\/a>, welche die Features vergleicht.<\/p>\n<p>Generell w\u00e4re ich ja auch von Gitlab nicht abgeneigt, jedoch finde ich die <a href=\"https:\/\/docs.gitlab.com\/ee\/install\/requirements.html#hardware-requirements\" target=\"blank_\">Minumum-Requirements<\/a> einfach zu hoch f\u00fcr unsere paar Repositories. Gitea gibt sich recht schnell zufrieden und soll auch auf eine Raspberry brauchbar laufen.<\/p>\n<p>Nun eigentlich die Hauptfrage: Warum brauche ich das ? Eigentlich brauche ich es absolut nicht, konnte auch bisher gut ohne leben. Aber trotzdem, halt darum \ud83d\ude09 <del>Und falls Microsoft tats\u00e4chlich Github kaufen wird, werde ich dort alles von mir abziehen. Das ist aber ein Ger\u00fccht, das schon mehrmals in die Welt gesetzt wurde, noch nichts konkretes<\/del>. <em>EDIT 4.6.:<\/em> Das Ger\u00fccht hat sich leider auch schon <a href=\"https:\/\/about.gitlab.com\/2018\/06\/03\/microsoft-acquires-github\/\" target=\"_blank\" rel=\"noopener\">best\u00e4tigt<\/a> &#8211; <a href=\"https:\/\/blog.github.com\/2018-06-04-github-microsoft\/\" target=\"_blank\" rel=\"noopener\">Github<\/a> geh\u00f6rt nun <a href=\"https:\/\/blogs.microsoft.com\/blog\/2018\/06\/04\/microsoft-github-empowering-developers\/\" target=\"_blank\" rel=\"noopener\">Microsoft<\/a>&#8230;<br \/>\nIch habe nichts wichtiges auf Github, aber dennoch will ich einfach keine MS-Dienstleistungen verwenden, aus Prinzip.<br \/>\nZudem arbeite ich recht intensiv mit Redmine und dessen Git-Integration (Referenzierung zu tickets etc).<\/p>\n<h2>Installation<\/h2>\n<p>Die Installation ist kinderleicht &#8211; ob man es manuell oder mit einem Package macht.<\/p>\n<h3>sid\/buster<\/h3>\n<p>Unter <a href=\"https:\/\/packages.debian.org\/search?keywords=gitea&amp;searchon=names&amp;suite=all&amp;section=all\" target=\"blank_\">sid<\/a> ist gitea im Repository, also easy-peasy. Als ich Gitea noch gar nicht kannte, war das meine &#8220;schnell-mal-reinschauen&#8221;-Variante.<\/p>\n<p>Nach dem Setup hatte ich jedoch keinen Schimmer, wie ich mich nun als Admin einloggen k\u00f6nnte. Deshalb hab ich mir einfach einen Admin-User angelegt<\/p>\n<pre># su - gitea\r\n$ gitea admin create-user --name foobar --password admin \\\r\n    --email peter@bar.fuss --admin -c \/var\/lib\/gitea\/custom\/conf\/app.ini                                 \r\n2018\/06\/03 14:58:09 [I] XORM Log Mode: File(Warn)\r\nNew user 'foobar' has been successfully created!\r\n<\/pre>\n<h3>Stable<\/h3>\n<p>Da unser Git-Server jedoch auf Stretch l\u00e4uft, werde ich Gitea dort manuell montieren. Da das ganze in Go geschrieben ist, auch nicht weiter umst\u00e4ndlich. Zudem hab ich mich derzeit sowieso ein bisschen in Go verliebt&#8230;<\/p>\n<p>Da wir das ganze nicht als Root laufen lassen wollen, legen wir einen User f\u00fcr gitea an<\/p>\n<pre>adduser --disabled-login --gecos 'gitea' gitea<\/pre>\n<p>oder &#8211; wie ich es mache &#8211; in einem manifest. Das <a href=\"https:\/\/unix.stackexchange.com\/questions\/96892\/what-does-adduser-disabled-login-do\" target=\"blank_\">! im Passwort<\/a> sollte eigentlich kein Login erlauben, identisch mit &#8211;disabled-login.<\/p>\n<pre>user { 'gitea':\r\n  ensure     =&gt; present,\r\n  comment    =&gt; 'Gitea Daemon',\r\n  home       =&gt; '\/var\/lib\/gitea',\r\n  managehome =&gt; true,\r\n  password   =&gt; '!',\r\n}\r\n<\/pre>\n<p>und laden das aktuellste Stable-Binary herunter<\/p>\n<pre>su - gitea\r\nwget -O gitea https:\/\/github.com\/go-gitea\/gitea\/releases\/download\/v1.4.1\/gitea-1.4.1-linux-amd64\r\nchmod +x gitea\r\n<\/pre>\n<p>Theoretisch k\u00f6nnte man nun bereits gitea manuell starten<\/p>\n<pre>su - gitea\r\n.\/gitea web\r\n<\/pre>\n<p>Beim ersten Start landet man auch gleich auf der \/install-Site und die Basis-Konfiguration kann gemacht werden. Man kann aber auch einfach das configfile unter custom\/config\/app.ini eingetragen werden.<\/p>\n<h4>Authentifizierung<\/h4>\n<p>Es werden unterschiedlich Authentifizierungs-Backends unterst\u00fctzt, bspw. LDAP, SMTP, PAM (PAM jedoch <a href=\"https:\/\/github.com\/go-gitea\/gitea\/issues\/865\" target=\"_blank\" rel=\"noopener\">nicht in den vorkompilierten Binaries<\/a>). Naja, da wir nicht wirklich viel User auf dem Server haben, hab ich mich f\u00fcr die Gitea-internen entschieden. LDAP ist ja sch\u00f6n und gut, kann aber auch ein Problem sein, wenn der LDAP nicht erreichbar w\u00e4re..<\/p>\n<h4>init<\/h4>\n<p>Ich m\u00f6chte jedoch noch ein initfile erstellen<br \/>\nIn vielen Tutorials wird von <a href=\"https:\/\/packages.debian.org\/search?keywords=supervisor&amp;searchon=names&amp;suite=stable&amp;section=all\" target=\"blank_\">supervisor<\/a> gesprochen. Ich kannte das bis anhin gar nicht und frage mich, warum nicht einfach eine systemd-unit, wie es sonst \u00fcblich ist ? Da ich&#8217;s in sid ja zum Testen bereits mal montiert hab, muss ich das ganze nicht mal mehr definieren, sondern kann das von Debian \u00fcbernehmen&#8230;<\/p>\n<pre>[Unit]\r\nDescription=Gitea (Git with a cup of tea)\r\nDocumentation=man:gitea(1)\r\n# syslog is \"socket activated\"\r\n#After=syslog.target\r\nAfter=network.target\r\n#After=mysqld.service\r\n#After=postgresql.service\r\n#After=memcached.service\r\n#After=redis.service\r\n\r\n[Service]\r\n# Modify these two values and uncomment them if you have\r\n# repos with lots of files and get an HTTP error 500 because\r\n# of that\r\n###\r\n#LimitMEMLOCK=infinity\r\n#LimitNOFILE=65535\r\nType=simple\r\nUser=gitea\r\nGroup=gitea\r\nWorkingDirectory=\/var\/lib\/gitea\r\nExecStart=\/var\/lib\/gitea\/gitea web\r\nRestart=always\r\nEnvironment=USER=gitea HOME=\/var\/lib\/gitea GITEA_WORK_DIR=\/var\/lib\/gitea\r\n\r\n[Install]\r\nWantedBy=multi-user.target\r\n<\/pre>\n<h2>Import<\/h2>\n<p>Es gibt nat\u00fcrlich auch eine Importfunktion<\/p>\n<h3>Import via HTTPS\/Git-URL<\/h3>\n<p>Um einen Import von Github oder \u00e4hnlichem zu machen, w\u00e4hlt man &#8220;Neue Migration&#8221;. Der Rest ist eigentlich straight-forward. W\u00e4hlt man &#8220;Mirror&#8221;, wird das Repository (in der Standardsetting) alle 8 Stunden gespiegelt. Also eigentlich noch ganz gut, um ein Backup zu machen.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1819\" src=\"http:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/06\/gitea_migration.png\" alt=\"\" width=\"804\" height=\"719\" srcset=\"https:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/06\/gitea_migration.png 804w, https:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/06\/gitea_migration-300x268.png 300w, https:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/06\/gitea_migration-768x687.png 768w\" sizes=\"auto, (max-width: 804px) 100vw, 804px\" \/><\/p>\n<p>Diese Einstellungen lassen sich aber sp\u00e4ter auch jederzeit anpassen:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1817\" src=\"http:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/06\/gitea_mirrorsettings.png\" alt=\"\" width=\"1131\" height=\"412\" srcset=\"https:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/06\/gitea_mirrorsettings.png 1131w, https:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/06\/gitea_mirrorsettings-300x109.png 300w, https:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/06\/gitea_mirrorsettings-768x280.png 768w, https:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/06\/gitea_mirrorsettings-1024x373.png 1024w\" sizes=\"auto, (max-width: 1131px) 100vw, 1131px\" \/><\/p>\n<p>M\u00f6chte man den Mirror aufheben, muss man in den Settings des Repositories &#8220;Convert to regular Repository&#8221; w\u00e4hlen.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1816\" src=\"http:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/06\/gitea_dangerzone.png\" alt=\"\" width=\"1130\" height=\"421\" srcset=\"https:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/06\/gitea_dangerzone.png 1130w, https:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/06\/gitea_dangerzone-300x112.png 300w, https:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/06\/gitea_dangerzone-768x286.png 768w, https:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/06\/gitea_dangerzone-1024x382.png 1024w\" sizes=\"auto, (max-width: 1130px) 100vw, 1130px\" \/><\/p>\n<p>Ich bin mir zwar nicht ganz sicher, aber soweit ich gesehen hab, werden keine Issues gespiegelt&#8230;<\/p>\n<h3>Import von lokalem Directory<\/h3>\n<p>EDIT 4.6.: Ein lokaler Import ist doch m\u00f6glich, muss jedoch in der app.ini aktiviert werden:<\/p>\n<pre class=\"lang:default decode:true \">...\r\n[security]\r\n...\r\n; True when users are allowed to import local server paths\r\nIMPORT_LOCAL_PATHS = true\r\n...<\/pre>\n<p>Wenn also IMPORT_LOCAL_PATHS gesetzt ist, kann auch einfach der Pfad mitgegeben werden:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1849\" src=\"http:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/06\/gitea_localimport.png\" alt=\"\" width=\"804\" height=\"670\" srcset=\"https:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/06\/gitea_localimport.png 804w, https:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/06\/gitea_localimport-300x250.png 300w, https:\/\/blog.datentraeger.li\/wp-content\/uploads\/2018\/06\/gitea_localimport-768x640.png 768w\" sizes=\"auto, (max-width: 804px) 100vw, 804px\" \/><\/p>\n<p>Eine komplette Auflistung der Config-Paramter findet man \u00fcbrigens im <a href=\"https:\/\/docs.gitea.io\/en-us\/config-cheat-sheet\/\" target=\"_blank\" rel=\"noopener\">Gitea-Cheat-Sheet<\/a>, was noch hilfreich sein kann&#8230;<\/p>\n<p><del>Da mein Gitea Server auf meinem Git-Server montiert wird (hm, logischerweise), habe ich bestehende lokale Repositories, die ich verwalten m\u00f6chte.<\/del><\/p>\n<p><del>Als erstes legt man ein neues Repository in Gitea an. Dann muss man eigentlich nur den URL als Remote erg\u00e4nzen und das ganze pushen<\/del><\/p>\n<pre><del>git remote add origin https:\/\/your.gogs.com\/youruser\/yourrepo\r\ngit push origin master\r\n<\/del><\/pre>\n<p><del>Da es sich bei mir aber um denselben server handelt, muss ich eigentlich nur die Pfade im .git\/config korrigieren und git push origin master, that&#8217;s it&#8230;<\/del><\/p>\n<p><del>Ich habe es mit einem einzelnen Repository getestet und da hat es bei mir tadellos geklappt, als Referenzen haben ich <a href=\"https:\/\/discuss.gogs.io\/t\/importing-local-file-based-git-repositories\/280\" target=\"blank_\">diesen<\/a> und <a href=\"https:\/\/github.com\/go-gitea\/gitea\/issues\/1635\" target=\"blank_\">diesen<\/a> Link verwendet.<\/del><\/p>\n<p><del>Da ich auch weiterhin &#8220;ganz normal&#8221;, also auch ohne gitea arbeiten k\u00f6nnen m\u00f6chte, m\u00fcssen die Rechte zum Repository-Pfad entsprechend passen. Nehmen wir an, ich bin Member der Gruppe &#8216;staff&#8217;. Diese Gruppe ben\u00f6tigt volle Rechte beim Repository-Pfad<\/del><\/p>\n<pre><del>chgrp -R staff \/var\/lib\/gitea\/repository\r\nchmod -R 775 \/var\/lib\/gitea\/repository\r\n<\/del><\/pre>\n<p><del>So sollte auch ein &#8220;normales&#8221; Arbeiten mit meinem Login-User funktionieren (nat\u00fcrlich immer mit dem vollst\u00e4ndigen Pfad zum jeweiligen Repository)<\/del><\/p>\n<p><em>EDIT 4.6.:<\/em> Ich habe mich nun doch soweit eingeschr\u00e4nkt, nur gitea-Logins zu verwenden, da es sonst st\u00e4ndig Berechtigungen im Repository auf den Gitea-User zur\u00fccksetzt und bei gr\u00f6ssen Repositories konnte ich es zwar pushen, in gitea war jedoch nichts zu sehen. Man muss sich das Leben ja nicht bewusst schwerer machen&#8230;<\/p>\n<h2>SSH<\/h2>\n<p>SSH kann man entweder mit OpenSSH einsetzen oder mit einem integrierten SSH-Server von Gitea. Falls man den internen verwenden m\u00f6chte, muss man dies in der app.ini festlegen<\/p>\n<pre class=\"lang:default decode:true \">[server]\r\n...\r\nDISABLE_SSH      = false\r\n; built-in server verwenden\r\nSTART_SSH_SERVER = true\r\n; built-in server port\r\nSSH_LISTEN_PORT  = 10022\r\n; displayed port in clone url\r\nSSH_PORT         = 10022\r\n...<\/pre>\n<p>Der integrierte Server hat irgendwie was &#8211; l\u00e4sst by design keine Shell-Logins zu und l\u00e4uft unter dem gitea-User&#8230; aber funktionieren tut&#8217;s mit beiden Varianten.<\/p>\n<h2>Backup\/Restore<\/h2>\n<p>Backup k\u00f6nnen mit gitea dump angelegt werden. So wie ich es aus der <a href=\"https:\/\/docs.gitea.io\/en-us\/backup-and-restore\/\" target=\"_blank\" rel=\"noopener\">Dokumentation<\/a> verstehe, wird ein Zip mit allen wichtigen Directories\/Files und einem DB-Dump angelegt.<\/p>\n<h2>Fazit<\/h2>\n<p>Also mein Fazit (obwohl ich noch nicht wirklich viel sagen kann, habe nur den letzten Sonntag damit verbracht):<\/p>\n<p>Generell ganz sicher die bessere L\u00f6sung, da auch Gitea freie Software ist, nicht wie Github. Sch\u00f6n w\u00e4re es jedoch, wenn es so etwas wie Federation geben w\u00fcrde, um sich mit anderen privaten Servern zu verbinden. Das w\u00e4re meiner Meinung nach ein Killerfeature. Alles andere &#8211; ich scheine nicht wirklich etwas zu vermissen, im Gegenteil &#8211; jetzt kann ich auch private Repositories machen, was bisher nur mit einem kostenpflichtigen Account m\u00f6glich gewesen w\u00e4re. Zudem habe ich gerne das Zeugs bei mir, nicht bei einem Closed-Source-Anbieter. Und erst recht nicht bei Microschrott.<\/p>\n<p>Links\/Referenzen zu anderen Blogs zum Thema:<br \/>\n<a href=\"https:\/\/blog.yumdap.net\/gitea-oder-gogs-statt-github-und-gitlab\/\" target=\"_blank\" rel=\"noopener\">Blog Gitea\/Gogs<\/a><br \/>\n<a href=\"https:\/\/jeremyverda.net\/installing-gitea-on-debian\/\" target=\"_blank\" rel=\"noopener\">Blog Gitea unter Debian<\/a><\/p>\n<h2>weitere Alternativen<\/h2>\n<p>es gibt weitere self-hosted Alternativen, einige davon w\u00e4ren:<\/p>\n<ul>\n<li><a href=\"https:\/\/gitlab.com\/\" target=\"_blank\" rel=\"noopener\">Gitlab<\/a> das wohl bekannteste<\/li>\n<li><a href=\"https:\/\/gogs.io\/\" target=\"_blank\" rel=\"noopener\">Gogs<\/a> (von dem ja Gitea geforkt wurde)<\/li>\n<li><a href=\"https:\/\/www.fossil-scm.org\/\" target=\"_blank\" rel=\"noopener\">Fossil SCM<\/a><\/li>\n<li><a href=\"http:\/\/gitolite.com\/gitolite\/index.html\" target=\"_blank\" rel=\"noopener\">Gitolite<\/a><\/li>\n<li><a href=\"https:\/\/git.wiki.kernel.org\/index.php\/Gitweb\" target=\"_blank\" rel=\"noopener\">Gitweb<\/a><\/li>\n<\/ul>\n<p>wobei diese Auflistung alles andere als komplett ist und ich auch einige davon nicht genauer angeschaut habe.<\/p>\n","protected":false},"excerpt":{"rendered":"Vor langer Zeit hab ich mir mal Gogs gebookmarkt, aber nie wirklich weiterverfolgt. Wenn man jedoch ein bisschen recherchiert, ist Gitea wohl die bessere Alternative. Auch von den Features her finde ich Gitea ansprechend. Auf Github hat jemand eine sch\u00f6ne Tabelle erstellt, welche die Features vergleicht. Generell w\u00e4re ich ja&hellip;\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19],"tags":[],"class_list":["post-1799","post","type-post","status-publish","format-standard","hentry","category-git"],"_links":{"self":[{"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/posts\/1799","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1799"}],"version-history":[{"count":53,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/posts\/1799\/revisions"}],"predecessor-version":[{"id":1880,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=\/wp\/v2\/posts\/1799\/revisions\/1880"}],"wp:attachment":[{"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1799"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1799"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.datentraeger.li\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1799"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}