aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/docker
diff options
context:
space:
mode:
authorEgor Tensin <Egor.Tensin@gmail.com>2022-03-26 12:44:29 +0300
committerEgor Tensin <Egor.Tensin@gmail.com>2022-03-26 12:44:31 +0300
commit0f5dbcc3bdeb401f00c1cdcb7b0ef826003b5bd7 (patch)
treed6d591ba8845d6cda37c756a44f9c92605c7df09 /docker
parentdocker: run once at startup, even when in cron (diff)
downloadcgitize-0f5dbcc3bdeb401f00c1cdcb7b0ef826003b5bd7.tar.gz
cgitize-0f5dbcc3bdeb401f00c1cdcb7b0ef826003b5bd7.zip
docker: add a frontend nginx image
At first, I built a custom image at https://egort.name/. It had a rather long development history, and I just copied the files from there.
Diffstat (limited to 'docker')
-rw-r--r--docker/frontend/Dockerfile19
-rwxr-xr-xdocker/frontend/cmd.sh13
-rw-r--r--docker/frontend/etc/cgit/cgitrc4
-rw-r--r--docker/frontend/etc/cgit/common36
-rw-r--r--docker/frontend/etc/nginx/conf.d/default.conf24
-rwxr-xr-xdocker/frontend/usr/lib/cgit/filters/about-formatting.sh13
-rw-r--r--docker/frontend/usr/lib/cgit/filters/html-converters/.gitattributes1
-rwxr-xr-xdocker/frontend/usr/lib/cgit/filters/html-converters/md2html289
8 files changed, 399 insertions, 0 deletions
diff --git a/docker/frontend/Dockerfile b/docker/frontend/Dockerfile
new file mode 100644
index 0000000..5fb1960
--- /dev/null
+++ b/docker/frontend/Dockerfile
@@ -0,0 +1,19 @@
+FROM nginx:1
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ runtime_deps='cgit cmark-gfm fcgiwrap tini' && \
+ apt-get update && \
+ apt-get install -y --no-install-recommends $runtime_deps && \
+ # Install the latest Pygments (so that it would highlight CMakeLists.txt, etc.):
+ apt-get install -y --no-install-recommends python3-pip && \
+ pip3 install --no-cache-dir pygments~=2.0 && \
+ # Replace the theme with the one I like better:
+ grep -q -F -- "style='pastie'" /usr/lib/cgit/filters/syntax-highlighting.py && \
+ sed -i -e "s/style='pastie'/style='vs'/" -- /usr/lib/cgit/filters/syntax-highlighting.py
+
+COPY ["etc/", "/etc/"]
+COPY ["usr/", "/usr/"]
+COPY ["cmd.sh", "/"]
+
+ENTRYPOINT ["/usr/bin/tini", "--"]
+CMD ["/cmd.sh"]
diff --git a/docker/frontend/cmd.sh b/docker/frontend/cmd.sh
new file mode 100755
index 0000000..4a769f6
--- /dev/null
+++ b/docker/frontend/cmd.sh
@@ -0,0 +1,13 @@
+#!/usr/bin/env bash
+
+set -o errexit -o nounset -o pipefail
+
+spawn-fcgi \
+ -u nginx \
+ -g nginx \
+ -M 0755 \
+ -F 10 \
+ -s /run/fcgiwrap.sock \
+ /usr/sbin/fcgiwrap
+
+exec nginx -g 'daemon off;'
diff --git a/docker/frontend/etc/cgit/cgitrc b/docker/frontend/etc/cgit/cgitrc
new file mode 100644
index 0000000..e12b2f4
--- /dev/null
+++ b/docker/frontend/etc/cgit/cgitrc
@@ -0,0 +1,4 @@
+include=/etc/cgit/common
+
+root-title=My git repositories
+root-desc=Synced using https://github.com/egor-tensin/cgitize
diff --git a/docker/frontend/etc/cgit/common b/docker/frontend/etc/cgit/common
new file mode 100644
index 0000000..4fdf2a5
--- /dev/null
+++ b/docker/frontend/etc/cgit/common
@@ -0,0 +1,36 @@
+css=/cgit/cgit.css
+logo=/cgit/cgit.png
+favicon=/cgit/favicon.ico
+
+mimetype.bmp=image/bmp
+mimetype.gif=image/gif
+mimetype.html=text/html
+mimetype.jpg=image/jpeg
+mimetype.jpeg=image/jpeg
+mimetype.pdf=application/pdf
+mimetype.png=image/png
+mimetype.svg=image/svg+xml
+
+enable-blame=1
+enable-commit-graph=1
+enable-follow-links=1
+enable-index-links=1
+enable-index-owner=0
+enable-subject-links=1
+max-blob-size=10000
+max-repo-count=100
+max-stats=year
+remove-suffix=1
+snapshots=tar.gz tar.bz2 zip
+
+about-filter=/usr/lib/cgit/filters/about-formatting.sh
+readme=:README.md
+readme=:readme.md
+readme=:README.txt
+readme=:readme.txt
+readme=:README
+readme=:readme
+
+source-filter=/usr/lib/cgit/filters/syntax-highlighting.py
+
+scan-path=/mnt/cgitize
diff --git a/docker/frontend/etc/nginx/conf.d/default.conf b/docker/frontend/etc/nginx/conf.d/default.conf
new file mode 100644
index 0000000..4dd9402
--- /dev/null
+++ b/docker/frontend/etc/nginx/conf.d/default.conf
@@ -0,0 +1,24 @@
+server {
+ listen 80 default_server;
+ listen [::]:80 default_server;
+ server_name _;
+
+ location / {
+ index index.html;
+ }
+
+ location /cgit/ {
+ alias /usr/share/cgit/;
+ }
+
+ location /git/ {
+ include fastcgi_params;
+ fastcgi_pass unix:/run/fcgiwrap.sock;
+
+ fastcgi_param CGIT_CONFIG /etc/cgit/cgitrc;
+ fastcgi_param SCRIPT_FILENAME /usr/lib/cgit/cgit.cgi;
+
+ fastcgi_split_path_info ^(/git/?)(.+)$;
+ fastcgi_param PATH_INFO $fastcgi_path_info;
+ }
+}
diff --git a/docker/frontend/usr/lib/cgit/filters/about-formatting.sh b/docker/frontend/usr/lib/cgit/filters/about-formatting.sh
new file mode 100755
index 0000000..b352e31
--- /dev/null
+++ b/docker/frontend/usr/lib/cgit/filters/about-formatting.sh
@@ -0,0 +1,13 @@
+#!/usr/bin/env dash
+
+script_dir="$( dirname -- "$0" )"
+cd -- "$script_dir/html-converters/"
+
+path="$1"
+path="$( echo "$1" | tr '[:upper:]' '[:lower:]' )"
+
+case "$path" in
+ *.markdown|*.mdown|*.md|*.mkd)
+ exec ./md2html
+ ;;
+esac
diff --git a/docker/frontend/usr/lib/cgit/filters/html-converters/.gitattributes b/docker/frontend/usr/lib/cgit/filters/html-converters/.gitattributes
new file mode 100644
index 0000000..3287fcc
--- /dev/null
+++ b/docker/frontend/usr/lib/cgit/filters/html-converters/.gitattributes
@@ -0,0 +1 @@
+md2html text eol=lf
diff --git a/docker/frontend/usr/lib/cgit/filters/html-converters/md2html b/docker/frontend/usr/lib/cgit/filters/html-converters/md2html
new file mode 100755
index 0000000..ee3768b
--- /dev/null
+++ b/docker/frontend/usr/lib/cgit/filters/html-converters/md2html
@@ -0,0 +1,289 @@
+#!/usr/bin/env dash
+
+cat <<EOF
+<style>
+.markdown-body {
+ font-size: 14px;
+ line-height: 1.6;
+ overflow: hidden;
+}
+.markdown-body>*:first-child {
+ margin-top: 0 !important;
+}
+.markdown-body>*:last-child {
+ margin-bottom: 0 !important;
+}
+.markdown-body a.absent {
+ color: #c00;
+}
+.markdown-body a.anchor {
+ display: block;
+ padding-left: 30px;
+ margin-left: -30px;
+ cursor: pointer;
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+}
+.markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 {
+ margin: 20px 0 10px;
+ padding: 0;
+ font-weight: bold;
+ -webkit-font-smoothing: antialiased;
+ cursor: text;
+ position: relative;
+}
+.markdown-body h1 .mini-icon-link, .markdown-body h2 .mini-icon-link, .markdown-body h3 .mini-icon-link, .markdown-body h4 .mini-icon-link, .markdown-body h5 .mini-icon-link, .markdown-body h6 .mini-icon-link {
+ display: none;
+ color: #000;
+}
+.markdown-body h1:hover a.anchor, .markdown-body h2:hover a.anchor, .markdown-body h3:hover a.anchor, .markdown-body h4:hover a.anchor, .markdown-body h5:hover a.anchor, .markdown-body h6:hover a.anchor {
+ text-decoration: none;
+ line-height: 1;
+ padding-left: 0;
+ margin-left: -22px;
+ top: 15%;
+}
+.markdown-body h1:hover a.anchor .mini-icon-link, .markdown-body h2:hover a.anchor .mini-icon-link, .markdown-body h3:hover a.anchor .mini-icon-link, .markdown-body h4:hover a.anchor .mini-icon-link, .markdown-body h5:hover a.anchor .mini-icon-link, .markdown-body h6:hover a.anchor .mini-icon-link {
+ display: inline-block;
+}
+div#cgit .markdown-body h1 a.toclink, div#cgit .markdown-body h2 a.toclink, div#cgit .markdown-body h3 a.toclink, div#cgit .markdown-body h4 a.toclink, div#cgit .markdown-body h5 a.toclink, div#cgit .markdown-body h6 a.toclink {
+ color: black;
+}
+.markdown-body h1 tt, .markdown-body h1 code, .markdown-body h2 tt, .markdown-body h2 code, .markdown-body h3 tt, .markdown-body h3 code, .markdown-body h4 tt, .markdown-body h4 code, .markdown-body h5 tt, .markdown-body h5 code, .markdown-body h6 tt, .markdown-body h6 code {
+ font-size: inherit;
+}
+.markdown-body h1 {
+ font-size: 28px;
+ color: #000;
+}
+.markdown-body h2 {
+ font-size: 24px;
+ border-bottom: 1px solid #ccc;
+ color: #000;
+}
+.markdown-body h3 {
+ font-size: 18px;
+}
+.markdown-body h4 {
+ font-size: 16px;
+}
+.markdown-body h5 {
+ font-size: 14px;
+}
+.markdown-body h6 {
+ color: #777;
+ font-size: 14px;
+}
+.markdown-body p, .markdown-body blockquote, .markdown-body ul, .markdown-body ol, .markdown-body dl, .markdown-body table, .markdown-body pre {
+ margin: 15px 0;
+}
+.markdown-body hr {
+ background: transparent url("/dirty-shade.png") repeat-x 0 0;
+ border: 0 none;
+ color: #ccc;
+ height: 4px;
+ padding: 0;
+}
+.markdown-body>h2:first-child, .markdown-body>h1:first-child, .markdown-body>h1:first-child+h2, .markdown-body>h3:first-child, .markdown-body>h4:first-child, .markdown-body>h5:first-child, .markdown-body>h6:first-child {
+ margin-top: 0;
+ padding-top: 0;
+}
+.markdown-body a:first-child h1, .markdown-body a:first-child h2, .markdown-body a:first-child h3, .markdown-body a:first-child h4, .markdown-body a:first-child h5, .markdown-body a:first-child h6 {
+ margin-top: 0;
+ padding-top: 0;
+}
+.markdown-body h1+p, .markdown-body h2+p, .markdown-body h3+p, .markdown-body h4+p, .markdown-body h5+p, .markdown-body h6+p {
+ margin-top: 0;
+}
+.markdown-body li p.first {
+ display: inline-block;
+}
+.markdown-body ul, .markdown-body ol {
+ padding-left: 30px;
+}
+.markdown-body ul.no-list, .markdown-body ol.no-list {
+ list-style-type: none;
+ padding: 0;
+}
+.markdown-body ul li>:first-child, .markdown-body ul li ul:first-of-type, .markdown-body ul li ol:first-of-type, .markdown-body ol li>:first-child, .markdown-body ol li ul:first-of-type, .markdown-body ol li ol:first-of-type {
+ margin-top: 0px;
+}
+.markdown-body ul li p:last-of-type, .markdown-body ol li p:last-of-type {
+ margin-bottom: 0;
+}
+.markdown-body ul ul, .markdown-body ul ol, .markdown-body ol ol, .markdown-body ol ul {
+ margin-bottom: 0;
+}
+.markdown-body dl {
+ padding: 0;
+}
+.markdown-body dl dt {
+ font-size: 14px;
+ font-weight: bold;
+ font-style: italic;
+ padding: 0;
+ margin: 15px 0 5px;
+}
+.markdown-body dl dt:first-child {
+ padding: 0;
+}
+.markdown-body dl dt>:first-child {
+ margin-top: 0px;
+}
+.markdown-body dl dt>:last-child {
+ margin-bottom: 0px;
+}
+.markdown-body dl dd {
+ margin: 0 0 15px;
+ padding: 0 15px;
+}
+.markdown-body dl dd>:first-child {
+ margin-top: 0px;
+}
+.markdown-body dl dd>:last-child {
+ margin-bottom: 0px;
+}
+.markdown-body blockquote {
+ border-left: 4px solid #DDD;
+ padding: 0 15px;
+ color: #777;
+}
+.markdown-body blockquote>:first-child {
+ margin-top: 0px;
+}
+.markdown-body blockquote>:last-child {
+ margin-bottom: 0px;
+}
+.markdown-body table th {
+ font-weight: bold;
+}
+.markdown-body table th, .markdown-body table td {
+ border: 1px solid #ccc;
+ padding: 6px 13px;
+}
+.markdown-body table tr {
+ border-top: 1px solid #ccc;
+ background-color: #fff;
+}
+.markdown-body table tr:nth-child(2n) {
+ background-color: #f8f8f8;
+}
+.markdown-body img {
+ max-width: 100%;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.markdown-body span.frame {
+ display: block;
+ overflow: hidden;
+}
+.markdown-body span.frame>span {
+ border: 1px solid #ddd;
+ display: block;
+ float: left;
+ overflow: hidden;
+ margin: 13px 0 0;
+ padding: 7px;
+ width: auto;
+}
+.markdown-body span.frame span img {
+ display: block;
+ float: left;
+}
+.markdown-body span.frame span span {
+ clear: both;
+ color: #333;
+ display: block;
+ padding: 5px 0 0;
+}
+.markdown-body span.align-center {
+ display: block;
+ overflow: hidden;
+ clear: both;
+}
+.markdown-body span.align-center>span {
+ display: block;
+ overflow: hidden;
+ margin: 13px auto 0;
+ text-align: center;
+}
+.markdown-body span.align-center span img {
+ margin: 0 auto;
+ text-align: center;
+}
+.markdown-body span.align-right {
+ display: block;
+ overflow: hidden;
+ clear: both;
+}
+.markdown-body span.align-right>span {
+ display: block;
+ overflow: hidden;
+ margin: 13px 0 0;
+ text-align: right;
+}
+.markdown-body span.align-right span img {
+ margin: 0;
+ text-align: right;
+}
+.markdown-body span.float-left {
+ display: block;
+ margin-right: 13px;
+ overflow: hidden;
+ float: left;
+}
+.markdown-body span.float-left span {
+ margin: 13px 0 0;
+}
+.markdown-body span.float-right {
+ display: block;
+ margin-left: 13px;
+ overflow: hidden;
+ float: right;
+}
+.markdown-body span.float-right>span {
+ display: block;
+ overflow: hidden;
+ margin: 13px auto 0;
+ text-align: right;
+}
+.markdown-body code, .markdown-body tt {
+ margin: 0 2px;
+ padding: 0px 5px;
+ border: 1px solid #eaeaea;
+ background-color: #f8f8f8;
+ border-radius: 3px;
+}
+.markdown-body code {
+ white-space: nowrap;
+}
+.markdown-body pre>code {
+ margin: 0;
+ padding: 0;
+ white-space: pre;
+ border: none;
+ background: transparent;
+}
+.markdown-body .highlight pre, .markdown-body pre {
+ background-color: #f8f8f8;
+ border: 1px solid #ccc;
+ font-size: 13px;
+ line-height: 19px;
+ overflow: auto;
+ padding: 6px 10px;
+ border-radius: 3px;
+}
+.markdown-body pre code, .markdown-body pre tt {
+ margin: 0;
+ padding: 0;
+ background-color: transparent;
+ border: none;
+}
+</style>
+EOF
+
+echo "<div class='markdown-body'>"
+cmark-gfm --extension table --extension autolink
+echo "</div>"