Anyone who works with software (whether alone or in a team) eventually realizes that they should version their source code in some way. Over the years I have been working with software, I have tried a number of systems, such as CVS, SVN, FreeVCS, and GIT.
In recent years, it has been almost exclusively GIT. All the other systems were only encountered occasionally.
My VCS History
Very early on, I wanted to have my own Version Control System (VCS). In 2012, for example, I worked with Gitosis. Gitosis was a simple tool for managing GIT repositories that stored its own configuration in GIT. Back then, I even programmed a web interface for it and published it on Github.
Since I had introduced Gitlab as a VCS at the office, I thought it would be a good idea to run it privately as well. This was possible on my NAS via Docker. However, Gitlab has relatively high requirements. At some point, I had to admit that Gitlab was a little oversized for one person like me. I had basically used a sledgehammer to crack a nut.
When I discovered Gitea, Gitlab was replaced fairly quickly.
Why Gitea?
Gitea is compiled golang software that runs on all common operating systems (including Windows). On its website, Gitea describes itself as A painless self-hosted Git service. And I can only agree.
As has become usual for me lately, installation is quite quick via Docker. An official Docker image is available.
There are virtually no dependencies. For data management, Gitea can be run with one of the following databases:
- MySQL
- PostgreSQL
- SQLite3
- MSSQL
- TiDB
Like almost all applications written in golang, it requires relatively little memory. The Docker images are also very small. Where Gitlab still needed at least 1 GB of memory on my system (after optimization), I now get by with about 130 MB. The Docker image for version 1.10 is 103.2 MB in size.
My Setup
If the system is relatively quiet, even a SQLite DB is sufficient. I chose the recommended PostgreSQL option.
version: "2" services: gitea: container_name: gitea image: gitea/gitea:1.10 restart: unless-stopped ports: - "3000:3000" - "22:22" volumes: - ./volumes/gitea:/data depends_on: - gitea_db gitea_db: container_name: gitea_db image: postgres:9.6 restart: unless-stopped environment: - POSTGRES_USER=gitea - POSTGRES_PASSWORD=<my-password> - POSTGRES_DB=gitea volumes: - ./volumes/postgres:/var/lib/postgresql/data
Features
Anyone who uses Gitlab knows that, while the software needs a lot of memory, it also comes with quite a few features. If you now think Gitea has few features, you are mistaken.

Among other things, Gitea comes with:
- Dashboard with statistics
- Wiki
- Issues with milestones
- Pull requests
- Multiple languages
- Authentication through various sources (including OAuth, PAM, LDAP)
- 2FA
- Extensive REST API
- Repository importer
- User management
- Release management
- Source code browser
- Git hooks
- Webhooks
- Deploy key management
Conclusion
For me, the system has become indispensable. It simply runs extremely reliably. I have not had any problems since introducing it.
I have also combined the system with the Drone-CI CI system. This lets you set up a continuous integration environment at home too. I will write a separate article about that when I get the chance.
Perhaps I have now sparked your interest in the system a little and you would like to try it yourself.
Feel free to leave your questions, suggestions, or experiences here as a comment.
Have fun!
Update 19.01.2025
I now use the fork Forgejo.