Skip to content

Commit 750cea7

Browse files
author
secus
committed
feat: implement kubernetes deployment system with worker queue
- Add deployment worker with background job processing - Integrate kubernetes service for k8s deployments - Update deployment models with job queue support - Add frontend pages for deployment management - Update database schema for deployment tracking - Configure deployment sender channel in app state
1 parent f7532d8 commit 750cea7

26 files changed

Lines changed: 2053 additions & 362 deletions

.sqlx/query-418ecaef4e8144de092974ac916d4cd62cf1ad745507e4f266a4b63de3d52333.json

Lines changed: 8 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.sqlx/query-6fd2256f4838df3a629d064ad4cf991dfd4ebd8250f347133741faad5e547e78.json

Lines changed: 17 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.sqlx/query-afe81e45436b88f983369c7c3527eace663e0f97d05ebe16712ba0cef8b8f85f.json

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ license = "MIT"
77
repository = "https://github.com/ngocbd/Open-Container-Engine"
88

99
[dependencies]
10+
1011
# Web framework
1112
axum = { version = "0.7", features = ["macros", "tracing"] }
1213
tokio = { version = "1.0", features = ["full"] }
@@ -15,7 +16,10 @@ tower-http = { version = "0.5", features = ["fs", "trace", "cors"] }
1516

1617
# Database
1718
sqlx = { version = "0.8", features = ["runtime-tokio-rustls", "postgres", "uuid", "chrono", "migrate"] }
18-
19+
# Kube client
20+
kube = { version = "2.0.1", features = ["runtime", "derive"] }
21+
k8s-openapi = { version = "0.26.0", features = ["latest", "schemars"] }
22+
schemars = { version = "1" }
1923
# Redis
2024
redis = { version = "0.25", features = ["tokio-comp"] }
2125

@@ -58,10 +62,6 @@ validator = { version = "0.18", features = ["derive"] }
5862
# Regex
5963
regex = "1.0"
6064

61-
# Kubernetes client (for container orchestration)
62-
kube = { version = "0.95", features = ["runtime", "derive"] }
63-
k8s-openapi = { version = "0.23", features = ["latest"] }
64-
6565
# OpenAPI documentation
6666
utoipa = { version = "4.0", features = ["axum_extras", "chrono", "uuid"] }
6767
utoipa-swagger-ui = { version = "4.0", features = ["axum"] }

apps/container-engine-frontend/package-lock.json

Lines changed: 34 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/container-engine-frontend/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@
1313
"@heroicons/react": "^2.2.0",
1414
"@tailwindcss/vite": "^4.1.13",
1515
"axios": "^1.12.2",
16+
"date-fns": "^4.1.0",
1617
"react": "^19.1.1",
1718
"react-dom": "^19.1.1",
1819
"react-router-dom": "^7.9.1",
20+
"react-toastify": "^11.0.5",
1921
"tailwindcss": "^4.1.13"
2022
},
2123
"devDependencies": {

apps/container-engine-frontend/src/App.tsx

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,27 +10,33 @@ import DeploymentDetailPage from './pages/DeploymentDetailPage';
1010
import ApiKeysPage from './pages/ApiKeysPage';
1111
import AccountSettingsPage from './pages/AccountSettingsPage';
1212
import ProtectedRoute from './components/ProtectedRoute';
13+
import { ToastContainer, toast } from 'react-toastify';
14+
import 'react-toastify/dist/ReactToastify.css';
1315

1416
function App() {
1517
return (
16-
<AuthProvider>
17-
<Router>
18-
<Routes>
19-
<Route path="/auth" element={<AuthPage />} />
20-
21-
{/* Protected Routes */}
22-
<Route path="/dashboard" element={<ProtectedRoute><DashboardPage /></ProtectedRoute>} />
23-
<Route path="/deployments" element={<ProtectedRoute><DeploymentsPage /></ProtectedRoute>} />
24-
<Route path="/deployments/new" element={<ProtectedRoute><NewDeploymentPage /></ProtectedRoute>} />
25-
<Route path="/deployments/:deploymentId" element={<ProtectedRoute><DeploymentDetailPage /></ProtectedRoute>} />
26-
<Route path="/api-keys" element={<ProtectedRoute><ApiKeysPage /></ProtectedRoute>} />
27-
<Route path="/settings" element={<ProtectedRoute><AccountSettingsPage /></ProtectedRoute>} />
28-
29-
{/* Default route */}
30-
<Route path="*" element={<Navigate to="/dashboard" />} />
31-
</Routes>
32-
</Router>
33-
</AuthProvider>
18+
<>
19+
<ToastContainer position="top-center" />
20+
<AuthProvider>
21+
<Router>
22+
<Routes>
23+
<Route path="/auth" element={<AuthPage />} />
24+
25+
{/* Protected Routes */}
26+
<Route path="/dashboard" element={<ProtectedRoute><DashboardPage /></ProtectedRoute>} />
27+
<Route path="/deployments" element={<ProtectedRoute><DeploymentsPage /></ProtectedRoute>} />
28+
<Route path="/deployments/new" element={<ProtectedRoute><NewDeploymentPage /></ProtectedRoute>} />
29+
<Route path="/deployments/:deploymentId" element={<ProtectedRoute><DeploymentDetailPage /></ProtectedRoute>} />
30+
<Route path="/api-keys" element={<ProtectedRoute><ApiKeysPage /></ProtectedRoute>} />
31+
<Route path="/settings" element={<ProtectedRoute><AccountSettingsPage /></ProtectedRoute>} />
32+
33+
{/* Default route */}
34+
<Route path="*" element={<Navigate to="/dashboard" />} />
35+
</Routes>
36+
</Router>
37+
</AuthProvider>
38+
</>
39+
3440
);
3541
}
3642

apps/container-engine-frontend/src/components/Layout/DashboardLayout.tsx

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,6 @@ const BellIcon = () => (
4747
</svg>
4848
);
4949

50-
const UserIcon = () => (
51-
<svg className="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24">
52-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" />
53-
</svg>
54-
);
5550

5651
const MenuIcon = () => (
5752
<svg className="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">

apps/container-engine-frontend/src/pages/AccountSettingsPage.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ const AccountSettingsPage: React.FC = () => {
8787
<input type="password" id="confirmNewPassword" value={password.confirmNewPassword} onChange={e => setPassword({ ...password, confirmNewPassword: e.target.value })} required className="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md" />
8888
</div>
8989
<div className="flex justify-end pt-2">
90-
<button type="submit" className="px-4 py-2 bg-primary text-white rounded-md">Change Password</button>
90+
<button type="submit" className="px-4 py-2 bg-primary text-black rounded-md hover:text-blue-700">Change Password</button>
9191
</div>
9292
{passwordMessage.text && <p className={`text-sm mt-2 ${passwordMessage.type === 'success' ? 'text-green-600' : 'text-red-600'}`}>{passwordMessage.text}</p>}
9393
</form>

0 commit comments

Comments
 (0)