From 0f5dbcc3bdeb401f00c1cdcb7b0ef826003b5bd7 Mon Sep 17 00:00:00 2001 From: Egor Tensin Date: Sat, 26 Mar 2022 12:44:29 +0300 Subject: 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. --- docker/frontend/Dockerfile | 19 ++ docker/frontend/cmd.sh | 13 + docker/frontend/etc/cgit/cgitrc | 4 + docker/frontend/etc/cgit/common | 36 +++ docker/frontend/etc/nginx/conf.d/default.conf | 24 ++ .../usr/lib/cgit/filters/about-formatting.sh | 13 + .../cgit/filters/html-converters/.gitattributes | 1 + .../usr/lib/cgit/filters/html-converters/md2html | 289 +++++++++++++++++++++ 8 files changed, 399 insertions(+) create mode 100644 docker/frontend/Dockerfile create mode 100755 docker/frontend/cmd.sh create mode 100644 docker/frontend/etc/cgit/cgitrc create mode 100644 docker/frontend/etc/cgit/common create mode 100644 docker/frontend/etc/nginx/conf.d/default.conf create mode 100755 docker/frontend/usr/lib/cgit/filters/about-formatting.sh create mode 100644 docker/frontend/usr/lib/cgit/filters/html-converters/.gitattributes create mode 100755 docker/frontend/usr/lib/cgit/filters/html-converters/md2html (limited to 'docker/frontend') 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 < +.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; +} + +EOF + +echo "
" +cmark-gfm --extension table --extension autolink +echo "
" -- cgit v1.2.3