aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatarLarge Libravatar memdmp <memdmpestrogenzone>2025-01-03 01:03:27 +0100
committerLibravatarLarge Libravatar memdmp <memdmpestrogenzone>2025-01-03 01:03:27 +0100
commite6359a9ceb5fba89ab0d152ce6ead2da7b8afa57 (patch)
tree0751a2a4b358f850dac8c83a4ee74a155c6c6e59
parenta912704a1fdc06622466c9887051e1e0b2f5d42f (diff)
downloadcgit-oci-e6359a9ceb5fba89ab0d152ce6ead2da7b8afa57.tar.gz
cgit-oci-e6359a9ceb5fba89ab0d152ce6ead2da7b8afa57.tar.bz2
cgit-oci-e6359a9ceb5fba89ab0d152ce6ead2da7b8afa57.tar.lz
cgit-oci-e6359a9ceb5fba89ab0d152ce6ead2da7b8afa57.zip

feat: a sensible setup, for once

-rw-r--r--.dockerignore1
-rw-r--r--.env.example1
-rw-r--r--.gitignore2
-rw-r--r--Dockerfile133
-rw-r--r--README.md257
-rw-r--r--compose.yml17
-rwxr-xr-xcontrib/build6
-rwxr-xr-xcontrib/launch4
-rwxr-xr-xcontrib/setup-img38
-rw-r--r--httpd.conf54
-rw-r--r--image/Caddyfile26
-rw-r--r--image/cgitrc (renamed from cgitrc)4
-rwxr-xr-ximage/fcgiwrap-launcher15
-rwxr-xr-ximage/prepare-container.sh57
-rw-r--r--image/sshd_config (renamed from sshd_config)7
-rw-r--r--image/syntax-highlighting.sh121
-rwxr-xr-xprepare-container.sh63
17 files changed, 363 insertions, 443 deletions
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..cc63de3
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1 @@
+/cgit
diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000..2706789
--- /dev/null
+++ b/.env.example
@@ -0,0 +1 @@
+SSH_KEY="ssh-ed25519 AAAAC4Ms4C1ZDI1NTE5AAAAIPFc91ReTcvSEkHhtpA9esUOzeXBb7FvuUxbJGUWuDC6 lain@rain"
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ba8c1d6
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+/cgit
+/.env
diff --git a/Dockerfile b/Dockerfile
index f49018e..858e237 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,92 +1,79 @@
-FROM httpd:2.4-alpine
-
-MAINTAINER Grégory J. <gregjbs@protonmail.com>
-
-WORKDIR /root
-
-ARG HTTP_PROXY
+FROM docker.io/alpine:latest AS base
WORKDIR /root
# Packages we'll keep
-RUN apk update && apk add git openssh && \
- apk add python3 py3-pygments && \
- apk add py3-markdown && \
- apk add libintl musl-libintl && \
- apk add zlib
-
-# cgit install
-RUN git clone git://git.zx2c4.com/cgit
-WORKDIR cgit
-# Packages needed for build
-RUN apk update && apk add gcc make libressl-dev && \
- apk add linux-headers && \
- ln -sf /usr/include/linux/unistd.h /usr/include/ && \
- apk add musl-dev zlib-dev && \
-# Build
- git submodule init && \
- git submodule update && \
- make install NO_LUA=1 NO_REGEX=NeedsStartEnd && \
-# Clean up
- cd ../ && \
- rm -Rf cgit && \
- apk del gcc make libressl-dev && \
- apk del linux-headers musl-dev zlib-dev && \
- rm -rf /tmp/* /var/cache/apk/*
-WORKDIR /root
-
-# cgit config
-ENV HTTP_AUTH_USER="", HTTP_AUTH_PASSWORD=""
-ADD httpd.conf /usr/local/apache2/conf/httpd.conf
-ADD cgitrc /home/git/cgitrc
-# Extra copy if /home/git is bindmounted
-ADD cgitrc /etc/cgitrc.default
-RUN ln -s /home/git/cgitrc /etc/cgitrc
-
-# Gitolite install
-# Clone
-RUN git clone https://github.com/sitaramc/gitolite && \
- gitolite/install -to /usr/local/bin/
+RUN apk upgrade --no-cache && \
+ apk add --no-cache \
+ git openssh \
+ python3 py3-pygments \
+ py3-markdown \
+ libintl musl-libintl \
+ zlib \
+ caddy \
+ cgit gitolite \
+ openssl \
+ dumb-init \
+ fcgiwrap \
+ sudo zsh openrc \
+ libcap
+
+ADD image/prepare-container.sh /usr/local/bin/prepare-container.sh
+ADD image/fcgiwrap-launcher /usr/local/bin/fcgiwrap-launcher
+RUN chmod +x /usr/local/bin/prepare-container.sh /usr/local/bin/fcgiwrap-launcher
-# Default work dir for base image httpd
-WORKDIR /usr/local/apache2
+# SSHD config : no password, no strict mode
+# Moved by prepare-container.sh
+ADD image/sshd_config /etc/sshd_config
-# Pre-launch script
-ADD prepare-container.sh /usr/local/bin
-RUN chmod +x /usr/local/bin/prepare-container.sh
+# CGIT Config
+# Copied by prepare-container.sh
+ADD image/cgitrc /etc/cgitrc.default
-# SSHD config : no password, no strict mode
-ADD sshd_config /etc/ssh/sshd_config
+# Caddy config
+ADD image/Caddyfile /etc/caddy/Caddyfile
# Remove SSH keyes, fresh keys will be generated at container startup by prepare-container.sh
RUN rm -rf /etc/ssh/ssh_host_rsa_key /etc/ssh/ssh_host_dsa_key
# Gitolis / Gitolite
-RUN adduser -D -g "" -s "/bin/ash" git
+RUN adduser -D -g "" -s "/bin/ash" http
+RUN addgroup git www-data && addgroup git http
+RUN addgroup http www-data && addgroup http git
# We need a password set, otherwise pubkey auth doesn't work... why ?? /sbin/nologin doesn't work either
-RUN echo "git:fhzefGG65gdoejdK$!dhd753" | chpasswd
+RUN echo "git:$(openssl rand -hex 4096)" | chpasswd
-# Volume for server key
-VOLUME ["/etc/ssh"]
+# Caddy needs CAP_NET_BIND_SERVICE
+RUN setcap CAP_NET_BIND_SERVICE=+eip /usr/sbin/caddy
-# Volume for /home/git
-VOLUME ["/home/git"]
+RUN ln -s /var/lib/git/cgitrc /etc/cgitrc
-# Ports
+# SSH Keys, Config
+VOLUME ["/etc/ssh"]
+# Git Directories
+VOLUME ["/var/lib/git"]
+
+# CGit
EXPOSE 80
+# SSH
EXPOSE 22
-# Minimal INIT system, cf https://github.com/Yelp/dumb-init/
-ADD https://github.com/Yelp/dumb-init/releases/download/v1.0.0/dumb-init_1.0.0_amd64 /usr/local/bin/dumb-init
-RUN chmod +x /usr/local/bin/dumb-init
-
-# Runs "/usr/bin/dumb-init -- sh -c prepare-container.sh && exec apachectl -DFOREGROUND"
-# dumb-init gets PID 1 and handles signals gracefully
-ENTRYPOINT ["/usr/local/bin/dumb-init", "--"]
-CMD ["sh", "-c", "prepare-container.sh && exec httpd-foreground"]
-
-# To work without dumb-init, uncomment last line in prepare-container.sh to make it usual Docker entrypoint.
-# Use following CMD statement which comes from httpd Dockerfile.
-# Comment previous ENTRYPOINT and CMD.
-#ENTRYPOINT ["prepare-container.sh"]
-#CMD ["httpd-foreground"]
+ENTRYPOINT ["/usr/bin/dumb-init", "--"]
+CMD ["sh", "-c", "/usr/local/bin/prepare-container.sh && sh -c 'sleep 3 && chgrp www-data /run/fcgiwrap/fcgiwrap.sock && chmod g+w /run/fcgiwrap/fcgiwrap.sock && exec sudo -u http /usr/sbin/caddy run --config /etc/caddy/Caddyfile --adapter caddyfile' & /usr/local/bin/fcgiwrap-launcher"]
+
+FROM base AS with-fmt
+RUN apk add --no-cache py3-markdown py3-docutils groff
+RUN echo 'about-filter=/usr/lib/cgit/filters/about-formatting.sh\
+readme=:README.rst\
+readme=:readme.rst\
+readme=:README.md\
+readme=:readme.md\
+readme=:README\
+readme=:readme\
+' >> /etc/cgitrc.default
+
+FROM with-fmt AS with-highlighting
+RUN apk add --no-cache highlight
+ADD image/syntax-highlighting.sh /usr/lib/cgit/filters/syntax-highlighting-uwu.sh
+RUN chmod +x /usr/lib/cgit/filters/syntax-highlighting-uwu.sh
+RUN echo 'source-filter=/usr/lib/cgit/filters/syntax-highlighting-uwu.sh' >> /etc/cgitrc.default
diff --git a/README.md b/README.md
index acee003..7d97069 100644
--- a/README.md
+++ b/README.md
@@ -1,252 +1,13 @@
-Image docker Gitolite/cgit
-=========================
+# cgit+caddy+gitolite on alpine in podman
-This [Docker][docker] image offers a very quick way of deploying a Gitolite / Cgit server. Gitolite is a lightweight yet powerful git manager. Cgit is web-based frontend to Git repositories.
+## installation
-Based on Alpine Linux.
-
-
-
-## Starting a gitolite-cgit container
-
-### First launch
+1. copy .env.example to .env
+2. replace the key with your ssh key
+3. run `podman compose up -d --build`
+4. rerun the above command without `--build`
+5. enjoy
-This first launch will create the server RSA keypair and make Gitolite initialization. `SSH_KEY` is the Gitolite admin's public RSA key.
-For more details about Gitolite setup, please read the [official documentation][gitolite_doc].
+## setup
-The container will stop by itself once the initial configuration is done. The `--rm` will make Docker remove it automatically. Only data will remain on the volume/bindmount.
-
- $ docker run --rm -dit -v git-data:/home/git -v git-ssh:/etc/ssh -e SSH_KEY="$(cat /home/<user>/.ssh/id_rsa.pub)" gjbs84/gitolite-cgit:latest
-
-Default behavion is to save data into an internal named volume, `git-data` and `git-ssh` in this exemple. Of course you can change it if you wish.
-
-If it's suits you better you can use a bindmount. Here an exemple with `/srv/git-data` and `/srv/git-ssh`. No existing `repositories` directory must be there !
-
- $ docker run --rm -dit -v /srv/git-data:/home/git -v /srv/git-ssh:/etc/ssh -e SSH_KEY="$(cat /home/<user>/.ssh/id_rsa.pub)" gjbs84/gitolite-cgit:latest
-
-
-### Troubleshooting
-
-If the initial startup fails, it can be usefull to repeat it one more time without the `--rm` option.
-
-The container will remains in stoped state and its logs will be available.
-
- $ docker logs git-test
-
-A good first startup looks like this :
-
-```sh
- Generating public/private rsa key pair.
- Your identification has been saved in /etc/ssh/ssh_host_rsa_key
- Your public key has been saved in /etc/ssh/ssh_host_rsa_key.pub
- The key fingerprint is:
- SHA256:4GcKIlWTPI5tpto3eqfHK30jBqM8U+eWoTp/tWSU2zs root@67dc97f12dd3
- The key's randomart image is:
- +---[RSA 3072]----+
- | .o. |
- | .+. |
- | .+ .. . |
- | .. =. .o |
- |. .+. ..So |
- | ...+.o+= . |
- | + o O.* . . |
- |. B * % + E |
- | oXoX.+ . . |
- +----[SHA256]-----+
- Generating public/private dsa key pair.
- Your identification has been saved in /etc/ssh/ssh_host_dsa_key
- Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub
- The key fingerprint is:
- SHA256:M5WtzLCBRcU6HtrRdBgOHvDkqa+DU3x5XaWC6VjXexU root@67dc97f12dd3
- The key's randomart image is:
- +---[DSA 1024]----+
- | .o*ooo |
- | B =+o. E.|
- | . B+++.. o.|
- | .=B=.o + .|
- | ..+SO+o o ..|
- | +.*oo . . .|
- | o ... . |
- | o .. |
- | ... |
- +----[SHA256]-----+
- Starting sshd
- Initialized empty Git repository in /home/git/repositories/gitolite-admin.git/
- Initialized empty Git repository in /home/git/repositories/testing.git/
- WARNING: /home/git/.ssh missing; creating a new one
- (this is normal on a brand new install)
- WARNING: /home/git/.ssh/authorized_keys missing; creating a new one
- (this is normal on a brand new install)
- First launch : container is now shut down
-```
-
-## Final launch
-
-You can now run the final container. It will use the previoulsy created volumes `git-data` and `git-ssh`. Now we can give a name to this container and we have to NAT ports 22 et 80 to the host. Of course you may have to adapt the command line to your network.
-
- $ docker run --name gitolite-cgit-srv -dit -v git-data:/home/git -v git-ssh:/etc/ssh -p 20080:80 -p 20022:22 gjbs84/gitolite-cgit:lastest
-
-If you have chosen the bindmount way :
-
- $ docker run --name gitolite-cgit-srv -dit -v /srv/git-data:/home/git -v /srv/git-ssh:/etc/ssh -p 20080:80 -p 20022:22 gjbs84/gitolite-cgit:lastest
-
-It's now time to check if everythings is right ! Let's clone the `testing` repository.
-
-If you are new to Gitolite you have to know that every connection to it is made by the same user, commonly `git`. A very convenient way to proceed is to add an entry in your `~/.ssh/config` :
-
- Host <server>
- Port 20022
- User git
- IdentityFile ~/.ssh/id_rsa
-
-Of course you have to adapt this to your network once again.
-
-Now you can easily clone the testing repo :
-
- $ git clone localhost:testing
- Cloning into 'testing'...
- Enter passphrase for key '/home/greg/.ssh/id_rsa':
- warning: warning: You appear to have cloned an empty repository.
- Checking connectivity... done.
-
-Git tells us this an empty repository, it's true so everything is fine so far.
-
-## Updating / recreating container
-
-If you have deleted the exiting container or wish to update it with a newer version, just run the "Final launch" step again. All your data are kept in Docker volume (or bindmount) .
-
-### .htaccess authentication
-
-You may wish to protect access to the git fronted Cgit.
-
-Just give fill up environnement variables `HTTP_AUTH_USER` and `HTTP_AUTH_PASSWORD` during the final launch step :
-
- $ docker run --name gitolite-cgit-srv -dit -v git-data:/home/git -v git-ssh:/etc/ssh -p 20080:80 -p 20022:22 -e HTTP_AUTH_USER="my_user" -e HTTP_AUTH_PASSWORD="my_password" gjbs84/gitolite-cgit:latest
-
-
-### Troubleshooting
-
-If you're experimenting some issue, start with having a loog into running container. Check health of `httpd` and `sshd` daemons.
-
-To jump into the container :
-
- $ docker exec -ti git-test sh
-
-Then check for `sshd` and `httpd` :
-
-```
- $ ps
- PID USER TIME COMMAND
- 1 root 0:00 /usr/local/bin/dumb-init -- sh -c prepare-container.sh && exec httpd-foreground
- 6 root 0:00 httpd -DFOREGROUND
- 13 root 0:00 sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups
- 69 daemon 0:00 httpd -DFOREGROUND
- 70 daemon 0:00 httpd -DFOREGROUND
- 71 daemon 0:00 httpd -DFOREGROUND
- 72 daemon 0:00 httpd -DFOREGROUND
- 73 daemon 0:00 httpd -DFOREGROUND
-```
-
-## Using Gitolite and Cgit
-
-### Cgit
-
-Cgit is configured to automatically serve every repositories located into `/home/git/repositories` which is where Gitolite stores them. You basically have nothing to do to use it, just got to (adapt URL to the port number and server name) :
-
- http(s)://myserver:20080
-
-You may want to custumize it (clone-prefix, favicon, headers...), just edit `/home/git/cgitrc`.
-
-
-### Gitolite
-
-This is not a Git/Gitolite course, but here is a very simple set of commands to quickly add a new repo to Gitolite. And a new non-admin user in the process.
-
-1. Clone the `gitolite-admin` repository :
-
- $ git clone myserver:gitolite-admin
-
-2. Edit the `conf/gitolite.conf` file to add a repo :
-
- repo new_repo
- RW+ = bob
-
-3. Add Bob's public RSA key in `keydir/bob.pub` (of course you can use `admin` which already exists but it's not recommanded...). That's all you have to do to add a Gitolite user.
-
-4. Add, commit and push the updated Gitolite configuration :
-
- $ git add keydir/bob.pub conf/gitolite.conf
- $ git commit -m "Added Bob and new_repo"
- $ git push --all
-
-5. Now just add a remote site in you local `new_repo` repository and push a local branch to it !
-
- $ git remote add origin ssh://myserver:new_repo.git
- $ git push origin master
-
-
-For more details, you'll have to check for official documentation of both projects !
-
- * [Gitolite][gitolite_admin] administration
- * [Cgit][cgit_page]
-
-
-## Add existing repositories
-
-First you must have an archive containing all you existing repositories.
-
-They have to be BARE repositories ! No working copy should exist in any of them !
-
-1. Jump into the container
-
-2. Copy repos archive into the container.
-
- $ scp user@<your_host_local_ip>:/home/user/repos.tgz /tmp/
-
-3. Untar archive into Gitolite repositories directory :
-
- $ cd /home/git/repositories
- $ tar -xf /tmp/repos.tgz
- $ rm /tmp/repos.tgz
-
-4. Set permissions :
-
- $ chown -R git:git *
- $ chmod -R 755 *
-
-5. From now you definitely should read [the official procedure][gitolite_existing_repo] before you go any further ! These commands come directly from there.
-
- $ su git
- $ cd
- $ gitolite compile
- $ gitolite setup --hooks-only
- $ gitolite trigger POST_COMPILE
-
-6. Clone the Gitolite admin repository or go to your local copy and update the `gitolite.conf` with your new repositories info. Don't forget to add new users public key in `keydir` if needed.
-
-7. Add/commit/push and you're done ! Check everything is fine with the `info` command. You shoud see all the repositories you have access to, which means all of them (because you have the admin key).
-
- $ ssh git@myserver info
-
-8. Adjust Cgit configuration in `/home/git/cgitrc` if you wish, but it will work out of the box.
-
-
-## Building container image
-
-In case you want to build you own image, clone from Github and build using the common Docker way (adjust or remove proxy settings according to your needs).
-
- $ docker build --build-arg HTTP_PROXY=http://192.168.0.1:3128 -t <image_name> .
-
-
-## Voir aussi
-
-* [Base image I used (httpd 2.4) ](https:https://hub.docker.com/_/httpd)
-* [Gitolite image](http://github.com/sitaramc/gitolite#adding-users-and-repos)
-* [Cgit image](https://github.com/invokr/docker-cgit)
-* [Gitolite Documentation](https://gitolite.com/gitolite/index.html)
-
-[docker]: https://www.docker.com/
-[gitolite_doc]: https://gitolite.com/gitolite/install.html
-[gitolite_admin]: https://gitolite.com/gitolite/basic-admin.html
-[cgit_page]: https://git.zx2c4.com/cgit/about/
-[gitolite_existing_repo]: https://gitolite.com/gitolite/basic-admin.html#appendix-1-bringing-existing-repos-into-gitolite
+to [clone the admin repo](https://gitolite.com/gitolite/basic-admin.html#clone-the-gitolite-admin-repo), run `git clone ssh://git@127.0.0.1:12222/gitolite-admin`.
diff --git a/compose.yml b/compose.yml
new file mode 100644
index 0000000..e3359f2
--- /dev/null
+++ b/compose.yml
@@ -0,0 +1,17 @@
+services:
+ cgit:
+ image: docker.io/memdmp/cgit:local-build
+ build:
+ dockerfile: ./Dockerfile
+ volumes:
+ - cgit_ssh:/etc/ssh:rw
+ - ./cgit/repos:/var/lib/git:rw
+ ports:
+ - 127.0.0.1:18080:80
+ - 127.0.0.1:12222:22
+ env_file:
+ - .env
+
+volumes:
+ cgit_ssh:
+ cgit_repos:
diff --git a/contrib/build b/contrib/build
new file mode 100755
index 0000000..f071a5d
--- /dev/null
+++ b/contrib/build
@@ -0,0 +1,6 @@
+#!/bin/zsh
+set -eax
+IMG="${IMG:-"docker.io/memdmp/cgit:${TAG:-"local-build"}"}"
+! podman container exists cgit >/dev/null 2>/dev/null || podman container rm cgit
+! podman image exists "$IMG" >/dev/null 2>/dev/null || podman image rm "$IMG"
+podman build -t "$IMG" .
diff --git a/contrib/launch b/contrib/launch
new file mode 100755
index 0000000..0124c70
--- /dev/null
+++ b/contrib/launch
@@ -0,0 +1,4 @@
+#!/bin/zsh
+set -eax
+podman container exists cgit || ("$(dirname "$(realpath "$0")")/setup-img" 2>&1 | tee /tmp/setup || (grep 'First launch: container is now shut down' /tmp/setup && rm /tmp/setup))
+podman start -ia cgit
diff --git a/contrib/setup-img b/contrib/setup-img
new file mode 100755
index 0000000..879f383
--- /dev/null
+++ b/contrib/setup-img
@@ -0,0 +1,38 @@
+#!/bin/zsh
+set -eax
+
+__filename="$(realpath "$0")"
+__dirname="$(dirname "${__filename})"
+if [[ -f "$__dirname/.env" ]]; then
+ source "$__dirname/.env"
+fi
+
+IMG="${IMG:-"docker.io/memdmp/cgit:${TAG:-"local-build"}"}"
+SSH_DIR="${SSH_DIR:-"$HOME/.ssh"}"
+SSH_KEY="${SSH_KEY:-"$(ls "$SSH_DIR/id_*.pub" | head -n 1)"}"
+if [[ -f "$SSH_KEY" ]]; then
+ SSH_KEY="$(cat "$SSH_KEY")"
+elif [[ -f "$SSH_DIR/$SSH_KEY.pub" ]]; then
+ SSH_KEY="$(cat "$SSH_DIR/$SSH_KEY.pub")"
+elif [[ -f "$SSH_DIR/id_$SSH_KEY.pub" ]]; then
+ SSH_KEY="$(cat "$SSH_DIR/id_$SSH_KEY.pub")"
+elif [[ -f "$SSH_DIR/$SSH_KEY" ]]; then
+ SSH_KEY="$(cat "$SSH_DIR/$SSH_KEY")"
+elif [[ -f "$SSH_DIR/id_$SSH_KEY" ]]; then
+ SSH_KEY="$(cat "$SSH_DIR/id_$SSH_KEY")"
+fi
+
+mkdir -p cgit/{ssh,git}
+! podman container exists cgit >/dev/null 2>/dev/null || podman container rm cgit
+! podman network exists cgit >/dev/null 2>/dev/null || podman network rm cgit
+podman network create cgit
+podman create \
+ --name cgit \
+ --network cgit \
+ -v "$(pwd)/cgit/ssh:/etc/ssh:rw" \
+ -v "$(pwd)/cgit/git:/var/lib/git:rw" \
+ -p 127.0.0.1:18080:80 \
+ -p 127.0.0.1:12222:22 \
+ -e "SSH_KEY=${SSH_KEY}" \
+ "$IMG" "$@"
+podman start -ia cgit
diff --git a/httpd.conf b/httpd.conf
deleted file mode 100644
index dc6c934..0000000
--- a/httpd.conf
+++ /dev/null
@@ -1,54 +0,0 @@
-ServerRoot "/usr/local/apache2"
-
-# standard
-LoadModule authz_core_module modules/mod_authz_core.so
-LoadModule unixd_module modules/mod_unixd.so
-LoadModule log_config_module modules/mod_log_config.so
-LoadModule logio_module modules/mod_logio.so
-LoadModule mime_magic_module modules/mod_mime_magic.so
-LoadModule mime_module modules/mod_mime.so
-LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
-LoadModule cgi_module modules/mod_cgi.so
-LoadModule dir_module modules/mod_dir.so
-
-# uncomment for htaccess
-LoadModule auth_basic_module modules/mod_auth_basic.so
-LoadModule authn_core_module modules/mod_authn_core.so
-LoadModule authn_file_module modules/mod_authn_file.so
-LoadModule authz_user_module modules/mod_authz_user.so
-
-Listen 80
-User daemon
-Group daemon
-
-ServerName localhost
-ServerAdmin root@localhost
-
-ErrorLog "logs/error_log"
-LogLevel warn
-
-LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
-LogFormat "%h %l %u %t \"%r\" %>s %b" common
-CustomLog "logs/access_log" combined
-
-AddHandler cgi-script .cgi
-AddDefaultCharset UTF-8
-TypesConfig conf/mime.types
-MIMEMagicFile conf/magic
-EnableSendfile on
-
-<Directory />
- Require all denied
-</Directory>
-
-DocumentRoot "/var/www/htdocs/cgit"
-<Directory "/var/www/htdocs/cgit/">
- DirectoryIndex cgit.cgi
- AllowOverride All
- Options +ExecCGI -FollowSymLinks
- Require all granted
-</Directory>
-
-<Files ".ht*">
- Require all denied
-</Files>
diff --git a/image/Caddyfile b/image/Caddyfile
new file mode 100644
index 0000000..b50dccc
--- /dev/null
+++ b/image/Caddyfile
@@ -0,0 +1,26 @@
+http:// {
+ route {
+ root * /var/lib/git/static
+ file_server {
+ pass_thru
+ }
+ }
+
+ route {
+ root * /usr/share/webapps/cgit
+ file_server {
+ pass_thru
+ }
+ }
+
+ reverse_proxy unix//run/fcgiwrap/fcgiwrap.sock {
+ transport fastcgi {
+ env SCRIPT_FILENAME /usr/share/webapps/cgit/cgit.cgi
+ env PATH_INFO {http.request.uri}
+ env QUERY_STRING {query}
+ # env GIT_HTTP_EXPORT_ALL 1
+ # env GIT_PROJECT_ROOT /var/lib/git/repositories
+ # env HOME /var/lib/git
+ }
+ }
+}
diff --git a/cgitrc b/image/cgitrc
index 4ab1c02..60d0bef 100644
--- a/cgitrc
+++ b/image/cgitrc
@@ -106,7 +106,7 @@ mimetype.svg=image/svg+xml
section=my repo
#repo.url=testing
-#repo.path=/home/git/testing.git
+#repo.path=/var/lib/git/testing.git
#repo.desc=Testing repo created by Gitolite
#repo.owner=admin@mynetwork.com
#
@@ -114,6 +114,6 @@ section=my repo
# Auto scan
-scan-path=/home/git/repositories
+scan-path=/var/lib/git/repositories
diff --git a/image/fcgiwrap-launcher b/image/fcgiwrap-launcher
new file mode 100755
index 0000000..0970ec4
--- /dev/null
+++ b/image/fcgiwrap-launcher
@@ -0,0 +1,15 @@
+#!/bin/zsh
+set -eax
+command="/usr/bin/fcgiwrap"
+user="fcgiwrap"
+group="www-data"
+: ${socket:="unix:/run/fcgiwrap/fcgiwrap.sock"}
+case "$socket" in
+unix:/*)
+ local socket_path="${socket#unix:}"
+ /usr/libexec/rc/bin/checkpath --directory --mode 2775 --owner "${user}:${group}" \
+ "${socket_path%/*}"
+ ;;
+esac
+
+exec sudo -u "$user" -g "$group" "$command" -c "${nproc:-$(nproc)}" -s "$socket"
diff --git a/image/prepare-container.sh b/image/prepare-container.sh
new file mode 100755
index 0000000..66ccb2f
--- /dev/null
+++ b/image/prepare-container.sh
@@ -0,0 +1,57 @@
+#!/bin/sh
+set -e
+
+# Warning : this no standard docker entrypoint, we use dumb-init !
+ensureKeyAlgo() {
+ if [ ! -f "/etc/ssh/ssh_host_${1}_key" ]; then
+ # generate fresh $1 key
+ ssh-keygen -f /etc/ssh/ssh_host_${1}_key -N '' -t "${1}"
+ fi
+}
+ensureKeyAlgo ed25519
+ensureKeyAlgo rsa
+ensureKeyAlgo ecdsa
+[[ -f /etc/sshd_config ]] && mv /etc/sshd_config /etc/ssh/sshd_config || [[ -f /etc/ssh/sshd_config ]]
+chmod -w /etc/ssh/sshd_config
+
+# prepare run dir
+if ! [[ -d "/var/run/sshd" ]]; then
+ mkdir -p /var/run/sshd
+fi
+
+# Run sshd
+echo "Starting sshd"
+/usr/sbin/sshd
+
+# Volume permissions
+echo "Setting up permissions"
+mkdir -p /var/lib/git/.gitolite/logs
+chown -R git /var/lib/git
+chgrp -R www-data /var/lib/git
+chmod -R 775 /var/lib/git
+
+# If no cgitrc, let's copy one from /etc/cgitrc.default. This happens when bindmounting /var/lib/git
+if [ ! -f "/var/lib/git/cgitrc" ]; then
+ echo '# This is an autogenrated file. Do not edit it by hand, changes will be lost.' | cat - /etc/cgitrc.default > /var/lib/git/cgitrc
+ chown git /var/lib/git/cgitrc
+ chmod 711 /var/lib/git/cgitrc
+fi
+if [ ! -f "/var/lib/git/.ssh/authorized_keys" ]; then
+ # Gitolite configuration (admin pubkey)
+ if [ -n "$SSH_KEY" ]; then
+ echo "$SSH_KEY" > "/tmp/admin.pub"
+ su - git -c "gitolite setup -pk \"/tmp/admin.pub\""
+ rm "/tmp/admin.pub"
+ else
+ echo "You need to specify SSH_KEY on first run to setup gitolite"
+ echo 'Example: podman run --rm -dit -v git-data:/var/lib/git -v git-ssh:/etc/ssh -e SSH_KEY="$(cat /home/<user>/.ssh/id_rsa.pub)" gjbs84/gitolite-cgit:latest'
+ exit 1
+ fi
+ echo "First launch: container is now shut down"
+ halt
+else
+ # Check setup at every startup
+ su - git -c "gitolite setup"
+fi
+
+#exec "$@"
diff --git a/sshd_config b/image/sshd_config
index 7f51fe2..553d298 100644
--- a/sshd_config
+++ b/image/sshd_config
@@ -15,9 +15,10 @@
#ListenAddress 0.0.0.0
#ListenAddress ::
-#HostKey /etc/ssh/ssh_host_rsa_key
-#HostKey /etc/ssh/ssh_host_ecdsa_key
-#HostKey /etc/ssh/ssh_host_ed25519_key
+HostKey /etc/ssh/ssh_host_ed25519_key
+HostKey /etc/ssh/ssh_host_rsa_key
+HostKey /etc/ssh/ssh_host_ecdsa_key
+HostKey /etc/ssh/ssh_host_ed25519_key
# Ciphers and keying
#RekeyLimit default none
diff --git a/image/syntax-highlighting.sh b/image/syntax-highlighting.sh
new file mode 100644
index 0000000..3de95fa
--- /dev/null
+++ b/image/syntax-highlighting.sh
@@ -0,0 +1,121 @@
+#!/bin/sh
+# This script can be used to implement syntax highlighting in the cgit
+# tree-view by referring to this file with the source-filter or repo.source-
+# filter options in cgitrc.
+#
+# This script requires a shell supporting the ${var##pattern} syntax.
+# It is supported by at least dash and bash, however busybox environments
+# might have to use an external call to sed instead.
+#
+# Note: the highlight command (http://www.andre-simon.de/) uses css for syntax
+# highlighting, so you'll probably want something like the following included
+# in your css file:
+#
+# Style definition file generated by highlight 2.4.8, http://www.andre-simon.de/
+#
+# table.blob .num { color:#2928ff; }
+# table.blob .esc { color:#ff00ff; }
+# table.blob .str { color:#ff0000; }
+# table.blob .dstr { color:#818100; }
+# table.blob .slc { color:#838183; font-style:italic; }
+# table.blob .com { color:#838183; font-style:italic; }
+# table.blob .dir { color:#008200; }
+# table.blob .sym { color:#000000; }
+# table.blob .kwa { color:#000000; font-weight:bold; }
+# table.blob .kwb { color:#830000; }
+# table.blob .kwc { color:#000000; font-weight:bold; }
+# table.blob .kwd { color:#010181; }
+#
+#
+# Style definition file generated by highlight 2.6.14, http://www.andre-simon.de/
+#
+# body.hl { background-color:#ffffff; }
+# pre.hl { color:#000000; background-color:#ffffff; font-size:10pt; font-family:'Courier New';}
+# .hl.num { color:#2928ff; }
+# .hl.esc { color:#ff00ff; }
+# .hl.str { color:#ff0000; }
+# .hl.dstr { color:#818100; }
+# .hl.slc { color:#838183; font-style:italic; }
+# .hl.com { color:#838183; font-style:italic; }
+# .hl.dir { color:#008200; }
+# .hl.sym { color:#000000; }
+# .hl.line { color:#555555; }
+# .hl.mark { background-color:#ffffbb;}
+# .hl.kwa { color:#000000; font-weight:bold; }
+# .hl.kwb { color:#830000; }
+# .hl.kwc { color:#000000; font-weight:bold; }
+# .hl.kwd { color:#010181; }
+#
+#
+# Style definition file generated by highlight 3.8, http://www.andre-simon.de/
+#
+# body.hl { background-color:#e0eaee; }
+# pre.hl { color:#000000; background-color:#e0eaee; font-size:10pt; font-family:'Courier New';}
+# .hl.num { color:#b07e00; }
+# .hl.esc { color:#ff00ff; }
+# .hl.str { color:#bf0303; }
+# .hl.pps { color:#818100; }
+# .hl.slc { color:#838183; font-style:italic; }
+# .hl.com { color:#838183; font-style:italic; }
+# .hl.ppc { color:#008200; }
+# .hl.opt { color:#000000; }
+# .hl.lin { color:#555555; }
+# .hl.kwa { color:#000000; font-weight:bold; }
+# .hl.kwb { color:#0057ae; }
+# .hl.kwc { color:#000000; font-weight:bold; }
+# .hl.kwd { color:#010181; }
+#
+#
+# Style definition file generated by highlight 3.13, http://www.andre-simon.de/
+#
+# body.hl { background-color:#e0eaee; }
+# pre.hl { color:#000000; background-color:#e0eaee; font-size:10pt; font-family:'Courier New',monospace;}
+# .hl.num { color:#b07e00; }
+# .hl.esc { color:#ff00ff; }
+# .hl.str { color:#bf0303; }
+# .hl.pps { color:#818100; }
+# .hl.slc { color:#838183; font-style:italic; }
+# .hl.com { color:#838183; font-style:italic; }
+# .hl.ppc { color:#008200; }
+# .hl.opt { color:#000000; }
+# .hl.ipl { color:#0057ae; }
+# .hl.lin { color:#555555; }
+# .hl.kwa { color:#000000; font-weight:bold; }
+# .hl.kwb { color:#0057ae; }
+# .hl.kwc { color:#000000; font-weight:bold; }
+# .hl.kwd { color:#010181; }
+#
+#
+# The following environment variables can be used to retrieve the configuration
+# of the repository for which this script is called:
+# CGIT_REPO_URL ( = repo.url setting )
+# CGIT_REPO_NAME ( = repo.name setting )
+# CGIT_REPO_PATH ( = repo.path setting )
+# CGIT_REPO_OWNER ( = repo.owner setting )
+# CGIT_REPO_DEFBRANCH ( = repo.defbranch setting )
+# CGIT_REPO_SECTION ( = section setting )
+# CGIT_REPO_CLONE_URL ( = repo.clone-url setting )
+#
+
+# store filename and extension in local vars
+BASENAME="$1"
+EXTENSION="${BASENAME##*.}"
+
+[ "${BASENAME}" = "${EXTENSION}" ] && EXTENSION=txt
+[ -z "${EXTENSION}" ] && EXTENSION=txt
+
+# map Makefile and Makefile.* to .mk
+[ "${BASENAME%%.*}" = "Makefile" ] && EXTENSION=mk
+
+# highlight versions 2 and 3 have different commandline options. Specifically,
+# the -X option that is used for version 2 is replaced by the -O xhtml option
+# for version 3.
+#
+# Version 2 can be found (for example) on EPEL 5, while version 3 can be
+# found (for example) on EPEL 6.
+#
+# This is for version 2
+#exec highlight --force -f -I -X -S "$EXTENSION" 2>/dev/null
+
+# This is for version 3
+exec highlight --force --inline-css -f -I -O xhtml -S "$EXTENSION" 2>/dev/null
diff --git a/prepare-container.sh b/prepare-container.sh
deleted file mode 100755
index da8544d..0000000
--- a/prepare-container.sh
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/bin/sh
-
-# Warning : this no standard docker entrypoint, we use dumb-init !
-
-if [ ! -f "/etc/ssh/ssh_host_rsa_key" ]; then
- # generate fresh rsa key
- ssh-keygen -f /etc/ssh/ssh_host_rsa_key -N '' -t rsa
-fi
-if [ ! -f "/etc/ssh/ssh_host_dsa_key" ]; then
- # generate fresh dsa key
- ssh-keygen -f /etc/ssh/ssh_host_dsa_key -N '' -t dsa
-fi
-
-#prepare run dir
-if [ ! -d "/var/run/sshd" ]; then
- mkdir -p /var/run/sshd
-fi
-
-# Run sshd
-echo "Starting sshd"
-/usr/sbin/sshd
-
-# If no cgitrc, let's copy one from /etc/cgitrc.default. This happens when bindmounting /home/git
-if [ ! -f "/home/git/cgitrc" ]; then
- cp /etc/cgitrc.default /home/git/cgitrc
-fi
-
-# Gitolite configuration (admin pubkey)
-if [ ! -f "/home/git/.ssh/authorized_keys" ]; then
- if [ -n "$SSH_KEY" ]; then
- echo "$SSH_KEY" > "/tmp/admin.pub"
- su - git -c "gitolite setup -pk \"/tmp/admin.pub\""
- rm "/tmp/admin.pub"
- else
- echo "You need to specify SSH_KEY on first run to setup gitolite"
- echo 'Example: docker run --rm -dit -v git-data:/home/git -v git-ssh:/etc/ssh -e SSH_KEY="$(cat /home/<user>/.ssh/id_rsa.pub)" gjbs84/gitolite-cgit:latest'
- exit 1
- fi
- echo "First launch : container is now shut down"
- halt
-# Check setup at every startup
-else
- su - git -c "gitolite setup"
-fi
-
-# Volume permissions
-echo "Setting up permissions"
-chown -R git:git /home/git
-chmod -R 755 /home/git/repositories
-
-# htaccess/htpasswd auth (comes from docker-cgit/scripts)
-echo "No Apache htaccess required"
-if [ "$HTTP_AUTH_PASSWORD" != "" ]; then
- echo "Enables Apache htaccess"
- echo "AuthType Basic
-AuthName \"CGit\"
-AuthUserFile /var/www/htdocs/cgit/.htpasswd
-Require valid-user" > /var/www/htdocs/cgit/.htaccess
-htpasswd -c -b /var/www/htdocs/cgit/.htpasswd $HTTP_AUTH_USER $HTTP_AUTH_PASSWORD
-fi
-
-#exec "$@"
-