mirror of
https://github.com/louislam/dockge.git
synced 2026-05-22 14:32:16 +00:00
Compare commits
17 Commits
feat-use-m
...
1.0.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
317c97650d | ||
|
|
9295583727 | ||
|
|
6dc998bedf | ||
|
|
f5552b3344 | ||
|
|
b90fd35348 | ||
|
|
3dca9e735a | ||
|
|
200ba0ca07 | ||
|
|
dd58a9cbc4 | ||
|
|
7f41cc099c | ||
|
|
4ce696181b | ||
|
|
959dbba776 | ||
|
|
ffa978eea1 | ||
|
|
9fd0c6416a | ||
|
|
e6fc623758 | ||
|
|
209dedf682 | ||
|
|
cf49a2ef2a | ||
|
|
c5d3b23af2 |
28
README.md
28
README.md
@@ -4,15 +4,17 @@
|
|||||||
|
|
||||||
# Dockge
|
# Dockge
|
||||||
|
|
||||||
A fancy, easy-to-use and reactive docker `compose.yaml` stack-oriented manager.
|
A fancy, easy-to-use and reactive self-hosted docker compose.yaml stack-oriented manager.
|
||||||
|
|
||||||
<img src="https://github.com/louislam/dockge/assets/1336778/26a583e1-ecb1-4a8d-aedf-76157d714ad7" width="900" alt="" />
|
<img src="https://github.com/louislam/dockge/assets/1336778/26a583e1-ecb1-4a8d-aedf-76157d714ad7" width="900" alt="" />
|
||||||
|
|
||||||
[View Video](https://youtu.be/AWAlOQeNpgU?t=48)
|
View Video: https://youtu.be/AWAlOQeNpgU?t=48
|
||||||
|
|
||||||
## ⭐ Features
|
## ⭐ Features
|
||||||
|
|
||||||
- Manage `compose.yaml`
|
- Manage `compose.yaml`
|
||||||
|
- Create/Edit/Start/Stop/Restart/Delete
|
||||||
|
- Update Docker Images
|
||||||
- Interactive Editor for `compose.yaml`
|
- Interactive Editor for `compose.yaml`
|
||||||
- Interactive Web Terminal
|
- Interactive Web Terminal
|
||||||
- Reactive
|
- Reactive
|
||||||
@@ -20,6 +22,12 @@ A fancy, easy-to-use and reactive docker `compose.yaml` stack-oriented manager.
|
|||||||
- Easy-to-use & fancy UI
|
- Easy-to-use & fancy UI
|
||||||
- If you love Uptime Kuma's UI/UX, you will love this too
|
- If you love Uptime Kuma's UI/UX, you will love this too
|
||||||
- Convert `docker run ...` commands into `compose.yaml`
|
- Convert `docker run ...` commands into `compose.yaml`
|
||||||
|
- File based structure
|
||||||
|
- Dockge won't kidnap your compose files, they stored on your drive as usual. You can interact with them using normal `docker compose` commands
|
||||||
|
<img src="https://github.com/louislam/dockge/assets/1336778/cc071864-592e-4909-b73a-343a57494002" width=300 />
|
||||||
|
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
## 🔧 How to Install
|
## 🔧 How to Install
|
||||||
|
|
||||||
@@ -33,7 +41,8 @@ Requirements:
|
|||||||
|
|
||||||
### Basic
|
### Basic
|
||||||
|
|
||||||
Default stacks directory is `/opt/stacks`.
|
- Default Stacks Directory: `/opt/stacks`
|
||||||
|
- Default Port: 5001
|
||||||
|
|
||||||
```
|
```
|
||||||
# Create a directory that stores your stacks and stores dockge's compose.yaml
|
# Create a directory that stores your stacks and stores dockge's compose.yaml
|
||||||
@@ -50,6 +59,8 @@ docker compose up -d
|
|||||||
# docker-compose up -d
|
# docker-compose up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Dockge is now running on http://localhost:5001
|
||||||
|
|
||||||
### Advanced
|
### Advanced
|
||||||
|
|
||||||
If you want to store your stacks in another directory, you can change the `DOCKGE_STACKS_DIR` environment variable and volumes.
|
If you want to store your stacks in another directory, you can change the `DOCKGE_STACKS_DIR` environment variable and volumes.
|
||||||
@@ -83,13 +94,16 @@ services:
|
|||||||
## How to Update
|
## How to Update
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd /opt/stacks
|
cd /opt/dockge
|
||||||
docker compose pull
|
docker compose pull
|
||||||
docker compose up -d
|
docker compose up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
## Screenshots
|
## Screenshots
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||
@@ -105,6 +119,10 @@ docker compose up -d
|
|||||||
If you love this project, please consider giving this project a ⭐.
|
If you love this project, please consider giving this project a ⭐.
|
||||||
|
|
||||||
|
|
||||||
|
## 🗣️ Discussion / Ask for Help
|
||||||
|
|
||||||
|
Please go to https://github.com/louislam/dockge/discussions
|
||||||
|
|
||||||
## FAQ
|
## FAQ
|
||||||
|
|
||||||
#### "Dockge"?
|
#### "Dockge"?
|
||||||
@@ -113,7 +131,7 @@ If you love this project, please consider giving this project a ⭐.
|
|||||||
|
|
||||||
The naming idea was coming from Twitch emotes like `sadge`, `bedge` or `wokege`. They are all ending with `-ge`.
|
The naming idea was coming from Twitch emotes like `sadge`, `bedge` or `wokege`. They are all ending with `-ge`.
|
||||||
|
|
||||||
If you are not comfortable with the pronunciation, you can call it `Dockage`
|
If you are not comfortable with the pronunciation, you can call it `Dockage`.
|
||||||
|
|
||||||
#### Can I manage a single container without `compose.yaml`?
|
#### Can I manage a single container without `compose.yaml`?
|
||||||
|
|
||||||
|
|||||||
@@ -177,6 +177,11 @@ export class Stack {
|
|||||||
|
|
||||||
for (let filename of filenameList) {
|
for (let filename of filenameList) {
|
||||||
try {
|
try {
|
||||||
|
// Check if it is a directory
|
||||||
|
let stat = fs.statSync(path.join(stacksDir, filename));
|
||||||
|
if (!stat.isDirectory()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
let stack = this.getStack(server, filename);
|
let stack = this.getStack(server, filename);
|
||||||
stack._status = CREATED_FILE;
|
stack._status = CREATED_FILE;
|
||||||
stackList.set(filename, stack);
|
stackList.set(filename, stack);
|
||||||
|
|||||||
20
extra/env2arg.js
Normal file
20
extra/env2arg.js
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
import childProcess from "child_process";
|
||||||
|
|
||||||
|
let env = process.env;
|
||||||
|
|
||||||
|
let cmd = process.argv[2];
|
||||||
|
let args = process.argv.slice(3);
|
||||||
|
let replacedArgs = [];
|
||||||
|
|
||||||
|
for (let arg of args) {
|
||||||
|
for (let key in env) {
|
||||||
|
arg = arg.replaceAll(`$${key}`, env[key]);
|
||||||
|
}
|
||||||
|
replacedArgs.push(arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
let child = childProcess.spawn(cmd, replacedArgs);
|
||||||
|
child.stdout.pipe(process.stdout);
|
||||||
|
child.stderr.pipe(process.stderr);
|
||||||
9
extra/test-docker.ts
Normal file
9
extra/test-docker.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
// Check if docker is running
|
||||||
|
import { exec } from "child_process";
|
||||||
|
|
||||||
|
exec("docker ps", (err, stdout, stderr) => {
|
||||||
|
if (err) {
|
||||||
|
console.error("Docker is not running. Please start docker and try again.");
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
});
|
||||||
64
extra/update-version.ts
Normal file
64
extra/update-version.ts
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
import pkg from "../package.json";
|
||||||
|
import childProcess from "child_process";
|
||||||
|
import fs from "fs";
|
||||||
|
|
||||||
|
const newVersion = process.env.VERSION;
|
||||||
|
|
||||||
|
console.log("New Version: " + newVersion);
|
||||||
|
|
||||||
|
if (! newVersion) {
|
||||||
|
console.error("invalid version");
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const exists = tagExists(newVersion);
|
||||||
|
|
||||||
|
if (! exists) {
|
||||||
|
// Process package.json
|
||||||
|
pkg.version = newVersion;
|
||||||
|
fs.writeFileSync("package.json", JSON.stringify(pkg, null, 4) + "\n");
|
||||||
|
commit(newVersion);
|
||||||
|
tag(newVersion);
|
||||||
|
} else {
|
||||||
|
console.log("version exists");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Commit updated files
|
||||||
|
* @param {string} version Version to update to
|
||||||
|
*/
|
||||||
|
function commit(version) {
|
||||||
|
let msg = "Update to " + version;
|
||||||
|
|
||||||
|
let res = childProcess.spawnSync("git", [ "commit", "-m", msg, "-a" ]);
|
||||||
|
let stdout = res.stdout.toString().trim();
|
||||||
|
console.log(stdout);
|
||||||
|
|
||||||
|
if (stdout.includes("no changes added to commit")) {
|
||||||
|
throw new Error("commit error");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a tag with the specified version
|
||||||
|
* @param {string} version Tag to create
|
||||||
|
*/
|
||||||
|
function tag(version) {
|
||||||
|
let res = childProcess.spawnSync("git", [ "tag", version ]);
|
||||||
|
console.log(res.stdout.toString().trim());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a tag exists for the specified version
|
||||||
|
* @param {string} version Version to check
|
||||||
|
* @returns {boolean} Does the tag already exist
|
||||||
|
*/
|
||||||
|
function tagExists(version) {
|
||||||
|
if (! version) {
|
||||||
|
throw new Error("invalid version");
|
||||||
|
}
|
||||||
|
|
||||||
|
let res = childProcess.spawnSync("git", [ "tag", "-l", version ]);
|
||||||
|
|
||||||
|
return res.stdout.toString().trim() === version;
|
||||||
|
}
|
||||||
@@ -23,6 +23,9 @@ import socket from "./mixins/socket";
|
|||||||
import lang from "./mixins/lang";
|
import lang from "./mixins/lang";
|
||||||
import theme from "./mixins/theme";
|
import theme from "./mixins/theme";
|
||||||
|
|
||||||
|
// Set Title
|
||||||
|
document.title = document.title + " - " + location.host;
|
||||||
|
|
||||||
const app = createApp(rootApp());
|
const app = createApp(rootApp());
|
||||||
|
|
||||||
app.use(Toast, {
|
app.use(Toast, {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "dockge",
|
"name": "dockge",
|
||||||
"version": "1.0.0",
|
"version": "1.0.2",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"fmt": "eslint \"**/*.{ts,vue}\" --fix",
|
"fmt": "eslint \"**/*.{ts,vue}\" --fix",
|
||||||
@@ -8,9 +8,10 @@
|
|||||||
"start": "tsx ./backend/index.ts",
|
"start": "tsx ./backend/index.ts",
|
||||||
"dev:backend": "cross-env NODE_ENV=development tsx watch ./backend/index.ts",
|
"dev:backend": "cross-env NODE_ENV=development tsx watch ./backend/index.ts",
|
||||||
"dev:frontend": "cross-env NODE_ENV=development vite --host --config ./frontend/vite.config.ts",
|
"dev:frontend": "cross-env NODE_ENV=development vite --host --config ./frontend/vite.config.ts",
|
||||||
|
"release-final": "tsx ./extra/test-docker.ts && tsx extra/update-version.ts && pnpm run build:frontend && npm run build:docker",
|
||||||
"build:frontend": "vite build --config ./frontend/vite.config.ts",
|
"build:frontend": "vite build --config ./frontend/vite.config.ts",
|
||||||
"build:docker-base": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/dockge:base -f ./docker/Base.Dockerfile . --push",
|
"build:docker-base": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/dockge:base -f ./docker/Base.Dockerfile . --push",
|
||||||
"build:docker": "pnpm run build:frontend && docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/dockge:latest -t louislam/dockge:1 -t louislam/dockge:1.0.0 --target release -f ./docker/Dockerfile . --push",
|
"build:docker": "node ./extra/env2arg.js docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/dockge:latest -t louislam/dockge:1 -t louislam/dockge:$VERSION --target release -f ./docker/Dockerfile . --push",
|
||||||
"build:docker-nightly": "pnpm run build:frontend && docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/dockge:nightly --target nightly -f ./docker/Dockerfile . --push",
|
"build:docker-nightly": "pnpm run build:frontend && docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/dockge:nightly --target nightly -f ./docker/Dockerfile . --push",
|
||||||
"start-docker": "docker run --rm -p 5001:5001 --name dockge louislam/dockge:latest",
|
"start-docker": "docker run --rm -p 5001:5001 --name dockge louislam/dockge:latest",
|
||||||
"mark-as-nightly": "tsx ./extra/mark-as-nightly.ts"
|
"mark-as-nightly": "tsx ./extra/mark-as-nightly.ts"
|
||||||
|
|||||||
Reference in New Issue
Block a user