Files
Containr/templates/gitea.md
T
2026-04-10 12:02:36 +02:00

466 lines
10 KiB
Markdown

# Gitea Git Hosting Template
## Overview
Gitea is a painless self-hosted Git service. It is similar to GitHub, Bitbucket, and GitLab.
## Quick Start
```bash
# Create docker-compose.yml with the content below
docker-compose up -d
```
## Docker Compose
```yaml
version: '3.8'
services:
gitea:
image: gitea/gitea:latest
container_name: gitea
restart: unless-stopped
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=postgres
- GITEA__database__HOST=gitea-db:5432
- GITEA__database__NAME=gitea
- GITEA__database__USER=gitea
- GITEA__database__PASSWD=gitea
- GITEA__server__DOMAIN=git.yourdomain.com
- GITEA__server__ROOT_URL=https://git.yourdomain.com/
- GITEA__server__SSH_DOMAIN=git.yourdomain.com
- GITEA__server__SSH_PORT=2222
- GITEA__server__SSH_LISTEN_PORT=22
- GITEA__webhook__ALLOWED_HOST_LIST=git.yourdomain.com
- GITEA__service__DISABLE_REGISTRATION=true
- GITEA__service__REQUIRE_SIGNIN_VIEW=true
- GITEA__mailer__ENABLED=true
- GITEA__mailer__FROM=git@yourdomain.com
- GITEA__mailer__MAILER_TYPE=smtp
- GITEA__mailer__HOST=smtp.gmail.com:587
- GITEA__mailer__USER=your-email@gmail.com
- GITEA__mailer__PASSWD=your-app-password
- GITEA__security__INSTALL_LOCK=true
- GITEA__security__SECRET_KEY=your-secret-key
ports:
- "2222:22"
- "3000:3000"
volumes:
- gitea-data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
depends_on:
- gitea-db
networks:
- gitea-network
gitea-db:
image: postgres:15-alpine
container_name: gitea-db
restart: unless-stopped
environment:
- POSTGRES_DB=gitea
- POSTGRES_USER=gitea
- POSTGRES_PASSWORD=gitea
volumes:
- gitea-db:/var/lib/postgresql/data
networks:
- gitea-network
volumes:
gitea-data:
gitea-db:
networks:
gitea-network:
driver: bridge
```
## Environment Variables
- `USER_UID`/`USER_GID`: User ID for file permissions
- `GITEA__database__*`: Database configuration
- `GITEA__server__*`: Server settings
- `GITEA__service__*`: Service configuration
- `GITEA__mailer__*`: Email configuration
- `GITEA__security__*`: Security settings
## Setup Guide
1. **Generate Secret Key**:
```bash
openssl rand -base64 32
```
2. **Create Directories**:
```bash
mkdir -p gitea-data
```
3. **Deploy**:
```bash
docker-compose up -d
```
4. **Access**: Open http://localhost:3000
5. **Initial Setup**:
- Create admin account
- Configure repository settings
- Set up SSH keys
## Configuration
### App.ini Configuration
```ini
# /data/gitea/conf/app.ini
[database]
DB_TYPE = postgres
HOST = gitea-db:5432
NAME = gitea
USER = gitea
PASSWD = gitea
[server]
DOMAIN = git.yourdomain.com
ROOT_URL = https://git.yourdomain.com/
SSH_DOMAIN = git.yourdomain.com
SSH_PORT = 2222
SSH_LISTEN_PORT = 22
LFS_START_SERVER = true
LFS_JWT_SECRET = your-lfs-jwt-secret
[service]
DISABLE_REGISTRATION = true
REQUIRE_SIGNIN_VIEW = true
ENABLE_NOTIFY_MAIL = true
[mailer]
ENABLED = true
FROM = git@yourdomain.com
MAILER_TYPE = smtp
HOST = smtp.gmail.com:587
USER = your-email@gmail.com
PASSWD = your-app-password
[security]
INSTALL_LOCK = true
SECRET_KEY = your-secret-key
```
### SSH Configuration
```bash
# Add SSH key to Gitea
ssh-keygen -t ed25519 -C "your-email@example.com"
# Add public key to Gitea web interface
# Test SSH connection
ssh -T git@git.yourdomain.com -p 2222
```
## Repository Management
### Create Repository
```bash
# Create new repository via API
curl -X POST http://localhost:3000/api/v1/user/repos \
-H "Authorization: token YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"my-repo","description":"My first repository","private":false}'
```
### Clone Repository
```bash
# HTTPS clone
git clone https://git.yourdomain.com/username/my-repo.git
# SSH clone
git clone ssh://git@git.yourdomain.com:2222/username/my-repo.git
```
### Push to Repository
```bash
cd my-repo
git init
git add .
git commit -m "Initial commit"
git remote add origin https://git.yourdomain.com/username/my-repo.git
git push -u origin main
```
## User Management
### Create User
```bash
# Create user via API
curl -X POST http://localhost:3000/api/v1/admin/users \
-H "Authorization: token YOUR_ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"username":"newuser","email":"user@example.com","password":"password","must_change_password":false}'
```
### Organizations
```bash
# Create organization
curl -X POST http://localhost:3000/api/v1/orgs \
-H "Authorization: token YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"username":"myorg","description":"My organization"}'
```
## Actions (CI/CD)
### Enable Actions
```yaml
# In app.ini
[actions]
ENABLED = true
# Create .gitea/workflows/build.yml
name: Build and Test
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test
- name: Build
run: npm run build
```
### Package Registry
```bash
# Publish npm package
npm publish --registry https://git.yourdomain.com/api/packages/npm
# Publish Docker image
docker push git.yourdomain.com/username/my-image:latest
```
## Reverse Proxy (Traefik)
```yaml
labels:
- "traefik.enable=true"
- "traefik.http.routers.gitea.rule=Host(`git.yourdomain.com`)"
- "traefik.http.routers.gitea.tls=true"
- "traefik.http.routers.gitea.tls.certresolver=letsencrypt"
- "traefik.http.services.gitea.loadbalancer.server.port=3000"
```
## Backup Strategy
```bash
# Backup Gitea data
docker run --rm -v gitea-data:/data -v $(pwd):/backup alpine tar czf /backup/gitea-backup.tar.gz -C /data .
# Backup PostgreSQL database
docker exec gitea-db pg_dump -U gitea gitea > gitea-db-backup.sql
# Restore database
docker exec -i gitea-db psql -U gitea gitea < gitea-db-backup.sql
# Restore Gitea data
docker run --rm -v gitea-data:/data -v $(pwd):/backup alpine tar xzf /backup/gitea-backup.tar.gz -C /data
# Restart after restore
docker-compose restart gitea
```
## Performance Optimization
```yaml
# For better performance
environment:
- GITEA__cache__ENABLED=true
- GITEA__cache__ADAPTER=redis
- GITEA__cache__HOST=redis://redis:6379/0
- GITEA__queue__TYPE=redis
- GITEA__queue__CONN_STR=redis://redis:6379/1
# Add Redis service
redis:
image: redis:7-alpine
container_name: gitea-redis
restart: unless-stopped
volumes:
- gitea-redis:/data
networks:
- gitea-network
```
## Security
### SSH Keys
```bash
# Generate SSH key pair
ssh-keygen -t ed25519 -C "gitea@yourdomain.com"
# Add to Gitea admin settings
# Configure in app.ini
[ssh]
MINIMUM_KEY_SIZE = 2048
AUTHORIZED_KEYS_ALLOW = true
```
### Access Control
```yaml
environment:
- GITEA__service__DISABLE_REGISTRATION=true
- GITEA__service__REQUIRE_SIGNIN_VIEW=true
- GITEA__security__LOGIN_REMEMBER_DAYS=30
- GITEA__security__COOKIE_USERNAME=git
- GITEA__security__COOKIE_REMEMBER_NAME=gitea_incredible
```
### Two-Factor Authentication
```yaml
environment:
- GITEA__security__TWO_FACTOR_ENABLED=true
- GITEA__security__TWO_FACTOR_REQUIRE_SIGN_IN=true
```
## Monitoring
### Health Checks
```bash
# Check Gitea health
curl http://localhost:3000/api/v1/version
# Check database connection
docker exec gitea-db pg_isready -U gitea
```
### Logs
```bash
# View logs
docker-compose logs -f gitea
# Check specific logs
docker exec gitea tail -f /data/gitea/log/gitea.log
```
## Troubleshooting
- **SSH connection issues**: Check SSH key configuration
- **Database connection**: Verify PostgreSQL settings
- **Performance problems**: Monitor resource usage
- **Email issues**: Check SMTP configuration
- **Repository access**: Verify permissions
## Maintenance
```bash
# Restart services
docker-compose restart
# Update images
docker-compose pull && docker-compose up -d
# Clean up old data
docker exec gitea gitea admin cleanup
# Check repository integrity
docker exec gitea gitea admin repo check
```
## Advanced Features
### LFS (Large File Storage)
```yaml
environment:
- GITEA__server__LFS_START_SERVER=true
- GITEA__server__LFS_JWT_SECRET=your-lfs-jwt-secret
# Install LFS client
git lfs install
# Track large files
git lfs track "*.zip"
git add .gitattributes
git commit -m "Add LFS tracking"
```
### Mirror Repositories
```bash
# Create mirror
curl -X POST http://localhost:3000/api/v1/repos/migrate \
-H "Authorization: token YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"clone_addr":"https://github.com/user/repo.git","repo_name":"my-mirror","mirror":true}'
```
### Webhooks
```bash
# Create webhook
curl -X POST http://localhost:3000/api/v1/repos/username/repo/hooks \
-H "Authorization: token YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"type":"gitea","config":{"content_type":"json","url":"https://your-domain.com/webhook","events":["push"]}}'
```
## Integration Examples
### GitHub Migration
```bash
# Migrate from GitHub
curl -X POST http://localhost:3000/api/v1/repos/migrate \
-H "Authorization: token YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"clone_addr":"https://github.com/user/repo.git","repo_name":"repo","service_type":"github","auth_token":"GITHUB_TOKEN"}'
```
### CI/CD Integration
```yaml
# GitHub Actions compatible workflows
name: CI/CD Pipeline
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run tests
run: npm test
```
### Package Registry
```bash
# Setup npm registry
npm config set registry https://git.yourdomain.com/api/packages/npm
# Login to registry
npm login --registry https://git.yourdomain.com/api/packages/npm
# Publish package
npm publish
```
## Customization
### Custom Themes
```yaml
# In app.ini
[ui]
DEFAULT_THEME = gitea-auto
THEMES = gitea,gitea-auto,gitea-dark
# Custom CSS
[ui.meta]
AUTHOR = Your Name
DESCRIPTION = Your Git Service
KEYWORDS = git,forge,development
```
### Custom Pages
```yaml
# Custom home page
[ui]
CUSTOM_EMOJIS = :gitea:,:git:
SHOW_MILESTONES_DASHBOARD_PAGE = true
SHOW_ISSUES_SUMMARY_PAGE = true
```