[{"data":1,"prerenderedAt":227},["ShallowReactive",2],{"seo-verification":3,"blog-migrate-gitlab-to-gitea-vps-2026-en":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-migrate-gitlab-to-gitea-vps-2026-en",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":36,"sections":37,"ctaTitle":159,"ctaBody":160,"ctaButton":161,"ctaUrl":162,"relatedPosts":163},352,"migrate-gitlab-to-gitea-vps-2026",{"fr":12,"en":10,"ar":13,"es":14},"migrer-gitlab-vers-gitea-vps-2026","الانتقال-من-gitlab-إلى-gitea-على-vps-في-2026","migrar-gitlab-a-gitea-en-un-vps-en-2026","Migrate from GitLab to Gitea on a VPS in 2026","GitLab.com made namespaces with more than 5 members read-only from August 15, 2026. Here is how to migrate to self-hosted Gitea without losing history.",10,0,false,"2026-09-16T00:00:00+00:00","2026-09-16T14:44:13+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},4,"Development","developpement","bg-warning\u002F10 text-warning","dev",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fmigrer-gitlab-vers-gitea-vps-2026-poster.svg",{"categorySlug":34,"appSlug":35},"development","gitea","Since August 15, 2026, GitLab.com has enforced read-only mode on namespaces with more than five members on free plans. For many teams, this is a forced migration — and an opportunity to regain control. Gitea, in version 1.27.3 available as a VPS template on ServOrbit, offers a lightweight, self-hosted alternative that covers the vast majority of needs for a mid-sized development team. This guide covers the GitLab export, Gitea import, CI\u002FCD setup, and permissions management, with real commands throughout.",[38,42,54,57,97,122,143,146,149,152,156],{"type":39,"title":40,"body":41},"h2","Why GitLab.com became untenable for teams of 5+","On August 15, 2026, GitLab enforced a new policy on its free tier: any namespace with more than five members is automatically set to read-only (source: support.gitlab.com\u002Fhc\u002Fen-us\u002Farticles\u002F28301407860508). In practice, additional developers can no longer push code, open merge requests, or trigger CI\u002FCD pipelines. The only path GitLab offers is a paid subscription — whose per-seat cost quickly becomes significant for a startup or agency.\n\nThis decision fits a broader pattern of accelerated monetisation of the SaaS platform. It primarily affects open-source teams on tight budgets, multi-project agencies, and independent developers sharing a namespace. It is not the first such restriction: GitLab already removed free CI\u002FCD pipeline minutes for new users in 2021. The direction is structural.\n\nIn this context, self-hosting your Git forge on a VPS makes full sense again. You control access, data stays on your infrastructure, and the cost is fixed — the server cost, not the per-seat cost.",{"type":43,"title":44,"items":45},"ul","What Gitea provides natively",[46,47,48,49,50,51,52,53],"**Full Git forge** — repositories, branches, tags, pull requests, inline code review and conflict management through the web interface.","**Organisation and team management** — granular permissions per repository (read, write, admin) with no member limits.","**Gitea Actions** — CI\u002FCD engine compatible with GitHub Actions YAML syntax, making existing workflow portability straightforward.","**Built-in package registry** — npm, PyPI, Maven, Docker, Helm: publish and consume artefacts with no external dependency.","**Webhooks and REST API** — broad API surface to integrate deployment tools, Slack notifications, or internal dashboards.","**SSO authentication** — LDAP, OAuth2, SAML, and OpenID Connect supported natively to centralise identity management.","**Low memory footprint** — 512 MB RAM is sufficient for a ten-person team; 1 GB recommended for concurrent Actions runners.","**Simple upgrades** — single binary or official Docker image, automatic database migrations on each version update.",{"type":39,"title":55,"body":56},"Prerequisites before you start","On the server side, Gitea v1.27.3 runs comfortably on 512 MB RAM for minimal usage; plan for 1 GB if you enable Gitea Actions with concurrent runners. The ServOrbit VPS template starts from a Debian 12 image with Docker pre-installed — this is the recommended deployment mode as it isolates the Gitea process and simplifies upgrades.\n\nOn the network side, point a subdomain to your VPS IP before launching the installation: Gitea generates SSH and HTTPS clone URLs at first startup, and correcting them afterwards is tedious. A single A record `git.your-domain.com` is enough. You will also need a TLS certificate — Caddy or Traefik can generate one automatically via Let's Encrypt as a Gitea front-end proxy.\n\nOn GitLab.com, confirm you have Owner rights on the groups or projects to migrate: the export requires this access level. Generate a personal API token with the `api` and `read_repository` scopes — it will be used during the API-based export.",{"type":58,"title":59,"rows":60,"headers":93},"comparison","GitLab vs Gitea — key criteria",[61,65,69,73,77,81,85,89],[62,63,64],"Member limit (free SaaS)","5 members (read-only beyond since Aug 2026)","Unrestricted when self-hosted",[66,67,68],"Minimum memory footprint","4 GB (GitLab CE self-hosted)","512 MB",[70,71,72],"Built-in CI\u002FCD","GitLab CI (YAML)","Gitea Actions (GitHub Actions syntax)",[74,75,76],"Container registry","Yes (GitLab Container Registry)","Yes (Gitea Packages — Docker included)",[78,79,80],"Merge\u002Fpull request management","Advanced Merge Requests","Pull Requests with inline code review",[82,83,84],"SSO authentication","SAML, LDAP, OAuth2","LDAP, OAuth2, SAML, OIDC",[86,87,88],"Import from GitLab","N\u002FA","Native import via API or .tar.gz archive",[90,91,92],"Operating cost","$29\u002Fuser\u002Fmonth (Premium)","VPS cost only (99 DH\u002Fmonth\u002Fmonth)",[94,95,96],"Criterion","GitLab.com Free","Gitea VPS",{"type":98,"title":99,"steps":100},"steps","Prepare the GitLab export",[101,104,107,110,113,116,119],{"title":102,"body":103},"Log in to GitLab.com and navigate to the project t","Log in to GitLab.com and navigate to the project to export: **Settings > General > Advanced > Export project**. Click 'Export project' and wait for the confirmation email (a few minutes for small repositories, up to an hour for large ones).",{"title":105,"body":106},"To export via the API without using the interface, trigger t","To export via the API without using the interface, trigger the export with: `curl --request POST --header \"PRIVATE-TOKEN: \u003Cyour-token>\" \"https:\u002F\u002Fgitlab.com\u002Fapi\u002Fv4\u002Fprojects\u002F\u003Cproject-id>\u002Fexport\"`",{"title":108,"body":109},"Check the export status with:","Check the export status with: `curl --header \"PRIVATE-TOKEN: \u003Cyour-token>\" \"https:\u002F\u002Fgitlab.com\u002Fapi\u002Fv4\u002Fprojects\u002F\u003Cproject-id>\u002Fexport\"` — wait for the `finished` status.",{"title":111,"body":112},"Download the export archive:","Download the export archive: `curl --location --header \"PRIVATE-TOKEN: \u003Cyour-token>\" \"https:\u002F\u002Fgitlab.com\u002Fapi\u002Fv4\u002Fprojects\u002F\u003Cproject-id>\u002Fexport\u002Fdownload\" --output gitlab-export.tar.gz`",{"title":114,"body":115},"To migrate the raw Git history as well, clone the repository","To migrate the raw Git history as well, clone the repository with all references: `git clone --mirror git@gitlab.com:your-group\u002Fyour-project.git your-project.git`",{"title":117,"body":118},"Verify the integrity of the mirror clone before transferring","Verify the integrity of the mirror clone before transferring: `git -C your-project.git fsck --no-progress` — no errors should appear.",{"title":120,"body":121},"Transfer the archive and mirror repository to your VPS:","Transfer the archive and mirror repository to your VPS: `rsync -avz gitlab-export.tar.gz your-project.git user@your-vps:\u002Ftmp\u002Fmigration\u002F`",{"type":98,"title":123,"steps":124},"Import into Gitea on your VPS",[125,128,131,134,137,140],{"title":126,"body":127},"On your VPS, create the target organisation in Gitea via the","On your VPS, create the target organisation in Gitea via the web interface or via the API: `curl -X POST \"https:\u002F\u002Fgit.your-domain.com\u002Fapi\u002Fv1\u002Forgs\" -H \"Authorization: token \u003Cgitea-token>\" -H \"Content-Type: application\u002Fjson\" -d '{\"username\":\"my-organisation\",\"visibility\":\"private\"}'`",{"title":129,"body":130},"Create the empty repository in Gitea before the import:","Create the empty repository in Gitea before the import: `curl -X POST \"https:\u002F\u002Fgit.your-domain.com\u002Fapi\u002Fv1\u002Forgs\u002Fmy-organisation\u002Frepos\" -H \"Authorization: token \u003Cgitea-token>\" -H \"Content-Type: application\u002Fjson\" -d '{\"name\":\"my-project\",\"private\":true}'`",{"title":132,"body":133},"Push the Git history from the mirror clone:","Push the Git history from the mirror clone: `git -C your-project.git remote set-url origin https:\u002F\u002Fgit.your-domain.com\u002Fmy-organisation\u002Fmy-project.git` then `git -C your-project.git push --mirror`",{"title":135,"body":136},"To import issues and merge requests from the GitLab archive,","To import issues and merge requests from the GitLab archive, use the `gitea-migrator` tool or Gitea's native import: in the interface, **+ New Migration > GitLab** and provide the source project URL with your GitLab token.",{"title":138,"body":139},"Verify that all branches and tags are present:","Verify that all branches and tags are present: `git ls-remote https:\u002F\u002Fgit.your-domain.com\u002Fmy-organisation\u002Fmy-project.git` should list the same references as the original.",{"title":141,"body":142},"Update the clone URLs in each developer's local configuratio","Update the clone URLs in each developer's local configuration: `git remote set-url origin https:\u002F\u002Fgit.your-domain.com\u002Fmy-organisation\u002Fmy-project.git`",{"type":39,"title":144,"body":145},"Setting up CI\u002FCD in Gitea","Gitea v1.27.3 includes Gitea Actions, a CI\u002FCD engine whose YAML syntax is intentionally compatible with GitHub Actions. If your pipelines were on GitLab CI, some adaptation is required — GitLab's `stages` and `script` translate to Gitea Actions `jobs` and `steps` — but the logic remains the same.\n\nTo enable runners, install `act_runner` on your VPS or on a dedicated machine: `act_runner register --no-interactive --instance https:\u002F\u002Fgit.your-domain.com --token \u003Crunner-token> --name my-runner --labels ubuntu-latest:docker:\u002F\u002Fnode:20-bullseye`. The registration token is found in **Site Administration > Runners**.\n\nIf you prefer a more decoupled CI\u002FCD approach, Woodpecker CI is a mature alternative that integrates natively with Gitea via OAuth2 and provides a build supervision interface. Its `.woodpecker.yml` pipeline file is also close to Drone CI syntax, simplifying migrations from older stacks. In both cases, the first pipeline should validate the build, run tests, and if everything passes, push an image to the Gitea Docker registry.",{"type":39,"title":147,"body":148},"Migrating team members and permissions","Gitea organises access at three levels: organisations (equivalent to GitLab groups), teams within an organisation, and per-repository permissions. Start by creating all user accounts — either manually, by temporarily enabling auto-registration, or via LDAP\u002FSSO if already available.\n\nThen create teams in your organisation: `Owners`, `Developers`, `Reporters` map to GitLab's Owner, Developer, and Reporter roles. Gitea allows you to refine permissions per repository within the same team — a subset of members can have write access to specific repos only.\n\nTo migrate memberships in bulk, the Gitea API accepts calls like: `curl -X PUT \"https:\u002F\u002Fgit.your-domain.com\u002Fapi\u002Fv1\u002Forgs\u002Fmy-organisation\u002Fteams\u002F\u003Cteam-id>\u002Fmembers\u002F\u003Cusername>\" -H \"Authorization: token \u003Cgitea-token>\"`. A shell script looping over your exported GitLab user list is enough to automate this step for teams of fewer than fifty people. Beyond that, evaluate an LDAP integration to synchronise groups automatically.",{"type":39,"title":150,"body":151},"Troubleshooting — the 4 most common errors","**`remote: repository not found` during mirror push.** The target repository does not yet exist in Gitea, or the token used does not have write rights. Verify that the repository was created (import step 2) and that your token has the `write:repository` scope.\n\n**`error: src refspec refs\u002Fmerge-requests\u002F... does not match any`** during `push --mirror`. GitLab's internal references (`refs\u002Fmerge-requests\u002F`) are not accepted by Gitea. Filter them explicitly before pushing: delete the parasitic refs locally with `git -C your-project.git for-each-ref --format='%(refname)' refs\u002Fmerge-requests | xargs -I{} git update-ref -d {}`.\n\n**`Error 413: Request Entity Too Large`** when importing a large archive. The maximum upload size is configured in Gitea's `app.ini` under the `MAX_UPLOAD_SIZE` key. Increase it (`MAX_UPLOAD_SIZE = 2048` for 2 GB) and reload the service: `docker compose restart gitea`.\n\n**Imported issues do not show the correct authors.** Gitea associates issues with local accounts by username. If the GitLab username differs from the Gitea username, issues are attributed to the user who ran the import. Create all accounts with the same usernames as on GitLab before running the issues migration.",{"type":153,"title":154,"body":155},"tip","Post-migration security tip","Once the migration is complete, disable auto-registration (`DISABLE_REGISTRATION = true` in `app.ini`) if you are not using SSO, and enforce two-factor authentication for all Owner members. Also configure automatic backups of the Docker volume containing `\u002Fdata\u002Fgitea`: a daily dump to remote storage (S3, Backblaze B2) protects you from disk loss. Finally, verify that Gitea's SSH port (default 2222 in Docker) is not directly exposed on the public IP if you filter by SSH key — a fail2ban rule or a UFW rule limiting SSH connections per minute significantly reduces the attack surface.",{"type":39,"title":157,"body":158},"Take back control of your Git forge","The GitLab.com restriction of August 15, 2026 accelerated a trend already underway: teams that had accepted dependency on a free SaaS platform now face an unanticipated pricing decision. Gitea v1.27.3 meets the essential needs of a team Git forge — repositories, pull requests, CI\u002FCD, package registry, SSO — in a footprint that fits on an entry-level VPS.\n\nThe migration is not instantaneous, but it is sequential and reversible at each step: the Git history is complete after the `push --mirror`, issues and pull requests follow via the native import, and CI\u002FCD reconfigures in a few hours if your workflows were already in YAML. The ServOrbit Gitea VPS template spares you the initial installation and configuration phase — Gitea is ready, Docker is in place, and you only need to attach your domain and follow the steps described here.\n\nSee the companion guides on the self-hosted AI stack with Gitea and Ollama, replacing GitHub Actions with Woodpecker CI, and installing GitLab CE on a VPS if you are still comparing both options.","Deploy your Git forge on ServOrbit VPS","Ready-to-use Gitea v1.27.3 template, root access, daily snapshots. Your private forge in less than ten minutes.","See developer VPS","\u002Fsolutions\u002Fdeveloppeurs",[164,188,208],{"id":165,"slug":166,"slugs":167,"title":171,"excerpt":172,"readTime":173,"views":18,"isPinned":19,"publishedAt":174,"updatedAt":175,"category":176,"categories":182,"featuredImage":30,"bgImage":31,"posterImage":184,"relatedSolution":185},335,"self-hosted-ai-stack-gitea-runners-and-ollama-on-a-vps",{"fr":168,"en":166,"ar":169,"es":170},"deployer-stack-ia-self-hosted-gitea-ollama-vps","مكدس-ذكاء-اصطناعي-ذاتي-gitea-وollama-على-خادم-vps","stack-de-ia-self-hosted-gitea-runners-y-ollama-en-un-vps","Self-hosted AI stack: Gitea, runners and Ollama on a VPS","Deploy a complete AI pipeline on your VPS: Gitea Git forge, CI runners and LLM inference with Ollama. No code or prompt leaves your server.",9,"2026-09-06T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":177,"name":178,"slug":179,"color":180,"icon":181},1,"Artificial Intelligence","intelligence-artificielle","bg-purple-500\u002F10 text-purple-400","ia",[183],{"id":177,"name":178,"slug":179,"color":180,"icon":181},"\u002Fblog\u002Fcovers\u002Fdeployer-stack-ia-self-hosted-gitea-ollama-vps-poster.svg",{"categorySlug":186,"appSlug":187},"artificial-intelligence","ollama",{"id":189,"slug":190,"slugs":191,"title":195,"excerpt":196,"readTime":197,"views":198,"isPinned":19,"publishedAt":199,"updatedAt":200,"category":201,"categories":205,"featuredImage":30,"bgImage":31,"posterImage":207,"relatedSolution":30},235,"install-gitlab-ce-on-a-vps-complete-guide",{"fr":192,"en":190,"ar":193,"es":194},"installer-gitlab-ce-vps","تثبيت-gitlab-ce-على-vps-دليل-شامل","instalar-gitlab-ce-en-un-vps-guia-completa","Install GitLab CE on a VPS: complete guide","Deploy GitLab CE on your VPS with Docker Compose: git forge, built-in CI\u002FCD, private Docker registry and project management — self-hosted.",17,3,"2026-08-07T00:00:00+00:00","2026-09-11T11:34:12+00:00",{"id":198,"name":202,"slug":203,"color":204,"icon":203},"Deployment","deploiement","bg-success\u002F10 text-success",[206],{"id":198,"name":202,"slug":203,"color":204,"icon":203},"\u002Fblog\u002Fcovers\u002Finstaller-gitlab-ce-vps-poster.svg",{"id":209,"slug":210,"slugs":211,"title":215,"excerpt":216,"readTime":217,"views":177,"isPinned":19,"publishedAt":218,"updatedAt":175,"category":219,"categories":224,"featuredImage":30,"bgImage":31,"posterImage":226,"relatedSolution":30},338,"replace-github-actions-with-woodpecker-ci-on-a-vps",{"fr":212,"en":210,"ar":213,"es":214},"remplacer-github-actions-woodpecker-ci-self-hosted-vps","استبدال-github-actions-بـwoodpecker-ci-على-vps","reemplazar-github-actions-con-woodpecker-ci-en-vps","Replace GitHub Actions with Woodpecker CI on a VPS","GitHub announced then suspended billing for self-hosted runners on private repos. Switch to Woodpecker CI: clean syntax, under 50 MB RAM, fixed cost on your VPS.",8,"2026-09-07T00:00:00+00:00",{"id":220,"name":221,"slug":222,"color":223,"icon":222},2,"Automation","automatisation","bg-brand-action\u002F10 text-brand-action",[225],{"id":220,"name":221,"slug":222,"color":223,"icon":222},"\u002Fblog\u002Fcovers\u002Fremplacer-github-actions-woodpecker-ci-self-hosted-vps-poster.svg",1789570165813]