Fixes three bugs discovered during live container testing. The critical bug was a bash post-increment no-op: `exitCode=$((exitCode++))` assigns the *old* value back to the variable, so exitCode stays 0 even when a download fails. This caused the Docker build to succeed silently when the gitea binary download failed, publishing a broken image to Docker Hub. - rootfs/root/docker/setup/05-custom.sh: change exitCode=$((exitCode++)) to exitCode=$((exitCode + 1)) in both the gitea and act_runner failure handlers - rootfs/usr/local/bin/entrypoint.sh: change CONTAINER_NAME and description from "archlinux" (copied template default) to "gitea" - rootfs/usr/local/etc/docker/init.d/08-gitea.sh: remove leading space from [ -d " /config/ssh" ] path test so the directory existence check is correct .claude/ rootfs/root/docker/setup/05-custom.sh rootfs/usr/local/bin/entrypoint.sh rootfs/usr/local/etc/docker/init.d/08-gitea.sh
gitea
An all-in-one Alpine-based Docker image that bundles Gitea (self-hosted Git service), Docker-in-Docker (dockerd), and act_runner (Gitea Actions CI runner) into a single container. Designed for teams that want a complete self-hosted Git + CI/CD stack without orchestrating multiple containers. Gitea is pre-configured with Actions enabled, SSH access, LFS, and five act_runner worker instances that register automatically on first boot.
🐳 Docker
Pull and run
docker run -d \
--restart always \
--privileged \
--name casjaysdevdocker-gitea-latest \
--hostname gitea \
-e TZ=${TIMEZONE:-America/New_York} \
-v /var/lib/srv/$USER/docker/casjaysdevdocker/gitea/data:/data:z \
-v /var/lib/srv/$USER/docker/casjaysdevdocker/gitea/config:/config:z \
-p 80:80 \
-p 7833:7833 \
-p 2375:2375 \
-p 44015:44015 \
casjaysdevdocker/gitea:latest
Note:
--privilegedis required — the container runs a full Docker daemon (DinD) and needs cgroup v2 access.
Ports
| Port | Protocol | Service | Description |
|---|---|---|---|
80 |
TCP | Gitea | Web UI and HTTP clone |
7833 |
TCP | sshd | Git SSH access (git clone git@host:user/repo) |
2375 |
TCP | dockerd | Docker daemon (plain HTTP — bind to localhost or a trusted network only) |
44015 |
TCP | act_runner | Actions artifact/cache server |
Volumes
| Path | Description |
|---|---|
/config |
Gitea config, SSH host keys, act_runner registration state |
/data |
Gitea repositories, LFS objects, SQLite database, Docker layer cache |
Environment variables
| Variable | Default | Description |
|---|---|---|
TZ |
America/New_York |
Container timezone |
SERVER_ADDRESS |
http://localhost |
Gitea URL used by act_runner for self-registration |
SERVER_TOKEN |
(auto-generated) | act_runner registration token — generated from Gitea on first boot if not set |
RUNNER_LABELS |
(runner default) | Comma-separated labels applied to all registered runners |
RUNNERS_START |
5 |
Number of act_runner worker instances to start |
RUNNERS_LOG_DIR |
/var/log/act_runner |
Directory for per-runner log files |
docker-compose
services:
gitea:
image: casjaysdevdocker/gitea:latest
container_name: casjaysdevdocker-gitea
restart: always
privileged: true
hostname: gitea
environment:
- TZ=America/New_York
- RUNNERS_START=5
volumes:
- /var/lib/srv/$USER/docker/casjaysdevdocker/gitea/data:/data:z
- /var/lib/srv/$USER/docker/casjaysdevdocker/gitea/config:/config:z
ports:
- 80:80
- 7833:7833
- 2375:2375
- 44015:44015
Automatic install/update via dockermgr
dockermgr update gitea
🛠️ Development
Get source files
git clone "https://github.com/casjaysdevdocker/gitea" "$HOME/Projects/github/casjaysdevdocker/gitea"
🐳 Docker build
The image builds for linux/amd64 and linux/arm64 via BuildX. Gitea and act_runner binaries are downloaded from GitHub/Gitea APIs at build time.
cd "$HOME/Projects/github/casjaysdevdocker/gitea"
buildx
Image tags pushed: casjaysdevdocker/gitea:latest and casjaysdevdocker/gitea:YYMM (date tag).
👤 Authors
🤖 casjay: Github 🤖
⛵ casjaysdevdocker: Github Docker ⛵
📄 License
MIT — see LICENSE.md