1
0
Fork 0

add docker-copilot, glance-agent, linkwarden

This commit is contained in:
pooneyy 2025-06-22 08:35:49 +00:00
commit b32a2d006b
16 changed files with 503 additions and 0 deletions

View File

@ -0,0 +1,18 @@
# DockerCopilot
## 介绍
一个主打便捷的docker容器管理工具现在已经支持所有平台。
已经实现:
1. 一键更新容器
2. 指定镜像和tag更新
3. 启动、停止、重启容器
4. 重命名容器
5. 删除无TAG镜像
6. 删除未使用镜像
7. 更新进度查看
8. 备份容器设置
9. 恢复容器设置
## 开发环境
go版本1.21+

View File

@ -0,0 +1,22 @@
name: Docker-Copilot
tags:
- 实用工具
title: DockerCopilot
description: docker容器管理工具
additionalProperties:
key: docker-copilot
name: Docker-Copilot
tags:
- Tools
shortDescZh: 一键更新容器
shortDescEn: DockerCopilot Application
description:
zh: 便捷的docker容器管理工具。
en: DockerCopilot is a convenient docker container management tool.
type: website
crossVersionUpdate: true
limit: 0
recommend: 0
website: https://github.com/onlyLTY/dockerCopilot
github: https://github.com/onlyLTY/dockerCopilot
document: https://github.com/onlyLTY/dockerCopilot

View File

@ -0,0 +1,19 @@
additionalProperties:
formFields:
- default: "12712"
edit: true
envKey: PANEL_APP_PORT_HTTP
labelEn: Service Port 12712
labelZh: 服务端口 12712
required: true
rule: paramPort
type: number
- default: "copilot"
edit: true
envKey: SECRET_KEY
labelEn: secretKey
labelZh: 密码,不少于八位且非纯数字
random: true
required: true
rule: paramComplexity
type: password

View File

@ -0,0 +1,21 @@
services:
dockercopilot:
image: 0nlylty/dockercopilot:latest
container_name: ${CONTAINER_NAME}
restart: always
ports:
- ${PANEL_APP_PORT_HTTP}:12712
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./data:/data
networks:
- 1panel-network
environment:
- TZ=Asia/Shanghai
- DOCKER_HOST=unix:///var/run/docker.sock
- secretKey=${SECRET_KEY}
labels:
createdBy: Apps
networks:
1panel-network:
external: true

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

216
apps/glance-agent/README.md Normal file
View File

