Self-hosted Git platform powered by Scala with GitHub API compatibility, pull requests, issue tracking, and single-file Java deployment.
Internal networks without internet access frequently demand private source code hosting without the operational overhead of a multi-node cluster. GitBucket delivers a self-contained Git platform running as an executable Java web archive with GitHub-compatible APIs. It provides pull requests, issue tracking, and repository management directly from a single local directory.
GitBucket targets workflow compatibility for teams accustomed to GitHub conventions, whereas Bitbucket aligns tightly with Atlassian project management suites. While Bitbucket offers integrated Jira tracking and native Bitbucket Pipelines, GitBucket delivers operational simplicity through its GitHub v3 REST API implementation. Developers can reuse standard GitHub command-line tools, editor extensions, and webhook scripts against an on-premise instance without modifications.
The tradeoff centers on ecosystem breadth versus infrastructure independence. Bitbucket requires recurring per-seat subscriptions or complex Data Center deployments. GitBucket eliminates licensing fees and external database dependencies by packaging an embedded servlet container and datastore into a single file. Teams forfeit Bitbucket’s built-in pipeline runners and multi-reviewer approval matrices, requiring engineers to connect external automation tools like Jenkins via webhooks.
How does GitBucket differ from Bitbucket for daily development? GitBucket delivers GitHub-style code reviews and API compatibility from a standalone Java archive without per-user licensing fees. Bitbucket provides deeper Atlassian ecosystem integration, fine-grained branch permissions, and built-in pipelines, but requires commercial subscriptions or complex Data Center infrastructure.
Can GitBucket run without an external database server? Yes. GitBucket includes an embedded H2 database by default, though teams can point it to external PostgreSQL or MySQL instances as repository volume grows.
Does GitBucket support Git LFS for large file storage? Yes. GitBucket natively handles Git Large File Storage for tracking binary assets over HTTP and SSH, storing LFS data on the local filesystem.
GitBucket is a practical choice for development teams that need lightweight, self-hosted Git collaboration with GitHub-compatible tooling and zero license fees, provided they are prepared to run an external continuous integration runner. Active development through September 2026 and an Apache-2.0 license make it straightforward to deploy on private infrastructure or customize via plugins without enterprise lock-in.
Commands from the official package registries. Each package is matched to GitBucket through the registry's own link to its source code or website.
brew install gitbucketbrew install gitbucketWe started this exact setup from scratch in a clean Linux machine on Nov 2, 2026 and checked it through GitBucket's own API: every check passed. Recipes are re-checked regularly and removed if they stop working.
mkdir -p gitbucket && cd gitbucket
curl -fsSL https://open-source.store/tools/gitbucket/compose.yml -o compose.ymlcat > .env <<EOF
GITBUCKET_BASE_URL=http://localhost:8080
EOFGITBUCKET_BASE_URL — Public URL where GitBucket is reached (e.g. http://<your-server>:8080 or https://git.example.com); set this to your server's public URL.docker compose up -dservices:
gitbucket:
image: ghcr.io/gitbucket/gitbucket:4.48.0
ports:
- "8080:8080"
environment:
GITBUCKET_BASE_URL: ${GITBUCKET_BASE_URL}
volumes:
- gitbucket-data:/gitbucket
restart: always
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:8080/ || exit 1"]
interval: 5s
timeout: 5s
retries: 20
start_period: 20s
volumes:
gitbucket-data:
Go, gRPC and Protobuf done right, LLM agents in production, and the hard parts of shipping a first product.
Show that GitBucket is listed as an open-source alternative. Paste into your README:
Ubuntu 24.04 · Apple container, Docker 29.1.3, Compose 2.40.3+ds1-0ubuntu1~24.04.1. Images pulled in 120 s: ghcr.io/gitbucket/gitbucket:4.48.0.
Based on the upstream setup. Official Docker image pinned to 4.48.0. Base URL moved to .env; healthcheck added; SSH port 29418 is disabled by default so Git operations use HTTP.
gitbucket-1 | 2026-11-02T07:16:09.506127512Z SLF4J(W): No SLF4J providers were found.
gitbucket-1 | 2026-11-02T07:16:09.506150970Z SLF4J(W): Defaulting to no-operation (NOP) logger implementation
gitbucket-1 | 2026-11-02T07:16:09.506152137Z SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details.
gitbucket-1 | 2026-11-02T07:16:10.320281096Z 07:16:10.319 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
gitbucket-1 | 2026-11-02T07:16:10.419435721Z 07:16:10.419 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:/root/.gitbucket/data user=SA
gitbucket-1 | 2026-11-02T07:16:10.419905262Z 07:16:10.419 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.
gitbucket-1 | 2026-11-02T07:16:10.427125054Z 07:16:10.426 [main] INFO g.core.servlet.InitializeListener - Check version
gitbucket-1 | 2026-11-02T07:16:10.427152012Z 07:16:10.427 [main] INFO g.core.servlet.InitializeListener - Start schema update
gitbucket-1 | 2026-11-02T07:16:11.156836971Z 07:16:11.156 [main] INFO g.core.servlet.InitializeListener - Extract bundled plugins...
gitbucket-1 | 2026-11-02T07:16:11.160374096Z 07:16:11.160 [main] INFO g.core.servlet.InitializeListener - Extract to /root/.gitbucket/plugins/gitbucket-notifications-plugin-1.11.0.jar
gitbucket-1 | 2026-11-02T07:16:11.161010971Z 07:16:11.160 [main] INFO g.core.servlet.InitializeListener - Extract to /root/.gitbucket/plugins/gitbucket-gist-plugin-4.26.0.jar
gitbucket-1 | 2026-11-02T07:16:11.161232721Z 07:16:11.161 [main] INFO g.core.servlet.InitializeListener - Extract to /root/.gitbucket/plugins/gitbucket-emoji-plugin-4.6.0.jar
gitbucket-1 | 2026-11-02T07:16:11.163874638Z 07:16:11.163 [main] INFO g.core.servlet.InitializeListener - Extract to /root/.gitbucket/plugins/gitbucket-pages-plugin-1.11.0.jar
gitbucket-1 | 2026-11-02T07:16:11.164133138Z 07:16:11.164 [main] INFO g.core.servlet.InitializeListener - Initialize plugins
gitbucket-1 | 2026-11-02T07:16:11.181203471Z 07:16:11.181 [main] INFO g.core.plugin.PluginRegistry - Initialize gitbucket-gist-plugin-4.26.0.jar
gitbucket-1 | 2026-11-02T07:16:11.308862763Z 07:16:11.308 [main] INFO g.core.plugin.PluginRegistry - Initialize gitbucket-emoji-plugin-4.6.0.jar
gitbucket-1 | 2026-11-02T07:16:11.311847846Z 07:16:11.311 [main] INFO g.core.plugin.PluginRegistry - Initialize gitbucket-pages-plugin-1.11.0.jar
gitbucket-1 | 2026-11-02T07:16:11.326849721Z 07:16:11.326 [main] INFO g.core.plugin.PluginRegistry - Initialize gitbucket-notifications-plugin-1.11.0.jar
gitbucket-1 | 2026-11-02T07:16:11.367098846Z 07:16:11.366 [Thread-9] INFO g.core.plugin.PluginWatchThread - Start PluginWatchThread: /root/.gitbucket/plugins
gitbucket-1 | 2026-11-02T07:16:11.367824471Z 07:16:11.367 [main] INFO o.scalatra.servlet.ScalatraListener - The cycle class name from the config: ScalatraBootstrap
gitbucket-1 | 2026-11-02T07:16:11.368446805Z 07:16:11.368 [main] INFO o.scalatra.servlet.ScalatraListener - Initializing life cycle class: ScalatraBootstrap
gitbucket-1 | 2026-11-02T07:16:13.024101514Z 07:16:13.023 [scala-execution-context-global-34] INFO o.c.core.Cache2kCoreProviderImpl - cache2k starting. version=2.6.1.Final
gitbucket-1 | 2026-11-02T07:16:37.681477885Z 07:16:37.681 [qtp186370029-94] INFO g.core.service.AccountService - Failed to authenticate: admin
gitbucket-1 | 2026-11-02T07:16:37.686420719Z 07:16:37.686 [qtp186370029-116] INFO g.core.service.AccountService - Failed to authenticate: admin
gitbucket-1 | 2026-11-02T07:16:44.659626139Z 07:16:44.658 [qtp186370029-126] INFO g.core.service.AccountService - Failed to authenticate: {{username}}
gitbucket-1 | 2026-11-02T07:16:44.675989889Z 07:16:44.675 [qtp186370029-112] INFO g.core.service.AccountService - Failed to authenticate: {{username}}
gitbucket-1 | 2026-11-02T07:16:58.651704797Z 07:16:58.651 [qtp186370029-85] INFO g.core.service.AccountService - Failed to authenticate: admin
gitbucket-1 | 2026-11-02T07:16:58.667589255Z 07:16:58.667 [qtp186370029-50] INFO g.core.service.AccountService - Failed to authenticate: admin
gitbucket-1 | 2026-11-02T07:17:01.630998423Z 07:17:01.630 [qtp186370029-109] INFO g.core.service.AccountService - Failed to authenticate: admin
gitbucket-1 | 2026-11-02T07:17:01.644461632Z 07:17:01.642 [qtp186370029-87] INFO g.core.service.AccountService - Failed to authenticate: admin
gitbucket-1 | 2026-11-02T07:17:03.626220633Z 07:17:03.626 [qtp186370029-85] INFO g.core.service.AccountService - Failed to authenticate: rocketskates
gitbucket-1 | 2026-11-02T07:17:03.645303341Z 07:17:03.645 [qtp186370029-155] INFO g.core.service.AccountService - Failed to authenticate: rocketskates
gitbucket-1 | 2026-11-02T07:17:04.649619133Z 07:17:04.649 [qtp186370029-47] INFO g.core.service.AccountService - Failed to authenticate: admin
gitbucket-1 | 2026-11-02T07:17:04.682122133Z 07:17:04.681 [qtp186370029-65] INFO g.core.service.AccountService - Failed to authenticate: admin
gitbucket-1 | 2026-11-02T07:17:07.668888676Z 07:17:07.668 [qtp186370029-144] INFO g.core.service.AccountService - Failed to authenticate: guest
gitbucket-1 | 2026-11-02T07:17:07.673821134Z 07:17:07.673 [qtp186370029-132] INFO g.core.service.AccountService - Failed to authenticate: guest