mirror of
https://github.com/RayLabsHQ/gitea-mirror.git
synced 2025-12-08 04:26:44 +03:00
Docs updated | added some options
This commit is contained in:
48
CHANGELOG.md
48
CHANGELOG.md
@@ -7,6 +7,54 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Git LFS (Large File Storage) support for mirroring (#74)
|
||||||
|
- New UI checkbox "Mirror LFS" in Mirror Options
|
||||||
|
- Automatic LFS object transfer when enabled
|
||||||
|
- Documentation for Gitea server LFS requirements
|
||||||
|
- Repository "ignored" status to skip specific repos from mirroring (#75)
|
||||||
|
- Repositories can be marked as ignored to exclude from all operations
|
||||||
|
- Scheduler automatically skips ignored repositories
|
||||||
|
- Enhanced error handling for all metadata mirroring operations
|
||||||
|
- Individual try-catch blocks for issues, PRs, labels, milestones
|
||||||
|
- Operations continue even if individual components fail
|
||||||
|
- Support for BETTER_AUTH_TRUSTED_ORIGINS environment variable
|
||||||
|
- Comprehensive fix report documentation
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Fixed metadata mirroring authentication errors (#68)
|
||||||
|
- Changed field checking from `username` to `defaultOwner` in metadata functions
|
||||||
|
- Added proper field validation for all metadata operations
|
||||||
|
- Fixed automatic mirroring scheduler issues (#72)
|
||||||
|
- Improved interval parsing and error handling
|
||||||
|
- Fixed OIDC authentication 500 errors with Authentik (#73)
|
||||||
|
- Added URL validation in Better Auth configuration
|
||||||
|
- Prevented undefined URL errors in auth callback
|
||||||
|
- Fixed SSL certificate handling in Docker (#48)
|
||||||
|
- NODE_EXTRA_CA_CERTS no longer gets overridden
|
||||||
|
- Proper preservation of custom CA certificates
|
||||||
|
- Fixed reverse proxy base domain issues (#63)
|
||||||
|
- Better handling of custom subdomains
|
||||||
|
- Support for trusted origins configuration
|
||||||
|
- Fixed configuration persistence bugs (#49)
|
||||||
|
- Config merging now preserves all fields
|
||||||
|
- Retention period settings no longer reset
|
||||||
|
- Fixed sync failures with improved error handling (#51)
|
||||||
|
- Comprehensive error wrapping for all operations
|
||||||
|
- Better error messages and logging
|
||||||
|
|
||||||
|
### Improved
|
||||||
|
- Enhanced logging throughout metadata mirroring operations
|
||||||
|
- Detailed success/failure messages for each component
|
||||||
|
- Configuration details logged for debugging
|
||||||
|
- Better configuration state management
|
||||||
|
- Proper merging of loaded configs with defaults
|
||||||
|
- Preservation of user settings on refresh
|
||||||
|
- Updated documentation
|
||||||
|
- Added LFS feature documentation
|
||||||
|
- Updated README with new features
|
||||||
|
- Enhanced CLAUDE.md with repository status definitions
|
||||||
|
|
||||||
## [3.2.6] - 2025-08-09
|
## [3.2.6] - 2025-08-09
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|||||||
16
CLAUDE.md
16
CLAUDE.md
@@ -180,6 +180,9 @@ export async function POST({ request }: APIContext) {
|
|||||||
|
|
||||||
### Mirror Options (UI Fields)
|
### Mirror Options (UI Fields)
|
||||||
- **mirrorReleases**: Mirror GitHub releases to Gitea
|
- **mirrorReleases**: Mirror GitHub releases to Gitea
|
||||||
|
- **mirrorLFS**: Mirror Git LFS (Large File Storage) objects
|
||||||
|
- Requires LFS enabled on Gitea server (LFS_START_SERVER = true)
|
||||||
|
- Requires Git v2.1.2+ on server
|
||||||
- **mirrorMetadata**: Enable metadata mirroring (master toggle)
|
- **mirrorMetadata**: Enable metadata mirroring (master toggle)
|
||||||
- **metadataComponents** (only available when mirrorMetadata is enabled):
|
- **metadataComponents** (only available when mirrorMetadata is enabled):
|
||||||
- **issues**: Mirror issues
|
- **issues**: Mirror issues
|
||||||
@@ -192,6 +195,19 @@ export async function POST({ request }: APIContext) {
|
|||||||
- **skipForks**: Skip forked repositories (default: false)
|
- **skipForks**: Skip forked repositories (default: false)
|
||||||
- **skipStarredIssues**: Skip issues for starred repositories (default: false) - enables "Lightweight mode" for starred repos
|
- **skipStarredIssues**: Skip issues for starred repositories (default: false) - enables "Lightweight mode" for starred repos
|
||||||
|
|
||||||
|
### Repository Statuses
|
||||||
|
Repositories can have the following statuses:
|
||||||
|
- **imported**: Repository discovered from GitHub
|
||||||
|
- **mirroring**: Currently being mirrored to Gitea
|
||||||
|
- **mirrored**: Successfully mirrored
|
||||||
|
- **syncing**: Repository being synchronized
|
||||||
|
- **synced**: Successfully synchronized
|
||||||
|
- **failed**: Mirror/sync operation failed
|
||||||
|
- **skipped**: Skipped due to filters or conditions
|
||||||
|
- **ignored**: User explicitly marked to ignore (won't be mirrored/synced)
|
||||||
|
- **deleting**: Repository being deleted
|
||||||
|
- **deleted**: Repository deleted
|
||||||
|
|
||||||
### Authentication Configuration
|
### Authentication Configuration
|
||||||
|
|
||||||
#### SSO Provider Configuration
|
#### SSO Provider Configuration
|
||||||
|
|||||||
30
README.md
30
README.md
@@ -35,9 +35,13 @@ First user signup becomes admin. Configure GitHub and Gitea through the web inte
|
|||||||
- 🔁 Mirror public, private, and starred GitHub repos to Gitea
|
- 🔁 Mirror public, private, and starred GitHub repos to Gitea
|
||||||
- 🏢 Mirror entire organizations with flexible strategies
|
- 🏢 Mirror entire organizations with flexible strategies
|
||||||
- 🎯 Custom destination control for repos and organizations
|
- 🎯 Custom destination control for repos and organizations
|
||||||
|
- 📦 **Git LFS support** - Mirror large files with Git LFS
|
||||||
|
- 📝 **Metadata mirroring** - Issues, PRs, labels, milestones, wiki
|
||||||
|
- 🚫 **Repository ignore** - Mark specific repos to skip
|
||||||
- 🔐 Secure authentication with Better Auth (email/password, SSO, OIDC)
|
- 🔐 Secure authentication with Better Auth (email/password, SSO, OIDC)
|
||||||
- 📊 Real-time dashboard with activity logs
|
- 📊 Real-time dashboard with activity logs
|
||||||
- ⏱️ Scheduled automatic mirroring
|
- ⏱️ Scheduled automatic mirroring with flexible intervals
|
||||||
|
- 🗑️ Automatic database cleanup with configurable retention
|
||||||
- 🐳 Dockerized with multi-arch support (AMD64/ARM64)
|
- 🐳 Dockerized with multi-arch support (AMD64/ARM64)
|
||||||
|
|
||||||
## 📸 Screenshots
|
## 📸 Screenshots
|
||||||
@@ -176,6 +180,30 @@ bun run dev
|
|||||||
- Override individual repository destinations in the table view
|
- Override individual repository destinations in the table view
|
||||||
- Starred repositories automatically go to a dedicated organization
|
- Starred repositories automatically go to a dedicated organization
|
||||||
|
|
||||||
|
## Advanced Features
|
||||||
|
|
||||||
|
### Git LFS (Large File Storage)
|
||||||
|
Mirror Git LFS objects along with your repositories:
|
||||||
|
- Enable "Mirror LFS" option in Settings → Mirror Options
|
||||||
|
- Requires Gitea server with LFS enabled (`LFS_START_SERVER = true`)
|
||||||
|
- Requires Git v2.1.2+ on the server
|
||||||
|
|
||||||
|
### Metadata Mirroring
|
||||||
|
Transfer complete repository metadata from GitHub to Gitea:
|
||||||
|
- **Issues** - Mirror all issues with comments and labels
|
||||||
|
- **Pull Requests** - Transfer PR discussions to Gitea
|
||||||
|
- **Labels** - Preserve repository labels
|
||||||
|
- **Milestones** - Keep project milestones
|
||||||
|
- **Wiki** - Mirror wiki content
|
||||||
|
- **Releases** - Transfer GitHub releases with assets
|
||||||
|
|
||||||
|
Enable in Settings → Mirror Options → Mirror metadata
|
||||||
|
|
||||||
|
### Repository Management
|
||||||
|
- **Ignore Status** - Mark repositories to skip from mirroring
|
||||||
|
- **Automatic Cleanup** - Configure retention period for activity logs
|
||||||
|
- **Scheduled Sync** - Set custom intervals for automatic mirroring
|
||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
|
|
||||||
### Reverse Proxy Configuration
|
### Reverse Proxy Configuration
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ Essential application settings required for running Gitea Mirror.
|
|||||||
| `DATABASE_URL` | Database connection URL | `sqlite://data/gitea-mirror.db` | No |
|
| `DATABASE_URL` | Database connection URL | `sqlite://data/gitea-mirror.db` | No |
|
||||||
| `BETTER_AUTH_SECRET` | Secret key for session signing (generate with: `openssl rand -base64 32`) | - | Yes |
|
| `BETTER_AUTH_SECRET` | Secret key for session signing (generate with: `openssl rand -base64 32`) | - | Yes |
|
||||||
| `BETTER_AUTH_URL` | Base URL for authentication | `http://localhost:4321` | No |
|
| `BETTER_AUTH_URL` | Base URL for authentication | `http://localhost:4321` | No |
|
||||||
|
| `BETTER_AUTH_TRUSTED_ORIGINS` | Comma-separated list of trusted origins for OIDC | - | No |
|
||||||
| `ENCRYPTION_SECRET` | Optional encryption key for tokens (generate with: `openssl rand -base64 48`) | - | No |
|
| `ENCRYPTION_SECRET` | Optional encryption key for tokens (generate with: `openssl rand -base64 48`) | - | No |
|
||||||
|
|
||||||
## GitHub Configuration
|
## GitHub Configuration
|
||||||
@@ -84,7 +85,7 @@ Settings for the destination Gitea instance.
|
|||||||
|----------|-------------|---------|---------|
|
|----------|-------------|---------|---------|
|
||||||
| `GITEA_ORG_VISIBILITY` | Default organization visibility | `public` | `public`, `private`, `limited`, `default` |
|
| `GITEA_ORG_VISIBILITY` | Default organization visibility | `public` | `public`, `private`, `limited`, `default` |
|
||||||
| `GITEA_MIRROR_INTERVAL` | Mirror sync interval (automatically enables scheduler) | `8h` | Duration string (e.g., `30m`, `1h`, `8h`, `24h`) |
|
| `GITEA_MIRROR_INTERVAL` | Mirror sync interval (automatically enables scheduler) | `8h` | Duration string (e.g., `30m`, `1h`, `8h`, `24h`) |
|
||||||
| `GITEA_LFS` | Enable LFS support | `false` | `true`, `false` |
|
| `GITEA_LFS` | Enable LFS support (requires LFS on Gitea server) | `false` | `true`, `false` |
|
||||||
| `GITEA_CREATE_ORG` | Auto-create organizations | `true` | `true`, `false` |
|
| `GITEA_CREATE_ORG` | Auto-create organizations | `true` | `true`, `false` |
|
||||||
| `GITEA_PRESERVE_VISIBILITY` | Preserve GitHub repo visibility in Gitea | `false` | `true`, `false` |
|
| `GITEA_PRESERVE_VISIBILITY` | Preserve GitHub repo visibility in Gitea | `false` | `true`, `false` |
|
||||||
|
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ export function ConfigTabs() {
|
|||||||
},
|
},
|
||||||
mirrorOptions: {
|
mirrorOptions: {
|
||||||
mirrorReleases: false,
|
mirrorReleases: false,
|
||||||
|
mirrorLFS: false,
|
||||||
mirrorMetadata: false,
|
mirrorMetadata: false,
|
||||||
metadataComponents: {
|
metadataComponents: {
|
||||||
issues: false,
|
issues: false,
|
||||||
@@ -470,10 +471,14 @@ export function ConfigTabs() {
|
|||||||
response.giteaConfig || config.giteaConfig,
|
response.giteaConfig || config.giteaConfig,
|
||||||
scheduleConfig:
|
scheduleConfig:
|
||||||
response.scheduleConfig || config.scheduleConfig,
|
response.scheduleConfig || config.scheduleConfig,
|
||||||
cleanupConfig:
|
cleanupConfig: {
|
||||||
response.cleanupConfig || config.cleanupConfig,
|
...config.cleanupConfig,
|
||||||
mirrorOptions:
|
...response.cleanupConfig, // Merge to preserve all fields
|
||||||
response.mirrorOptions || config.mirrorOptions,
|
},
|
||||||
|
mirrorOptions: {
|
||||||
|
...config.mirrorOptions,
|
||||||
|
...response.mirrorOptions, // Merge to preserve all fields including new mirrorLFS
|
||||||
|
},
|
||||||
advancedOptions:
|
advancedOptions:
|
||||||
response.advancedOptions || config.advancedOptions,
|
response.advancedOptions || config.advancedOptions,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -98,6 +98,32 @@ export function MirrorOptionsForm({
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div className="flex items-center">
|
||||||
|
<Checkbox
|
||||||
|
id="mirror-lfs"
|
||||||
|
checked={config.mirrorLFS}
|
||||||
|
onCheckedChange={(checked) =>
|
||||||
|
handleChange("mirrorLFS", Boolean(checked))
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
<label
|
||||||
|
htmlFor="mirror-lfs"
|
||||||
|
className="ml-2 text-sm select-none flex items-center"
|
||||||
|
>
|
||||||
|
Mirror LFS (Large File Storage)
|
||||||
|
<Tooltip>
|
||||||
|
<TooltipTrigger asChild>
|
||||||
|
<span className="ml-1 cursor-pointer text-muted-foreground">
|
||||||
|
<Info size={14} />
|
||||||
|
</span>
|
||||||
|
</TooltipTrigger>
|
||||||
|
<TooltipContent side="right" className="max-w-xs text-xs">
|
||||||
|
Mirror Git LFS objects. Requires LFS to be enabled on your Gitea server and Git v2.1.2+
|
||||||
|
</TooltipContent>
|
||||||
|
</Tooltip>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="flex items-center">
|
<div className="flex items-center">
|
||||||
<Checkbox
|
<Checkbox
|
||||||
id="mirror-metadata"
|
id="mirror-metadata"
|
||||||
|
|||||||
@@ -418,6 +418,7 @@ export const mirrorGithubRepoToGitea = async ({
|
|||||||
repo_name: repository.name,
|
repo_name: repository.name,
|
||||||
mirror: true,
|
mirror: true,
|
||||||
wiki: config.giteaConfig?.wiki || false, // will mirror wiki if it exists
|
wiki: config.giteaConfig?.wiki || false, // will mirror wiki if it exists
|
||||||
|
lfs: config.giteaConfig?.lfs || false, // Enable LFS mirroring if configured
|
||||||
private: repository.isPrivate,
|
private: repository.isPrivate,
|
||||||
repo_owner: repoOwner,
|
repo_owner: repoOwner,
|
||||||
description: "",
|
description: "",
|
||||||
@@ -711,6 +712,7 @@ export async function mirrorGitHubRepoToGiteaOrg({
|
|||||||
repo_name: repository.name,
|
repo_name: repository.name,
|
||||||
mirror: true,
|
mirror: true,
|
||||||
wiki: config.giteaConfig?.wiki || false, // will mirror wiki if it exists
|
wiki: config.giteaConfig?.wiki || false, // will mirror wiki if it exists
|
||||||
|
lfs: config.giteaConfig?.lfs || false, // Enable LFS mirroring if configured
|
||||||
private: repository.isPrivate,
|
private: repository.isPrivate,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ export function mapUiToDbConfig(
|
|||||||
|
|
||||||
// Mirror interval and options
|
// Mirror interval and options
|
||||||
mirrorInterval: "8h", // Default value, could be made configurable
|
mirrorInterval: "8h", // Default value, could be made configurable
|
||||||
lfs: false, // Not in UI yet
|
lfs: mirrorOptions.mirrorLFS || false, // LFS mirroring option
|
||||||
wiki: mirrorOptions.mirrorMetadata && mirrorOptions.metadataComponents.wiki,
|
wiki: mirrorOptions.mirrorMetadata && mirrorOptions.metadataComponents.wiki,
|
||||||
|
|
||||||
// Visibility settings
|
// Visibility settings
|
||||||
@@ -132,6 +132,7 @@ export function mapDbToUiConfig(dbConfig: any): {
|
|||||||
// Map mirror options from various database fields
|
// Map mirror options from various database fields
|
||||||
const mirrorOptions: MirrorOptions = {
|
const mirrorOptions: MirrorOptions = {
|
||||||
mirrorReleases: dbConfig.giteaConfig?.mirrorReleases || false,
|
mirrorReleases: dbConfig.giteaConfig?.mirrorReleases || false,
|
||||||
|
mirrorLFS: dbConfig.giteaConfig?.lfs || false,
|
||||||
mirrorMetadata: dbConfig.giteaConfig?.mirrorMetadata || false,
|
mirrorMetadata: dbConfig.giteaConfig?.mirrorMetadata || false,
|
||||||
metadataComponents: {
|
metadataComponents: {
|
||||||
issues: dbConfig.giteaConfig?.mirrorIssues || false,
|
issues: dbConfig.giteaConfig?.mirrorIssues || false,
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ export interface GitHubConfig {
|
|||||||
|
|
||||||
export interface MirrorOptions {
|
export interface MirrorOptions {
|
||||||
mirrorReleases: boolean;
|
mirrorReleases: boolean;
|
||||||
|
mirrorLFS: boolean; // Mirror Git LFS objects
|
||||||
mirrorMetadata: boolean;
|
mirrorMetadata: boolean;
|
||||||
metadataComponents: {
|
metadataComponents: {
|
||||||
issues: boolean;
|
issues: boolean;
|
||||||
|
|||||||
Reference in New Issue
Block a user