@ -0,0 +1,216 @@
# Glance Python 远程服务器监控 Agent
## 项目简介
本项目为 Glance Dashboard 提供远程服务器监控数据采集,使用 Python3 + FastAPI 实现,兼容 Glance `server-stats` 组件前端展示。支持 Docker 部署,适合多服务器统一监控。
## 功能特性
- 采集主机名、平台、启动时间、CPU 负载/温度、内存、磁盘等信息
- 提供 `/api/sysinfo/all` HTTP API返回 Glance 兼容 JSON
- 支持 Docker 镜像和 docker-compose 一键部署
- 可多实例部署,适配多服务器场景
- **主机名自动识别**:容器内自动优先读取宿主机 `/etc/hostname`,无需手动配置
## API 说明
- 路径:`/api/sysinfo/all`
- 方法GET
- 返回:
```json
{
"Hostname": "server1",
"Platform": "Linux-5.15.0-1051-azure-x86_64-with-glibc2.29",
"BootTime": 1710000000,
"HostInfoIsAvailable": true,
"CPU": {
"Load1Percent": 12.5,
"Load15Percent": 8.2,
"TemperatureC": 45.0,
"LoadIsAvailable": true,
"TemperatureIsAvailable": true
},
"Memory": {
"IsAvailable": true,
"UsedPercent": 55.3,
"UsedMB": 2048,
"TotalMB": 4096,
"SwapIsAvailable": true,
"SwapUsedMB": 256,
"SwapTotalMB": 1024,
"SwapUsedPercent": 25.0
},
"Mountpoints": [
{
"Name": "/dev/sda1",
"Path": "/",
"UsedMB": 10240,
"TotalMB": 20480,
"UsedPercent": 50.0
}
]
}
```
## Glance 集成方法
1. 将 `agent/custom-api-example.yaml` 内容合并到 Glance 的主配置文件(如 `glance.yml`)对应 widgets 区域。
2. 每台服务器部署一个 agent配置对应的 API 地址。
3. 前端展示效果与本地 server-stats 一致。
### custom-api 配置示例
```yaml
- type: custom-api
title: 远程服务器A
url: http://192.168.1.200:8000/api/sysinfo/all ## 请修改为实际的IP地址
cache: 15s
template: |
<div class="server">
<div class="server-info">
<div class="server-details">
<div class="server-name color-highlight size-h3">
{{ .JSON.String "Hostname" }}
</div>
<div>
{{ if .JSON.Bool "HostInfoIsAvailable" }}
<span {{ .JSON.Int "BootTime" | printf "%d" | parseTime "unix" | toRelativeTime }}></span> uptime
{{ else }}unknown uptime{{ end }}
</div>
</div>
<div class="shrink-0" data-popover-type="html" data-popover-margin="0.2rem" data-popover-max-width="400px">
<div data-popover-html>
<div class="size-h5 text-compact">PLATFORM</div>
<div class="color-highlight">
{{ if .JSON.Bool "HostInfoIsAvailable" }}
{{ .JSON.String "Platform" }}
{{ else }}Unknown{{ end }}
</div>
</div>
<!-- 服务器logo -->
<svg class="server-icon" stroke="var(--color-positive)" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5">
<path stroke-linecap="round" stroke-linejoin="round" d="M21.75 17.25v-.228a4.5 4.5 0 0 0-.12-1.03l-2.268-9.64a3.375 3.375 0 0 0-3.285-2.602H7.923a3.375 3.375 0 0 0-3.285 2.602l-2.268 9.64a4.5 4.5 0 0 0-.12 1.03v.228m19.5 0a3 3 0 0 1-3 3H5.25a3 3 0 0 1-3-3m19.5 0a3 3 0 0 0-3-3H5.25a3 3 0 0 0-3 3m16.5 0h.008v.008h-.008v-.008Zm-3 0h.008v.008h-.008v-.008Z" />
</svg>
</div>
</div>
<div class="server-stats">
<!-- CPU -->
<div class="flex-1{{ if not (.JSON.Bool "CPU.LoadIsAvailable") }} server-stat-unavailable{{ end }}">
<div class="flex items-end size-h5">
<div>CPU</div>
{{ if and (.JSON.Bool "CPU.TemperatureIsAvailable") (ge (.JSON.Float "CPU.TemperatureC") 80.0) }}
<svg class="server-spicy-cpu-icon" fill="var(--color-negative)" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" >
<path fill-rule="evenodd" d="M8.074.945A4.993 4.993 0 0 0 6 5v.032c.004.6.114 1.176.311 1.709.16.428-.204.91-.61.7a5.023 5.023 0 0 1-1.868-1.677c-.202-.304-.648-.363-.848-.058a6 6 0 1 0 8.017-1.901l-.004-.007a4.98 4.98 0 0 1-2.18-2.574c-.116-.31-.477-.472-.744-.28Zm.78 6.178a3.001 3.001 0 1 1-3.473 4.341c-.205-.365.215-.694.62-.59a4.008 4.008 0 0 0 1.873.03c.288-.065.413-.386.321-.666A3.997 3.997 0 0 1 8 8.999c0-.585.126-1.14.351-1.641a.42.42 0 0 1 .503-.235Z" clip-rule="evenodd" />
</svg>
{{ end }}
<div class="color-highlight margin-left-auto text-very-compact">
{{ if .JSON.Bool "CPU.LoadIsAvailable" }}
{{ .JSON.Float "CPU.Load1Percent" }} <span class="color-base">%</span>
{{ else }}n/a{{ end }}
</div>
</div>
<div data-popover-type="html">
<div data-popover-html>
<div class="flex">
<div class="size-h5">1M AVG</div>
<div class="value-separator"></div>
<div class="color-highlight text-very-compact">{{ .JSON.Float "CPU.Load1Percent" }} <span class="color-base size-h5">%</span></div>
</div>
<div class="flex margin-top-3">
<div class="size-h5">15M AVG</div>
<div class="value-separator"></div>
<div class="color-highlight text-very-compact">{{ .JSON.Float "CPU.Load15Percent" }} <span class="color-base size-h5">%</span></div>
</div>
{{ if .JSON.Bool "CPU.TemperatureIsAvailable" }}
<div class="flex margin-top-3">
<div class="size-h5">TEMP C</div>
<div class="value-separator"></div>
<div class="color-highlight text-very-compact">{{ .JSON.Float "CPU.TemperatureC" }} <span class="color-base size-h5">°</span></div>
</div>
{{ end }}
</div>
<div class="progress-bar progress-bar-combined">
{{ if .JSON.Bool "CPU.LoadIsAvailable" }}
<div class="progress-value{{ if ge (.JSON.Float "CPU.Load1Percent") 85.0 }} progress-value-notice{{ end }}" style="--percent: {{ .JSON.Float "CPU.Load1Percent" }}"></div>
<div class="progress-value{{ if ge (.JSON.Float "CPU.Load15Percent") 85.0 }} progress-value-notice{{ end }}" style="--percent: {{ .JSON.Float "CPU.Load15Percent" }}"></div>
{{ end }}
</div>
</div>
</div>
<!-- RAM -->
<div class="flex-1{{ if not (.JSON.Bool "Memory.IsAvailable") }} server-stat-unavailable{{ end }}">
<div class="flex justify-between items-end size-h5">
<div>RAM</div>
<div class="color-highlight text-very-compact">
{{ if .JSON.Bool "Memory.IsAvailable" }}
{{ .JSON.Float "Memory.UsedPercent" }} <span class="color-base">%</span>
{{ else }}n/a{{ end }}
</div>
</div>
<div data-popover-type="html">
<div data-popover-html>
<div class="flex">
<div class="size-h5">RAM</div>
<div class="value-separator"></div>
<div class="color-highlight text-very-compact">
{{ .JSON.Float "Memory.UsedGB" }}GB <span class="color-base size-h5">/</span> {{ .JSON.Float "Memory.TotalGB" }}GB
</div>
</div>
{{ if .JSON.Bool "Memory.SwapIsAvailable" }}
<div class="flex margin-top-3">
<div class="size-h5">SWAP</div>
<div class="value-separator"></div>
<div class="color-highlight text-very-compact">
{{ .JSON.Float "Memory.SwapUsedGB" }}GB <span class="color-base size-h5">/</span> {{ .JSON.Float "Memory.SwapTotalGB" }}GB
</div>
</div>
{{ end }}
</div>
<div class="progress-bar progress-bar-combined">
{{ if .JSON.Bool "Memory.IsAvailable" }}
<div class="progress-value{{ if ge (.JSON.Float "Memory.UsedPercent") 85.0 }} progress-value-notice{{ end }}" style="--percent: {{ .JSON.Float "Memory.UsedPercent" }}"></div>
{{ if .JSON.Bool "Memory.SwapIsAvailable" }}
<div class="progress-value{{ if ge (.JSON.Float "Memory.SwapUsedPercent") 85.0 }} progress-value-notice{{ end }}" style="--percent: {{ .JSON.Float "Memory.SwapUsedPercent" }}"></div>
{{ end }}
{{ end }}
</div>
</div>
</div>
<!-- DISK -->
<div class="flex-1{{ if not ((.JSON.Array "Mountpoints" | len)) }} server-stat-unavailable{{ end }}">
<div class="flex justify-between items-end size-h5">
<div>DISK</div>
<div class="color-highlight text-very-compact">
{{ if gt (.JSON.Array "Mountpoints" | len) 0 }}
{{ (index (.JSON.Array "Mountpoints") 0).Float "UsedPercent" }} <span class="color-base">%</span>
{{ else }}n/a{{ end }}
</div>
</div>
<div data-popover-type="html">
<div data-popover-html>
<ul class="list list-gap-2">
{{ range .JSON.Array "Mountpoints" }}
<li class="flex">
<div class="size-h5">{{ if .String "Name" }}{{ .String "Name" }}{{ else }}{{ .String "Path" }}{{ end }}</div>
<div class="value-separator"></div>
<div class="color-highlight text-very-compact">
{{ .Float "UsedGB" }}GB <span class="color-base size-h5">/</span> {{ .Float "TotalGB" }}GB
</div>
</li>
{{ end }}
</ul>
</div>
<div class="progress-bar progress-bar-combined">
{{ if gt (.JSON.Array "Mountpoints" | len) 0 }}
<div class="progress-value{{ if ge ((index (.JSON.Array "Mountpoints") 0).Float "UsedPercent") 85.0 }} progress-value-notice{{ end }}" style="--percent: {{ (index (.JSON.Array "Mountpoints") 0).Float "UsedPercent" }}"></div>
{{ if gt (.JSON.Array "Mountpoints" | len) 1 }}
<div class="progress-value{{ if ge ((index (.JSON.Array "Mountpoints") 1).Float "UsedPercent") 85.0 }} progress-value-notice{{ end }}" style="--percent: {{ (index (.JSON.Array "Mountpoints") 1).Float "UsedPercent" }}"></div>
{{ end }}
{{ end }}
</div>
</div>
</div>
</div>
</div>
```
## 参考
- [Glance-Monitor](https://github.com/arch3rPro/Glance-Monitor)
- [Document文档](https://github.com/arch3rPro/Glance-Monitor/blob/main/server-status-agent/README.md)

View File

@ -0,0 +1,24 @@
name: Glance-Agent
tags:
- 实用工具
- 监控
- Dashboard
- Other
title: glance-agent
description: 为Glance Dashboard提供远程服务器监控数据采集API接口
additionalProperties:
key: glance-agent
name: Glance-Agent
tags:
- 实用工具
- 监控
- Dashboard
- Other
shortDescZh: 远程服务器监控数据采集agent
shortDescEn: Remote server monitoring data collection agent
type: tools
crossVersionUpdate: true
website: https://github.com/arch3rPro/Glance-Monitor
github: https://github.com/arch3rPro/Glance-Monitor
document: https://github.com/arch3rPro/Glance-Monitor/blob/main/server-status-agent/README.md

View File

@ -0,0 +1,10 @@
additionalProperties:
formFields:
- default: "12080"
edit: true
envKey: PANEL_APP_PORT_HTTP
labelEn: Service Port 8000
labelZh: 服务端口 8000
required: true
rule: paramPort
type: number

View File

@ -0,0 +1,18 @@
services:
agent-image:
image: vuldocker/glance-agent:latest
container_name: ${CONTAINER_NAME}
restart: unless-stopped
ports:
- ${PANEL_APP_PORT_HTTP}:8000
volumes:
- /etc/hostname:/host/etc/hostname:ro
networks:
- 1panel-network
environment:
- TZ=Asia/Shanghai
labels:
createdBy: Apps
networks:
1panel-network:
external: true

BIN
apps/glance-agent/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

46
apps/linkwarden/README.md Normal file
View File

@ -0,0 +1,46 @@
# Linkwarden
Linkwarden 是一个自托管、开源的协作书签管理工具,支持网页归档、团队协作、全文搜索等功能。
## 主要特性
- 📸 自动捕获每个网页的屏幕截图、PDF、单个 html 文件和可读视图。
- 🏛️ 将你的网页发送到 Wayback Machine ( archive.org ) 获取快照。(可选)
- ✨ 本地 AI 标记可根据链接内容自动标记链接(可选)。
- 📂 按集合、子集合、名称、描述和多个标签组织链接。
- 👥 协作收集集合中的链接。
- 🎛️自定义每个成员的权限。
- 🌐 与世界分享您收集的链接和保存的格式。
- 📌 将您最喜欢的链接固定到仪表板。
- 🔍 全文搜索、过滤和排序,方便检索。
- 📱 响应式设计并支持大多数现代浏览器。
- 🌓 支持暗/亮模式。
- 🧩 浏览器扩展程序。在此加星标!
- 🔄 浏览器同步使用Floccus
- ⬇️ 导入和导出您的书签。
- 🔐 SSO 集成。(仅限企业用户和自托管用户)
- 📦可安装的渐进式 Web 应用程序 (PWA)。
- 🍎 iOS 快捷方式将链接保存到 Linkwarden。
- 🔑 API 密钥。
- ✅ 批量操作。
- 👥 用户管理。
- 🌐 支持其他语言i18n
- 📁 图像和 PDF 上传。
- 🎨 链接和收藏的自定义图标。
- 🔔 RSS 订阅。
## 官网与文档
- 官网https://linkwarden.app
- 文档https://docs.linkwarden.app
- 源码https://github.com/linkwarden/linkwarden
## 1Panel 部署说明
1. 在 1Panel 应用商店搜索 Linkwarden 并安装
2. 安装完成后,访问 `http://服务器IP:端口` 进行初始化设置
3. 数据默认持久化在 `data` 目录下
## 相关截图
![dashboard](https://raw.githubusercontent.com/linkwarden/linkwarden/main/assets/dashboard.png)

24
apps/linkwarden/data.yml Normal file
View File

@ -0,0 +1,24 @@
name: linkwarden
tags:
- 工具
- 书签
- 协作
- 开源
title: Linkwarden
description: Linkwarden 是一个自托管、开源的协作书签管理工具,支持网页归档、团队协作、全文搜索等功能。
additionalProperties:
key: linkwarden
name: Linkwarden
tags:
- 工具
- 书签
- 协作
- 开源
shortDescZh: Linkwarden 书签归档与协作工具
shortDescEn: Linkwarden - Collaborative Bookmark Manager
type: website
crossVersionUpdate: true
website: https://linkwarden.app
github: https://github.com/linkwarden/linkwarden
document: https://docs.linkwarden.app

View File

@ -0,0 +1,4 @@
NEXTAUTH_URL=http://localhost:3000/api/v1/auth
NEXTAUTH_SECRET=${NEXTAUTH_SECRET}
MEILI_MASTER_KEY=${MEILI_MASTER_KEY}
POSTGRES_PASSWORD=${POSTGRES_PASSWORD}

View File

@ -0,0 +1,34 @@
additionalProperties:
formFields:
- default: "3000"
edit: true
envKey: PANEL_APP_PORT_HTTP
labelEn: Service Port 3000
labelZh: 服务端口 3000
required: true
rule: paramPort
type: number
- default: ""
edit: true
envKey: NEXTAUTH_SECRET
labelEn: NEXTAuth Secret
labelZh: NEXTAuth 密钥
required: true
rule: paramComplexity
type: password
- default: ""
edit: true
envKey: POSTGRES_PASSWORD
labelEn: Postgres Password
labelZh: Postgres 数据库密码
required: true
rule: paramComplexity
type: password
- default: ""
edit: true
envKey: MEILI_MASTER_KEY
labelEn: Meilisearch Master Key
labelZh: Meilisearch 主密钥
required: true
rule: paramComplexity
type: password

View File

@ -0,0 +1,47 @@
services:
linkwarden:
image: ghcr.io/linkwarden/linkwarden:latest
container_name: ${CONTAINER_NAME}
restart: always
ports:
- ${PANEL_APP_PORT_HTTP}:3000
volumes:
- ./data:/data/data
networks:
- 1panel-network
environment:
- DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/postgres
- NEXTAUTH_URL=http://localhost:3000/api/v1/auth
- NEXTAUTH_SECRET=${NEXTAUTH_SECRET}
depends_on:
- postgres
- meilisearch
labels:
createdBy: Apps
meilisearch:
image: getmeili/meilisearch:v1.12.8
container_name: ${CONTAINER_NAME}-Meilisearch
restart: always
volumes:
- ./meili_data:/meili_data
networks:
- 1panel-network
environment:
- MEILI_MASTER_KEY=${MEILI_MASTER_KEY}
labels:
createdBy: Apps
postgres:
image: postgres:16-alpine
container_name: ${CONTAINER_NAME}-Postgres
restart: always
volumes:
- ./pgdata:/var/lib/postgresql/data
networks:
- 1panel-network
environment:
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
labels:
createdBy: Apps
networks:
1panel-network:
external: true

BIN
apps/linkwarden/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB