mirror of
https://github.com/RayLabsHQ/gitea-mirror.git
synced 2026-03-14 06:23:01 +03:00
Merge pull request #183 from RayLabsHQ/codex/issue-154-external-gitea-url
Add optional external Gitea URL for UI links
This commit is contained in:
@@ -67,6 +67,7 @@ DOCKER_TAG=latest
|
|||||||
|
|
||||||
# Basic Gitea Settings
|
# Basic Gitea Settings
|
||||||
# GITEA_URL=http://gitea:3000
|
# GITEA_URL=http://gitea:3000
|
||||||
|
# GITEA_EXTERNAL_URL=https://gitea.example.com # Optional: used only for UI links
|
||||||
# GITEA_TOKEN=your-local-gitea-token
|
# GITEA_TOKEN=your-local-gitea-token
|
||||||
# GITEA_USERNAME=your-local-gitea-username
|
# GITEA_USERNAME=your-local-gitea-username
|
||||||
# GITEA_ORGANIZATION=github-mirrors # Default organization for single-org strategy
|
# GITEA_ORGANIZATION=github-mirrors # Default organization for single-org strategy
|
||||||
|
|||||||
@@ -88,6 +88,7 @@ Settings for the destination Gitea instance.
|
|||||||
| Variable | Description | Default | Options |
|
| Variable | Description | Default | Options |
|
||||||
|----------|-------------|---------|---------|
|
|----------|-------------|---------|---------|
|
||||||
| `GITEA_URL` | Gitea instance URL | - | Valid URL |
|
| `GITEA_URL` | Gitea instance URL | - | Valid URL |
|
||||||
|
| `GITEA_EXTERNAL_URL` | Optional external/browser URL used for dashboard links. API and mirroring still use `GITEA_URL`. | - | Valid URL |
|
||||||
| `GITEA_TOKEN` | Gitea access token | - | - |
|
| `GITEA_TOKEN` | Gitea access token | - | - |
|
||||||
| `GITEA_USERNAME` | Gitea username | - | - |
|
| `GITEA_USERNAME` | Gitea username | - | - |
|
||||||
| `GITEA_ORGANIZATION` | Default organization for single-org strategy | `github-mirrors` | Any string |
|
| `GITEA_ORGANIZATION` | Default organization for single-org strategy | `github-mirrors` | Any string |
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ export function ConfigTabs() {
|
|||||||
},
|
},
|
||||||
giteaConfig: {
|
giteaConfig: {
|
||||||
url: '',
|
url: '',
|
||||||
|
externalUrl: '',
|
||||||
username: '',
|
username: '',
|
||||||
token: '',
|
token: '',
|
||||||
organization: 'github-mirrors',
|
organization: 'github-mirrors',
|
||||||
|
|||||||
@@ -195,6 +195,27 @@ export function GiteaConfigForm({ config, setConfig, onAutoSave, isAutoSaving, g
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label
|
||||||
|
htmlFor="gitea-external-url"
|
||||||
|
className="block text-sm font-medium mb-1.5"
|
||||||
|
>
|
||||||
|
Gitea External URL (optional)
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
id="gitea-external-url"
|
||||||
|
name="externalUrl"
|
||||||
|
type="url"
|
||||||
|
value={config.externalUrl || ""}
|
||||||
|
onChange={handleChange}
|
||||||
|
className="w-full rounded-md border border-input bg-background px-3 py-2 text-sm shadow-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
|
||||||
|
placeholder="https://gitea.example.com"
|
||||||
|
/>
|
||||||
|
<p className="text-xs text-muted-foreground mt-1">
|
||||||
|
Used only for dashboard links. API sync still uses Gitea URL.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label
|
<label
|
||||||
htmlFor="gitea-token"
|
htmlFor="gitea-token"
|
||||||
|
|||||||
@@ -15,7 +15,8 @@ export function RepositoryList({ repositories }: RepositoryListProps) {
|
|||||||
|
|
||||||
// Helper function to construct Gitea repository URL
|
// Helper function to construct Gitea repository URL
|
||||||
const getGiteaRepoUrl = (repository: Repository): string | null => {
|
const getGiteaRepoUrl = (repository: Repository): string | null => {
|
||||||
if (!giteaConfig?.url) {
|
const rawBaseUrl = giteaConfig?.externalUrl || giteaConfig?.url;
|
||||||
|
if (!rawBaseUrl) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -38,9 +39,9 @@ export function RepositoryList({ repositories }: RepositoryListProps) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Ensure the base URL doesn't have a trailing slash
|
// Ensure the base URL doesn't have a trailing slash
|
||||||
const baseUrl = giteaConfig.url.endsWith('/')
|
const baseUrl = rawBaseUrl.endsWith("/")
|
||||||
? giteaConfig.url.slice(0, -1)
|
? rawBaseUrl.slice(0, -1)
|
||||||
: giteaConfig.url;
|
: rawBaseUrl;
|
||||||
|
|
||||||
return `${baseUrl}/${repoPath}`;
|
return `${baseUrl}/${repoPath}`;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -67,7 +67,8 @@ export function OrganizationList({
|
|||||||
|
|
||||||
// Helper function to construct Gitea organization URL
|
// Helper function to construct Gitea organization URL
|
||||||
const getGiteaOrgUrl = (organization: Organization): string | null => {
|
const getGiteaOrgUrl = (organization: Organization): string | null => {
|
||||||
if (!giteaConfig?.url) {
|
const rawBaseUrl = giteaConfig?.externalUrl || giteaConfig?.url;
|
||||||
|
if (!rawBaseUrl) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,9 +85,9 @@ export function OrganizationList({
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Ensure the base URL doesn't have a trailing slash
|
// Ensure the base URL doesn't have a trailing slash
|
||||||
const baseUrl = giteaConfig.url.endsWith('/')
|
const baseUrl = rawBaseUrl.endsWith("/")
|
||||||
? giteaConfig.url.slice(0, -1)
|
? rawBaseUrl.slice(0, -1)
|
||||||
: giteaConfig.url;
|
: rawBaseUrl;
|
||||||
|
|
||||||
return `${baseUrl}/${orgName}`;
|
return `${baseUrl}/${orgName}`;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ export const githubConfigSchema = z.object({
|
|||||||
|
|
||||||
export const giteaConfigSchema = z.object({
|
export const giteaConfigSchema = z.object({
|
||||||
url: z.url(),
|
url: z.url(),
|
||||||
|
externalUrl: z.url().optional(),
|
||||||
token: z.string(),
|
token: z.string(),
|
||||||
defaultOwner: z.string(),
|
defaultOwner: z.string(),
|
||||||
organization: z.string().optional(),
|
organization: z.string().optional(),
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ interface EnvConfig {
|
|||||||
};
|
};
|
||||||
gitea: {
|
gitea: {
|
||||||
url?: string;
|
url?: string;
|
||||||
|
externalUrl?: string;
|
||||||
username?: string;
|
username?: string;
|
||||||
token?: string;
|
token?: string;
|
||||||
organization?: string;
|
organization?: string;
|
||||||
@@ -118,6 +119,7 @@ function parseEnvConfig(): EnvConfig {
|
|||||||
},
|
},
|
||||||
gitea: {
|
gitea: {
|
||||||
url: process.env.GITEA_URL,
|
url: process.env.GITEA_URL,
|
||||||
|
externalUrl: process.env.GITEA_EXTERNAL_URL,
|
||||||
username: process.env.GITEA_USERNAME,
|
username: process.env.GITEA_USERNAME,
|
||||||
token: process.env.GITEA_TOKEN,
|
token: process.env.GITEA_TOKEN,
|
||||||
organization: process.env.GITEA_ORGANIZATION,
|
organization: process.env.GITEA_ORGANIZATION,
|
||||||
@@ -267,6 +269,7 @@ export async function initializeConfigFromEnv(): Promise<void> {
|
|||||||
// Build Gitea config
|
// Build Gitea config
|
||||||
const giteaConfig = {
|
const giteaConfig = {
|
||||||
url: envConfig.gitea.url || existingConfig?.[0]?.giteaConfig?.url || '',
|
url: envConfig.gitea.url || existingConfig?.[0]?.giteaConfig?.url || '',
|
||||||
|
externalUrl: envConfig.gitea.externalUrl || existingConfig?.[0]?.giteaConfig?.externalUrl || undefined,
|
||||||
token: envConfig.gitea.token ? encrypt(envConfig.gitea.token) : existingConfig?.[0]?.giteaConfig?.token || '',
|
token: envConfig.gitea.token ? encrypt(envConfig.gitea.token) : existingConfig?.[0]?.giteaConfig?.token || '',
|
||||||
defaultOwner: envConfig.gitea.username || existingConfig?.[0]?.giteaConfig?.defaultOwner || '',
|
defaultOwner: envConfig.gitea.username || existingConfig?.[0]?.giteaConfig?.defaultOwner || '',
|
||||||
organization: envConfig.gitea.organization || existingConfig?.[0]?.giteaConfig?.organization || undefined,
|
organization: envConfig.gitea.organization || existingConfig?.[0]?.giteaConfig?.organization || undefined,
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ export interface DefaultConfigOptions {
|
|||||||
githubToken?: string;
|
githubToken?: string;
|
||||||
githubUsername?: string;
|
githubUsername?: string;
|
||||||
giteaUrl?: string;
|
giteaUrl?: string;
|
||||||
|
giteaExternalUrl?: string;
|
||||||
giteaToken?: string;
|
giteaToken?: string;
|
||||||
giteaUsername?: string;
|
giteaUsername?: string;
|
||||||
scheduleEnabled?: boolean;
|
scheduleEnabled?: boolean;
|
||||||
@@ -38,6 +39,8 @@ export async function createDefaultConfig({ userId, envOverrides = {} }: Default
|
|||||||
const githubToken = envOverrides.githubToken || process.env.GITHUB_TOKEN || "";
|
const githubToken = envOverrides.githubToken || process.env.GITHUB_TOKEN || "";
|
||||||
const githubUsername = envOverrides.githubUsername || process.env.GITHUB_USERNAME || "";
|
const githubUsername = envOverrides.githubUsername || process.env.GITHUB_USERNAME || "";
|
||||||
const giteaUrl = envOverrides.giteaUrl || process.env.GITEA_URL || "";
|
const giteaUrl = envOverrides.giteaUrl || process.env.GITEA_URL || "";
|
||||||
|
const giteaExternalUrl =
|
||||||
|
envOverrides.giteaExternalUrl || process.env.GITEA_EXTERNAL_URL || "";
|
||||||
const giteaToken = envOverrides.giteaToken || process.env.GITEA_TOKEN || "";
|
const giteaToken = envOverrides.giteaToken || process.env.GITEA_TOKEN || "";
|
||||||
const giteaUsername = envOverrides.giteaUsername || process.env.GITEA_USERNAME || "";
|
const giteaUsername = envOverrides.giteaUsername || process.env.GITEA_USERNAME || "";
|
||||||
|
|
||||||
@@ -77,6 +80,7 @@ export async function createDefaultConfig({ userId, envOverrides = {} }: Default
|
|||||||
},
|
},
|
||||||
giteaConfig: {
|
giteaConfig: {
|
||||||
url: giteaUrl,
|
url: giteaUrl,
|
||||||
|
externalUrl: giteaExternalUrl || undefined,
|
||||||
token: giteaToken ? encrypt(giteaToken) : "",
|
token: giteaToken ? encrypt(giteaToken) : "",
|
||||||
defaultOwner: giteaUsername,
|
defaultOwner: giteaUsername,
|
||||||
mirrorInterval: "8h",
|
mirrorInterval: "8h",
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ export function mapUiToDbConfig(
|
|||||||
// Map Gitea config to match database schema
|
// Map Gitea config to match database schema
|
||||||
const dbGiteaConfig: DbGiteaConfig = {
|
const dbGiteaConfig: DbGiteaConfig = {
|
||||||
url: giteaConfig.url,
|
url: giteaConfig.url,
|
||||||
|
externalUrl: giteaConfig.externalUrl?.trim() || undefined,
|
||||||
token: giteaConfig.token,
|
token: giteaConfig.token,
|
||||||
defaultOwner: giteaConfig.username, // Map username to defaultOwner
|
defaultOwner: giteaConfig.username, // Map username to defaultOwner
|
||||||
organization: giteaConfig.organization, // Add organization field
|
organization: giteaConfig.organization, // Add organization field
|
||||||
@@ -127,6 +128,7 @@ export function mapDbToUiConfig(dbConfig: any): {
|
|||||||
// Map from database Gitea config to UI fields
|
// Map from database Gitea config to UI fields
|
||||||
const giteaConfig: GiteaConfig = {
|
const giteaConfig: GiteaConfig = {
|
||||||
url: dbConfig.giteaConfig?.url || "",
|
url: dbConfig.giteaConfig?.url || "",
|
||||||
|
externalUrl: dbConfig.giteaConfig?.externalUrl || "",
|
||||||
username: dbConfig.giteaConfig?.defaultOwner || "", // Map defaultOwner to username
|
username: dbConfig.giteaConfig?.defaultOwner || "", // Map defaultOwner to username
|
||||||
token: dbConfig.giteaConfig?.token || "",
|
token: dbConfig.giteaConfig?.token || "",
|
||||||
organization: dbConfig.githubConfig?.defaultOrg || "github-mirrors", // Get from GitHub config
|
organization: dbConfig.githubConfig?.defaultOrg || "github-mirrors", // Get from GitHub config
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ export type StarredReposMode = "dedicated-org" | "preserve-owner";
|
|||||||
|
|
||||||
export interface GiteaConfig {
|
export interface GiteaConfig {
|
||||||
url: string;
|
url: string;
|
||||||
|
externalUrl?: string;
|
||||||
username: string;
|
username: string;
|
||||||
token: string;
|
token: string;
|
||||||
organization: string;
|
organization: string;
|
||||||
|
|||||||
Reference in New Issue
Block a user