mirror of
https://github.com/datahub-project/datahub.git
synced 2025-10-29 09:52:40 +00:00
155 lines
3.6 KiB
Markdown
155 lines
3.6 KiB
Markdown
|
|
# Base Path Support in DataHub Frontend
|
||
|
|
|
||
|
|
DataHub's React frontend supports runtime base path detection, allowing the same build to be deployed at different URL paths (e.g., `/` or `/datahub/`) without requiring rebuild or reconfiguration.
|
||
|
|
|
||
|
|
## How It Works
|
||
|
|
|
||
|
|
The base path is determined through a hierarchical detection system:
|
||
|
|
|
||
|
|
1. **Server Template** (Primary): The Play Framework backend injects the base path into the HTML template
|
||
|
|
2. **Config Endpoint** (Fallback): Attempts to fetch base path from `/config` or `config` endpoints
|
||
|
|
3. **Default** (Last Resort): Falls back to root path `/`
|
||
|
|
|
||
|
|
## Using Base Paths in Code
|
||
|
|
|
||
|
|
### For Asset URLs
|
||
|
|
|
||
|
|
Use the `resolveRuntimePath()` function to resolve any asset path:
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
import { resolveRuntimePath } from '../utils/runtimeBasePath';
|
||
|
|
|
||
|
|
// Resolve asset paths
|
||
|
|
const logoUrl = resolveRuntimePath('/assets/logo.png');
|
||
|
|
const apiUrl = resolveRuntimePath('/api/graphql');
|
||
|
|
|
||
|
|
// Use in components
|
||
|
|
<img src={resolveRuntimePath('/assets/icons/favicon.ico')} alt="DataHub" />
|
||
|
|
```
|
||
|
|
|
||
|
|
### For Navigation Links
|
||
|
|
|
||
|
|
Use React Router's relative paths or resolve absolute paths:
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
import { resolveRuntimePath } from '../utils/runtimeBasePath';
|
||
|
|
|
||
|
|
// For React Router navigation (preferred - automatic)
|
||
|
|
<Link to="/datasets">Datasets</Link>
|
||
|
|
|
||
|
|
// For absolute URLs when needed
|
||
|
|
<a href={resolveRuntimePath('/browse')}>Browse</a>
|
||
|
|
```
|
||
|
|
|
||
|
|
### For API Endpoints
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
import { resolveRuntimePath } from '../utils/runtimeBasePath';
|
||
|
|
|
||
|
|
// Resolve API endpoints
|
||
|
|
const endpoint = resolveRuntimePath('/api/v2/graphql');
|
||
|
|
fetch(endpoint, { ... });
|
||
|
|
```
|
||
|
|
|
||
|
|
## Configuration
|
||
|
|
|
||
|
|
### Server Configuration
|
||
|
|
|
||
|
|
The base path is configured in the backend Play application:
|
||
|
|
|
||
|
|
```hocon
|
||
|
|
# datahub-frontend/conf/application.conf
|
||
|
|
datahub.basePath = "/datahub"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Environment Variables
|
||
|
|
|
||
|
|
For containerized deployments:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Docker/Kubernetes
|
||
|
|
DATAHUB_BASE_PATH=/datahub
|
||
|
|
```
|
||
|
|
|
||
|
|
## Examples
|
||
|
|
|
||
|
|
### Development
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Serve at root
|
||
|
|
yarn start # Available at http://localhost:3000/
|
||
|
|
|
||
|
|
# Serve at subpath
|
||
|
|
yarn preview --base /datahub # Available at http://localhost:3000/datahub/
|
||
|
|
```
|
||
|
|
|
||
|
|
### Production Deployment
|
||
|
|
|
||
|
|
**At Root Path:**
|
||
|
|
|
||
|
|
```bash
|
||
|
|
DATAHUB_BASE_PATH="" docker run datahub-frontend
|
||
|
|
# Accessible at: https://datahub.company.com/
|
||
|
|
```
|
||
|
|
|
||
|
|
or unset
|
||
|
|
|
||
|
|
```
|
||
|
|
unset DATAHUB_BASE_PATH
|
||
|
|
docker run datahub-frontend
|
||
|
|
```
|
||
|
|
|
||
|
|
**At Subpath:**
|
||
|
|
|
||
|
|
```bash
|
||
|
|
DATAHUB_BASE_PATH=/datahub docker run datahub-frontend
|
||
|
|
# Accessible at: https://company.com/datahub/
|
||
|
|
```
|
||
|
|
|
||
|
|
## Browser Support
|
||
|
|
|
||
|
|
The implementation uses standard HTML `<base>` tags and modern JavaScript features:
|
||
|
|
|
||
|
|
- All modern browsers (Chrome 60+, Firefox 60+, Safari 12+, Edge 79+)
|
||
|
|
- Progressive enhancement with fallback detection
|
||
|
|
|
||
|
|
## Troubleshooting
|
||
|
|
|
||
|
|
### Assets Not Loading
|
||
|
|
|
||
|
|
1. Check browser console for 404 errors
|
||
|
|
2. Verify `window.__DATAHUB_BASE_PATH__` is set correctly
|
||
|
|
3. Ensure all asset references use `resolveRuntimePath()`
|
||
|
|
|
||
|
|
### Incorrect Redirects
|
||
|
|
|
||
|
|
1. Check that authentication endpoints use resolved paths
|
||
|
|
2. Verify React Router basename configuration
|
||
|
|
3. Test config endpoint accessibility
|
||
|
|
|
||
|
|
### Development Issues
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Clear cache and rebuild
|
||
|
|
yarn clean
|
||
|
|
yarn build
|
||
|
|
|
||
|
|
# Check base path detection
|
||
|
|
console.log(window.__DATAHUB_BASE_PATH__);
|
||
|
|
```
|
||
|
|
|
||
|
|
## Implementation Details
|
||
|
|
|
||
|
|
- **HTML Template**: `datahub-frontend/app/views/index.scala.html`
|
||
|
|
- **Runtime Utility**: `src/utils/runtimeBasePath.ts`
|
||
|
|
- **Asset Resolution**: All `src/` files using `resolveRuntimePath()`
|
||
|
|
- **Server Handler**: `datahub-frontend/app/controllers/Application.java`
|
||
|
|
|
||
|
|
The system automatically handles:
|
||
|
|
|
||
|
|
- Favicon and manifest paths
|
||
|
|
- Main application JS/CSS assets
|
||
|
|
- Platform logos and theme assets
|
||
|
|
- API endpoint resolution
|
||
|
|
- Authentication redirects
|