Πρόσφατα μετέφερα τὸν οἰκιακὸ διακομιστή μου στὸ GNU Guix·
αὐτὸς εἶναι ἕνας σύντομος ὁδηγὸς γιὰ τὸ πῶς ἔστησα τὸ cgit. Ἐλπίζω
νὰ βοηθήσει κάποιους ἀπὸ ἐσᾶς.
Γιατί χρησιμοποιῶ GNU Guix γιὰ τὸν διακομιστή μου
Τὸ GNU Guix εἶναι τὸ προτιμώμενό μου σύστημα γιὰ κάθε μηχανὴ ποὺ χρησιμοποιῶ· πρόσφατα μετέφερα ἀκόμα καὶ τὸν οἰκιακὸ διακομιστή μου (πίσω) στὸ Guix. Χρησιμοποιῶ τὸν οἰκιακὸ διακομιστὴ γιὰ νὰ φιλοξενῶ αὐτὸ τὸ ἱστολόγιο καθὼς καὶ τὴν ἐγκατάσταση cgit μου· μέχρι τώρα συνιστῶ τὸ Guix, ὡς ἐρασιτέχνης, γιὰ τοὺς ἑξῆς λόγους:
Ἐπαναφορές- Εἶχα δοκιμάσει καὶ Gentoo καὶ Debian πρὶν γιὰ τὸν διακομιστή μου· περισσότερες ἀπὸ μία φορὲς εἶχα μία ἢ περισσότερες αὐτοφιλοξενούμενες ὑπηρεσίες ἐκτὸς λειτουργίας ἐπειδὴ μιὰ ἐνημέρωση ἔθεσε ἐκτὸς λειτουργίας τὴ διαμόρφωσή μου. Ὁ χρόνος μου εἶναι περιορισμένος καὶ αὐτὲς οἱ βλάβες συχνὰ συνέβαιναν σὲ πολυάσχολες ἑβδομάδες ὅπου δὲν εἶχα χρόνο νὰ τὶς διορθώσω. Μὲ τὸ Guix μπορῶ ἁπλῶς νὰ ἐπαναφέρω προηγούμενη λειτουργικὴ γενιὰ ἂν μιὰ ἐνημέρωση ἢ μιὰ δική μου λανθασμένη διαμόρφωση προκαλέσει βλάβη.
Ἀναπαραγωγιμότητα- Ὅρισε τὴ διάταξή σου μία φορά, τρέξε τὴν ὁπουδήποτε. Δὲν θέλω νὰ στήνω τίποτα χειροκίνητα.
Ἁπλότητα- Ὁλόκληρος ὁ κώδικας τοῦ Guix βρίσκεται σὲ ἕνα ἀποθετήριο καὶ εἶναι σχεδὸν ἐξ ὁλοκλήρου γραμμένος σὲ μία γλώσσα, Guile Scheme. Ἂν βρεῖς ὁποιαδήποτε προβλήματα μὲ μιὰ ὑπηρεσία ἢ ἕνα πακέτο, μπορεῖς νὰ τὸ ἐπαναορίσεις ὅπως θέλεις στὴ διαμόρφωσή σου.
Γιατί νὰ αὐτοφιλοξενεῖς git διακομιστή;
Γιατί νὰ μὴν αὐτοφιλοξενεῖς τὰ δικά σου ἔργα; Τὸ θεωρῶ ἀντίθετο πρὸς τὸ ἦθος τοῦ FOSS, καὶ ἴσως ἀκόμα καὶ εἰρωνικό, νὰ βασίζεσαι σὲ ἰδιόκτητες πλατφόρμες γιὰ τὴ διανομὴ ἐλεύθερου λογισμικοῦ.
Ἡ φιλοξενία ἑνὸς διακομιστῆ Git εἶναι ἁπλὴ καὶ ἀπαιτεῖ ἐλάχιστους πόρους.
Πρόβλημα uri git-http-backend “/” καὶ διόρθωση
Τὸ Guix ἔχει ξεχωριστὸ τύπο δεδομένων διαμόρφωσης γιὰ τὴν ἐξυπηρέτηση
ἀποθετηρίων Git μέσω HTTP. Πρὸς τὸ παρόν, ἡ κανονικὴ ἔκφραση ποὺ χρησιμοποιεῖ
δὲν ἐπιτρέπει τὸ ριζικὸ URI "/" νὰ χρησιμοποιηθεῖ γιὰ ἐξυπηρέτηση
(ἀρχειοθετημένη ἀναφορά).
Τὸ πρόβλημα βρίσκεται στὴ μονάδα (gnu services version-control),
συγκεκριμένα σὲ αὐτὸ τὸ μέρος:
(define* (git-http-nginx-location-configuration #:optional
(config
(git-http-configuration)))
(match config
(($ <git-http-configuration> package git-root export-all?
uri-path fcgiwrap-socket)
(nginx-location-configuration
;; ISSUE here: regex won't allow for "/"
(uri (string-append "~ /" (string-trim-both uri-path #\/) "(/.*)"))
(body
(list
(list "fastcgi_pass " fcgiwrap-socket ";")
(list "fastcgi_param SCRIPT_FILENAME "
package "/libexec/git-core/git-http-backend"
";")
"fastcgi_param QUERY_STRING $query_string;"
"fastcgi_param REQUEST_METHOD $request_method;"
"fastcgi_param CONTENT_TYPE $content_type;"
"fastcgi_param CONTENT_LENGTH $content_length;"
(if export-all?
"fastcgi_param GIT_HTTP_EXPORT_ALL \"\";"
"")
(list "fastcgi_param GIT_PROJECT_ROOT " git-root ";")
(list "fastcgi_param GIT_CONFIG_GLOBAL "
(plain-file "gitconfig"
(string-append "[safe]\n\tdirectory = " git-root "/*\n"))
";")
"fastcgi_param PATH_INFO $1;"))))))
Εὐτυχῶς, μποροῦμε εὔκολα νὰ τὸ λύσουμε ἐπαναορίζοντας τὸ
(gnu services version-control).
- Οἱ διαφορές μου (διορθωτικὸ ἀπόσπασμα) γιὰ νὰ διορθώσω αὐτὸ τὸ πρόβλημα, καθὼς καὶ νὰ καθορίσω ἐνέργειες git:
diff --git a/gnu/services/version-control.scm b/gnu/services/version-control.scm
index a7f40812a6c..e33e5de21f0 100644
--- a/gnu/services/version-control.scm
+++ b/gnu/services/version-control.scm
@@ -235,7 +235,11 @@ (define* (git-http-nginx-location-configuration #:optional
(($ <git-http-configuration> package git-root export-all?
uri-path fcgiwrap-socket)
(nginx-location-configuration
- (uri (string-append "~ /" (string-trim-both uri-path #\/) "(/.*)"))
+ (uri (string-append "~ "
+ (if (string=? uri-path "/")
+ ""
+ (string-append "/" (string-trim-both uri-path #\/)))
+ "/(info/refs|git-upload-pack|git-receive-pack)"))
(body
(list
(list "fastcgi_pass " fcgiwrap-socket ";")
@@ -254,7 +258,7 @@ (define* (git-http-nginx-location-configuration #:optional
(plain-file "gitconfig"
(string-append "[safe]\n\tdirectory = " git-root "/*\n"))
";")
- "fastcgi_param PATH_INFO $1;"))))))
+ "fastcgi_param PATH_INFO $uri;"))))))
;;;
Μπορεῖς νὰ βρεῖς τὴν πλήρη μονάδα ποὺ χρησιμοποιῶ ἐδῶ στὸ ἀποθετήριο dotfiles μου.
Θὰ συνιστοῦσα νὰ δημιουργήσεις τὴ δική σου μονάδα καὶ νὰ τὴν φορτώσεις τρέχοντας τὴν ἑξῆς ἐντολή:
sudo guix system reocnfigure ~/dotfiles/guix/server-config.scm -L ~/dotfiles/guix
Διαμόρφωση cgit-service-type
Τὸ Guix παρέχει μονάδα ὑπηρεσίας cgit (gnu services cgit).
Μερικὰ πράγματα νὰ σημειώσεις:
- Μπορεῖς νὰ δώσεις
cssκαὶfaviconμὲ ἐξωτερικὴ διεύθυνση URL. Μπορεῖς νὰ βρεῖς τὴ μορφοποίηση CSS ποὺ χρησιμοποιῶ ἐδῶ.
Παράδειγμα cgit-service-type
(define my/git-repos
(list
(repository-cgit-configuration
(url "repo1")
(name "repo1")
(desc "Example Repo 1")
(path "/srv/git/repo1")
(section "Section 1"))
(repository-cgit-configuration
(url "repo2")
(name "repo2")
(desc "Example Repo 2")
(path "/srv/git/repo2")
(homepage "https://myhomepage")
(section "Section 2"))))
(service cgit-service-type
(cgit-configuration
(package cgit)
(root-desc "Root Desc")
(repository-directory "")
(root-title "Root Title")
(repositories my/git-repos)
(enable-index-owner? #f)
(enable-http-clone? #f)
(clone-prefix '("https://git.thanosapollo.org")) ;; change this to your own url
;; Cache
(cache-root "/var/cache/cgit")
;; 20000 = 5 hours. Feel free to adjust this.
(cache-size 20000)
(cache-static-ttl 20000)
(cache-dynamic-ttl 20000)
(cache-repo-ttl 20000)
(cache-root-ttl 20000)
(cache-scanrc-ttl 20000)
(cache-about-ttl 20000)
(cache-snapshot-ttl 20000)
(case-sensitive-sort? #f)
(css "https://thanosapollo.org/cgit.css") ;; My personal css.
(nginx
(list
(nginx-server-configuration
(server-name '("git.thanosapollo.org"))
(root cgit)
(try-files (list "$uri" "@cgit"))
;; I use cloudflare tunnel, which handles certs for me.
(listen '("80"))
(ssl-certificate #f)
(ssl-certificate-key #f)
;; ;; If you use certbot try the following:
;; (listen '("443 ssl"))
;; (ssl-certificate
;; "/etc/certs/git.my-host.org/fullchain.pem")
;; (ssl-certificate-key
;; "/etc/certs/git.my-host.org/privkey.pem")
(locations
(list
(nginx-location-configuration
(uri "@cgit")
(body '("fastcgi_param SCRIPT_FILENAME $document_root/lib/cgit/cgit.cgi;"
"fastcgi_param PATH_INFO $uri;"
"fastcgi_param QUERY_STRING $args;"
"fastcgi_param HTTP_HOST $server_name;"
"fastcgi_pass 127.0.0.1:9000;")))
(git-http-nginx-location-configuration
(git-http-configuration
(uri-path "/")
(export-all? #t))))))))))
Μπορεῖς νὰ βρεῖς τὴ διαμόρφωση τοῦ οἰκιακοῦ μου διακομιστῆ ἐδῶ.