mirror of
https://github.com/Dvorinka/Containr.git
synced 2026-06-03 20:12:58 +00:00
466 lines
10 KiB
Markdown
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
|
|
```
|