jason b016f1db1d
Build and Push / build (push) Failing after 1s
opengist / release-opengist (push) Failing after 53s
🐛 Fix container restart loop from set -e propagation 🐛
Root cause: many functions in functions/entrypoint.sh ended with a bare,
unguarded `[ "$DEBUGGER" = "on" ] && echo/printf/__service_banner ...`
statement as their last executed line. With DEBUGGER unset (the default
runtime case), the `[ ]` test is false, so the function's implicit
return value is nonzero. Several of these functions (most critically
__symlink, called bare from __setup_mta) are invoked as unguarded
statements from other functions, and the whole entrypoint runs under
`set -eo pipefail`, so the nonzero return aborted the entire script
chain immediately after startup — explaining why the container only
printed the first log line and exited 1, and why it only worked with
DEBUGGER=on (which makes the echo run and return 0, masking the bug).

Verified via two clean docker buildx build + run cycles: before the
fix, `docker inspect` showed the container crash-looping (exit 1,
~3.9s uptime); after, `RestartCount=0 Status=running Health=healthy`
with opengist fully started, DEBUGGER unset.

- rootfs/usr/local/etc/docker/functions/entrypoint.sh: append `|| true`
  to all 26 bare `[ "$DEBUGGER" = "on" ] && ...` statements so their
  result never propagates as the enclosing function's return value
- TODO.AI.md: log 20 pre-existing script-lint findings on the same
  file (missing `--` on grep, missing `local` on a few function-local
  vars, missing VERSION= line) found incidentally while diagnosing
  this bug; deferred as unrelated cleanup, not part of this fix
2026-08-03 09:41:46 -04:00
🗃️ Updated 🗃️
2026-06-12 05:39:45 -04:00
🦈🏠🐜 Initial Commit 🐜🦈🏠
2025-09-16 23:50:20 -04:00
2026-08-02 23:28:19 -04:00
🗃️ Updated 🗃️
2026-06-12 05:39:45 -04:00
🗃️ Updated 🗃️
2026-06-12 05:39:45 -04:00
2026-08-03 09:41:46 -04:00
2026-08-02 23:26:29 -04:00
2026-05-12 20:08:00 -04:00

opengist

A containerized OpenGist — a self-hosted pastebin powered by Git. Create, share, and fork code snippets with full Git history, HTTP clone, SSH push/pull, and OAuth2 login via GitHub, GitLab, Gitea, or OpenID Connect. Built on Alpine Linux with SQLite storage and no external database required.


📦 Install

sudo bash -c "$(curl -q -LSsf "https://github.com/systemmgr/installer/raw/main/install.sh")"
sudo systemmgr --config && sudo systemmgr install scripts
dockermgr update opengist

Manual docker run

docker run -d \
  --restart always \
  --name casjaysdevdocker-opengist-latest \
  --hostname opengist \
  -e TZ=${TIMEZONE:-America/New_York} \
  -v /srv/$USER/docker/casjaysdevdocker/opengist/latest/volumes/data:/data:z \
  -v /srv/$USER/docker/casjaysdevdocker/opengist/latest/volumes/config:/config:z \
  -p 172.17.0.1:80:80 \
  -p 172.17.0.1:7823:7823 \
  casjaysdevdocker/opengist:latest

docker-compose

services:
  opengist:
    image: casjaysdevdocker/opengist:latest
    container_name: casjaysdevdocker-opengist
    hostname: opengist
    environment:
      - TZ=America/New_York
    volumes:
      - "/srv/$USER/docker/casjaysdevdocker/opengist/latest/volumes/data:/data:z"
      - "/srv/$USER/docker/casjaysdevdocker/opengist/latest/volumes/config:/config:z"
    ports:
      - "172.17.0.1:80:80"
      - "172.17.0.1:7823:7823"
    restart: always

⚙️ Configuration

Volumes

Path Purpose
/config Runtime configuration (auto-generated on first start)
/data Gist repositories, SQLite database, logs, and index

Ports

Port Protocol Purpose
80 HTTP Web UI and HTTP Git clone/pull
7823 TCP Built-in SSH server for Git push/pull

Environment variables

Variable Default Description
TZ America/New_York Container timezone
HOSTNAME casjaysdev-opengist Sets the external-url in opengist config
SERVER_NAME / FULL_DOMAIN_NAME Override hostname for external URL
OPENGIST_APPNAME_ENABLED yes Set to no to disable the service
OPENGIST_ROOT_USER_NAME Initial admin username
OPENGIST_ROOT_PASS_WORD Initial admin password
OPENGIST_USER_NAME Initial normal user name
OPENGIST_USER_PASS_WORD Initial normal user password
DEBUGGER Set to on to enable shell-level debug tracing

Runtime config overrides

Place a shell script at /config/env/opengist.sh inside the container (or mount it as a file) to override any variable at runtime without rebuilding the image. A template is written on first start.

OAuth2

After first start, edit /config/opengist/config.yaml to add OAuth2 credentials:

github.client-key: <your-key>
github.secret:     <your-secret>

gitlab.client-key: <your-key>
gitlab.secret:     <your-secret>
gitlab.url:        https://gitlab.com/

gitea.client-key:  <your-key>
gitea.secret:      <your-secret>
gitea.url:         https://your-gitea-instance/

oidc.client-key:      <your-key>
oidc.secret:          <your-secret>
oidc.discovery-url:   https://auth.example.com/.well-known/openid-configuration

OAuth2 callback URLs must follow the pattern: http://<opengist-url>/oauth/<github|gitlab|gitea|openid-connect>/callback


🛠️ Development

Prerequisites

  • Docker with buildx support
  • git

Get source

git clone "https://github.com/casjaysdevdocker/opengist" \
  "$HOME/Projects/github/casjaysdevdocker/opengist"
cd "$HOME/Projects/github/casjaysdevdocker/opengist"

Or via dockermgr:

dockermgr download src casjaysdevdocker/opengist

Build the image

buildx

The build downloads the latest OpenGist release binary from GitHub at build time and bundles it into the image.


📄 License

WTFPL — see LICENSE.md

🤖 casjay: Github 🤖
casjaysdevdocker: Github Docker

S
Description
Repo for opengist
Readme
248 KiB
Languages
Shell 93.8%
Dockerfile 6.2%