Files
composes/gitea-mirror
tiennm99 4c66ec76e6 docs: keep each service README inside its own directory
A service README now describes only its own service: no links to other
services or to the root, and no restating of the shared conventions that
the root README and CLAUDE.md already carry. Each service is a separate
Coolify app on a <service>/** watch path, so a cross-link made editing one
service redeploy another. The rule is recorded at the root; the alloy
compose comment now points at a heading that exists.
2026-09-29 20:00:15 +07:00
..

gitea-mirror

Self-hosted Gitea backed by PostgreSQL, with gitea-mirror mirroring GitHub repositories into it.

Every published port binds to 127.0.0.1, so nothing is reachable from outside the host. Put a reverse proxy in front for remote access.

Services

Service Image Address
db postgres:16-alpine internal only
gitea gitea/gitea:latest 127.0.0.1:3000 (HTTP), 127.0.0.1:2222 (SSH)
gitea-mirror ghcr.io/raylabshq/gitea-mirror:latest 127.0.0.1:4321

gitea waits for db to pass its health check before starting. gitea-mirror sets pull_policy: always, so every recreate takes the newest latest.

Usage

Complete Gitea's first-run setup at http://127.0.0.1:3000, then configure mirroring at http://127.0.0.1:4321.

Gitea advertises SSH port 2222:

git clone ssh://git@127.0.0.1:2222/<owner>/<repo>.git

Configuration

compose.yml hardcodes everything — database credentials, ports and the Gitea SSH port are written inline, and it reads no environment variables, so .env.example is not wired up.

The Postgres credentials are gitea / gitea. Change them before exposing this stack beyond localhost.

Storage

Volume Holds
db-data PostgreSQL data
gitea-data Repositories, Gitea config and state
gitea-mirror-data Mirror job database