Integrating Gitea and its Act Runners into Coolify is straightforward. Act Runners are fully compatible with GitHub Actions, which means you can migrate your projects without having to modify your existing workflows.
Deploying Gitea in Coolify
The first step is to add a new Gitea resource to one of your Coolify projects. The default configuration is already designed to work seamlessly with the platform, making the setup process very simple.
However, configuring the Runner (the container responsible for executing your CI/CD pipelines) may require a few adjustments. After adding the Gitea Runner resource from the list of available services in Coolify, you may need to modify some settings to ensure everything works correctly.
Configuring Environment Variables
Start by configuring the following environment variables:
GITEA_INSTANCE_URL
The URL of your Gitea instance.
GITEA_RUNNER_REGISTRATION_TOKEN
The Runner registration token. You can retrieve it from the Gitea administration interface: Site Administration → Actions → Runners → Create New Runner
The token is displayed during the runner creation process.
GITEA_RUNNER_NAME
The name of your runner, for example:
gitea-runner
GITEA_RUNNER_LABELS
ubuntu-latest:docker://node:22-bullseyeCode language: JavaScript (javascript)
This configuration is important because most workflows rely on Node.js. The runner will automatically pull a Docker image based on Ubuntu with Node.js 22 preinstalled.
Issue Encountered When Starting Actions
During my testing, I encountered a blocking issue during the environment preparation phase of the runner. After spending quite some time searching for a solution without success, I found the following error message:
Gitea Runner(version:v1.0.3) received task 1100 of job Build and push yggdrasil docker image, be triggered by event: push
workflow prepared
evaluating expression ‘success()’
expression ‘success()’ evaluated to ‘true’
Starting job container Error response from daemon:
Head "https://registry-1.docker.io/v2/gitea/runner-images/manifests/ubuntu-latest": unknown: malformed HTTP Authorization headerCode language: JavaScript (javascript)
Solution
To resolve this issue, I followed these steps:
1. Remove the Registered Runner
In Gitea, navigate to: Site Administration → Actions → Runners
Then remove the runner that is currently registered.
2. Generate the Configuration File
Next, connect to the runner container and generate the default configuration file:
gitea-runner generate-config > config.yamlCode language: CSS (css)
In my case, this file was missing, which prevented the runner from operating correctly.
3. Re-register the Runner
Once the configuration file has been created and verified, register the runner again:
gitea-runner register
Follow the registration process and use the token generated earlier in Gitea.
Conclusion
After these adjustments, your Gitea instance and Act Runners should work perfectly within Coolify. You now have a fully self-hosted Git environment with CI/CD pipelines running entirely on your own infrastructure.
This approach provides greater control over your data, improved privacy, and full ownership of your deployment pipeline—especially at a time when centralized platforms remain attractive targets for security incidents and cyberattacks.


