Gitea Playground
Basically GiHub, but Open Source.
- eth0
- /
- oci://ghcr.io/sagikazarmark/iximiuz-labs/playgrounds/gitea/dev-machine:live@sha256:c1e81aa86d8930fb7ac5f9c6e3db2050db34c99495a59fcbef6fd38e5fea0e42
- eth0
- /
- oci://ghcr.io/sagikazarmark/iximiuz-labs/playgrounds/gitea/server:live@sha256:f90a8bf49c923511e437f0be6d09a42e1e62f8bf26f22ca5f68a92cb7fb4f098
- eth0
- /
- oci://ghcr.io/sagikazarmark/iximiuz-labs/playgrounds/gitea/act-runner:live@sha256:649552c29c3fcb63af16f37f0e4d1b8f1d25d38e7a1d80e254c565d79e0e4118
- eth0
- /
- oci://ghcr.io/sagikazarmark/iximiuz-labs/playgrounds/gitea/act-runner:live@sha256:649552c29c3fcb63af16f37f0e4d1b8f1d25d38e7a1d80e254c565d79e0e4118
This environment is set up for learning how to work with Gitea — a painless self-hosted Git service that provides a GitHub-like experience for managing repositories, issues, and collaborative development workflows.
🔧 System Components
gitea: The Git hosting platform daemon running as a systemd service.
🛠️ Tools
tea: The official command-line client for Gitea.git: Version control system for managing repositories.
🎯 Getting Started
Access the Web Interface
Gitea is accessible at: http://gitea.local
Pre-configured user account:
- Username:
laborant - Password:
iximiuz
Create a new repository
# Create a new directory
mkdir test
cd test
# Initialize a new Git repository
git init
# Create a README file
echo "Hello world" > README.md
git add README.md
git commit -m "Initial commit"
export REPO=test-$(hostname)
# Create a new repository via tea CLI
tea repo create --name $REPO
# Push the repository to Gitea
git remote add origin "git@gitea.local:laborant/${REPO}.git"
git push -u origin main
Run Gitea Actions
The playground comes with runners configured for running Gitea Actions.
Create a workflow directory:
mkdir -p .gitea/workflows
Place a workflow file in the workflow directory:
name: Gitea Actions Demo
run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀
on: [push]
jobs:
Explore-Gitea-Actions:
runs-on: ubuntu-latest
steps:
- run: echo "🎉 The job was automatically triggered by a ${{ gitea.event_name }} event."
- run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by Gitea!"
- run: echo "🔎 The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}."
- name: Check out repository code
uses: actions/checkout@v4
- run: echo "💡 The ${{ gitea.repository }} repository has been cloned to the runner."
- run: echo "🖥️ The workflow is now ready to test your code on the runner."
- name: List files in the repository
run: |
ls ${{ gitea.workspace }}
- run: echo "🍏 This job's status is ${{ job.status }}."
Commit and push the changes:
git add .
git commit -m "add actions"
git push
📚 Learn More
Happy learning! 🚀
A real VM, not a container
Get root on a VM with its own kernel, so Docker, Kubernetes, and systemd just work.
Read the docs →
SSH from browser or CLI
Use the built-in web terminal, or connect with labctl ssh, plain ssh, scp, or rsync.
Read the docs →
Drive it with AI
Let Claude, Codex, or any MCP client start this playground and run commands in it.
Read the docs →
Expose HTTP(S) ports
Give any web app running inside the VM a public URL - for yourself or to share with others.
Read the docs →
Share terminals
Invite others into your terminal session, or open it yourself from another device.
Read the docs →
Customize with init scripts
Add shell scripts that run at boot to install packages, clone repos, or seed test data.
Read the docs →
Private networking
VMs reach the internet via NAT with no public IP; several VMs share bridge networks.
Read the docs →
Ephemeral or persistent
By default, VMs are destroyed when the session ends; enable persistence to keep the disks for next time.
Read the docs →
Built-in container registry
A private registry.iximiuz.com for every playground to share images across services and VMs.
Read the docs →