The repositories are the easy part. A full mirror clone carries every branch, tag, and commit intact, and any of these forges can host the result within an afternoon. The work is everything wrapped around the code: pull request review rules, required checks, issue triage, labels and milestones, release automation, and the webhooks and integrations that assume GitHub's API. Inventory those events - from opening a change to publishing a release - before you pick a target, because that list, not the repository count, decides whether the move is a configuration exercise or a process redesign.
Match the forge to how much of GitHub you are trying to replace. Gitea folds git hosting, code review, a package registry, and CI through Gitea Actions into one modest Go binary, which makes it the closest single-tool stand-in for a small GitHub organization. Gogs shares that lineage but stays deliberately lean, running on Raspberry Pi-class hardware when you only need repositories, issues, and pull requests without the extra services. OneDev leans the other way, adding language-aware symbol search, regex code search, and GUI-built CI/CD pipelines for teams who lived in GitHub's code navigation and Actions.
Data beyond the git history needs an explicit export. Pull issues, pull requests, labels, milestones, releases, and wikis through the GitHub API, and map user identities before import or comments and review history lose their authorship. After the data lands, repoint remotes, deploy keys, secrets, webhooks, badges, and documentation links, then leave the GitHub side read-only long enough to catch references you missed.