[{"data":1,"prerenderedAt":147},["ShallowReactive",2],{"seo-verification":3,"blog-move-your-cicd-to-forgejo-after-the-github-outage-of-2026-en":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"id":7,"slug":8,"slugs":9,"title":12,"excerpt":13,"readTime":14,"views":15,"isPinned":16,"publishedAt":17,"category":18,"categories":23,"featuredImage":25,"bgImage":26,"posterImage":27,"relatedSolution":25,"intro":28,"sections":29,"ctaTitle":88,"ctaBody":89,"ctaButton":90,"ctaUrl":91,"relatedPosts":92},303,"move-your-cicd-to-forgejo-after-the-github-outage-of-2026",{"fr":10,"en":8,"ar":11},"migrer-ci-cd-forgejo-apres-panne-github-2026","الانتقال-بـcicd-إلى-forgejo-بعد-انقطاع-github-2026","Move your CI\u002FCD to Forgejo after the GitHub outage of 2026","The August 17 2026 GitHub outage (7 h 47 min) consumed a year's uptime budget in one day. Move your CI\u002FCD to Forgejo Actions: same YAML, your own VPS.",9,0,false,"2026-08-26T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":21},3,"Deployment","deploiement","bg-success\u002F10 text-success",[24],{"id":19,"name":20,"slug":21,"color":22,"icon":21},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fmigrer-ci-cd-forgejo-apres-panne-github-2026-poster.svg","The GitHub outage of August 17, 2026 lasted 7 hours and 47 minutes. It affected github.com, authentication, GitHub Actions, APIs, pull requests, issues and Copilot. For teams whose CI\u002FCD relied on GitHub Actions, it consumed their entire annual downtime budget in a single day. Forgejo Actions runs on your own VPS, using the same YAML syntax as GitHub Actions, with no dependency on external infrastructure. This guide covers the complete migration: installation, repository migration, workflow porting and post-migration configuration.",[30,34,44,47,75,78,82,85],{"type":31,"title":32,"body":33},"h2","Why the August 17, 2026 outage changes the question","On August 17, 2026, at 9:40 a.m. ET, GitHub experienced a capacity failure in its Central US datacenter. The platform hit a new traffic peak its infrastructure could not absorb: roughly a 20% error rate on web experiences and API calls, up to 50% on archive downloads. GitHub Actions was among the most durably affected services. Full service did not return until 5:27 p.m. ET — 7 hours and 47 minutes after the incident began — \u003Ca href=\"https:\u002F\u002Fgithub.blog\u002Fnews-insights\u002Fcompany-news\u002Fthe-august-17-outage-and-the-work-ahead\u002F\">publicly acknowledged by GitHub on August 20, 2026\u003C\u002Fa>.\n\nDanubeData, a data infrastructure company, published a detailed post-mortem: the incident exposed a hidden dependency of their control plane on GitHub. In response, they migrated 9 repositories — 333 pull requests and roughly 400 MB of Git history — to a self-hosted Forgejo instance in a single day. Their main build pipeline and production deployment workflow followed the same day.\n\nThe question is no longer \"can GitHub go down?\" but \"what is our exposure if it does?\". Forgejo Actions answers that question by moving CI\u002FCD execution to your own infrastructure.",{"type":35,"title":36,"items":37},"ul","Benefits of a self-hosted Forgejo for your CI\u002FCD",[38,39,40,41,42,43],"**Availability independent of GitHub** — a platform outage does not interrupt your builds or deployments.","**Compatible YAML syntax** — the majority of GitHub Actions workflows run without modification on Forgejo Actions.","**Fixed and predictable cost** — every pipeline minute is a resource already paid for on your VPS, not an additional line item billed per minute.","**Pipeline confidentiality** — source code, environment secrets and build artifacts never leave your infrastructure.","**Configurable runners** — run jobs in a Docker container, a native process or an LXC environment unavailable on GitHub.","**Nonprofit governance** — Forgejo is maintained by Codeberg e.V., with no paid enterprise edition and no risk of a commercial pivot.",{"type":31,"title":45,"body":46},"Prerequisites","Before starting the installation, verify that your VPS meets the following requirements.\n\n**RAM**: 2 GB minimum for the forge alone, with 5 to 20 developers and reasonably sized repositories. Plan for 4 GB if you run Forgejo Actions with runners that compile locally (Go, Rust, Java).\n\n**vCPU**: 2 vCPU is sufficient for a team of 20 developers. Add 2 vCPU per concurrent runner for CPU-intensive builds.\n\n**Disk**: reserve at least 20 GB of SSD for repositories, Git history, CI artifacts and logs. Plan for 50 GB if you host several years of history or large binary artifacts.\n\n**Network**: port 22 remains available on the host (system SSH); Forgejo SSH will be exposed on a separate port, conventionally 2222. Port 443 must be open for the reverse proxy.\n\n**Domain**: prepare a subdomain such as `git.yourdomain.com` with an A record pointing to your VPS IP.\n\n**Software**: Docker 24+ and the Compose plugin installed on the VPS.",{"type":48,"title":49,"steps":50},"steps","Migrating from GitHub to Forgejo Actions: installation and porting",[51,54,57,60,63,66,69,72],{"title":52,"body":53},"Install Forgejo with Docker and PostgreSQL","Create the working directory `\u002Fopt\u002Fforgejo` and a `data` subdirectory. Write a `docker-compose.yml` with two services: `forgejo` (image `codeberg.org\u002Fforgejo\u002Fforgejo:latest`, internal port 3000, SSH mapped on `2222:22`, volume `.\u002Fdata:\u002Fdata`, variables `USER_UID=1000` and `USER_GID=1000`) and `db` (image `postgres:16`, dedicated volume, variables `POSTGRES_USER`, `POSTGRES_PASSWORD`, `POSTGRES_DB`). Run `docker compose up -d` and watch `docker compose logs -f forgejo` until you see HTTP port 3000 active.",{"title":55,"body":56},"Configure the reverse proxy and SSL certificate","With Caddy, a single block is enough: `git.yourdomain.com { reverse_proxy localhost:3000 }`. The Let's Encrypt certificate is provisioned automatically. With Nginx, create a `server` block listening on 443 with `proxy_pass http:\u002F\u002F127.0.0.1:3000;` and add **mandatorily** `proxy_read_timeout 600s;` — DanubeData hit a 504 without this setting, which halted the import at 196 of 333 pull requests. Redirect HTTP to HTTPS in a separate block.",{"title":58,"body":59},"Complete the initial setup","Go to `https:\u002F\u002Fgit.yourdomain.com`. The setup wizard asks for: database driver (PostgreSQL), host (`db:5432`), credentials, HTTPS base URL and external SSH port (2222). Create the administrator account. For a private instance, disable self-registration in the settings or by adding `DISABLE_REGISTRATION=true` to the service environment variables.",{"title":61,"body":62},"Migrate GitHub repositories","In the Forgejo interface, click **New repository → Migrate**. Select GitHub as the source. Enter the repository URL (`https:\u002F\u002Fgithub.com\u002Fyour-org\u002Fyour-repo`), a GitHub personal access token with the `repo` scope, and enable migration of pull requests, labels, milestones and releases. For large repositories (> 1 GB or > 200 pull requests), test first with the reverse proxy timeout at 600 s. Delete the incomplete repository and retry if a 504 occurs. Repeat for each repository.",{"title":64,"body":65},"Register a Forgejo Actions runner","In Forgejo, go to **Administration → Actions → Runners → Create runner**. Copy the registration token. Add an `act-runner` service to your `docker-compose.yml` with the image `codeberg.org\u002Fforgejo\u002Frunner:latest`, and set the variables `FORGEJO_INSTANCE_URL` (HTTPS URL of your instance) and `FORGEJO_RUNNER_REGISTRATION_TOKEN`. Run `docker compose up -d act-runner`. Verify that the runner appears as **Online** in the administration panel.",{"title":67,"body":68},"Place workflow files in the correct directory","On GitHub, your workflows live in `.github\u002Fworkflows\u002F`. On Forgejo, they must be in `.forgejo\u002Fworkflows\u002F`. Rename the directory in each migrated repository and push the change. The rest of the YAML file — `on:` triggers, jobs, steps, `uses:` for compatible third-party actions — remains identical in most cases. Forgejo does not read the `.github\u002F` directory.",{"title":70,"body":71},"Adapt GitHub-specific elements","A few adaptation points: replace actions that call the GitHub API (`gh`-based) with a Forgejo equivalent or remove them; remove any `permissions: id-token: write` (Forgejo uses `enable-openid-connect` in the workflow file for OIDC); if your workflow references a tool absent from the runner's Debian bookworm image, add an `apt-get install -y \u003Ctool>` step. The `actions\u002Fcheckout` and `actions\u002Fsetup-node` actions are resolved natively.",{"title":73,"body":74},"Validate the first pipelines","Create a minimal workflow `.forgejo\u002Fworkflows\u002Fsmoke.yml` triggered on `push`, with a single job running `echo \"Pipeline OK\"`. Check **Actions** in the Forgejo interface. Once this first run is green, migrate your production workflows one by one and fix any discrepancies along the way.",{"type":31,"title":76,"body":77},"Post-migration configuration","After validating pipeline execution, three items remain to configure.\n\n**Webhooks and notifications**: if external systems (Slack, Mattermost, a deployment webhook) were listening for GitHub events, recreate them in Forgejo under **Settings → Webhooks**. The payload is similar to GitHub's but differs on a few fields — adjust your receiving endpoints accordingly.\n\n**Pipeline secrets**: GitHub secrets (menu **Settings → Secrets**) must be recreated in Forgejo under **Repository Settings → Actions → Secrets**. For organization secrets, use **Administration → Organizations → [your org] → Settings → Actions → Secrets**. Never migrate a secret by embedding its value in a commit or a versioned file.\n\n**Runner permissions**: by default, a runner registered at instance level can execute workflows for all repositories. For finer control, restrict a runner to a specific organization or repository in the **Runners** tab of the corresponding settings.",{"type":79,"title":80,"body":81},"tip","Hardening your Forgejo instance","Three measures significantly reduce the attack surface of an instance exposed to the internet.\n\n**Enable mandatory 2FA** for all accounts, especially administrator accounts: **Administration → Authentication Settings → Require 2FA**.\n\n**Audit registered SSH keys.** A user migrated from GitHub may have orphaned or outdated keys in their profile. Ask each team member to review their keys under **Settings → SSH\u002FGPG Keys** and delete any that no longer correspond to an active device.\n\n**Enable HMAC verification on all outgoing webhooks.** In each webhook, fill in the **Secret** field with a random string of at least 32 characters. The receiving endpoint must verify the `X-Gitea-Signature` header (identical on Forgejo). Without this check, anyone who knows your endpoint URL can trigger a deployment action.",{"type":31,"title":83,"body":84},"Troubleshooting — common errors","`504 Gateway Timeout` during repository migration. Forgejo performs the import synchronously within the HTTP request. If the reverse proxy cuts the connection before the import finishes, the migration stops and the repository remains stuck as \"Migration in progress\". Increase `proxy_read_timeout` to 600 s (Nginx) or add `timeouts { read_body 10m }` (Caddy) **before** starting the migration. Then delete the incomplete repository and retry.\n\n`Runner stays Offline after startup`. Verify that `FORGEJO_INSTANCE_URL` points to the public HTTPS URL of your instance, not `localhost` or the container's internal IP. The runner must reach Forgejo via the same path as an external browser.\n\n`Workflow not triggered after push`. Verify that the workflow files are in `.forgejo\u002Fworkflows\u002F` and not in `.github\u002Fworkflows\u002F`. Forgejo does not read the `.github\u002F` directory.\n\n`Error: this step uses an action, but the runner does not support actions`. Some third-party actions referenced by `uses:` call the GitHub API. Replace them with an equivalent available on Codeberg or mirror them to your instance.\n\n`permission denied` on a script at the end of a job. The runner's base image (Debian bookworm) does not include the same utilities as GitHub's Ubuntu image. Add an `apt-get install -y \u003Ctool>` step at the beginning of the job, or specify a custom Docker image via `container:`.",{"type":31,"title":86,"body":87},"Further reading","This guide covers installation and migration of your CI\u002FCD to Forgejo Actions. To go further, the following articles cover related topics: initial Forgejo hosting on a VPS with Docker and SSL, setting up a Woodpecker CI pipeline alongside Forgejo, and migrating your GitHub repositories to a self-hosted Git forge.\n\n\u003Ca href=\"\u002Fblog\u002Fheberger-forgejo\">Host Forgejo on your own VPS\u003C\u002Fa> — complete installation, reverse proxy and first runner.\n\n\u003Ca href=\"\u002Fblog\u002Fwoodpecker-ci-pipeline-vps-forgejo\">Woodpecker CI pipeline on VPS with Forgejo\u003C\u002Fa> — an alternative to Forgejo Actions for teams that want to separate the forge and the CI engine.\n\n\u003Ca href=\"\u002Fblog\u002Fmigrer-depots-github-vers-gitea-vps\">Migrate your GitHub repositories to Gitea or Forgejo on a VPS\u003C\u002Fa> — step-by-step migration procedure using the official tool.","Your Forgejo forge and CI\u002FCD pipelines on a ServOrbit VPS","A Cloud VPS with Docker pre-installed to host Forgejo, your runners and your repositories. Independent of GitHub, always available.","Explore developer solutions","\u002Fsolutions\u002Fdeveloppeurs",[93,113,131],{"id":94,"slug":95,"slugs":96,"title":99,"excerpt":100,"readTime":101,"views":102,"isPinned":16,"publishedAt":103,"category":104,"categories":110,"featuredImage":25,"bgImage":26,"posterImage":112,"relatedSolution":25},75,"host-forgejo-on-your-own-vps",{"fr":97,"en":95,"ar":98},"heberger-forgejo","استضافة-forgejo-على-خادم-vps-الخاص-بك","Self-Host Forgejo on Your VPS: Complete 2025 Guide","Deploy Forgejo on your VPS with Docker, SSL, Actions runners and hardened security. Step-by-step guide for a sovereign Git forge.",10,1,"2026-04-06T00:00:00+00:00",{"id":105,"name":106,"slug":107,"color":108,"icon":109},7,"Self-hosting","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[111],{"id":105,"name":106,"slug":107,"color":108,"icon":109},"\u002Fblog\u002Fcovers\u002Fheberger-forgejo-poster.svg",{"id":114,"slug":115,"slugs":116,"title":119,"excerpt":120,"readTime":121,"views":102,"isPinned":16,"publishedAt":122,"category":123,"categories":128,"featuredImage":25,"bgImage":26,"posterImage":130,"relatedSolution":25},212,"woodpecker-ci-and-forgejo-cicd-pipeline-on-a-vps",{"fr":117,"en":115,"ar":118},"woodpecker-ci-pipeline-vps-forgejo","woodpecker-ci-وforgejo-خط-أنابيب-cicd-على-خادم-vps","Woodpecker CI and Forgejo: CI\u002FCD pipeline on a VPS","Deploy Woodpecker CI with Forgejo on your VPS for a self-hosted, lightweight and sovereign open source CI\u002FCD pipeline. Step-by-step Docker guide.",4,"2026-08-02T00:00:00+00:00",{"id":124,"name":125,"slug":126,"color":127,"icon":126},2,"Automation","automatisation","bg-brand-action\u002F10 text-brand-action",[129],{"id":124,"name":125,"slug":126,"color":127,"icon":126},"\u002Fblog\u002Fcovers\u002Fwoodpecker-ci-pipeline-vps-forgejo-poster.svg",{"id":132,"slug":133,"slugs":134,"title":137,"excerpt":138,"readTime":14,"views":15,"isPinned":16,"publishedAt":139,"category":140,"categories":141,"featuredImage":25,"bgImage":26,"posterImage":143,"relatedSolution":144},279,"migrate-your-github-repos-to-self-hosted-gitea-on-a-vps",{"fr":135,"en":133,"ar":136},"migrer-depots-github-vers-gitea-vps","نقل-مستودعات-github-إلى-gitea-على-خادم-vps-خاص","Migrate Your GitHub Repos to Self-Hosted Gitea on a VPS","Export your repos, issues and labels via the GitHub API, import them into Gitea in under an hour, and update your local remotes — no history loss, no SaaS dependency.","2026-08-18T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":21},[142],{"id":19,"name":20,"slug":21,"color":22,"icon":21},"\u002Fblog\u002Fcovers\u002Fmigrer-depots-github-vers-gitea-vps-poster.svg",{"categorySlug":145,"appSlug":146},"development","gitea",1787744378120]