feat:添加openlitespeed、calibre-web等十几个应用到列表 (#340)
10
apps/answer/1.1.1/data.yml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
additionalProperties:
|
||||||
|
formFields:
|
||||||
|
- default: 40065
|
||||||
|
edit: true
|
||||||
|
envKey: PANEL_APP_PORT_HTTP
|
||||||
|
labelEn: Port
|
||||||
|
labelZh: 端口
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
18
apps/answer/1.1.1/docker-compose.yml
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
answer:
|
||||||
|
container_name: ${CONTAINER_NAME}
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
ports:
|
||||||
|
- "${PANEL_APP_PORT_HTTP}:80"
|
||||||
|
volumes:
|
||||||
|
- "./data:/data"
|
||||||
|
image: answerdev/answer:1.1.1
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
networks:
|
||||||
|
1panel-network:
|
||||||
|
external: true
|
39
apps/answer/README.md
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
<a href="https://answer.dev">
|
||||||
|
<img alt="logo" src="https://github.com/answerdev/answer/raw/main/docs/img/logo.svg" height="99px">
|
||||||
|
</a>
|
||||||
|
|
||||||
|
# Answer - 构建问答社区
|
||||||
|
|
||||||
|
一款问答形式的知识社区开源软件,你可以使用它快速建立你的问答社区,用于产品技术支持、客户支持、用户交流等。
|
||||||
|
|
||||||
|
了解更多关于该项目的内容,请访问 [answer.dev](https://answer.dev).
|
||||||
|
|
||||||
|
[![LICENSE](https://img.shields.io/github/license/answerdev/answer)](https://github.com/answerdev/answer/blob/main/LICENSE)
|
||||||
|
[![Language](https://img.shields.io/badge/language-go-blue.svg)](https://golang.org/)
|
||||||
|
[![Language](https://img.shields.io/badge/language-react-blue.svg)](https://reactjs.org/)
|
||||||
|
[![Go Report Card](https://goreportcard.com/badge/github.com/answerdev/answer)](https://goreportcard.com/report/github.com/answerdev/answer)
|
||||||
|
[![Discord](https://img.shields.io/badge/discord-chat-5865f2?logo=discord&logoColor=f5f5f5)](https://discord.gg/Jm7Y4cbUej)
|
||||||
|
|
||||||
|
## 截图
|
||||||
|
|
||||||
|
![screenshot](https://github.com/answerdev/answer/raw/main/docs/img/screenshot.png)
|
||||||
|
|
||||||
|
## 快速开始
|
||||||
|
|
||||||
|
### 使用 docker 快速搭建
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run -d -p 9080:80 -v answer-data:/data --name answer answerdev/answer:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
其他安装配置细节请参考 [Installation](https://answer.dev/docs/installation)
|
||||||
|
|
||||||
|
## 贡献
|
||||||
|
|
||||||
|
我们随时欢迎你的贡献!
|
||||||
|
|
||||||
|
参考 [CONTRIBUTING](https://answer.dev/docs/development/contributing/) 开始贡献。
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
[Apache License 2.0](https://github.com/answerdev/answer/blob/main/LICENSE)
|
20
apps/answer/data.yml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
name: Answer
|
||||||
|
tags:
|
||||||
|
- 建站
|
||||||
|
title: 一款适合任何团队的问答平台软件
|
||||||
|
type: 建站
|
||||||
|
description: 一款适合任何团队的问答平台软件
|
||||||
|
additionalProperties:
|
||||||
|
key: answer
|
||||||
|
name: Answer
|
||||||
|
tags:
|
||||||
|
- WebSite
|
||||||
|
shortDescZh: 一款适合任何团队的问答平台软件
|
||||||
|
shortDescEn: A Q&A platform software for teams at any scales
|
||||||
|
type: website
|
||||||
|
crossVersionUpdate: true
|
||||||
|
limit: 0
|
||||||
|
recommend: 0
|
||||||
|
website: https://answer.dev/
|
||||||
|
github: https://github.com/answerdev/answer
|
||||||
|
document: https://answer.dev/zh-CN/docs
|
BIN
apps/answer/logo.png
Normal file
After Width: | Height: | Size: 3.3 KiB |
38
apps/audiobookshelf/2.3.3/data.yml
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
additionalProperties:
|
||||||
|
formFields:
|
||||||
|
- default: 40096
|
||||||
|
edit: true
|
||||||
|
envKey: PANEL_APP_PORT_HTTP
|
||||||
|
labelEn: Port
|
||||||
|
labelZh: 端口
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
||||||
|
- default: ./data/config
|
||||||
|
edit: true
|
||||||
|
envKey: DATA_PATH
|
||||||
|
labelEn: Data folder path
|
||||||
|
labelZh: 数据文件夹路径
|
||||||
|
required: true
|
||||||
|
type: text
|
||||||
|
- default: ./data/audiobooks
|
||||||
|
edit: true
|
||||||
|
envKey: DATA_PATH1
|
||||||
|
labelEn: audiobooks folder path
|
||||||
|
labelZh: audiobooks 文件夹路径
|
||||||
|
required: true
|
||||||
|
type: text
|
||||||
|
- default: ./data/podcasts
|
||||||
|
edit: true
|
||||||
|
envKey: DATA_PATH2
|
||||||
|
labelEn: podcasts folder path
|
||||||
|
labelZh: podcasts 文件夹路径
|
||||||
|
required: true
|
||||||
|
type: text
|
||||||
|
- default: ./data/metadata
|
||||||
|
edit: true
|
||||||
|
envKey: DATA_PATH3
|
||||||
|
labelEn: metadata folder path
|
||||||
|
labelZh: metadata 文件夹路径
|
||||||
|
required: true
|
||||||
|
type: text
|
21
apps/audiobookshelf/2.3.3/docker-compose.yml
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
audiobookshelf:
|
||||||
|
container_name: ${CONTAINER_NAME}
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
ports:
|
||||||
|
- "${PANEL_APP_PORT_HTTP}:80"
|
||||||
|
volumes:
|
||||||
|
- "${DATA_PATH1}:/audiobooks"
|
||||||
|
- "${DATA_PATH2}:/podcasts"
|
||||||
|
- "${DATA_PATH}:/config"
|
||||||
|
- "${DATA_PATH3}:/metadata"
|
||||||
|
image: advplyr/audiobookshelf:2.3.3
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
networks:
|
||||||
|
1panel-network:
|
||||||
|
external: true
|
308
apps/audiobookshelf/README.md
Normal file
@ -0,0 +1,308 @@
|
|||||||
|
<br />
|
||||||
|
<div align="center">
|
||||||
|
<img alt="Audiobookshelf Banner" src="https://github.com/advplyr/audiobookshelf/raw/master/images/banner.svg" width="600">
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<br />
|
||||||
|
<a href="https://audiobookshelf.org/docs">Documentation</a>
|
||||||
|
·
|
||||||
|
<a href="https://audiobookshelf.org/guides">User Guides</a>
|
||||||
|
·
|
||||||
|
<a href="https://audiobookshelf.org/support">Support</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
# About
|
||||||
|
|
||||||
|
Audiobookshelf is a self-hosted audiobook and podcast server.
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* Fully **open-source**, including the [android & iOS app](https://github.com/advplyr/audiobookshelf-app) *(in beta)*
|
||||||
|
* Stream all audio formats on the fly
|
||||||
|
* Search and add podcasts to download episodes w/ auto-download
|
||||||
|
* Multi-user support w/ custom permissions
|
||||||
|
* Keeps progress per user and syncs across devices
|
||||||
|
* Auto-detects library updates, no need to re-scan
|
||||||
|
* Upload books and podcasts w/ bulk upload drag and drop folders
|
||||||
|
* Backup your metadata + automated daily backups
|
||||||
|
* Progressive Web App (PWA)
|
||||||
|
* Chromecast support on the web app and android app
|
||||||
|
* Fetch metadata and cover art from several sources
|
||||||
|
* Chapter editor and chapter lookup (using [Audnexus API](https://audnex.us/))
|
||||||
|
* Merge your audio files into a single m4b
|
||||||
|
* Embed metadata and cover image into your audio files (using [Tone](https://github.com/sandreas/tone))
|
||||||
|
* Basic ebook support and ereader
|
||||||
|
* Epub, pdf, cbr, cbz
|
||||||
|
* Send ebook to device (i.e. Kindle)
|
||||||
|
* Open RSS feeds for podcasts and audiobooks
|
||||||
|
|
||||||
|
Is there a feature you are looking for? [Suggest it](https://github.com/advplyr/audiobookshelf/issues/new/choose)
|
||||||
|
|
||||||
|
Join us on [Discord](https://discord.gg/pJsjuNCKRq) or [Matrix](https://matrix.to/#/#audiobookshelf:matrix.org)
|
||||||
|
|
||||||
|
### Android App (beta)
|
||||||
|
Try it out on the [Google Play Store](https://play.google.com/store/apps/details?id=com.audiobookshelf.app)
|
||||||
|
|
||||||
|
### iOS App (beta)
|
||||||
|
Available using Test Flight: https://testflight.apple.com/join/wiic7QIW - [Join the discussion](https://github.com/advplyr/audiobookshelf-app/discussions/60)
|
||||||
|
|
||||||
|
### Build your own tools & clients
|
||||||
|
Check out the [API documentation](https://api.audiobookshelf.org/)
|
||||||
|
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<img alt="Library Screenshot" src="https://github.com/advplyr/audiobookshelf/raw/master/images/DemoLibrary.png" />
|
||||||
|
|
||||||
|
<br />
|
||||||
|
|
||||||
|
# Organizing your audiobooks
|
||||||
|
|
||||||
|
#### Directory structure and folder names are important to Audiobookshelf!
|
||||||
|
|
||||||
|
See [documentation](https://audiobookshelf.org/docs#book-directory-structure) for supported directory structure, folder naming conventions, and audio file metadata usage.
|
||||||
|
|
||||||
|
<br />
|
||||||
|
|
||||||
|
# Installation
|
||||||
|
|
||||||
|
See [install docs](https://www.audiobookshelf.org/docs)
|
||||||
|
|
||||||
|
<br />
|
||||||
|
|
||||||
|
# Reverse Proxy Set Up
|
||||||
|
|
||||||
|
#### Important! Audiobookshelf requires a websocket connection.
|
||||||
|
|
||||||
|
#### Note: Subfolder paths (e.g. /audiobooks) are not supported yet. See [issue](https://github.com/advplyr/audiobookshelf/issues/385)
|
||||||
|
|
||||||
|
### NGINX Proxy Manager
|
||||||
|
|
||||||
|
Toggle websockets support.
|
||||||
|
|
||||||
|
<img alt="NGINX Web socket" src="https://user-images.githubusercontent.com/67830747/153679106-b2a7f5b9-0702-48c6-9740-b26b401986e9.png" />
|
||||||
|
|
||||||
|
### NGINX Reverse Proxy
|
||||||
|
|
||||||
|
Add this to the site config file on your nginx server after you have changed the relevant parts in the <> brackets, and inserted your certificate paths.
|
||||||
|
|
||||||
|
|
||||||
|
```bash
|
||||||
|
server
|
||||||
|
{
|
||||||
|
listen 443 ssl;
|
||||||
|
server_name <sub>.<domain>.<tld>;
|
||||||
|
|
||||||
|
access_log /var/log/nginx/audiobookshelf.access.log;
|
||||||
|
error_log /var/log/nginx/audiobookshelf.error.log;
|
||||||
|
|
||||||
|
ssl_certificate /path/to/certificate;
|
||||||
|
ssl_certificate_key /path/to/key;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
|
||||||
|
proxy_pass http://<URL_to_forward_to>;
|
||||||
|
proxy_redirect http:// https://;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Apache Reverse Proxy
|
||||||
|
|
||||||
|
Add this to the site config file on your Apache server after you have changed the relevant parts in the <> brackets, and inserted your certificate paths.
|
||||||
|
|
||||||
|
For this to work you must enable at least the following mods using `a2enmod`:
|
||||||
|
- `ssl`
|
||||||
|
- `proxy`
|
||||||
|
- `proxy_http`
|
||||||
|
- `proxy_balancer`
|
||||||
|
- `proxy_wstunnel`
|
||||||
|
- `rewrite`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
<IfModule mod_ssl.c>
|
||||||
|
<VirtualHost *:443>
|
||||||
|
ServerName <sub>.<domain>.<tld>
|
||||||
|
|
||||||
|
ErrorLog ${APACHE_LOG_DIR}/error.log
|
||||||
|
CustomLog ${APACHE_LOG_DIR}/access.log combined
|
||||||
|
|
||||||
|
ProxyPreserveHost On
|
||||||
|
ProxyPass / http://localhost:<audiobookshelf_port>/
|
||||||
|
RewriteEngine on
|
||||||
|
RewriteCond %{HTTP:Upgrade} websocket [NC]
|
||||||
|
RewriteCond %{HTTP:Connection} upgrade [NC]
|
||||||
|
RewriteRule ^/?(.*) "ws://localhost:<audiobookshelf_port>/$1" [P,L]
|
||||||
|
|
||||||
|
# unless you're doing something special this should be generated by a
|
||||||
|
# tool like certbot by let's encrypt
|
||||||
|
SSLCertificateFile /path/to/cert/file
|
||||||
|
SSLCertificateKeyFile /path/to/key/file
|
||||||
|
</VirtualHost>
|
||||||
|
</IfModule>
|
||||||
|
```
|
||||||
|
|
||||||
|
Some SSL certificates like those signed by Let's Encrypt require ACME validation. To allow Let's Encrypt to write and confirm
|
||||||
|
the ACME challenge, edit your VirtualHost definition to prevent proxying traffic that queries `/.well-known` and instead
|
||||||
|
serve that directly:
|
||||||
|
```bash
|
||||||
|
<VirtualHost *:443>
|
||||||
|
# ...
|
||||||
|
|
||||||
|
# create the directory structure /.well-known/acme-challenges
|
||||||
|
# within DocumentRoot and give the HTTP user recursive write
|
||||||
|
# access to it.
|
||||||
|
DocumentRoot /path/to/local/directory
|
||||||
|
|
||||||
|
ProxyPreserveHost On
|
||||||
|
ProxyPass /.well-known !
|
||||||
|
ProxyPass / http://localhost:<audiobookshelf_port>/
|
||||||
|
|
||||||
|
# ...
|
||||||
|
</VirtualHost>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### SWAG Reverse Proxy
|
||||||
|
|
||||||
|
[See LinuxServer.io config sample](https://github.com/linuxserver/reverse-proxy-confs/blob/master/audiobookshelf.subdomain.conf.sample)
|
||||||
|
|
||||||
|
### Synology Reverse Proxy
|
||||||
|
|
||||||
|
1. Open Control Panel > Application Portal
|
||||||
|
2. Change to the Reverse Proxy tab
|
||||||
|
3. Select the proxy rule for which you want to enable Websockets and click on Edit
|
||||||
|
4. Change to the "Custom Header" tab
|
||||||
|
5. Click Create > WebSocket
|
||||||
|
6. Click Save
|
||||||
|
|
||||||
|
[from @silentArtifact](https://github.com/advplyr/audiobookshelf/issues/241#issuecomment-1036732329)
|
||||||
|
|
||||||
|
### [Traefik Reverse Proxy](https://doc.traefik.io/traefik/)
|
||||||
|
|
||||||
|
Middleware relating to CORS will cause the app to report Unknown Error when logging in. To prevent this don't apply any of the following headers to the router for this site:
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>accessControlAllowMethods</li>
|
||||||
|
<li>accessControlAllowOriginList</li>
|
||||||
|
<li>accessControlMaxAge</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
From [@Dondochaka](https://discord.com/channels/942908292873723984/942914154254176257/945074590374318170) and [@BeastleeUK](https://discord.com/channels/942908292873723984/942914154254176257/970366039294611506)
|
||||||
|
<br />
|
||||||
|
|
||||||
|
### Example Caddyfile - [Caddy Reverse Proxy](https://caddyserver.com/docs/caddyfile/directives/reverse_proxy)
|
||||||
|
|
||||||
|
```
|
||||||
|
subdomain.domain.com {
|
||||||
|
encode gzip zstd
|
||||||
|
reverse_proxy <LOCAL_IP>:<PORT>
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
# Run from source
|
||||||
|
|
||||||
|
# Contributing
|
||||||
|
|
||||||
|
This application is built using [NodeJs](https://nodejs.org/).
|
||||||
|
|
||||||
|
### Dev Container Setup
|
||||||
|
The easiest way to begin developing this project is to use a dev container. An introduction to dev containers in VSCode can be found [here](https://code.visualstudio.com/docs/devcontainers/containers).
|
||||||
|
|
||||||
|
Required Software:
|
||||||
|
* [Docker Desktop](https://www.docker.com/products/docker-desktop/)
|
||||||
|
* [VSCode](https://code.visualstudio.com/download)
|
||||||
|
|
||||||
|
*Note, it is possible to use other container software than Docker and IDEs other than VSCode. However, this setup is more complicated and not covered here.*
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<details>
|
||||||
|
<summary>Install the required software on Windows with <a href=(https://docs.microsoft.com/en-us/windows/package-manager/winget/#production-recommended)>winget</a></summary>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Note: This requires a PowerShell prompt with winget installed. You should be able to copy and paste the code block to install. If you use an elevated PowerShell prompt, UAC will not pop up during the installs.
|
||||||
|
|
||||||
|
```PowerShell
|
||||||
|
winget install -e --id Docker.DockerDesktop; `
|
||||||
|
winget install -e --id Microsoft.VisualStudioCode
|
||||||
|
```
|
||||||
|
|
||||||
|
</p>
|
||||||
|
</details>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<details>
|
||||||
|
<summary>Install the required software on MacOS with <a href=(https://snapcraft.io/)>homebrew</a></summary>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
|
||||||
|
```sh
|
||||||
|
brew install --cask docker visual-studio-code
|
||||||
|
```
|
||||||
|
|
||||||
|
</p>
|
||||||
|
</details>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="padding-bottom: 1em">
|
||||||
|
<details>
|
||||||
|
<summary>Install the required software on Linux with <a href=(https://brew.sh/)>snap</a></summary>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo snap install docker; \
|
||||||
|
sudo snap install code --classic
|
||||||
|
```
|
||||||
|
|
||||||
|
</p>
|
||||||
|
</details>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
After installing these packages, you can now install the [Remote Development](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack) extension for VSCode. After installing this extension open the command pallet (`ctrl+shift+p` or `cmd+shift+p`) and select the command `>Dev Containers: Rebuild and Reopen in Container`. This will cause the development environment container to be built and launched.
|
||||||
|
|
||||||
|
You are now ready to start development!
|
||||||
|
|
||||||
|
### Manual Environment Setup
|
||||||
|
|
||||||
|
If you don't want to use the dev container, you can still develop this project. First, you will need to install [NodeJs](https://nodejs.org/) (version 16) and [FFmpeg](https://ffmpeg.org/).
|
||||||
|
|
||||||
|
Next you will need to create a `dev.js` file in the project's root directory. This contains configuration information and paths unique to your development environment. You can find an example of this file in `.devcontainer/dev.js`.
|
||||||
|
|
||||||
|
You are now ready to build the client:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm ci
|
||||||
|
cd client
|
||||||
|
npm ci
|
||||||
|
npm run generate
|
||||||
|
cd ..
|
||||||
|
```
|
||||||
|
|
||||||
|
### Development Commands
|
||||||
|
|
||||||
|
After setting up your development environment, either using the dev container or using your own custom environment, the following commands will help you run the server and client.
|
||||||
|
|
||||||
|
To run the server, you can use the command `npm run dev`. This will use the client that was built when you ran `npm run generate` in the client directory or when you started the dev container. If you make changes to the server, you will need to restart the server. If you make changes to the client, you will need to run the command `(cd client; npm run generate)` and then restart the server. By default the client runs at `localhost:3333`, though the port can be configured in `dev.js`.
|
||||||
|
|
||||||
|
You can also build a version of the client that supports live reloading. To do this, start the server, then run the command `(cd client; npm run dev)`. This will run a separate instance of the client at `localhost:3000` that will be automatically updated as you make changes to the client.
|
||||||
|
|
||||||
|
If you are using VSCode, this project includes a couple of pre-defined targets to speed up this process. First, if you build the project (`ctrl+shift+b` or `cmd+shift+b`) it will automatically generate the client. Next, there are debug commands for running the server and client. You can view these targets using the debug panel (bring it up with (`ctrl+shift+d` or `cmd+shift+d`):
|
||||||
|
|
||||||
|
* `Debug server`—Run the server.
|
||||||
|
* `Debug client (nuxt)`—Run the client with live reload.
|
||||||
|
* `Debug server and client (nuxt)`—Runs both the preceding two debug targets.
|
||||||
|
|
||||||
|
|
||||||
|
# How to Support
|
||||||
|
|
||||||
|
[See the incomplete "How to Support" page](https://www.audiobookshelf.org/support)
|
20
apps/audiobookshelf/data.yml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
name: Audiobookshelf
|
||||||
|
tags:
|
||||||
|
- 工具
|
||||||
|
title: 一个自托管有声读物和播客服务器
|
||||||
|
type: 工具
|
||||||
|
description: 一个自托管有声读物和播客服务器
|
||||||
|
additionalProperties:
|
||||||
|
key: audiobookshelf
|
||||||
|
name: Audiobookshelf
|
||||||
|
tags:
|
||||||
|
- Tool
|
||||||
|
shortDescZh: 一个自托管有声读物和播客服务器
|
||||||
|
shortDescEn: A Self-hosted audiobook and podcast server
|
||||||
|
type: tool
|
||||||
|
crossVersionUpdate: true
|
||||||
|
limit: 0
|
||||||
|
recommend: 0
|
||||||
|
website: https://www.audiobookshelf.org/
|
||||||
|
github: https://github.com/advplyr/audiobookshelf
|
||||||
|
document: https://www.audiobookshelf.org/docs
|
BIN
apps/audiobookshelf/logo.png
Normal file
After Width: | Height: | Size: 16 KiB |
24
apps/calibre-web/0.6.20/data.yml
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
additionalProperties:
|
||||||
|
formFields:
|
||||||
|
- default: 40109
|
||||||
|
edit: true
|
||||||
|
envKey: PANEL_APP_PORT_HTTP
|
||||||
|
labelEn: HTTP Port
|
||||||
|
labelZh: HTTP端口
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
||||||
|
- default: ./data/books
|
||||||
|
edit: true
|
||||||
|
envKey: DATA_PATH
|
||||||
|
labelEn: Books folder path
|
||||||
|
labelZh: 书本文件夹路径
|
||||||
|
required: true
|
||||||
|
type: text
|
||||||
|
- default: Asia/Shanghai
|
||||||
|
edit: true
|
||||||
|
envKey: TIME_ZONE
|
||||||
|
labelEn: Time zone
|
||||||
|
labelZh: 时区
|
||||||
|
required: true
|
||||||
|
type: text
|
25
apps/calibre-web/0.6.20/docker-compose.yml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
calibre-web:
|
||||||
|
container_name: ${CONTAINER_NAME}
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
ports:
|
||||||
|
- "${PANEL_APP_PORT_HTTP}:8083"
|
||||||
|
volumes:
|
||||||
|
- "./data/config:/config"
|
||||||
|
- "${DATA_PATH}:/books"
|
||||||
|
environment:
|
||||||
|
- PUID=1000
|
||||||
|
- PGID=1000
|
||||||
|
- TZ=${TIME_ZONE}
|
||||||
|
- DOCKER_MODS=linuxserver/mods:universal-calibre #optional
|
||||||
|
- OAUTHLIB_RELAX_TOKEN_SCOPE=1 #optional
|
||||||
|
image: linuxserver/calibre-web:0.6.20
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
networks:
|
||||||
|
1panel-network:
|
||||||
|
external: true
|
133
apps/calibre-web/README.md
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
# 使用说明
|
||||||
|
|
||||||
|
- 默认账户密码
|
||||||
|
|
||||||
|
```
|
||||||
|
username:admin
|
||||||
|
password:admin123
|
||||||
|
```
|
||||||
|
|
||||||
|
# 原始相关
|
||||||
|
|
||||||
|
# Calibre-Web
|
||||||
|
|
||||||
|
Calibre-Web is a web app that offers a clean and intuitive interface for browsing, reading, and downloading eBooks using a valid [Calibre](https://calibre-ebook.com) database.
|
||||||
|
|
||||||
|
[![License](https://img.shields.io/github/license/janeczku/calibre-web?style=flat-square)](https://github.com/janeczku/calibre-web/blob/master/LICENSE)
|
||||||
|
![Commit Activity](https://img.shields.io/github/commit-activity/w/janeczku/calibre-web?logo=github&style=flat-square&label=commits)
|
||||||
|
[![All Releases](https://img.shields.io/github/downloads/janeczku/calibre-web/total?logo=github&style=flat-square)](https://github.com/janeczku/calibre-web/releases)
|
||||||
|
[![PyPI](https://img.shields.io/pypi/v/calibreweb?logo=pypi&logoColor=fff&style=flat-square)](https://pypi.org/project/calibreweb/)
|
||||||
|
[![PyPI - Downloads](https://img.shields.io/pypi/dm/calibreweb?logo=pypi&logoColor=fff&style=flat-square)](https://pypi.org/project/calibreweb/)
|
||||||
|
[![Discord](https://img.shields.io/discord/838810113564344381?label=Discord&logo=discord&style=flat-square)](https://discord.gg/h2VsJ2NEfB)
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary><strong>Table of Contents</strong> (click to expand)</summary>
|
||||||
|
|
||||||
|
- [使用说明](#使用说明)
|
||||||
|
- [原始相关](#原始相关)
|
||||||
|
- [Calibre-Web](#calibre-web)
|
||||||
|
- [Features](#features)
|
||||||
|
- [Installation](#installation)
|
||||||
|
- [Installation via pip (recommended)](#installation-via-pip-recommended)
|
||||||
|
- [Quick Start](#quick-start)
|
||||||
|
- [Default Admin Login:](#default-admin-login)
|
||||||
|
- [Requirements](#requirements)
|
||||||
|
- [Docker Images](#docker-images)
|
||||||
|
- [**LinuxServer - x64, aarch64**](#linuxserver---x64-aarch64)
|
||||||
|
- [Contributor Recognition](#contributor-recognition)
|
||||||
|
- [Contact](#contact)
|
||||||
|
- [Contributing to Calibre-Web](#contributing-to-calibre-web)
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
|
||||||
|
*This software is a fork of [library](https://github.com/mutschler/calibreserver) and licensed under the GPL v3 License.*
|
||||||
|
|
||||||
|
![Main screen](https://github.com/janeczku/calibre-web/wiki/images/main_screen.png)
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Modern and responsive Bootstrap 3 HTML5 interface
|
||||||
|
- Full graphical setup
|
||||||
|
- Comprehensive user management with fine-grained per-user permissions
|
||||||
|
- Admin interface
|
||||||
|
- Multilingual user interface supporting 20+ languages ([supported languages](https://github.com/janeczku/calibre-web/wiki/Translation-Status))
|
||||||
|
- OPDS feed for eBook reader apps
|
||||||
|
- Advanced search and filtering options
|
||||||
|
- Custom book collection (shelves) creation
|
||||||
|
- eBook metadata editing and deletion support
|
||||||
|
- Metadata download from various sources (extensible via plugins)
|
||||||
|
- eBook conversion through Calibre binaries
|
||||||
|
- eBook download restriction to logged-in users
|
||||||
|
- Public user registration support
|
||||||
|
- Send eBooks to E-Readers with a single click
|
||||||
|
- Sync Kobo devices with your Calibre library
|
||||||
|
- In-browser eBook reading support for multiple formats
|
||||||
|
- Upload new books in various formats, including audio formats
|
||||||
|
- Calibre Custom Columns support
|
||||||
|
- Content hiding based on categories and Custom Column content per user
|
||||||
|
- Self-update capability
|
||||||
|
- "Magic Link" login for easy access on eReaders
|
||||||
|
- LDAP, Google/GitHub OAuth, and proxy authentication support
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
#### Installation via pip (recommended)
|
||||||
|
1. Create a virtual environment for Calibre-Web to avoid conflicts with existing Python dependencies
|
||||||
|
2. Install Calibre-Web via pip: `pip install calibreweb` (or `pip3` depending on your OS/distro)
|
||||||
|
3. Install optional features via pip as needed, see [this page](https://github.com/janeczku/calibre-web/wiki/Dependencies-in-Calibre-Web-Linux-and-Windows) for details
|
||||||
|
4. Start Calibre-Web by typing `cps`
|
||||||
|
|
||||||
|
*Note: Raspberry Pi OS users may encounter issues during installation. If so, please update pip (`./venv/bin/python3 -m pip install --upgrade pip`) and/or install cargo (`sudo apt install cargo`) before retrying the installation.*
|
||||||
|
|
||||||
|
Refer to the Wiki for additional installation examples: [manual installation](https://github.com/janeczku/calibre-web/wiki/Manual-installation), [Linux Mint](https://github.com/janeczku/calibre-web/wiki/How-To:Install-Calibre-Web-in-Linux-Mint-19-or-20), [Cloud Provider](https://github.com/janeczku/calibre-web/wiki/How-To:-Install-Calibre-Web-on-a-Cloud-Provider).
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
1. Open your browser and navigate to `http://localhost:8083` or `http://localhost:8083/opds` for the OPDS catalog
|
||||||
|
2. Log in with the default admin credentials
|
||||||
|
3. If you don't have a Calibre database, you can use [this database](https://github.com/janeczku/calibre-web/raw/master/library/metadata.db) (move it out of the Calibre-Web folder to prevent overwriting during updates)
|
||||||
|
4. Set `Location of Calibre database` to the path of the folder containing your Calibre library (metadata.db) and click "Save"
|
||||||
|
5. Optionally, use Google Drive to host your Calibre library by following the [Google Drive integration guide](https://github.com/janeczku/calibre-web/wiki/G-Drive-Setup#using-google-drive-integration)
|
||||||
|
6. Configure your Calibre-Web instance via the admin page, referring to the [Basic Configuration](https://github.com/janeczku/calibre-web/wiki/Configuration#basic-configuration) and [UI Configuration](https://github.com/janeczku/calibre-web/wiki/Configuration#ui-configuration) guides
|
||||||
|
|
||||||
|
#### Default Admin Login:
|
||||||
|
- **Username:** admin
|
||||||
|
- **Password:** admin123
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- Python 3.5+
|
||||||
|
- [Imagemagick](https://imagemagick.org/script/download.php) for cover extraction from EPUBs (Windows users may need to install [Ghostscript](https://ghostscript.com/releases/gsdnld.html) for PDF cover extraction)
|
||||||
|
- Optional: [Calibre desktop program](https://calibre-ebook.com/download) for on-the-fly conversion and metadata editing (set "calibre's converter tool" path on the setup page)
|
||||||
|
- Optional: [Kepubify tool](https://github.com/pgaskin/kepubify/releases/latest) for Kobo device support (place the binary in `/opt/kepubify` on Linux or `C:\Program Files\kepubify` on Windows)
|
||||||
|
|
||||||
|
## Docker Images
|
||||||
|
|
||||||
|
Pre-built Docker images are available in the following Docker Hub repositories (maintained by the LinuxServer team):
|
||||||
|
|
||||||
|
#### **LinuxServer - x64, aarch64**
|
||||||
|
- [Docker Hub](https://hub.docker.com/r/linuxserver/calibre-web)
|
||||||
|
- [GitHub](https://github.com/linuxserver/docker-calibre-web)
|
||||||
|
- [GitHub - Optional Calibre layer](https://github.com/linuxserver/docker-mods/tree/universal-calibre)
|
||||||
|
|
||||||
|
Include the environment variable `DOCKER_MODS=linuxserver/mods:universal-calibre` in your Docker run/compose file to add the Calibre `ebook-convert` binary (x64 only). Omit this variable for a lightweight image.
|
||||||
|
|
||||||
|
Both the Calibre-Web and Calibre-Mod images are automatically rebuilt on new releases and updates.
|
||||||
|
|
||||||
|
- Set "path to convertertool" to `/usr/bin/ebook-convert`
|
||||||
|
- Set "path to unrar" to `/usr/bin/unrar`
|
||||||
|
|
||||||
|
## Contributor Recognition
|
||||||
|
|
||||||
|
We would like to thank all the [contributors](https://github.com/janeczku/calibre-web/graphs/contributors) and maintainers of Calibre-Web for their valuable input and dedication to the project. Your contributions are greatly appreciated.
|
||||||
|
|
||||||
|
## Contact
|
||||||
|
|
||||||
|
Join us on [Discord](https://discord.gg/h2VsJ2NEfB)
|
||||||
|
|
||||||
|
For more information, How To's, and FAQs, please visit the [Wiki](https://github.com/janeczku/calibre-web/wiki)
|
||||||
|
|
||||||
|
## Contributing to Calibre-Web
|
||||||
|
|
||||||
|
Check out our [Contributing Guidelines](https://github.com/janeczku/calibre-web/blob/master/CONTRIBUTING.md)
|
20
apps/calibre-web/data.yml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
name: Calibre-Web
|
||||||
|
tags:
|
||||||
|
- 工具
|
||||||
|
title: 用于浏览、阅读和下载存储在 Calibre 数据库中的电子书的 Web 应用程序
|
||||||
|
type: 工具
|
||||||
|
description: 用于浏览、阅读和下载存储在 Calibre 数据库中的电子书的 Web 应用程序
|
||||||
|
additionalProperties:
|
||||||
|
key: calibre-web
|
||||||
|
name: Calibre-Web
|
||||||
|
tags:
|
||||||
|
- Tool
|
||||||
|
shortDescZh: 用于浏览、阅读和下载存储在 Calibre 数据库中的电子书的 Web 应用程序
|
||||||
|
shortDescEn: Web app for browsing, reading and downloading eBooks stored in a Calibre database
|
||||||
|
type: tool
|
||||||
|
crossVersionUpdate: true
|
||||||
|
limit: 0
|
||||||
|
recommend: 0
|
||||||
|
website: https://calibre-ebook.com
|
||||||
|
github: https://github.com/janeczku/calibre-web
|
||||||
|
document: https://calibre-ebook.com/help
|
BIN
apps/calibre-web/logo.png
Normal file
After Width: | Height: | Size: 8.5 KiB |
10
apps/changedetectionio/0.44/data.yml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
additionalProperties:
|
||||||
|
formFields:
|
||||||
|
- default: 40097
|
||||||
|
edit: true
|
||||||
|
envKey: PANEL_APP_PORT_HTTP
|
||||||
|
labelEn: Port
|
||||||
|
labelZh: 端口
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
18
apps/changedetectionio/0.44/docker-compose.yml
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
changedetection:
|
||||||
|
container_name: ${CONTAINER_NAME}
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
ports:
|
||||||
|
- "${PANEL_APP_PORT_HTTP}:5000"
|
||||||
|
volumes:
|
||||||
|
- "./data:/datastore"
|
||||||
|
image: dgtlmoon/changedetection.io:0.44
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
networks:
|
||||||
|
1panel-network:
|
||||||
|
external: true
|
260
apps/changedetectionio/README.md
Normal file
@ -0,0 +1,260 @@
|
|||||||
|
## Web Site Change Detection, Restock monitoring and notifications.
|
||||||
|
|
||||||
|
**_Detect website content changes and perform meaningful actions - trigger notifications via Discord, Email, Slack, Telegram, API calls and many more._**
|
||||||
|
|
||||||
|
_Live your data-life pro-actively._
|
||||||
|
|
||||||
|
|
||||||
|
[<img src="https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/docs/screenshot.png" style="max-width:100%;" alt="Self-hosted web page change monitoring" title="Self-hosted web page change monitoring" />](https://changedetection.io?src=github)
|
||||||
|
|
||||||
|
[![Release Version][release-shield]][release-link] [![Docker Pulls][docker-pulls]][docker-link] [![License][license-shield]](https://github.com/dgtlmoon/changedetection.io/blob/master/LICENSE.md)
|
||||||
|
|
||||||
|
![changedetection.io](https://github.com/dgtlmoon/changedetection.io/actions/workflows/test-only.yml/badge.svg?branch=master)
|
||||||
|
|
||||||
|
[**Don't have time? Let us host it for you! try our $8.99/month subscription - use our proxies and support!**](https://changedetection.io) , _half the price of other website change monitoring services!_
|
||||||
|
|
||||||
|
- Chrome browser included.
|
||||||
|
- Super fast, no registration needed setup.
|
||||||
|
- Get started watching and receiving website change notifications straight away.
|
||||||
|
|
||||||
|
|
||||||
|
### Target specific parts of the webpage using the Visual Selector tool.
|
||||||
|
|
||||||
|
Available when connected to a <a href="https://github.com/dgtlmoon/changedetection.io/wiki/Playwright-content-fetcher">playwright content fetcher</a> (included as part of our subscription service)
|
||||||
|
|
||||||
|
[<img src="https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/docs/visualselector-anim.gif" style="max-width:100%;" alt="Self-hosted web page change monitoring context difference " title="Self-hosted web page change monitoring context difference " />](https://changedetection.io?src=github)
|
||||||
|
|
||||||
|
### Easily see what changed, examine by word, line, or individual character.
|
||||||
|
|
||||||
|
[<img src="https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/docs/screenshot-diff.png" style="max-width:100%;" alt="Self-hosted web page change monitoring context difference " title="Self-hosted web page change monitoring context difference " />](https://changedetection.io?src=github)
|
||||||
|
|
||||||
|
|
||||||
|
### Perform interactive browser steps
|
||||||
|
|
||||||
|
Fill in text boxes, click buttons and more, setup your changedetection scenario.
|
||||||
|
|
||||||
|
Using the **Browser Steps** configuration, add basic steps before performing change detection, such as logging into websites, adding a product to a cart, accept cookie logins, entering dates and refining searches.
|
||||||
|
|
||||||
|
[<img src="docs/browsersteps-anim.gif" style="max-width:100%;" alt="Self-hosted web page change monitoring context difference " title="Website change detection with interactive browser steps, login, cookies etc" />](https://changedetection.io?src=github)
|
||||||
|
|
||||||
|
After **Browser Steps** have been run, then visit the **Visual Selector** tab to refine the content you're interested in.
|
||||||
|
Requires Playwright to be enabled.
|
||||||
|
|
||||||
|
|
||||||
|
### Example use cases
|
||||||
|
|
||||||
|
- Products and services have a change in pricing
|
||||||
|
- _Out of stock notification_ and _Back In stock notification_
|
||||||
|
- Monitor and track PDF file changes, know when a PDF file has text changes.
|
||||||
|
- Governmental department updates (changes are often only on their websites)
|
||||||
|
- New software releases, security advisories when you're not on their mailing list.
|
||||||
|
- Festivals with changes
|
||||||
|
- Discogs restock alerts and monitoring
|
||||||
|
- Realestate listing changes
|
||||||
|
- Know when your favourite whiskey is on sale, or other special deals are announced before anyone else
|
||||||
|
- COVID related news from government websites
|
||||||
|
- University/organisation news from their website
|
||||||
|
- Detect and monitor changes in JSON API responses
|
||||||
|
- JSON API monitoring and alerting
|
||||||
|
- Changes in legal and other documents
|
||||||
|
- Trigger API calls via notifications when text appears on a website
|
||||||
|
- Glue together APIs using the JSON filter and JSON notifications
|
||||||
|
- Create RSS feeds based on changes in web content
|
||||||
|
- Monitor HTML source code for unexpected changes, strengthen your PCI compliance
|
||||||
|
- You have a very sensitive list of URLs to watch and you do _not_ want to use the paid alternatives. (Remember, _you_ are the product)
|
||||||
|
- Get notified when certain keywords appear in Twitter search results
|
||||||
|
- Proactively search for jobs, get notified when companies update their careers page, search job portals for keywords.
|
||||||
|
- Get alerts when new job positions are open on Bamboo HR and other job platforms
|
||||||
|
- Website defacement monitoring
|
||||||
|
- Pokémon Card Restock Tracker / Pokémon TCG Tracker
|
||||||
|
|
||||||
|
_Need an actual Chrome runner with Javascript support? We support fetching via WebDriver and Playwright!</a>_
|
||||||
|
|
||||||
|
#### Key Features
|
||||||
|
|
||||||
|
- Lots of trigger filters, such as "Trigger on text", "Remove text by selector", "Ignore text", "Extract text", also using regular-expressions!
|
||||||
|
- Target elements with xPath and CSS Selectors, Easily monitor complex JSON with JSONPath or jq
|
||||||
|
- Switch between fast non-JS and Chrome JS based "fetchers"
|
||||||
|
- Track changes in PDF files (Monitor text changed in the PDF, Also monitor PDF filesize and checksums)
|
||||||
|
- Easily specify how often a site should be checked
|
||||||
|
- Execute JS before extracting text (Good for logging in, see examples in the UI!)
|
||||||
|
- Override Request Headers, Specify `POST` or `GET` and other methods
|
||||||
|
- Use the "Visual Selector" to help target specific elements
|
||||||
|
- Configurable [proxy per watch](https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration)
|
||||||
|
- Send a screenshot with the notification when a change is detected in the web page
|
||||||
|
|
||||||
|
We [recommend and use Bright Data](https://brightdata.grsm.io/n0r16zf7eivq) global proxy services, Bright Data will match any first deposit up to $100 using our signup link.
|
||||||
|
|
||||||
|
Please :star: star :star: this project and help it grow! https://github.com/dgtlmoon/changedetection.io/
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
### Docker
|
||||||
|
|
||||||
|
With Docker composer, just clone this repository and..
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
Docker standalone
|
||||||
|
```bash
|
||||||
|
$ docker run -d --restart always -p "127.0.0.1:5000:5000" -v datastore-volume:/datastore --name changedetection.io dgtlmoon/changedetection.io
|
||||||
|
```
|
||||||
|
|
||||||
|
`:latest` tag is our latest stable release, `:dev` tag is our bleeding edge `master` branch.
|
||||||
|
|
||||||
|
Alternative docker repository over at ghcr - [ghcr.io/dgtlmoon/changedetection.io](https://ghcr.io/dgtlmoon/changedetection.io)
|
||||||
|
|
||||||
|
### Windows
|
||||||
|
|
||||||
|
See the install instructions at the wiki https://github.com/dgtlmoon/changedetection.io/wiki/Microsoft-Windows
|
||||||
|
|
||||||
|
### Python Pip
|
||||||
|
|
||||||
|
Check out our pypi page https://pypi.org/project/changedetection.io/
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ pip3 install changedetection.io
|
||||||
|
$ changedetection.io -d /path/to/empty/data/dir -p 5000
|
||||||
|
```
|
||||||
|
|
||||||
|
Then visit http://127.0.0.1:5000 , You should now be able to access the UI.
|
||||||
|
|
||||||
|
_Now with per-site configurable support for using a fast built in HTTP fetcher or use a Chrome based fetcher for monitoring of JavaScript websites!_
|
||||||
|
|
||||||
|
## Updating changedetection.io
|
||||||
|
|
||||||
|
### Docker
|
||||||
|
```
|
||||||
|
docker pull dgtlmoon/changedetection.io
|
||||||
|
docker kill $(docker ps -a -f name=changedetection.io -q)
|
||||||
|
docker rm $(docker ps -a -f name=changedetection.io -q)
|
||||||
|
docker run -d --restart always -p "127.0.0.1:5000:5000" -v datastore-volume:/datastore --name changedetection.io dgtlmoon/changedetection.io
|
||||||
|
```
|
||||||
|
|
||||||
|
### docker-compose
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose pull && docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
See the wiki for more information https://github.com/dgtlmoon/changedetection.io/wiki
|
||||||
|
|
||||||
|
|
||||||
|
## Filters
|
||||||
|
|
||||||
|
XPath, JSONPath, jq, and CSS support comes baked in! You can be as specific as you need, use XPath exported from various XPath element query creation tools.
|
||||||
|
(We support LXML `re:test`, `re:match` and `re:replace`.)
|
||||||
|
|
||||||
|
## Notifications
|
||||||
|
|
||||||
|
ChangeDetection.io supports a massive amount of notifications (including email, office365, custom APIs, etc) when a web-page has a change detected thanks to the <a href="https://github.com/caronc/apprise">apprise</a> library.
|
||||||
|
Simply set one or more notification URL's in the _[edit]_ tab of that watch.
|
||||||
|
|
||||||
|
Just some examples
|
||||||
|
|
||||||
|
discord://webhook_id/webhook_token
|
||||||
|
flock://app_token/g:channel_id
|
||||||
|
gitter://token/room
|
||||||
|
gchat://workspace/key/token
|
||||||
|
msteams://TokenA/TokenB/TokenC/
|
||||||
|
o365://TenantID:AccountEmail/ClientID/ClientSecret/TargetEmail
|
||||||
|
rocket://user:password@hostname/#Channel
|
||||||
|
mailto://user:pass@example.com?to=receivingAddress@example.com
|
||||||
|
json://someserver.com/custom-api
|
||||||
|
syslog://
|
||||||
|
|
||||||
|
<a href="https://github.com/caronc/apprise#popular-notification-services">And everything else in this list!</a>
|
||||||
|
|
||||||
|
<img src="https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/docs/screenshot-notifications.png" style="max-width:100%;" alt="Self-hosted web page change monitoring notifications" title="Self-hosted web page change monitoring notifications" />
|
||||||
|
|
||||||
|
Now you can also customise your notification content and use <a target="_new" href="https://jinja.palletsprojects.com/en/3.0.x/templates/">Jinja2 templating</a> for their title and body!
|
||||||
|
|
||||||
|
## JSON API Monitoring
|
||||||
|
|
||||||
|
Detect changes and monitor data in JSON API's by using either JSONPath or jq to filter, parse, and restructure JSON as needed.
|
||||||
|
|
||||||
|
![image](https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/docs/json-filter-field-example.png)
|
||||||
|
|
||||||
|
This will re-parse the JSON and apply formatting to the text, making it super easy to monitor and detect changes in JSON API results
|
||||||
|
|
||||||
|
![image](https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/docs/json-diff-example.png)
|
||||||
|
|
||||||
|
### JSONPath or jq?
|
||||||
|
|
||||||
|
For more complex parsing, filtering, and modifying of JSON data, jq is recommended due to the built-in operators and functions. Refer to the [documentation](https://stedolan.github.io/jq/manual/) for more specifc information on jq.
|
||||||
|
|
||||||
|
One big advantage of `jq` is that you can use logic in your JSON filter, such as filters to only show items that have a value greater than/less than etc.
|
||||||
|
|
||||||
|
See the wiki https://github.com/dgtlmoon/changedetection.io/wiki/JSON-Selector-Filter-help for more information and examples
|
||||||
|
|
||||||
|
### Parse JSON embedded in HTML!
|
||||||
|
|
||||||
|
When you enable a `json:` or `jq:` filter, you can even automatically extract and parse embedded JSON inside a HTML page! Amazingly handy for sites that build content based on JSON, such as many e-commerce websites.
|
||||||
|
|
||||||
|
```
|
||||||
|
<html>
|
||||||
|
...
|
||||||
|
<script type="application/ld+json">
|
||||||
|
|
||||||
|
{
|
||||||
|
"@context":"http://schema.org/",
|
||||||
|
"@type":"Product",
|
||||||
|
"offers":{
|
||||||
|
"@type":"Offer",
|
||||||
|
"availability":"http://schema.org/InStock",
|
||||||
|
"price":"3949.99",
|
||||||
|
"priceCurrency":"USD",
|
||||||
|
"url":"https://www.newegg.com/p/3D5-000D-001T1"
|
||||||
|
},
|
||||||
|
"description":"Cobratype King Cobra Hero Desktop Gaming PC",
|
||||||
|
"name":"Cobratype King Cobra Hero Desktop Gaming PC",
|
||||||
|
"sku":"3D5-000D-001T1",
|
||||||
|
"itemCondition":"NewCondition"
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
|
||||||
|
`json:$..price` or `jq:..price` would give `3949.99`, or you can extract the whole structure (use a JSONpath test website to validate with)
|
||||||
|
|
||||||
|
The application also supports notifying you that it can follow this information automatically
|
||||||
|
|
||||||
|
|
||||||
|
## Proxy Configuration
|
||||||
|
|
||||||
|
See the wiki https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration , we also support using [BrightData proxy services where possible]( https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration#brightdata-proxy-support)
|
||||||
|
|
||||||
|
## Raspberry Pi support?
|
||||||
|
|
||||||
|
Raspberry Pi and linux/arm/v6 linux/arm/v7 arm64 devices are supported! See the wiki for [details](https://github.com/dgtlmoon/changedetection.io/wiki/Fetching-pages-with-WebDriver)
|
||||||
|
|
||||||
|
## API Support
|
||||||
|
|
||||||
|
Supports managing the website watch list [via our API](https://changedetection.io/docs/api_v1/index.html)
|
||||||
|
|
||||||
|
## Support us
|
||||||
|
|
||||||
|
Do you use changedetection.io to make money? does it save you time or money? Does it make your life easier? less stressful? Remember, we write this software when we should be doing actual paid work, we have to buy food and pay rent just like you.
|
||||||
|
|
||||||
|
|
||||||
|
Firstly, consider taking out a [change detection monthly subscription - unlimited checks and watches](https://changedetection.io?src=github) , even if you don't use it, you still get the warm fuzzy feeling of helping out the project. (And who knows, you might just use it!)
|
||||||
|
|
||||||
|
Or directly donate an amount PayPal [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/donate/?hosted_button_id=7CP6HR9ZCNDYJ)
|
||||||
|
|
||||||
|
Or BTC `1PLFN327GyUarpJd7nVe7Reqg9qHx5frNn`
|
||||||
|
|
||||||
|
<img src="https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/docs/btc-support.png" style="max-width:50%;" alt="Support us!" />
|
||||||
|
|
||||||
|
## Commercial Support
|
||||||
|
|
||||||
|
I offer commercial support, this software is depended on by network security, aerospace , data-science and data-journalist professionals just to name a few, please reach out at dgtlmoon@gmail.com for any enquiries, I am more than glad to work with your organisation to further the possibilities of what can be done with changedetection.io
|
||||||
|
|
||||||
|
|
||||||
|
[release-shield]: https://img.shields.io:/github/v/release/dgtlmoon/changedetection.io?style=for-the-badge
|
||||||
|
[docker-pulls]: https://img.shields.io/docker/pulls/dgtlmoon/changedetection.io?style=for-the-badge
|
||||||
|
[test-shield]: https://github.com/dgtlmoon/changedetection.io/actions/workflows/test-only.yml/badge.svg?branch=master
|
||||||
|
|
||||||
|
[license-shield]: https://img.shields.io/github/license/dgtlmoon/changedetection.io.svg?style=for-the-badge
|
||||||
|
[release-link]: https://github.com/dgtlmoon/changedetection.io/releases
|
||||||
|
[docker-link]: https://hub.docker.com/r/dgtlmoon/changedetection.io
|
20
apps/changedetectionio/data.yml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
name: Changedetection.io
|
||||||
|
tags:
|
||||||
|
- 工具
|
||||||
|
title: 网站更改检测、补货监控和通知。
|
||||||
|
type: 工具
|
||||||
|
description: 网站更改检测、补货监控和通知。
|
||||||
|
additionalProperties:
|
||||||
|
key: changedetectionio
|
||||||
|
name: Changedetection.io
|
||||||
|
tags:
|
||||||
|
- Tool
|
||||||
|
shortDescZh: 网站更改检测、补货监控和通知。
|
||||||
|
shortDescEn: Web Site Change Detection, Restock monitoring and notifications
|
||||||
|
type: tool
|
||||||
|
crossVersionUpdate: true
|
||||||
|
limit: 0
|
||||||
|
recommend: 0
|
||||||
|
website: https://changedetection.io/
|
||||||
|
github: https://github.com/dgtlmoon/changedetection.io
|
||||||
|
document: https://github.com/dgtlmoon/changedetection.io/wiki
|
BIN
apps/changedetectionio/logo.png
Normal file
After Width: | Height: | Size: 22 KiB |
10
apps/focalboard/7.11.2/data.yml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
additionalProperties:
|
||||||
|
formFields:
|
||||||
|
- default: 40098
|
||||||
|
edit: true
|
||||||
|
envKey: PANEL_APP_PORT_HTTP
|
||||||
|
labelEn: Port
|
||||||
|
labelZh: 端口
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
16
apps/focalboard/7.11.2/data/config.json
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"serverRoot": "http://localhost:8000",
|
||||||
|
"port": 8000,
|
||||||
|
"dbtype": "sqlite3",
|
||||||
|
"dbconfig": "./data/focalboard.db",
|
||||||
|
"postgres_dbconfig": "dbname=focalboard sslmode=disable",
|
||||||
|
"useSSL": false,
|
||||||
|
"webpath": "./pack",
|
||||||
|
"filespath": "./data/files",
|
||||||
|
"telemetry": true,
|
||||||
|
"session_expire_time": 2592000,
|
||||||
|
"session_refresh_time": 18000,
|
||||||
|
"localOnly": false,
|
||||||
|
"enableLocalMode": true,
|
||||||
|
"localModeSocketLocation": "/var/tmp/focalboard_local.socket"
|
||||||
|
}
|
17
apps/focalboard/7.11.2/data/postgres-config.json
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"serverRoot": "http://localhost:8000",
|
||||||
|
"port": 8000,
|
||||||
|
"dbtype": "postgres",
|
||||||
|
"dbconfig": "postgres://boardsuser:boardsuser-password@focalboard-db/boards?sslmode=disable&connect_timeout=10",
|
||||||
|
"postgres_dbconfig": "dbname=boards sslmode=disable",
|
||||||
|
"useSSL": false,
|
||||||
|
"webpath": "./pack",
|
||||||
|
"filespath": "./data/files",
|
||||||
|
"telemetry": true,
|
||||||
|
"prometheusaddress": ":9092",
|
||||||
|
"session_expire_time": 2592000,
|
||||||
|
"session_refresh_time": 18000,
|
||||||
|
"localOnly": false,
|
||||||
|
"enableLocalMode": true,
|
||||||
|
"localModeSocketLocation": "/var/tmp/focalboard_local.socket"
|
||||||
|
}
|
23
apps/focalboard/7.11.2/docker-compose.yml
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
focalboard:
|
||||||
|
container_name: ${CONTAINER_NAME}
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
ports:
|
||||||
|
- "${PANEL_APP_PORT_HTTP}:8000"
|
||||||
|
volumes:
|
||||||
|
- "./data/config.json:/opt/focalboard/config.json" #sqlite
|
||||||
|
#- "./data/postgres-config.json:/opt/focalboard/config.json" #postgres,需要修改对应数据库信息
|
||||||
|
- fbdata:/opt/focalboard/data
|
||||||
|
image: mattermost/focalboard:7.11.2
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
fbdata:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
1panel-network:
|
||||||
|
external: true
|
149
apps/focalboard/README.md
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
# 使用说明
|
||||||
|
|
||||||
|
默认以`SQLite`数据库模式运行,
|
||||||
|
|
||||||
|
需要以`postgres`数据库运行的,需要修改目录下的`postgres-config.json`里的数据库信息
|
||||||
|
|
||||||
|
且修改`docker-compose.yml`文件里的配置映射。
|
||||||
|
|
||||||
|
# 原始相关
|
||||||
|
|
||||||
|
# :warning: Announcement: PLEASE READ :warning:
|
||||||
|
Focalboard Personal Server and Personal Desktop editions will transition to being fully community supported as of **April 30th, 2023**. This Focalboard repository will become the Personal Edition repository, and will remain open indefinitely. However, we won’t be adding any new enhancements, and will only address Sev-1 level bugs until April 30th, 2023.
|
||||||
|
|
||||||
|
# Focalboard
|
||||||
|
|
||||||
|
![CI Status](https://github.com/mattermost/focalboard/actions/workflows/ci.yml/badge.svg)
|
||||||
|
![CodeQL](https://github.com/mattermost/focalboard/actions/workflows/codeql-analysis.yml/badge.svg)
|
||||||
|
![Dev Release](https://github.com/mattermost/focalboard/actions/workflows/dev-release.yml/badge.svg)
|
||||||
|
![Prod Release](https://github.com/mattermost/focalboard/actions/workflows/prod-release.yml/badge.svg)
|
||||||
|
<a href="https://translate.mattermost.com/engage/focalboard/">
|
||||||
|
<img src="https://translate.mattermost.com/widgets/focalboard/-/svg-badge.svg" alt="Translation status" />
|
||||||
|
</a>
|
||||||
|
|
||||||
|
Like what you see? :eyes: Give us a GitHub Star! :star:
|
||||||
|
|
||||||
|
![Focalboard](https://github.com/mattermost/focalboard/raw/main/website/site/static/img/hero.jpg)
|
||||||
|
|
||||||
|
Focalboard is an open source, multilingual, self-hosted project management tool that's an alternative to Trello, Notion, and Asana.
|
||||||
|
|
||||||
|
It helps define, organize, track and manage work across individuals and teams. Focalboard comes in three editions:
|
||||||
|
|
||||||
|
* **[Mattermost Boards](https://mattermost.com/boards/)**: Integrated with the Mattermost platform for your team to plan and collaborate.
|
||||||
|
|
||||||
|
* **[Personal Desktop](https://www.focalboard.com/docs/personal-edition/desktop/)**: A standalone, single-user [macOS](https://apps.apple.com/app/apple-store/id1556908618?pt=2114704&ct=website&mt=8), [Windows](https://www.microsoft.com/store/apps/9NLN2T0SX9VF?cid=website), or [Linux](https://www.focalboard.com/download/personal-edition/desktop/#linux-desktop) desktop app for your own todos and personal projects.
|
||||||
|
|
||||||
|
* **[Personal Server](https://www.focalboard.com/download/personal-edition/ubuntu/)**: A standalone, multi-user server for development and personal use.
|
||||||
|
|
||||||
|
## Try Focalboard
|
||||||
|
|
||||||
|
### Mattermost Boards
|
||||||
|
|
||||||
|
**Mattermost Boards** combines project management tools with messaging and collaboration for teams of all sizes. To access and use **Mattermost Boards**, install or upgrade to Mattermost v6.0 or later as a [self-hosted server](https://docs.mattermost.com/guides/deployment.html?utm_source=github&utm_campaign=focalboard). After logging into Mattermost, select the menu in the top left corner and select **Boards**.
|
||||||
|
|
||||||
|
### Personal Desktop (Windows, Mac or Linux Desktop)
|
||||||
|
|
||||||
|
* **Windows**: Download from the [Windows App Store](https://www.microsoft.com/store/productId/9NLN2T0SX9VF) or download `focalboard-win.zip` from the [latest release](https://github.com/mattermost/focalboard/releases), unpack, and run `Focalboard.exe`.
|
||||||
|
* **Mac**: Download from the [Mac App Store](https://apps.apple.com/us/app/focalboard-insiders/id1556908618?mt=12).
|
||||||
|
* **Linux Desktop**: Download `focalboard-linux.tar.gz` from the [latest release](https://github.com/mattermost/focalboard/releases), unpack, and open `focalboard-app`.
|
||||||
|
|
||||||
|
### Personal Server
|
||||||
|
|
||||||
|
**Ubuntu**: You can download and run the compiled Focalboard **Personal Server** on Ubuntu by following [our latest install guide](https://www.focalboard.com/download/personal-edition/ubuntu/).
|
||||||
|
|
||||||
|
### API Docs
|
||||||
|
|
||||||
|
Boards API docs can be found over at https://htmlpreview.github.io/?https://github.com/mattermost/focalboard/blob/main/server/swagger/docs/html/index.html
|
||||||
|
|
||||||
|
## Contribute to Focalboard
|
||||||
|
|
||||||
|
For anyone interested in being an official maintainer of the Focalboard repository, please reach out to us on our [Focalboard Community Channel](https://community.mattermost.com/core/channels/focalboard). If there are no maintainers, and you’re still interested in adding your own improvements to the Focalboard Personal Editions, we encourage you to fork and maintain the repository.
|
||||||
|
|
||||||
|
### Getting started
|
||||||
|
|
||||||
|
Our [developer guide](https://developers.mattermost.com/contribute/focalboard/personal-server-setup-guide) has detailed instructions on how to set up your development environment for the **Personal Server**. It also provides more information about contributing to our open source community.
|
||||||
|
|
||||||
|
Clone [mattermost-server](https://github.com/mattermost/mattermost-server) into sibling directory.
|
||||||
|
|
||||||
|
Create an `.env` file in the focalboard directory that contains:
|
||||||
|
|
||||||
|
```
|
||||||
|
EXCLUDE_ENTERPRISE="1"
|
||||||
|
```
|
||||||
|
|
||||||
|
To build the server:
|
||||||
|
|
||||||
|
```
|
||||||
|
make prebuild
|
||||||
|
make
|
||||||
|
```
|
||||||
|
|
||||||
|
To run the server:
|
||||||
|
|
||||||
|
```
|
||||||
|
./bin/focalboard-server
|
||||||
|
```
|
||||||
|
|
||||||
|
Then navigate your browser to [`http://localhost:8000`](http://localhost:8000) to access your Focalboard server. The port is configured in `config.json`.
|
||||||
|
|
||||||
|
Once the server is running, you can rebuild just the web app via `make webapp` in a separate terminal window. Reload your browser to see the changes.
|
||||||
|
|
||||||
|
### Building and running standalone desktop apps
|
||||||
|
|
||||||
|
You can build standalone apps that package the server to run locally against SQLite:
|
||||||
|
|
||||||
|
* **Windows**:
|
||||||
|
* *Requires Windows 10, [Windows 10 SDK](https://developer.microsoft.com/en-us/windows/downloads/sdk-archive/) 10.0.19041.0, and .NET 4.8 developer pack*
|
||||||
|
* Open a `git-bash` prompt.
|
||||||
|
* Run `make prebuild`
|
||||||
|
* The above prebuild step needs to be run only when you make changes to or want to install your npm dependencies, etc.
|
||||||
|
* Once the prebuild is completed, you can keep repeating the below steps to build the app & see the changes.
|
||||||
|
* Run `make win-wpf-app`
|
||||||
|
* Run `cd win-wpf/msix && focalboard.exe`
|
||||||
|
* **Mac**:
|
||||||
|
* *Requires macOS 11.3+ and Xcode 13.2.1+*
|
||||||
|
* Run `make prebuild`
|
||||||
|
* The above prebuild step needs to be run only when you make changes to or want to install your npm dependencies, etc.
|
||||||
|
* Once the prebuild is completed, you can keep repeating the below steps to build the app & see the changes.
|
||||||
|
* Run `make mac-app`
|
||||||
|
* Run `open mac/dist/Focalboard.app`
|
||||||
|
* **Linux**:
|
||||||
|
* *Tested on Ubuntu 18.04*
|
||||||
|
* Install `webgtk` dependencies
|
||||||
|
* Run `sudo apt-get install libgtk-3-dev`
|
||||||
|
* Run `sudo apt-get install libwebkit2gtk-4.0-dev`
|
||||||
|
* Run `make prebuild`
|
||||||
|
* The above prebuild step needs to be run only when you make changes to or want to install your npm dependencies, etc.
|
||||||
|
* Once the prebuild is completed, you can keep repeating the below steps to build the app & see the changes.
|
||||||
|
* Run `make linux-app`
|
||||||
|
* Uncompress `linux/dist/focalboard-linux.tar.gz` to a directory of your choice
|
||||||
|
* Run `focalboard-app` from the directory you have chosen
|
||||||
|
* **Docker**:
|
||||||
|
* To run it locally from offical image:
|
||||||
|
* `docker run -it -p 80:8000 mattermost/focalboard`
|
||||||
|
* To build it for your current architecture:
|
||||||
|
* `docker build -f docker/Dockerfile .`
|
||||||
|
* To build it for a custom architecture (experimental):
|
||||||
|
* `docker build -f docker/Dockerfile --platform linux/arm64 .`
|
||||||
|
|
||||||
|
Cross-compilation currently isn't fully supported, so please build on the appropriate platform. Refer to the GitHub Actions workflows (`build-mac.yml`, `build-win.yml`, `build-ubuntu.yml`) for the detailed list of steps on each platform.
|
||||||
|
|
||||||
|
### Unit testing
|
||||||
|
|
||||||
|
Before checking in commits, run `make ci`, which is similar to the `.gitlab-ci.yml` workflow and includes:
|
||||||
|
|
||||||
|
* **Server unit tests**: `make server-test`
|
||||||
|
* **Web app ESLint**: `cd webapp; npm run check`
|
||||||
|
* **Web app unit tests**: `cd webapp; npm run test`
|
||||||
|
* **Web app UI tests**: `cd webapp; npm run cypress:ci`
|
||||||
|
|
||||||
|
### Translating
|
||||||
|
|
||||||
|
Help translate Focalboard! The app is already translated into several languages. We welcome corrections and new language translations! You can add new languages or improve existing translations at [Weblate](https://translate.mattermost.com/engage/focalboard/).
|
||||||
|
|
||||||
|
### Staying informed
|
||||||
|
|
||||||
|
* **Changes**: See the [CHANGELOG](CHANGELOG.md) for the latest updates
|
||||||
|
* **GitHub Discussions**: Join the [Developer Discussion](https://github.com/mattermost/focalboard/discussions) board
|
||||||
|
* **Bug Reports**: [File a bug report](https://github.com/mattermost/focalboard/issues/new?assignees=&labels=bug&template=bug_report.md&title=)
|
||||||
|
* **Chat**: Join the [Focalboard community channel](https://community.mattermost.com/core/channels/focalboard)
|
20
apps/focalboard/data.yml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
name: Focalboard
|
||||||
|
tags:
|
||||||
|
- 工具
|
||||||
|
title: Trello,Notion和Asana的开源自托管替代方案
|
||||||
|
type: 工具
|
||||||
|
description: Trello,Notion和Asana的开源自托管替代方案
|
||||||
|
additionalProperties:
|
||||||
|
key: focalboard
|
||||||
|
name: Focalboard
|
||||||
|
tags:
|
||||||
|
- Tool
|
||||||
|
shortDescZh: Trello,Notion和Asana的开源自托管替代方案
|
||||||
|
shortDescEn: An open source, self-hosted alternative to Trello, Notion, and Asana
|
||||||
|
type: tool
|
||||||
|
crossVersionUpdate: true
|
||||||
|
limit: 0
|
||||||
|
recommend: 0
|
||||||
|
website: https://www.focalboard.com/
|
||||||
|
github: https://github.com/mattermost/focalboard
|
||||||
|
document: https://docs.mattermost.com/guides/boards.html
|
BIN
apps/focalboard/logo.png
Normal file
After Width: | Height: | Size: 4.0 KiB |
18
apps/heimdall/2.5.6/data.yml
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
additionalProperties:
|
||||||
|
formFields:
|
||||||
|
- default: 40049
|
||||||
|
edit: true
|
||||||
|
envKey: PANEL_APP_PORT_HTTP
|
||||||
|
labelEn: HTTP Port
|
||||||
|
labelZh: HTTP端口
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
||||||
|
- default: 40050
|
||||||
|
edit: true
|
||||||
|
envKey: PANEL_APP_PORT_HTTPS
|
||||||
|
labelEn: HTTPS Port
|
||||||
|
labelZh: HTTPS端口
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
23
apps/heimdall/2.5.6/docker-compose.yml
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
heimdall:
|
||||||
|
container_name: ${CONTAINER_NAME}
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
ports:
|
||||||
|
- "${PANEL_APP_PORT_HTTP}:80"
|
||||||
|
- "${PANEL_APP_PORT_HTTPS}:443"
|
||||||
|
volumes:
|
||||||
|
- "./data:/config"
|
||||||
|
environment:
|
||||||
|
- PUID=1000
|
||||||
|
- PGID=1000
|
||||||
|
- TZ=Asia/Shanghai
|
||||||
|
image: linuxserver/heimdall:2.5.6
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
networks:
|
||||||
|
1panel-network:
|
||||||
|
external: true
|
219
apps/heimdall/README.md
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
# Heimdall
|
||||||
|
|
||||||
|
[![Heimdall_Banner](https://i.imgur.com/iuV8w3y.png)](https://heimdall.site)
|
||||||
|
|
||||||
|
[![Discord](https://img.shields.io/discord/354974912613449730.svg)](https://discord.gg/CCjHKn4)
|
||||||
|
[![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/heimdall.svg)](https://hub.docker.com/r/linuxserver/heimdall/)
|
||||||
|
[![firsttimersonly](https://img.shields.io/badge/first--timers--only-friendly-blue.svg)](https://www.firsttimersonly.com/)
|
||||||
|
[![Paypal](https://heimdall.site/img/paypaldonate.svg)](https://www.paypal.me/heimdall)
|
||||||
|
|
||||||
|
___
|
||||||
|
|
||||||
|
Visit the website - https://heimdall.site
|
||||||
|
___
|
||||||
|
|
||||||
|
## About
|
||||||
|
As the name suggests Heimdall Application Dashboard is a dashboard for all your web applications. It doesn't need to be limited to applications though, you can add links to anything you like.
|
||||||
|
|
||||||
|
Heimdall is an elegant solution to organise all your web applications. It’s dedicated to this purpose so you won’t lose your links in a sea of bookmarks.
|
||||||
|
|
||||||
|
Why not use it as your browser start page? It even has the ability to include a search bar using either Google, Bing or DuckDuckGo.
|
||||||
|
|
||||||
|
![Heimdall demo animation](https://i.imgur.com/MrC4QpN.gif)
|
||||||
|
|
||||||
|
## Video
|
||||||
|
If you want to see a quick video of it in use, go to https://youtu.be/GXnnMAxPzMc
|
||||||
|
|
||||||
|
## Supported applications
|
||||||
|
You can use the app to link to any site or application, but Foundation apps will auto fill in the icon for the app and supply a default color for the tile. In addition Enhanced apps allow you provide details to an apps API, allowing you to view live stats directly on the dashboad. For example, the NZBGet and Sabnzbd Enhanced apps will display the queue size and download speed while something is downloading.
|
||||||
|
|
||||||
|
Supported applications are recognized by the title of the application as entered in the title field when adding an application. For example, to add a link to pfSense, begin by typing "p" in the title field and then select "pfSense" from the list of supported applications.
|
||||||
|
|
||||||
|
[![enhancedapps](https://img.shields.io/badge/dynamic/json.svg?label=Enhanced%20Apps&url=https%3A%2F%2Fapps.heimdall.site%2Fstats&query=enhanced_apps&colorB=3f8483&style=for-the-badge&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAjCAMAAACw/5reAAAAnFBMVEUAAADu7u7u7u7u7u7u7u7x8fHu7u7u7u7u7u7u7u7u7u7u7u7r6+vu7u7v7+/u7u7t7e3v7+/v7+/u7u7u7u7u7u7u7u7u7u7u7u7u7u7v7+/u7u7p6ent7e3v7+/v7+/v7+/u7u7u7u7u7u7u7u7t7e3////u7u7u7u7u7u7u7u7w8PDw8PDt7e3u7u7t7e3s7Ozu7u7t7e3u7u4TnCP6AAAAM3RSTlMA+9n3phHw3czC088M5Y5zG6mflWdJFumyfj4sB2NeTi7hiWlDOQPGt5lsMiG9hFQntpFqxQJtAAABnElEQVQoz2WRh3KrQAxFtYWO6ZhucItrynv6/3/LFnA24c6wurpnYBkJZvXduNix6+GXTo8qWnxUPU4m2w0O1ktTozPsftiZpejGlm7C2MWUnRcWOohIo36+PaKyDZdLUOgDXvqQfaT9kwkfvP3AN18E7Kl8hkJHMHSXSSadxaTtTNjJhMkfjFHKMqGlolg4T7mtCbcq8gBCotxkwklFLIQSlQoTHnVWQqzNxYQuzpfmqGVMc5ijHK5yAuIhxbZ5p/S92RZkjv5BKs6aosSIr0JrcXBo1FtICVINKRKK6u0GnraoN84O5KbhjRwYzxCJnQCMtotkdNxjq2F7dJ2RoGuXIBTvc3ROthdmat6hZ7cOyfcxKGV+wTxBkxQxTQTzWOFny/7qS2nzx37T7nbtZj9xu7zUr/323nVy0sQnhwMJktSZrl5v7CjgSQmWi+haUCY8sH4tyc/FGSKGouS+WqBJm8U2NIE/+nLu2tzpF/xVNGy02QzRClafC/ysVpDzQJuA8xXsKl8bv+pgpXz57H9Yy3J1lQNY62wUrW+mdzrylWS0QwAAAABJRU5ErkJggg==)](https://apps.heimdall.site/applications/enhanced)
|
||||||
|
|
||||||
|
[![foundationapps](https://img.shields.io/badge/dynamic/json.svg?label=Foundation%20Apps&url=https%3A%2F%2Fapps.heimdall.site%2Fstats&query=foundation_apps&colorB=3f8483&style=for-the-badge&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAjCAMAAACw/5reAAAAnFBMVEUAAADu7u7u7u7u7u7u7u7x8fHu7u7u7u7u7u7u7u7u7u7u7u7r6+vu7u7v7+/u7u7t7e3v7+/v7+/u7u7u7u7u7u7u7u7u7u7u7u7u7u7v7+/u7u7p6ent7e3v7+/v7+/v7+/u7u7u7u7u7u7u7u7t7e3////u7u7u7u7u7u7u7u7w8PDw8PDt7e3u7u7t7e3s7Ozu7u7t7e3u7u4TnCP6AAAAM3RSTlMA+9n3phHw3czC088M5Y5zG6mflWdJFumyfj4sB2NeTi7hiWlDOQPGt5lsMiG9hFQntpFqxQJtAAABnElEQVQoz2WRh3KrQAxFtYWO6ZhucItrynv6/3/LFnA24c6wurpnYBkJZvXduNix6+GXTo8qWnxUPU4m2w0O1ktTozPsftiZpejGlm7C2MWUnRcWOohIo36+PaKyDZdLUOgDXvqQfaT9kwkfvP3AN18E7Kl8hkJHMHSXSSadxaTtTNjJhMkfjFHKMqGlolg4T7mtCbcq8gBCotxkwklFLIQSlQoTHnVWQqzNxYQuzpfmqGVMc5ijHK5yAuIhxbZ5p/S92RZkjv5BKs6aosSIr0JrcXBo1FtICVINKRKK6u0GnraoN84O5KbhjRwYzxCJnQCMtotkdNxjq2F7dJ2RoGuXIBTvc3ROthdmat6hZ7cOyfcxKGV+wTxBkxQxTQTzWOFny/7qS2nzx37T7nbtZj9xu7zUr/323nVy0sQnhwMJktSZrl5v7CjgSQmWi+haUCY8sH4tyc/FGSKGouS+WqBJm8U2NIE/+nLu2tzpF/xVNGy02QzRClafC/ysVpDzQJuA8xXsKl8bv+pgpXz57H9Yy3J1lQNY62wUrW+mdzrylWS0QwAAAABJRU5ErkJggg==)](https://apps.heimdall.site/applications/foundation)
|
||||||
|
|
||||||
|
## Installing
|
||||||
|
Apart from the Laravel 8 dependencies, namely PHP >= 7.4.32, BCMath PHP Extension, INTL PHP Extension, Ctype PHP Extension, Fileinfo PHP extension, JSON PHP Extension, Mbstring PHP Extension, OpenSSL PHP Extension, PDO PHP Extension, Tokenizer PHP Extension, XML PHP Extension, the only other thing Heimdall needs is sqlite support and zip support (php-zip).
|
||||||
|
|
||||||
|
If you find you can't change the background make sure `php_fileinfo` is enabled in your php.ini. I believe it should be by default, but one user came across the issue on a windows system.
|
||||||
|
|
||||||
|
Installation is as simple as cloning the repository somewhere, or downloading and extracting the zip/tar and pointing your httpd document root to the `/public` folder then creating the .env file and generating an encryption key (this is all taken care of for you with the docker).
|
||||||
|
|
||||||
|
```
|
||||||
|
cd /path/to/heimdall
|
||||||
|
cp .env.example .env
|
||||||
|
php artisan key:generate
|
||||||
|
```
|
||||||
|
|
||||||
|
For simple testing you could just go to the folder and type `php artisan serve`
|
||||||
|
|
||||||
|
There is also a multi-arch Docker which supports x86-64, armhf and arm64, instructions on how to use them at
|
||||||
|
|
||||||
|
- https://hub.docker.com/r/linuxserver/heimdall/
|
||||||
|
|
||||||
|
## Updating
|
||||||
|
To update your instance, simply clone this repository or download the zip/tar file with the new version and copy it over the old installation.
|
||||||
|
|
||||||
|
## Search Providers
|
||||||
|
v2.3.0 added the ability for users to customise the search options.
|
||||||
|
|
||||||
|
Options are stored in `/storage/app/searchproviders.yaml` (`/config/www/searchproviders.yaml` on docker installs), feel free to rearrange the options, add new ones, delete ones you don't use, etc.
|
||||||
|
|
||||||
|
Consider contributing to https://github.com/linuxserver/Heimdall/discussions/categories/search-providers to help others add new ones.
|
||||||
|
|
||||||
|
The item at the top of the list `Tiles` allows you to search for apps on your dashboard by name, helpful when you have lots of icons.
|
||||||
|
|
||||||
|
## New background image not being set
|
||||||
|
If you are using the docker image or a default php install you may find images over 2MB wont get set as the background image, you just need to change the `upload_max_filesize` in the php.ini.
|
||||||
|
|
||||||
|
If you are using the linuxserver.io docker image simply edit `/path/to/config/php/php-local.ini` and add `upload_max_filesize = 30M` to the end.
|
||||||
|
|
||||||
|
## Docker and enhanced apps
|
||||||
|
If you are running the docker and the EnhancedApps you are using are also in dockers, you may need to use the docker networking addresses to communicate with them.
|
||||||
|
|
||||||
|
You can do this by using `http(s)://docker_name:port` in the config section. Instead of the name you can use the internal docker ip, this usually starts with `172.`
|
||||||
|
|
||||||
|
## Languages
|
||||||
|
The app has been translated into several languages; however, the quality of the translations could do with work. If you would like to improve them, or help with other translations, they are stored in `/resources/lang/`.
|
||||||
|
|
||||||
|
To create a new language translation, make a new folder with the ISO 3166-1 alpha-2 code as the name, copy `app.php` from `/resources/lang/en/app.php` into your new folder and replace the English strings.
|
||||||
|
|
||||||
|
When you are finished, create a pull request.
|
||||||
|
|
||||||
|
Currently added languages are
|
||||||
|
|
||||||
|
- Breton
|
||||||
|
- Chinese
|
||||||
|
- Danish
|
||||||
|
- Dutch
|
||||||
|
- English
|
||||||
|
- Finnish
|
||||||
|
- French
|
||||||
|
- German
|
||||||
|
- Greek
|
||||||
|
- Hungarian
|
||||||
|
- Italian
|
||||||
|
- Japanese
|
||||||
|
- Korean
|
||||||
|
- Lombard
|
||||||
|
- Norwegian
|
||||||
|
- Polish
|
||||||
|
- Portuguese
|
||||||
|
- Russian
|
||||||
|
- Slovenian
|
||||||
|
- Spanish
|
||||||
|
- Swedish
|
||||||
|
- Turkish
|
||||||
|
|
||||||
|
## Web Server Configuration
|
||||||
|
|
||||||
|
### Apache
|
||||||
|
A `.htaccess` file ships with the app, however, a lot of apache installations disallow `.htaccess` files by default.
|
||||||
|
You will notice this due to some links not working like `/settings`.
|
||||||
|
In addition mod-rewrite needs to be enabled if it isn't already.
|
||||||
|
|
||||||
|
#### Fixes & work around options
|
||||||
|
##### - Apache global allow .htaccess
|
||||||
|
Find the `AllowOverride None` line in your apache configuration and change this to `AllowOverride All`
|
||||||
|
|
||||||
|
##### - Apache vhost configuration allow .htaccess
|
||||||
|
In the apache vhost configuration in the `<Directory />` block add `AllowOverride All`
|
||||||
|
|
||||||
|
##### - Add .htaccess content in apache configuration
|
||||||
|
You can add the full `.htaccess` into your apache configuration, this way you do not need to allow `.htaccess` files.
|
||||||
|
You can even shorten the content of the `.htaccess` when inserting it into the apache configuration to:
|
||||||
|
```
|
||||||
|
Options +FollowSymLinks
|
||||||
|
RewriteEngine On
|
||||||
|
|
||||||
|
RewriteCond %{REQUEST_FILENAME} !-d
|
||||||
|
RewriteCond %{REQUEST_FILENAME} !-f
|
||||||
|
RewriteRule ^ index.php [L]
|
||||||
|
```
|
||||||
|
#### More info
|
||||||
|
More info about `AllowOverride` can be found here:
|
||||||
|
https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Nginx
|
||||||
|
If you are using Nginx, the following directive in your site configuration will direct all requests to the `index.php` front controller:
|
||||||
|
|
||||||
|
```
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.php?$query_string;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Someone was using the same nginx setup to both run this and reverse proxy Plex, Plex is served from `/web` so their location was interfering with the `/webfonts`.
|
||||||
|
|
||||||
|
Therefore, if your fonts aren't showing because you have a location for `/web`, add the following
|
||||||
|
```
|
||||||
|
location /webfonts {
|
||||||
|
try_files $uri $uri/;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
If there are any other locations which might interfere with any of the folders in the `/public` folder, you might have to do the same for those as well, but it's a super fringe case.
|
||||||
|
|
||||||
|
### Reverse proxy
|
||||||
|
If you'd like to reverse proxy this app, we recommend using our letsencrypt/nginx docker image: [SWAG - Secure Web Application Gateway](https://hub.docker.com/r/linuxserver/swag)
|
||||||
|
You can either reverse proxy from the root location, or from a subdomain (subfolder method is currently not supported). For HTTPS proxy, make sure you use the HTTPS port of Heimdall webserver, otherwise some links may break. You can add security through `.htpasswd`
|
||||||
|
|
||||||
|
```
|
||||||
|
location / {
|
||||||
|
auth_basic "Restricted";
|
||||||
|
auth_basic_user_file /config/nginx/.htpasswd;
|
||||||
|
include /config/nginx/proxy.conf;
|
||||||
|
proxy_set_header X-Forwarded-Proto https;
|
||||||
|
proxy_pass http://heimdall;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Self-signed certificates and local CAs
|
||||||
|
Per default Heimdall uses the standard certificate bundle file (`ca-certificates.crt`) to verify HTTPS sites and will ignore additional certificates placed in `/etc/ssl/certs`. If you wish to use enhanced apps with HTTPS sites that use a self-signed certificate or certs signed with your own local CA, you can override the default bundle:
|
||||||
|
|
||||||
|
- Create a unified certificate `.pem` file that contains all CAs and certificates that Heimdall has to verify. For example, if you use both LetsEncrypt and a local CA for your internal apps, concatenate the LetsEncrypt intermediate CA (export via browser) and your local CA `cert.pem` (or any number of self-signed certs) into one `heimdall.pem` file.
|
||||||
|
- Place the `heimdall.pem` into the container (if you use Docker), for example by placing it in the path that you mapped to `/config`. Make sure that the Heimdall user has read access (`chmod a+r`).
|
||||||
|
- Set the `openssl.cafile` setting in `/config/php/php-local.ini` to your cert bundle:
|
||||||
|
|
||||||
|
```
|
||||||
|
# /config/php/php-local.ini
|
||||||
|
openssl.cafile = /config/heimdall.pem
|
||||||
|
```
|
||||||
|
|
||||||
|
Restart the container and the enhanced apps should now be able to access your local HTTP websites. This configuration will survive updating or recreating the Heimdall container.
|
||||||
|
|
||||||
|
## Running offline
|
||||||
|
The apps list is hosted on github, you have a couple of options if you want to run without a connection to the outside world:
|
||||||
|
1) Clone the repository and host it yourself, look at the .github actions file to see how to generate the apps list.
|
||||||
|
2) Download the apps list and store it as a json accessible to heimdall named `list.json`
|
||||||
|
|
||||||
|
With both options all you need to do is add the following to your `.env`
|
||||||
|
`APP_SOURCE=http://localhost/` Where `http://localhost/` is the path to the apps list without the name of the file, so if your file is stored at `https://heimdall.local/list.json` you would put `APP_SOURCE=https://heimdall.local/`
|
||||||
|
|
||||||
|
## Support
|
||||||
|
https://discord.gg/CCjHKn4 or through GitHub issues
|
||||||
|
|
||||||
|
## Donate
|
||||||
|
If you would like to show your appreciation, feel free to use the link below.
|
||||||
|
|
||||||
|
[![PayPal](https://heimdall.site/img/paypaldonate.svg)](https://www.paypal.me/heimdall)
|
||||||
|
|
||||||
|
## Credits
|
||||||
|
- PHP Framework - [Laravel](https://laravel.com/)
|
||||||
|
- Icons - [FontAwesome 5](https://fontawesome.com/)
|
||||||
|
- JavaScript - [jQuery](https://jquery.com/)
|
||||||
|
- Colour picker - [Huebee](http://huebee.buzz/)
|
||||||
|
- Background image - [pexels](https://www.pexels.com)
|
||||||
|
- Trianglify library - [Trianglify](https://github.com/qrohlf/trianglify)
|
||||||
|
- Everyone at Linuxserver.io that has helped with the app and let's not forget IronicBadger for the following question that started it all:
|
||||||
|
```
|
||||||
|
you know, i would love something like this landing page for all my servers apps
|
||||||
|
that gives me the ability to pin favourites
|
||||||
|
and / or search
|
||||||
|
@Stark @Kode do either of you think you'd be able to rustle something like this up ?
|
||||||
|
```
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This app is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).
|
20
apps/heimdall/data.yml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
name: Heimdall
|
||||||
|
tags:
|
||||||
|
- 工具
|
||||||
|
title: 应用程序仪表板和启动器
|
||||||
|
type: 工具
|
||||||
|
description: 应用程序仪表板和启动器
|
||||||
|
additionalProperties:
|
||||||
|
key: heimdall
|
||||||
|
name: Heimdall
|
||||||
|
tags:
|
||||||
|
- Tool
|
||||||
|
shortDescZh: 应用程序仪表板和启动器
|
||||||
|
shortDescEn: An Application dashboard and launcher
|
||||||
|
type: tool
|
||||||
|
crossVersionUpdate: true
|
||||||
|
limit: 0
|
||||||
|
recommend: 0
|
||||||
|
website: https://heimdall.site/
|
||||||
|
github: https://github.com/linuxserver/Heimdall
|
||||||
|
document: https://github.com/linuxserver/Heimdall
|
BIN
apps/heimdall/logo.png
Normal file
After Width: | Height: | Size: 15 KiB |
10
apps/hertzbeat/1.4.0/data.yml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
additionalProperties:
|
||||||
|
formFields:
|
||||||
|
- default: 40066
|
||||||
|
edit: true
|
||||||
|
envKey: PANEL_APP_PORT_HTTP
|
||||||
|
labelEn: Port
|
||||||
|
labelZh: 端口
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
22
apps/hertzbeat/1.4.0/docker-compose.yml
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
hertzbeat:
|
||||||
|
container_name: ${CONTAINER_NAME}
|
||||||
|
restart: always
|
||||||
|
environment:
|
||||||
|
- TZ=Asia/Shanghai
|
||||||
|
- LANG=zh_CN.UTF-8
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
ports:
|
||||||
|
- "${PANEL_APP_PORT_HTTP}:1157"
|
||||||
|
volumes:
|
||||||
|
- "./data/data:/opt/hertzbeat/data"
|
||||||
|
- "./data/logs:/opt/hertzbeat/logs"
|
||||||
|
image: tancloud/hertzbeat:v1.4.0
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
networks:
|
||||||
|
1panel-network:
|
||||||
|
external: true
|
390
apps/hertzbeat/README.md
Normal file
@ -0,0 +1,390 @@
|
|||||||
|
# 使用说明
|
||||||
|
|
||||||
|
- 默认账户密码
|
||||||
|
```
|
||||||
|
username:admin
|
||||||
|
password:hertzbeat
|
||||||
|
``````
|
||||||
|
# 原始相关
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://hertzbeat.com">
|
||||||
|
<img alt="hertzbeat" src="https://cdn.jsdelivr.net/gh/dromara/hertzbeat/home/static/img/hertzbeat-brand.svg" width="260">
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
> 默认账户密码 admin/hertzbeat
|
||||||
|
|
||||||
|
[comment]: <> (<img alt="sureness" src="https://cdn.jsdelivr.net/gh/dromara/hertzbeat/home/static/img/hertzbeat-brand.svg" width="300">)
|
||||||
|
|
||||||
|
## HertzBeat 赫兹跳动
|
||||||
|
|
||||||
|
> 易用友好的开源实时监控告警系统,无需Agent,强大自定义监控能力。
|
||||||
|
|
||||||
|
[![discord](https://img.shields.io/badge/chat-on%20discord-brightgreen)](https://discord.gg/Fb6M73htGr)
|
||||||
|
[![Gitter](https://badges.gitter.im/hertzbeat/community.svg)](https://gitter.im/hertzbeat/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
|
||||||
|
[![QQ](https://img.shields.io/badge/qq-236915833-orange)](https://jq.qq.com/?_wv=1027&k=aVIVB2K9)
|
||||||
|
![hertzbeat](https://cdn.jsdelivr.net/gh/dromara/hertzbeat@gh-pages/img/badge/web-monitor.svg)
|
||||||
|
![hertzbeat](https://cdn.jsdelivr.net/gh/dromara/hertzbeat@gh-pages/img/badge/ping-connect.svg)
|
||||||
|
![hertzbeat](https://cdn.jsdelivr.net/gh/dromara/hertzbeat@gh-pages/img/badge/port-available.svg)
|
||||||
|
![hertzbeat](https://cdn.jsdelivr.net/gh/dromara/hertzbeat@gh-pages/img/badge/database-monitor.svg)
|
||||||
|
![hertzbeat](https://cdn.jsdelivr.net/gh/dromara/hertzbeat@gh-pages/img/badge/os-monitor.svg)
|
||||||
|
![hertzbeat](https://img.shields.io/badge/monitor-cloud%20native-brightgreen)
|
||||||
|
![hertzbeat](https://img.shields.io/badge/monitor-middleware-blueviolet)
|
||||||
|
![hertzbeat](https://img.shields.io/badge/monitor-network-red)
|
||||||
|
![hertzbeat](https://cdn.jsdelivr.net/gh/dromara/hertzbeat@gh-pages/img/badge/custom-monitor.svg)
|
||||||
|
![hertzbeat](https://cdn.jsdelivr.net/gh/dromara/hertzbeat@gh-pages/img/badge/alert.svg)
|
||||||
|
|
||||||
|
**官网: [hertzbeat.dromara.org](https://hertzbeat.dromara.org) | [hertzbeat.com](https://hertzbeat.com)**
|
||||||
|
|
||||||
|
**云服务: [tancloud.cn](https://tancloud.cn)**
|
||||||
|
|
||||||
|
## 🎡 <font color="green">介绍</font>
|
||||||
|
|
||||||
|
> [HertzBeat赫兹跳动](https://github.com/dromara/hertzbeat) 是一个拥有强大自定义监控能力,无需 Agent 的开源实时监控告警系统。
|
||||||
|
> 集 **监控+告警+通知** 为一体,支持对应用服务,数据库,操作系统,中间件,云原生,网络等监控,阈值告警通知一步到位。
|
||||||
|
> 易用友好,全 WEB 页面操作,鼠标点一点就能监控告警,零上手学习成本。
|
||||||
|
> 更自由化的阈值规则,`邮件` `Discord` `Slack` `Telegram` `钉钉` `微信` `飞书` `短信` `Webhook` 等方式及时送达。
|
||||||
|
|
||||||
|
> 我们将`Http,Jmx,Ssh,Snmp,Jdbc`等协议规范可配置化,您只需在浏览器配置`YML`就能使用这些协议去自定义采集任何您想要的指标。
|
||||||
|
> 您相信只需配置下就能立刻适配一款`K8s`或`Docker`等新的监控类型吗?
|
||||||
|
|
||||||
|
> `HertzBeat`的强大自定义,多类型支持,易扩展,低耦合,希望能帮助开发者和中小团队快速搭建自有监控系统。
|
||||||
|
> 当然我们也提供了对应的 **[SAAS版本监控云](https://console.tancloud.cn)**,中小团队和个人无需再为了监控自己的网站资源,而去部署学习一套繁琐的监控系统,**[登录即可免费开始](https://console.tancloud.cn)**。
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
[![hertzbeat](https://github.com/dromara/hertzbeat/raw/master/home/static/img/home/1.png)](https://www.bilibili.com/video/BV1LY4y1m7rH/)
|
||||||
|
|
||||||
|
[![hertzbeat](https://github.com/dromara/hertzbeat/raw/master/home/static/img/home/9.png)](https://www.bilibili.com/video/BV1LY4y1m7rH/)
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
## 🥐 模块
|
||||||
|
|
||||||
|
![hertzBeat](https://github.com/dromara/hertzbeat/raw/master/home/static/img/docs/hertzbeat-arch.png)
|
||||||
|
|
||||||
|
## ⛄ 已支持
|
||||||
|
|
||||||
|
> 我们将监控采集类型(mysql,jvm,k8s)都定义为yml监控模版,用户可以导入这些模版来支持对应类型的监控!
|
||||||
|
> 欢迎大家一起贡献你使用过程中自定义的通用监控类型监控模版。
|
||||||
|
|
||||||
|
- [Website](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-website.yml), [Port Telnet](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-port.yml),
|
||||||
|
[Http Api](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-api.yml), [Ping Connect](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-ping.yml),
|
||||||
|
[Jvm](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-jvm.yml), [SiteMap](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-fullsite.yml),
|
||||||
|
[Ssl Certificate](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-ssl_cert.yml), [SpringBoot2](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-springboot2.yml),
|
||||||
|
[FTP Server](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-ftp.yml), [SpringBoot3](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-springboot3.yml)
|
||||||
|
- [Mysql](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-mysql.yml), [PostgreSQL](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-postgresql.yml),
|
||||||
|
[MariaDB](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-mariadb.yml), [Redis](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-redis.yml),
|
||||||
|
[ElasticSearch](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-elasticsearch.yml), [SqlServer](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-sqlserver.yml),
|
||||||
|
[Oracle](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-oracle.yml), [MongoDB](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-mongodb.yml),
|
||||||
|
[DM](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-dm.yml), [OpenGauss](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-opengauss.yml),
|
||||||
|
[ClickHouse](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-clickhouse.yml), [IoTDB](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-iotdb.yml),
|
||||||
|
[Redis Cluster](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-redis_cluster.yml), [Redis Sentinel](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-redis_sentinel.yml)
|
||||||
|
- [Linux](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-linux.yml), [Ubuntu](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-ubuntu.yml),
|
||||||
|
[CentOS](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-centos.yml), [Windows](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-windows.yml),
|
||||||
|
[EulerOS](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-euleros.yml), [Fedora CoreOS](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-coreos.yml),
|
||||||
|
[OpenSUSE](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-opensuse.yml), [Rocky Linux](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-rockylinux.yml),
|
||||||
|
[Red Hat](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-redhat.yml), [FreeBSD](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-freebsd.yml),
|
||||||
|
[AlmaLinux](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-almalinux.yml), [Debian Linux](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-debian.yml)
|
||||||
|
- [Tomcat](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-tomcat.yml), [Nacos](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-nacos.yml),
|
||||||
|
[Zookeeper](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-zookeeper.yml), [RabbitMQ](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-rabbitmq.yml),
|
||||||
|
[Flink](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-flink.yml), [Kafka](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-kafka.yml),
|
||||||
|
[ShenYu](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-shenyu.yml), [DynamicTp](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-dynamic_tp.yml),
|
||||||
|
[Jetty](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-jetty.yml), [ActiveMQ](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-activemq.yml)
|
||||||
|
- [Kubernetes](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-kubernetes.yml), [Docker](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-docker.yml)
|
||||||
|
- [CiscoSwitch](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-cisco_switch.yml), [HpeSwitch](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-hpe_switch.yml),
|
||||||
|
[HuaweiSwitch](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-huawei_switch.yml), [TpLinkSwitch](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-tplink_switch.yml),
|
||||||
|
[H3cSwitch](https://raw.githubusercontent.com/dromara/hertzbeat/master/manager/src/main/resources/define/app-h3c_switch.yml)
|
||||||
|
- 和更多自定义监控模版。
|
||||||
|
- 通知支持 `Discord` `Slack` `Telegram` `邮件` `钉钉` `微信` `飞书` `短信` `Webhook`。
|
||||||
|
|
||||||
|
## 🐕 快速开始
|
||||||
|
|
||||||
|
- 如果您不想部署而是直接使用,我们提供SAAS监控云-[TanCloud探云](https://console.tancloud.cn),即刻 **[登录注册](https://console.tancloud.cn)** 免费使用。
|
||||||
|
- 如果您是想将HertzBeat部署到内网环境搭建监控系统,请参考下面的部署文档进行操作。
|
||||||
|
|
||||||
|
### 🍞 HertzBeat安装
|
||||||
|
> HertzBeat支持通过源码安装启动,Docker容器运行和安装包方式安装部署,CPU架构支持X86/ARM64。
|
||||||
|
|
||||||
|
##### 方式一:Docker方式快速安装
|
||||||
|
|
||||||
|
1. `docker` 环境仅需一条命令即可开始
|
||||||
|
|
||||||
|
```docker run -d -p 1157:1157 --name hertzbeat tancloud/hertzbeat```
|
||||||
|
|
||||||
|
```或者使用 quay.io (若 dockerhub 网络链接超时)```
|
||||||
|
|
||||||
|
```docker run -d -p 1157:1157 --name hertzbeat quay.io/tancloud/hertzbeat```
|
||||||
|
|
||||||
|
2. 浏览器访问 `localhost:1157` 即可开始,默认账号密码 `admin/hertzbeat`
|
||||||
|
|
||||||
|
更多配置详细步骤参考 [通过Docker方式安装HertzBeat](https://hertzbeat.com/docs/start/docker-deploy)
|
||||||
|
|
||||||
|
##### 方式二:通过安装包安装
|
||||||
|
1. 下载您系统环境对应的安装包 [GITEE Release](https://gitee.com/dromara/hertzbeat/releases) [GITHUB Release](https://github.com/dromara/hertzbeat/releases)
|
||||||
|
2. 需要已安装`java11`环境
|
||||||
|
3. 配置 HertzBeat 的配置文件 `hertzbeat/config/application.yml`(可选)
|
||||||
|
4. 部署启动 `$ ./startup.sh ` 或 `startup.bat`
|
||||||
|
5. 浏览器访问 `localhost:1157` 即可开始,默认账号密码 `admin/hertzbeat`
|
||||||
|
|
||||||
|
更多配置详细步骤参考 [通过安装包安装HertzBeat](https://hertzbeat.com/docs/start/package-deploy)
|
||||||
|
|
||||||
|
##### 方式三:本地代码启动
|
||||||
|
1. 此为前后端分离项目,本地代码调试需要分别启动后端工程`manager`和前端工程`web-app`
|
||||||
|
2. 后端:需要`maven3+`, `java11`和`lombok`环境,修改`YML`配置信息并启动`manager`服务
|
||||||
|
3. 前端:需要`nodejs npm angular-cli`环境,待本地后端启动后,在`web-app`目录下启动 `ng serve --open`
|
||||||
|
4. 浏览器访问 `localhost:4200` 即可开始,默认账号密码 `admin/hertzbeat`
|
||||||
|
|
||||||
|
详细步骤参考 [参与贡献之本地代码启动](https://github.com/dromara/hertzbeat/blob/master/CONTRIBUTING.md)
|
||||||
|
|
||||||
|
##### 方式四:Docker-Compose 统一安装 hertzbeat+mysql+iotdb/tdengine
|
||||||
|
|
||||||
|
通过 [Docker-Compose 部署脚本](https://github.com/dromara/hertzbeat/blob/master/script/docker-compose) 一次性把 mysql 数据库, iotdb/tdengine 时序数据库和 hertzbeat 安装部署。
|
||||||
|
|
||||||
|
详细步骤参考 [通过Docker-Compose安装HertzBeat](https://github.com/dromara/hertzbeat/blob/master/script/docker-compose/README.md)
|
||||||
|
|
||||||
|
**HAVE FUN**
|
||||||
|
|
||||||
|
## 🥐 路线图
|
||||||
|
|
||||||
|
![hertzBeat](https://github.com/dromara/hertzbeat/raw/master/home/static/img/docs/hertzbeat-roadmap.png)
|
||||||
|
|
||||||
|
## ✨ Contributors
|
||||||
|
|
||||||
|
Thanks these wonderful people, welcome to join us:
|
||||||
|
[贡献者指南](https://github.com/dromara/hertzbeat/blob/master/CONTRIBUTING.md)
|
||||||
|
|
||||||
|
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
||||||
|
<!-- prettier-ignore-start -->
|
||||||
|
<!-- markdownlint-disable -->
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/tomsun28"><img src="https://avatars.githubusercontent.com/u/24788200?v=4?s=100" width="100px;" alt="tomsun28"/><br /><sub><b>tomsun28</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=tomsun28" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/commits?author=tomsun28" title="Documentation">📖</a> <a href="#design-tomsun28" title="Design">🎨</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wang1027-wqh"><img src="https://avatars.githubusercontent.com/u/71161318?v=4?s=100" width="100px;" alt="会编程的王学长"/><br /><sub><b>会编程的王学长</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=wang1027-wqh" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/commits?author=wang1027-wqh" title="Documentation">📖</a> <a href="#design-wang1027-wqh" title="Design">🎨</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://www.maxkey.top/"><img src="https://avatars.githubusercontent.com/u/1563377?v=4?s=100" width="100px;" alt="MaxKey"/><br /><sub><b>MaxKey</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=shimingxy" title="Code">💻</a> <a href="#design-shimingxy" title="Design">🎨</a> <a href="#ideas-shimingxy" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://blog.gcdd.top/"><img src="https://avatars.githubusercontent.com/u/26523525?v=4?s=100" width="100px;" alt="观沧海"/><br /><sub><b>观沧海</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=gcdd1993" title="Code">💻</a> <a href="#design-gcdd1993" title="Design">🎨</a> <a href="https://github.com/dromara/hertzbeat/issues?q=author%3Agcdd1993" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/a25017012"><img src="https://avatars.githubusercontent.com/u/32265356?v=4?s=100" width="100px;" alt="yuye"/><br /><sub><b>yuye</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=a25017012" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/commits?author=a25017012" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jx10086"><img src="https://avatars.githubusercontent.com/u/5323228?v=4?s=100" width="100px;" alt="jx10086"/><br /><sub><b>jx10086</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=jx10086" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/issues?q=author%3Ajx10086" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/winnerTimer"><img src="https://avatars.githubusercontent.com/u/76024658?v=4?s=100" width="100px;" alt="winnerTimer"/><br /><sub><b>winnerTimer</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=winnerTimer" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/issues?q=author%3AwinnerTimer" title="Bug reports">🐛</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/goo-kits"><img src="https://avatars.githubusercontent.com/u/13163673?v=4?s=100" width="100px;" alt="goo-kits"/><br /><sub><b>goo-kits</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=goo-kits" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/issues?q=author%3Agoo-kits" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/brave4Time"><img src="https://avatars.githubusercontent.com/u/105094014?v=4?s=100" width="100px;" alt="brave4Time"/><br /><sub><b>brave4Time</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=brave4Time" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/issues?q=author%3Abrave4Time" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/walkerlee-lab"><img src="https://avatars.githubusercontent.com/u/8426753?v=4?s=100" width="100px;" alt="WalkerLee"/><br /><sub><b>WalkerLee</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=walkerlee-lab" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/issues?q=author%3Awalkerlee-lab" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fullofjoy"><img src="https://avatars.githubusercontent.com/u/30247571?v=4?s=100" width="100px;" alt="jianghang"/><br /><sub><b>jianghang</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=fullofjoy" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/issues?q=author%3Afullofjoy" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ChineseTony"><img src="https://avatars.githubusercontent.com/u/24618786?v=4?s=100" width="100px;" alt="ChineseTony"/><br /><sub><b>ChineseTony</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=ChineseTony" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/issues?q=author%3AChineseTony" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wyt199905"><img src="https://avatars.githubusercontent.com/u/85098809?v=4?s=100" width="100px;" alt="wyt199905"/><br /><sub><b>wyt199905</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=wyt199905" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/weifuqing"><img src="https://avatars.githubusercontent.com/u/13931013?v=4?s=100" width="100px;" alt="卫傅庆"/><br /><sub><b>卫傅庆</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=weifuqing" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/issues?q=author%3Aweifuqing" title="Bug reports">🐛</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zklmcookle"><img src="https://avatars.githubusercontent.com/u/107192352?v=4?s=100" width="100px;" alt="zklmcookle"/><br /><sub><b>zklmcookle</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=zklmcookle" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/DevilX5"><img src="https://avatars.githubusercontent.com/u/13269921?v=4?s=100" width="100px;" alt="DevilX5"/><br /><sub><b>DevilX5</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=DevilX5" title="Documentation">📖</a> <a href="https://github.com/dromara/hertzbeat/commits?author=DevilX5" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/djzeng"><img src="https://avatars.githubusercontent.com/u/14074864?v=4?s=100" width="100px;" alt="tea"/><br /><sub><b>tea</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=djzeng" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yangshihui"><img src="https://avatars.githubusercontent.com/u/28550208?v=4?s=100" width="100px;" alt="yangshihui"/><br /><sub><b>yangshihui</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=yangshihui" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/issues?q=author%3Ayangshihui" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/DreamGirl524"><img src="https://avatars.githubusercontent.com/u/81132838?v=4?s=100" width="100px;" alt="DreamGirl524"/><br /><sub><b>DreamGirl524</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=DreamGirl524" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/commits?author=DreamGirl524" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/gzwlly"><img src="https://avatars.githubusercontent.com/u/83171907?v=4?s=100" width="100px;" alt="gzwlly"/><br /><sub><b>gzwlly</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=gzwlly" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cuipiheqiuqiu"><img src="https://avatars.githubusercontent.com/u/76642201?v=4?s=100" width="100px;" alt="cuipiheqiuqiu"/><br /><sub><b>cuipiheqiuqiu</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=cuipiheqiuqiu" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/commits?author=cuipiheqiuqiu" title="Tests">⚠️</a> <a href="#design-cuipiheqiuqiu" title="Design">🎨</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/oyiyou"><img src="https://avatars.githubusercontent.com/u/39228891?v=4?s=100" width="100px;" alt="lambert"/><br /><sub><b>lambert</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=oyiyou" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="http://mroldx.xyz/"><img src="https://avatars.githubusercontent.com/u/34847828?v=4?s=100" width="100px;" alt="mroldx"/><br /><sub><b>mroldx</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=mroldx" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/woshiniusange"><img src="https://avatars.githubusercontent.com/u/91513022?v=4?s=100" width="100px;" alt="woshiniusange"/><br /><sub><b>woshiniusange</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=woshiniusange" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://vampireachao.github.io/"><img src="https://avatars.githubusercontent.com/u/52746628?v=4?s=100" width="100px;" alt="VampireAchao"/><br /><sub><b>VampireAchao</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=VampireAchao" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Ceilzcx"><img src="https://avatars.githubusercontent.com/u/48920254?v=4?s=100" width="100px;" alt="zcx"/><br /><sub><b>zcx</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=Ceilzcx" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/issues?q=author%3ACeilzcx" title="Bug reports">🐛</a> <a href="#design-Ceilzcx" title="Design">🎨</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/CharlieXCL"><img src="https://avatars.githubusercontent.com/u/91540487?v=4?s=100" width="100px;" alt="CharlieXCL"/><br /><sub><b>CharlieXCL</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=CharlieXCL" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Privauto"><img src="https://avatars.githubusercontent.com/u/36581456?v=4?s=100" width="100px;" alt="Privauto"/><br /><sub><b>Privauto</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=Privauto" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/commits?author=Privauto" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/emrys-he"><img src="https://avatars.githubusercontent.com/u/5848915?v=4?s=100" width="100px;" alt="emrys"/><br /><sub><b>emrys</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=emrys-he" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SxLiuYu"><img src="https://avatars.githubusercontent.com/u/95198625?v=4?s=100" width="100px;" alt="SxLiuYu"/><br /><sub><b>SxLiuYu</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/issues?q=author%3ASxLiuYu" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://allcontributors.org"><img src="https://avatars.githubusercontent.com/u/46410174?v=4?s=100" width="100px;" alt="All Contributors"/><br /><sub><b>All Contributors</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=all-contributors" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/gxc-myh"><img src="https://avatars.githubusercontent.com/u/85919258?v=4?s=100" width="100px;" alt="铁甲小宝"/><br /><sub><b>铁甲小宝</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=gxc-myh" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/commits?author=gxc-myh" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/click33"><img src="https://avatars.githubusercontent.com/u/36243476?v=4?s=100" width="100px;" alt="click33"/><br /><sub><b>click33</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=click33" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://jpom.io/"><img src="https://avatars.githubusercontent.com/u/16408873?v=4?s=100" width="100px;" alt="蒋小小"/><br /><sub><b>蒋小小</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=bwcx-jzy" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://www.zhihu.com/people/kevinbauer"><img src="https://avatars.githubusercontent.com/u/28581579?v=4?s=100" width="100px;" alt="Kevin Huang"/><br /><sub><b>Kevin Huang</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=kevinhuangwl" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/TJxiaobao"><img src="https://avatars.githubusercontent.com/u/85919258?v=4?s=100" width="100px;" alt="铁甲小宝"/><br /><sub><b>铁甲小宝</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/issues?q=author%3ATJxiaobao" title="Bug reports">🐛</a> <a href="https://github.com/dromara/hertzbeat/commits?author=TJxiaobao" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/commits?author=TJxiaobao" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Jack-123-power"><img src="https://avatars.githubusercontent.com/u/84333501?v=4?s=100" width="100px;" alt="Captain Jack"/><br /><sub><b>Captain Jack</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=Jack-123-power" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/haibo-duan"><img src="https://avatars.githubusercontent.com/u/7974845?v=4?s=100" width="100px;" alt="haibo.duan"/><br /><sub><b>haibo.duan</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=haibo-duan" title="Tests">⚠️</a> <a href="https://github.com/dromara/hertzbeat/commits?author=haibo-duan" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/assassinfym"><img src="https://avatars.githubusercontent.com/u/15188754?v=4?s=100" width="100px;" alt="assassin"/><br /><sub><b>assassin</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/issues?q=author%3Aassassinfym" title="Bug reports">🐛</a> <a href="https://github.com/dromara/hertzbeat/commits?author=assassinfym" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/csyshu"><img src="https://avatars.githubusercontent.com/u/46591658?v=4?s=100" width="100px;" alt="Reverse wind"/><br /><sub><b>Reverse wind</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=csyshu" title="Tests">⚠️</a> <a href="https://github.com/dromara/hertzbeat/commits?author=csyshu" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/luxx-lq"><img src="https://avatars.githubusercontent.com/u/58515565?v=4?s=100" width="100px;" alt="luxx"/><br /><sub><b>luxx</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=luxx-lq" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://bandism.net/"><img src="https://avatars.githubusercontent.com/u/22633385?v=4?s=100" width="100px;" alt="Ikko Ashimine"/><br /><sub><b>Ikko Ashimine</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=eltociear" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zenan08"><img src="https://avatars.githubusercontent.com/u/80514991?v=4?s=100" width="100px;" alt="leizenan"/><br /><sub><b>leizenan</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=zenan08" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/BKing2020"><img src="https://avatars.githubusercontent.com/u/28869121?v=4?s=100" width="100px;" alt="BKing"/><br /><sub><b>BKing</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=BKing2020" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/xingshuaiLi"><img src="https://avatars.githubusercontent.com/u/119487588?v=4?s=100" width="100px;" alt="xingshuaiLi"/><br /><sub><b>xingshuaiLi</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=xingshuaiLi" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wangke6666"><img src="https://avatars.githubusercontent.com/u/113656595?v=4?s=100" width="100px;" alt="wangke6666"/><br /><sub><b>wangke6666</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=wangke6666" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/LWBobo"><img src="https://avatars.githubusercontent.com/u/50368698?v=4?s=100" width="100px;" alt="刺猬"/><br /><sub><b>刺猬</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/issues?q=author%3ALWBobo" title="Bug reports">🐛</a> <a href="https://github.com/dromara/hertzbeat/commits?author=LWBobo" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="http://www.zanglikun.com"><img src="https://avatars.githubusercontent.com/u/61591648?v=4?s=100" width="100px;" alt="Haste"/><br /><sub><b>Haste</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=zanglikun" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SuitSmile"><img src="https://avatars.githubusercontent.com/u/38679717?v=4?s=100" width="100px;" alt="zhongshi.yi"/><br /><sub><b>zhongshi.yi</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=SuitSmile" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://www.smallq.cn"><img src="https://avatars.githubusercontent.com/u/39754275?v=4?s=100" width="100px;" alt="Qi Zhang"/><br /><sub><b>Qi Zhang</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=zzzhangqi" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MrAndyMing"><img src="https://avatars.githubusercontent.com/u/49541483?v=4?s=100" width="100px;" alt="MrAndyMing"/><br /><sub><b>MrAndyMing</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=MrAndyMing" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://idongliming.github.io/"><img src="https://avatars.githubusercontent.com/u/31564353?v=4?s=100" width="100px;" alt="idongliming"/><br /><sub><b>idongliming</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=idongliming" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://earthjasonlin.github.io"><img src="https://avatars.githubusercontent.com/u/83632110?v=4?s=100" width="100px;" alt="Zichao Lin"/><br /><sub><b>Zichao Lin</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=earthjasonlin" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/commits?author=earthjasonlin" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="http://blog.liudonghua.com"><img src="https://avatars.githubusercontent.com/u/2276718?v=4?s=100" width="100px;" alt="liudonghua"/><br /><sub><b>liudonghua</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=liudonghua123" title="Code">💻</a> <a href="#ideas-liudonghua123" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/orangeyts"><img src="https://avatars.githubusercontent.com/u/4250869?v=4?s=100" width="100px;" alt="Jerry"/><br /><sub><b>Jerry</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=orangeyts" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/commits?author=orangeyts" title="Tests">⚠️</a> <a href="#ideas-orangeyts" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://dynamictp.cn"><img src="https://avatars.githubusercontent.com/u/13051908?v=4?s=100" width="100px;" alt="yanhom"/><br /><sub><b>yanhom</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=yanhom1314" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://www.jianshu.com/u/a8f822c04f67"><img src="https://avatars.githubusercontent.com/u/18587688?v=4?s=100" width="100px;" alt="fsl"/><br /><sub><b>fsl</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=fengshunli" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/xttttv"><img src="https://avatars.githubusercontent.com/u/116323904?v=4?s=100" width="100px;" alt="xttttv"/><br /><sub><b>xttttv</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=xttttv" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/NavinKumarBarnwal"><img src="https://avatars.githubusercontent.com/u/44504274?v=4?s=100" width="100px;" alt="NavinKumarBarnwal"/><br /><sub><b>NavinKumarBarnwal</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=NavinKumarBarnwal" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/z641205699"><img src="https://avatars.githubusercontent.com/u/45276423?v=4?s=100" width="100px;" alt="Zakkary"/><br /><sub><b>Zakkary</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=z641205699" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/898349230"><img src="https://avatars.githubusercontent.com/u/21972532?v=4?s=100" width="100px;" alt="sunxinbo"/><br /><sub><b>sunxinbo</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=898349230" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/commits?author=898349230" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ldzbook"><img src="https://avatars.githubusercontent.com/u/13903790?v=4?s=100" width="100px;" alt="ldzbook"/><br /><sub><b>ldzbook</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=ldzbook" title="Documentation">📖</a> <a href="https://github.com/dromara/hertzbeat/issues?q=author%3Aldzbook" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SurryChen"><img src="https://avatars.githubusercontent.com/u/91116490?v=4?s=100" width="100px;" alt="余与雨"/><br /><sub><b>余与雨</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=SurryChen" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/commits?author=SurryChen" title="Tests">⚠️</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MysticalDream"><img src="https://avatars.githubusercontent.com/u/78899028?v=4?s=100" width="100px;" alt="MysticalDream"/><br /><sub><b>MysticalDream</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=MysticalDream" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/commits?author=MysticalDream" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zhouyoulin12"><img src="https://avatars.githubusercontent.com/u/17086633?v=4?s=100" width="100px;" alt="zhouyoulin12"/><br /><sub><b>zhouyoulin12</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=zhouyoulin12" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/commits?author=zhouyoulin12" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jerjjj"><img src="https://avatars.githubusercontent.com/u/93431283?v=4?s=100" width="100px;" alt="jerjjj"/><br /><sub><b>jerjjj</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=jerjjj" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://wjl110.xyz/"><img src="https://avatars.githubusercontent.com/u/53851034?v=4?s=100" width="100px;" alt="wjl110"/><br /><sub><b>wjl110</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=wjl110" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ngyhd"><img src="https://avatars.githubusercontent.com/u/29095207?v=4?s=100" width="100px;" alt="Sean"/><br /><sub><b>Sean</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=ngyhd" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Daydreamer-ia"><img src="https://avatars.githubusercontent.com/u/83362909?v=4?s=100" width="100px;" alt="chenyiqin"/><br /><sub><b>chenyiqin</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=Daydreamer-ia" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/commits?author=Daydreamer-ia" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hudongdong129"><img src="https://avatars.githubusercontent.com/u/34374227?v=4?s=100" width="100px;" alt="hudongdong129"/><br /><sub><b>hudongdong129</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=hudongdong129" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/commits?author=hudongdong129" title="Tests">⚠️</a> <a href="https://github.com/dromara/hertzbeat/commits?author=hudongdong129" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/TherChenYang"><img src="https://avatars.githubusercontent.com/u/124348939?v=4?s=100" width="100px;" alt="TherChenYang"/><br /><sub><b>TherChenYang</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=TherChenYang" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/commits?author=TherChenYang" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/HattoriHenzo"><img src="https://avatars.githubusercontent.com/u/5141285?v=4?s=100" width="100px;" alt="HattoriHenzo"/><br /><sub><b>HattoriHenzo</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=HattoriHenzo" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/commits?author=HattoriHenzo" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ycilry"><img src="https://avatars.githubusercontent.com/u/63967101?v=4?s=100" width="100px;" alt="ycilry"/><br /><sub><b>ycilry</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=ycilry" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aoshiguchen"><img src="https://avatars.githubusercontent.com/u/10580997?v=4?s=100" width="100px;" alt="aoshiguchen"/><br /><sub><b>aoshiguchen</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=aoshiguchen" title="Documentation">📖</a> <a href="https://github.com/dromara/hertzbeat/commits?author=aoshiguchen" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/caibenxiang"><img src="https://avatars.githubusercontent.com/u/4568241?v=4?s=100" width="100px;" alt="蔡本祥"/><br /><sub><b>蔡本祥</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=caibenxiang" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="http://www.fckeverything.cn:4000/"><img src="https://avatars.githubusercontent.com/u/13827124?v=4?s=100" width="100px;" alt="浮游"/><br /><sub><b>浮游</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=lifefloating" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Grass-Life"><img src="https://avatars.githubusercontent.com/u/114381513?v=4?s=100" width="100px;" alt="Grass-Life"/><br /><sub><b>Grass-Life</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=Grass-Life" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/xiaohe428"><img src="https://avatars.githubusercontent.com/u/99130317?v=4?s=100" width="100px;" alt="xiaohe428"/><br /><sub><b>xiaohe428</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=xiaohe428" title="Code">💻</a> <a href="https://github.com/dromara/hertzbeat/commits?author=xiaohe428" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/baiban114"><img src="https://avatars.githubusercontent.com/u/59152619?v=4?s=100" width="100px;" alt="TableRow"/><br /><sub><b>TableRow</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=baiban114" title="Documentation">📖</a> <a href="https://github.com/dromara/hertzbeat/commits?author=baiban114" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ByteIDance"><img src="https://avatars.githubusercontent.com/u/100207562?v=4?s=100" width="100px;" alt="ByteIDance"/><br /><sub><b>ByteIDance</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=ByteIDance" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mangel2002"><img src="https://avatars.githubusercontent.com/u/9348020?v=4?s=100" width="100px;" alt="Jangfe"/><br /><sub><b>Jangfe</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=mangel2002" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zqr10159"><img src="https://avatars.githubusercontent.com/u/30048352?v=4?s=100" width="100px;" alt="zqr10159"/><br /><sub><b>zqr10159</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=zqr10159" title="Documentation">📖</a> <a href="https://github.com/dromara/hertzbeat/commits?author=zqr10159" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/vinci-897"><img src="https://avatars.githubusercontent.com/u/55838224?v=4?s=100" width="100px;" alt="vinci"/><br /><sub><b>vinci</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=vinci-897" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/js110"><img src="https://avatars.githubusercontent.com/u/51191863?v=4?s=100" width="100px;" alt="js110"/><br /><sub><b>js110</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=js110" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JavaLionLi"><img src="https://avatars.githubusercontent.com/u/31852897?v=4?s=100" width="100px;" alt="CrazyLionLi"/><br /><sub><b>CrazyLionLi</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=JavaLionLi" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="http://www.banmajio.com"><img src="https://avatars.githubusercontent.com/u/53471385?v=4?s=100" width="100px;" alt="banmajio"/><br /><sub><b>banmajio</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=banmajio" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://suder.fun"><img src="https://avatars.githubusercontent.com/u/69955165?v=4?s=100" width="100px;" alt="topsuder"/><br /><sub><b>topsuder</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=topsuder" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/richar2022"><img src="https://avatars.githubusercontent.com/u/129016397?v=4?s=100" width="100px;" alt="richar2022"/><br /><sub><b>richar2022</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=richar2022" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fcb-xiaobo"><img src="https://avatars.githubusercontent.com/u/60566194?v=4?s=100" width="100px;" alt="fcb-xiaobo"/><br /><sub><b>fcb-xiaobo</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=fcb-xiaobo" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wenkyzhang"><img src="https://avatars.githubusercontent.com/u/13983669?v=4?s=100" width="100px;" alt="wenkyzhang"/><br /><sub><b>wenkyzhang</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=wenkyzhang" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ZangJuxy"><img src="https://avatars.githubusercontent.com/u/71380295?v=4?s=100" width="100px;" alt="ZangJuxy"/><br /><sub><b>ZangJuxy</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=ZangJuxy" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/l646505418"><img src="https://avatars.githubusercontent.com/u/50475131?v=4?s=100" width="100px;" alt="l646505418"/><br /><sub><b>l646505418</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=l646505418" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="http://www.carpewang.com"><img src="https://avatars.githubusercontent.com/u/78642589?v=4?s=100" width="100px;" alt="Carpe-Wang"/><br /><sub><b>Carpe-Wang</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=Carpe-Wang" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/moshu023"><img src="https://avatars.githubusercontent.com/u/48593205?v=4?s=100" width="100px;" alt="莫枢"/><br /><sub><b>莫枢</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=moshu023" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/huangcanda"><img src="https://avatars.githubusercontent.com/u/4470566?v=4?s=100" width="100px;" alt="huangcanda"/><br /><sub><b>huangcanda</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=huangcanda" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://www.zrkizzy.com"><img src="https://avatars.githubusercontent.com/u/85340613?v=4?s=100" width="100px;" alt="世纪末的架构师"/><br /><sub><b>世纪末的架构师</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=Architect-Java" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ShuningWan"><img src="https://avatars.githubusercontent.com/u/31086770?v=4?s=100" width="100px;" alt="ShuningWan"/><br /><sub><b>ShuningWan</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=ShuningWan" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MrYZhou"><img src="https://avatars.githubusercontent.com/u/44339602?v=4?s=100" width="100px;" alt="MrYZhou"/><br /><sub><b>MrYZhou</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=MrYZhou" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/suncqujsj"><img src="https://avatars.githubusercontent.com/u/8012932?v=4?s=100" width="100px;" alt="suncqujsj"/><br /><sub><b>suncqujsj</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=suncqujsj" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sunqinbo"><img src="https://avatars.githubusercontent.com/u/1428540?v=4?s=100" width="100px;" alt="sunqinbo"/><br /><sub><b>sunqinbo</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=sunqinbo" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/haoww"><img src="https://avatars.githubusercontent.com/u/32739294?v=4?s=100" width="100px;" alt="haoww"/><br /><sub><b>haoww</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=haoww" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/i-mayuan"><img src="https://avatars.githubusercontent.com/u/101498477?v=4?s=100" width="100px;" alt="i-mayuan"/><br /><sub><b>i-mayuan</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=i-mayuan" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fengruge"><img src="https://avatars.githubusercontent.com/u/85803831?v=4?s=100" width="100px;" alt="fengruge"/><br /><sub><b>fengruge</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=fengruge" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aystzh"><img src="https://avatars.githubusercontent.com/u/38125392?v=4?s=100" width="100px;" alt="zhanghuan"/><br /><sub><b>zhanghuan</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=aystzh" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/shenyumin"><img src="https://avatars.githubusercontent.com/u/8438506?v=4?s=100" width="100px;" alt="shenymin"/><br /><sub><b>shenymin</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=shenyumin" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/dhruva1995"><img src="https://avatars.githubusercontent.com/u/12976351?v=4?s=100" width="100px;" alt="Dhruva Chandra"/><br /><sub><b>Dhruva Chandra</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=dhruva1995" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/weiwang988"><img src="https://avatars.githubusercontent.com/u/58241726?v=4?s=100" width="100px;" alt="miss_z"/><br /><sub><b>miss_z</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=weiwang988" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wyt990"><img src="https://avatars.githubusercontent.com/u/86013697?v=4?s=100" width="100px;" alt="wyt990"/><br /><sub><b>wyt990</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=wyt990" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/licocon"><img src="https://avatars.githubusercontent.com/u/36863277?v=4?s=100" width="100px;" alt="licocon"/><br /><sub><b>licocon</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=licocon" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/2406450951"><img src="https://avatars.githubusercontent.com/u/48074721?v=4?s=100" width="100px;" alt="Mi Na"/><br /><sub><b>Mi Na</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=2406450951" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Kylin-Guo"><img src="https://avatars.githubusercontent.com/u/131239856?v=4?s=100" width="100px;" alt="Kylin-Guo"/><br /><sub><b>Kylin-Guo</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=Kylin-Guo" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/1797899698"><img src="https://avatars.githubusercontent.com/u/40411650?v=4?s=100" width="100px;" alt="Mr灬Dong先生"/><br /><sub><b>Mr灬Dong先生</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=1797899698" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="http://neilblaze.live"><img src="https://avatars.githubusercontent.com/u/48355572?v=4?s=100" width="100px;" alt="Pratyay Banerjee"/><br /><sub><b>Pratyay Banerjee</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=Neilblaze" title="Documentation">📖</a> <a href="https://github.com/dromara/hertzbeat/commits?author=Neilblaze" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yujianzhong520"><img src="https://avatars.githubusercontent.com/u/63705063?v=4?s=100" width="100px;" alt="yujianzhong520"/><br /><sub><b>yujianzhong520</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=yujianzhong520" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://sppan24.github.io/"><img src="https://avatars.githubusercontent.com/u/15795173?v=4?s=100" width="100px;" alt="SPPan"/><br /><sub><b>SPPan</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=sppan24" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/1130600015"><img src="https://avatars.githubusercontent.com/u/67859663?v=4?s=100" width="100px;" alt="ZhangJiashu"/><br /><sub><b>ZhangJiashu</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=1130600015" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/QZmp236478"><img src="https://avatars.githubusercontent.com/u/56623162?v=4?s=100" width="100px;" alt="impress"/><br /><sub><b>impress</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=QZmp236478" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jx3775250"><img src="https://avatars.githubusercontent.com/u/40455946?v=4?s=100" width="100px;" alt="凌晨一点半"/><br /><sub><b>凌晨一点半</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=jx3775250" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/eeshaanSA"><img src="https://avatars.githubusercontent.com/u/100678386?v=4?s=100" width="100px;" alt="Eeshaan Sawant"/><br /><sub><b>Eeshaan Sawant</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=eeshaanSA" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nandofromthebando"><img src="https://avatars.githubusercontent.com/u/87321214?v=4?s=100" width="100px;" alt="nandofromthebando"/><br /><sub><b>nandofromthebando</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=nandofromthebando" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/caiboking"><img src="https://avatars.githubusercontent.com/u/6509883?v=4?s=100" width="100px;" alt="caiboking"/><br /><sub><b>caiboking</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=caiboking" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/baixing99"><img src="https://avatars.githubusercontent.com/u/73473087?v=4?s=100" width="100px;" alt="baixing99"/><br /><sub><b>baixing99</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=baixing99" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ifrenzyc"><img src="https://avatars.githubusercontent.com/u/543927?v=4?s=100" width="100px;" alt="Yang Chuang"/><br /><sub><b>Yang Chuang</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=ifrenzyc" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wlin20"><img src="https://avatars.githubusercontent.com/u/20657577?v=4?s=100" width="100px;" alt="wlin20"/><br /><sub><b>wlin20</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=wlin20" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/guojing1983"><img src="https://avatars.githubusercontent.com/u/60596094?v=4?s=100" width="100px;" alt="guojing1983"/><br /><sub><b>guojing1983</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=guojing1983" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/itxxq"><img src="https://avatars.githubusercontent.com/u/46962357?v=4?s=100" width="100px;" alt="moxi"/><br /><sub><b>moxi</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=itxxq" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/qq471754603"><img src="https://avatars.githubusercontent.com/u/23146592?v=4?s=100" width="100px;" alt="qq471754603"/><br /><sub><b>qq471754603</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=qq471754603" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/san346596324"><img src="https://avatars.githubusercontent.com/u/30828520?v=4?s=100" width="100px;" alt="渭雨"/><br /><sub><b>渭雨</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=san346596324" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/luoxuanzao"><img src="https://avatars.githubusercontent.com/u/44692579?v=4?s=100" width="100px;" alt="liuxuezhuo"/><br /><sub><b>liuxuezhuo</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=luoxuanzao" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lisongning"><img src="https://avatars.githubusercontent.com/u/93140178?v=4?s=100" width="100px;" alt="lisongning"/><br /><sub><b>lisongning</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=lisongning" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/YutingNie"><img src="https://avatars.githubusercontent.com/u/104416402?v=4?s=100" width="100px;" alt="YutingNie"/><br /><sub><b>YutingNie</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=YutingNie" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mikezzb"><img src="https://avatars.githubusercontent.com/u/23418428?v=4?s=100" width="100px;" alt="Mike Zhou"/><br /><sub><b>Mike Zhou</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=mikezzb" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/a-little-fool"><img src="https://avatars.githubusercontent.com/u/105542329?v=4?s=100" width="100px;" alt="小笨蛋"/><br /><sub><b>小笨蛋</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=a-little-fool" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/littlezhongzer"><img src="https://avatars.githubusercontent.com/u/33685289?v=4?s=100" width="100px;" alt="littlezhongzer"/><br /><sub><b>littlezhongzer</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=littlezhongzer" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ChenXiangxxxxx"><img src="https://avatars.githubusercontent.com/u/90089594?v=4?s=100" width="100px;" alt="ChenXiangxxxxx"/><br /><sub><b>ChenXiangxxxxx</b></sub></a><br /><a href="https://github.com/dromara/hertzbeat/commits?author=ChenXiangxxxxx" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<!-- markdownlint-restore -->
|
||||||
|
<!-- prettier-ignore-end -->
|
||||||
|
|
||||||
|
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||||
|
|
||||||
|
## 💬 社区交流
|
||||||
|
|
||||||
|
HertzBeat 赫兹跳动是 [Dromara开源社区](https://dromara.org/) 下顶级项目。Gitee GVP。
|
||||||
|
|
||||||
|
##### 微信交流群
|
||||||
|
|
||||||
|
加微信号 tan-cloud 或 扫描下面账号二维码拉您进微信群。
|
||||||
|
<img alt="tan-cloud" src="https://github.com/dromara/hertzbeat/raw/master/home/static/img/docs/help/tan-cloud-wechat.jpg" width="200"/>
|
||||||
|
|
||||||
|
##### QQ交流群
|
||||||
|
|
||||||
|
加QQ群号 236915833 或 扫描下面的群二维码进群
|
||||||
|
|
||||||
|
<img alt="tan-cloud" src="https://github.com/dromara/hertzbeat/raw/master/home/static/img/docs/help/qq-qr.jpg" width="200"/>
|
||||||
|
|
||||||
|
##### Channel
|
||||||
|
|
||||||
|
[Gitter Channel](https://gitter.im/hertzbeat/community)
|
||||||
|
|
||||||
|
[Github Discussion](https://github.com/dromara/hertzbeat/discussions)
|
||||||
|
|
||||||
|
[User Club](https://support.qq.com/products/379369)
|
||||||
|
|
||||||
|
##### 公众号与星球
|
||||||
|
|
||||||
|
<img alt="tan-cloud" src="https://github.com/dromara/hertzbeat/raw/master/home/static/img/wechat.png" width="400"/>
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
<img alt="planet" src="https://github.com/dromara/hertzbeat/raw/master/home/static/img/planet.jpg" width="400"/>
|
||||||
|
|
||||||
|
##### 友情链接
|
||||||
|
|
||||||
|
- [DynamicTp](https://github.com/dromara/dynamic-tp) : 轻量级动态线程池,内置监控告警功能,集成三方中间件线程池管理,基于主流配置中心
|
||||||
|
- [Hippo4j](https://github.com/opengoofy/hippo4j/) : 强大的动态线程池框架,附带监控报警功能
|
||||||
|
- [Jpom](https://gitee.com/dromara/Jpom) : 简而轻的低侵入式在线构建、自动部署、日常运维、项目监控软件
|
||||||
|
- [ArgusDBM](https://github.com/zmops/ArgusDBM) : 开源数据库一体化监控平台,致力于监控所有数据库
|
||||||
|
|
||||||
|
##### 赞助
|
||||||
|
- Postcat [开源 API 管理工具 ](https://datayi.cn/w/xRxVBBko) 简单可拓展,支持 API 测试、文档、Mock、团队协作等核心功能
|
||||||
|
- 感谢 [吉实信息(构建全新的微波+光交易网络)](https://www.flarespeed.com) 赞助服务器采集节点
|
||||||
|
- 感谢 [蓝易云(全新智慧上云)](https://www.tsyvps.com/aff/BZBEGYLX) 赞助服务器采集节点
|
||||||
|
|
||||||
|
## 🛡️ License
|
||||||
|
[`Apache License, Version 2.0`](https://www.apache.org/licenses/LICENSE-2.0.html)
|
20
apps/hertzbeat/data.yml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
name: HertzBeat
|
||||||
|
tags:
|
||||||
|
- 工具
|
||||||
|
title: 一个易用友好的开源实时监控告警系统
|
||||||
|
type: 工具
|
||||||
|
description: 一个易用友好的开源实时监控告警系统
|
||||||
|
additionalProperties:
|
||||||
|
key: hertzbeat
|
||||||
|
name: HertzBeat
|
||||||
|
tags:
|
||||||
|
- Tool
|
||||||
|
shortDescZh: 一个易用友好的开源实时监控告警系统
|
||||||
|
shortDescEn: An open source, real-time monitoring system with custom-monitoring
|
||||||
|
type: tool
|
||||||
|
crossVersionUpdate: true
|
||||||
|
limit: 0
|
||||||
|
recommend: 0
|
||||||
|
website: https://hertzbeat.com/
|
||||||
|
github: https://github.com/dromara/hertzbeat
|
||||||
|
document: https://hertzbeat.com/docs/
|
BIN
apps/hertzbeat/logo.png
Normal file
After Width: | Height: | Size: 12 KiB |
10
apps/it-tools/2023.5.14-77f2efc/data.yml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
additionalProperties:
|
||||||
|
formFields:
|
||||||
|
- default: 40116
|
||||||
|
edit: true
|
||||||
|
envKey: PANEL_APP_PORT_HTTP
|
||||||
|
labelEn: Port
|
||||||
|
labelZh: 端口
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
16
apps/it-tools/2023.5.14-77f2efc/docker-compose.yml
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
it-tools:
|
||||||
|
container_name: ${CONTAINER_NAME}
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
ports:
|
||||||
|
- "${PANEL_APP_PORT_HTTP}:80"
|
||||||
|
image: corentinth/it-tools:2023.5.14-77f2efc
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
networks:
|
||||||
|
1panel-network:
|
||||||
|
external: true
|
120
apps/it-tools/README.md
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
![logo](https://github.com/CorentinTh/it-tools/raw/main/.github/logo.png)
|
||||||
|
|
||||||
|
Useful tools for developer and people working in IT. [Have a look !](https://it-tools.tech).
|
||||||
|
|
||||||
|
## Functionalities and roadmap
|
||||||
|
|
||||||
|
Please check the [issues](https://github.com/CorentinTh/it-tools/issues) to see if some feature listed to be implemented.
|
||||||
|
|
||||||
|
You have an idea of a tool? Submit a [feature request](https://github.com/CorentinTh/it-tools/issues/new/choose)!
|
||||||
|
|
||||||
|
## Self host
|
||||||
|
|
||||||
|
Self host solutions for your homelab
|
||||||
|
|
||||||
|
**From docker hub:**
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker run -d --name it-tools --restart unless-stopped -p 8080:80 corentinth/it-tools:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
**From github packages:**
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker run -d --name it-tools --restart unless-stopped -p 8080:80 ghcr.io/corentinth/it-tools:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
**Other solutions:**
|
||||||
|
|
||||||
|
- [Tipi](https://www.runtipi.io/docs/apps-available)
|
||||||
|
- [Unraid](https://unraid.net/community/apps?q=it-tools)
|
||||||
|
|
||||||
|
## Contribute
|
||||||
|
|
||||||
|
### Recommended IDE Setup
|
||||||
|
|
||||||
|
[VSCode](https://code.visualstudio.com/) with the following extensions:
|
||||||
|
- [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur)
|
||||||
|
- [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin).
|
||||||
|
- [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)
|
||||||
|
- [i18n Ally](https://marketplace.visualstudio.com/items?itemName=lokalise.i18n-ally)
|
||||||
|
|
||||||
|
with the following settings:
|
||||||
|
|
||||||
|
```json5
|
||||||
|
{
|
||||||
|
"editor.formatOnSave": false,
|
||||||
|
"editor.codeActionsOnSave": {
|
||||||
|
"source.fixAll.eslint": true
|
||||||
|
},
|
||||||
|
"i18n-ally.localesPaths": [
|
||||||
|
"locales",
|
||||||
|
"src/tools/*/locales"
|
||||||
|
],
|
||||||
|
"i18n-ally.keystyle": "nested"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Type Support for `.vue` Imports in TS
|
||||||
|
|
||||||
|
TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin) to make the TypeScript language service aware of `.vue` types.
|
||||||
|
|
||||||
|
If the standalone TypeScript plugin doesn't feel fast enough to you, Volar has also implemented a [Take Over Mode](https://github.com/johnsoncodehk/volar/discussions/471#discussioncomment-1361669) that is more performant. You can enable it by the following steps:
|
||||||
|
|
||||||
|
1. Disable the built-in TypeScript Extension
|
||||||
|
1. Run `Extensions: Show Built-in Extensions` from VSCode's command palette
|
||||||
|
2. Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
|
||||||
|
2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
|
||||||
|
|
||||||
|
### Project Setup
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pnpm install
|
||||||
|
```
|
||||||
|
|
||||||
|
### Compile and Hot-Reload for Development
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pnpm dev
|
||||||
|
```
|
||||||
|
|
||||||
|
### Type-Check, Compile and Minify for Production
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pnpm build
|
||||||
|
```
|
||||||
|
|
||||||
|
### Run Unit Tests with [Vitest](https://vitest.dev/)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pnpm test
|
||||||
|
```
|
||||||
|
|
||||||
|
### Lint with [ESLint](https://eslint.org/)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pnpm lint
|
||||||
|
```
|
||||||
|
|
||||||
|
### Create a new tool
|
||||||
|
|
||||||
|
To create a new tool, there is a script that generate the boilerplate of the new tool, simply run:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pnpm run script:create-new-tool my-tool-name
|
||||||
|
```
|
||||||
|
|
||||||
|
It will create a directory in `src/tools` with the correct files, and a the import in `src/tools/index.ts`. You will just need to add the imported tool in the proper category and develop the tool.
|
||||||
|
|
||||||
|
## Credits
|
||||||
|
|
||||||
|
Coded with ❤️ by [Corentin Thomasset](https://corentin-thomasset.fr/).
|
||||||
|
|
||||||
|
This project is continuously deployed using [vercel.com](https://vercel.com).
|
||||||
|
|
||||||
|
<a href="https://www.producthunt.com/posts/it-tools?utm_source=badge-featured&utm_medium=badge&utm_souce=badge-it-tools" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=345793&theme=light" alt="IT Tools - Collection of handy online tools for devs, with great UX | Product Hunt" style="width: 250px; height: 54px;" width="250" height="54" /></a>
|
||||||
|
<a href="https://www.producthunt.com/posts/it-tools?utm_source=badge-top-post-badge&utm_medium=badge&utm_souce=badge-it-tools" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/top-post-badge.svg?post_id=345793&theme=light&period=daily" alt="IT Tools - Collection of handy online tools for devs, with great UX | Product Hunt" style="width: 250px; height: 54px;" width="250" height="54" /></a>
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This project is under the [GNU GPLv3](https://github.com/CorentinTh/it-tools/blob/main/LICENSE).
|
20
apps/it-tools/data.yml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
name: IT-Tools
|
||||||
|
tags:
|
||||||
|
- 工具
|
||||||
|
title: 为开发人员提供方便的在线工具集合,具有出色的用户体验
|
||||||
|
type: 工具
|
||||||
|
description: 为开发人员提供方便的在线工具集合,具有出色的用户体验
|
||||||
|
additionalProperties:
|
||||||
|
key: it-tools
|
||||||
|
name: IT-Tools
|
||||||
|
tags:
|
||||||
|
- Tool
|
||||||
|
shortDescZh: 为开发人员提供方便的在线工具集合,具有出色的用户体验
|
||||||
|
shortDescEn: Collection of handy online tools for developers, with great UX
|
||||||
|
type: tool
|
||||||
|
crossVersionUpdate: true
|
||||||
|
limit: 0
|
||||||
|
recommend: 0
|
||||||
|
website: https://it-tools.tech
|
||||||
|
github: https://github.com/CorentinTh/it-tools
|
||||||
|
document: https://github.com/CorentinTh/it-tools
|
BIN
apps/it-tools/logo.png
Normal file
After Width: | Height: | Size: 5.4 KiB |
10
apps/kodbox/1.4104/data.yml
Executable file
@ -0,0 +1,10 @@
|
|||||||
|
additionalProperties:
|
||||||
|
formFields:
|
||||||
|
- default: 8081
|
||||||
|
edit: true
|
||||||
|
envKey: PANEL_APP_PORT_HTTP
|
||||||
|
labelEn: Port
|
||||||
|
labelZh: 端口
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
18
apps/kodbox/1.4104/docker-compose.yml
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
version: "3.5"
|
||||||
|
|
||||||
|
services:
|
||||||
|
kodbox:
|
||||||
|
image: kodcloud/kodbox:v1.4104
|
||||||
|
container_name: ${CONTAINER_NAME}
|
||||||
|
ports:
|
||||||
|
- ${PANEL_APP_PORT_HTTP}:80
|
||||||
|
volumes:
|
||||||
|
- "./site:/var/www/html"
|
||||||
|
restart: always
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
networks:
|
||||||
|
1panel-network:
|
||||||
|
external: true
|
93
apps/navidrome/README.md
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
# 使用说明
|
||||||
|
|
||||||
|
容器以普通用户身份运行的,
|
||||||
|
|
||||||
|
但是默认面板创建应用时,可能会将所需的数据文件夹设定身份为`root`,导致首次运行异常。
|
||||||
|
|
||||||
|
不用在意,执行以下命令,将文件夹改成普通用户身份,再重建应用即可。
|
||||||
|
|
||||||
|
- 路径注意按需修改
|
||||||
|
```
|
||||||
|
chown -R 1000:1000 /opt/1panel/apps/local/navidrome/navidrome/data
|
||||||
|
```
|
||||||
|
|
||||||
|
# 原始相关
|
||||||
|
|
||||||
|
<a href="https://www.navidrome.org"><img src="https://github.com/navidrome/navidrome/raw/master/resources/logo-192x192.png" alt="Navidrome logo" title="navidrome" align="right" height="60px" /></a>
|
||||||
|
|
||||||
|
# Navidrome Music Server [![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=Tired%20of%20paying%20for%20music%20subscriptions%2C%20and%20not%20finding%20what%20you%20really%20like%3F%20Roll%20your%20own%20streaming%20service%21&url=https://navidrome.org&via=navidrome)
|
||||||
|
|
||||||
|
[![Last Release](https://img.shields.io/github/v/release/navidrome/navidrome?logo=github&label=latest&style=flat-square)](https://github.com/navidrome/navidrome/releases)
|
||||||
|
[![Build](https://img.shields.io/github/actions/workflow/status/navidrome/navidrome/pipeline.yml?branch=master&logo=github&style=flat-square)](https://nightly.link/navidrome/navidrome/workflows/pipeline/master)
|
||||||
|
[![Downloads](https://img.shields.io/github/downloads/navidrome/navidrome/total?logo=github&style=flat-square)](https://github.com/navidrome/navidrome/releases/latest)
|
||||||
|
[![Docker Pulls](https://img.shields.io/docker/pulls/deluan/navidrome?logo=docker&label=pulls&style=flat-square)](https://hub.docker.com/r/deluan/navidrome)
|
||||||
|
[![Dev Chat](https://img.shields.io/discord/671335427726114836?logo=discord&label=discord&style=flat-square)](https://discord.gg/xh7j7yF)
|
||||||
|
[![Subreddit](https://img.shields.io/reddit/subreddit-subscribers/navidrome?logo=reddit&label=/r/navidrome&style=flat-square)](https://www.reddit.com/r/navidrome/)
|
||||||
|
[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-v2.0-ff69b4.svg?style=flat-square)](CODE_OF_CONDUCT.md)
|
||||||
|
|
||||||
|
Navidrome is an open source web-based music collection server and streamer. It gives you freedom to listen to your
|
||||||
|
music collection from any browser or mobile device. It's like your personal Spotify!
|
||||||
|
|
||||||
|
|
||||||
|
**Note**: The `master` branch may be in an unstable or even broken state during development.
|
||||||
|
Please use [releases](https://github.com/navidrome/navidrome/releases) instead of
|
||||||
|
the `master` branch in order to get a stable set of binaries.
|
||||||
|
|
||||||
|
## [Check out our Live Demo!](https://www.navidrome.org/demo/)
|
||||||
|
|
||||||
|
__Any feedback is welcome!__ If you need/want a new feature, find a bug or think of any way to improve Navidrome,
|
||||||
|
please file a [GitHub issue](https://github.com/navidrome/navidrome/issues) or join the discussion in our
|
||||||
|
[Subreddit](https://www.reddit.com/r/navidrome/). If you want to contribute to the project in any other way
|
||||||
|
([ui/backend dev](https://www.navidrome.org/docs/developers/),
|
||||||
|
[translations](https://www.navidrome.org/docs/developers/translations/),
|
||||||
|
[themes](https://www.navidrome.org/docs/developers/creating-themes)), please join the chat in our
|
||||||
|
[Discord server](https://discord.gg/xh7j7yF).
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
See instructions on the [project's website](https://www.navidrome.org/docs/installation/)
|
||||||
|
|
||||||
|
## Cloud Hosting
|
||||||
|
|
||||||
|
[PikaPods](https://www.pikapods.com) has partnered with us to offer you an
|
||||||
|
[officially supported, cloud-hosted solution](https://www.navidrome.org/docs/installation/managed/#pikapods).
|
||||||
|
A share of the revenue helps fund the development of Navidrome at no additional cost for you.
|
||||||
|
|
||||||
|
[![PikaPods](https://www.pikapods.com/static/run-button.svg)](https://www.pikapods.com/pods?run=navidrome)
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Handles very **large music collections**
|
||||||
|
- Streams virtually **any audio format** available
|
||||||
|
- Reads and uses all your beautifully curated **metadata**
|
||||||
|
- Great support for **compilations** (Various Artists albums) and **box sets** (multi-disc albums)
|
||||||
|
- **Multi-user**, each user has their own play counts, playlists, favourites, etc...
|
||||||
|
- Very **low resource usage**
|
||||||
|
- **Multi-platform**, runs on macOS, Linux and Windows. **Docker** images are also provided
|
||||||
|
- Ready to use binaries for all major platforms, including **Raspberry Pi**
|
||||||
|
- Automatically **monitors your library** for changes, importing new files and reloading new metadata
|
||||||
|
- **Themeable**, modern and responsive **Web interface** based on [Material UI](https://material-ui.com)
|
||||||
|
- **Compatible** with all Subsonic/Madsonic/Airsonic [clients](https://www.navidrome.org/docs/overview/#apps)
|
||||||
|
- **Transcoding** on the fly. Can be set per user/player. **Opus encoding is supported**
|
||||||
|
- Translated to **various languages**
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
All documentation can be found in the project's website: https://www.navidrome.org/docs.
|
||||||
|
Here are some useful direct links:
|
||||||
|
|
||||||
|
- [Overview](https://www.navidrome.org/docs/overview/)
|
||||||
|
- [Installation](https://www.navidrome.org/docs/installation/)
|
||||||
|
- [Docker](https://www.navidrome.org/docs/installation/docker/)
|
||||||
|
- [Binaries](https://www.navidrome.org/docs/installation/pre-built-binaries/)
|
||||||
|
- [Build from source](https://www.navidrome.org/docs/installation/build-from-source/)
|
||||||
|
- [Development](https://www.navidrome.org/docs/developers/)
|
||||||
|
- [Subsonic API Compatibility](https://www.navidrome.org/docs/developers/subsonic-api/)
|
||||||
|
|
||||||
|
## Screenshots
|
||||||
|
|
||||||
|
<p align="left">
|
||||||
|
<img height="550" src="https://raw.githubusercontent.com/navidrome/navidrome/master/.github/screenshots/ss-mobile-login.png">
|
||||||
|
<img height="550" src="https://raw.githubusercontent.com/navidrome/navidrome/master/.github/screenshots/ss-mobile-player.png">
|
||||||
|
<img height="550" src="https://raw.githubusercontent.com/navidrome/navidrome/master/.github/screenshots/ss-mobile-album-view.png">
|
||||||
|
<img width="550" src="https://raw.githubusercontent.com/navidrome/navidrome/master/.github/screenshots/ss-desktop-player.png">
|
||||||
|
</p>
|
20
apps/navidrome/data.yml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
name: Navidrome Music Server
|
||||||
|
tags:
|
||||||
|
- 工具
|
||||||
|
title: 基于 Web 的开源音乐收藏服务器和流媒体
|
||||||
|
type: 工具
|
||||||
|
description: 基于 Web 的开源音乐收藏服务器和流媒体
|
||||||
|
additionalProperties:
|
||||||
|
key: navidrome
|
||||||
|
name: Navidrome Music Server
|
||||||
|
tags:
|
||||||
|
- Tool
|
||||||
|
shortDescZh: 基于 Web 的开源音乐收藏服务器和流媒体
|
||||||
|
shortDescEn: An open source web-based music collection server and streamer
|
||||||
|
type: tool
|
||||||
|
crossVersionUpdate: true
|
||||||
|
limit: 0
|
||||||
|
recommend: 0
|
||||||
|
website: https://www.navidrome.org
|
||||||
|
github: https://github.com/navidrome/navidrome
|
||||||
|
document: https://www.navidrome.org/docs
|
BIN
apps/navidrome/logo.png
Normal file
After Width: | Height: | Size: 17 KiB |
17
apps/navidrome/pr-2295/data.yml
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
additionalProperties:
|
||||||
|
formFields:
|
||||||
|
- default: 40108
|
||||||
|
edit: true
|
||||||
|
envKey: PANEL_APP_PORT_HTTP
|
||||||
|
labelEn: HTTP Port
|
||||||
|
labelZh: HTTP端口
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
||||||
|
- default: ./data/music
|
||||||
|
edit: true
|
||||||
|
envKey: MUSIC_PATH
|
||||||
|
labelEn: Music folder path
|
||||||
|
labelZh: 音乐文件夹路径
|
||||||
|
required: true
|
||||||
|
type: text
|
25
apps/navidrome/pr-2295/docker-compose.yml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
navidrome:
|
||||||
|
container_name: ${CONTAINER_NAME}
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
ports:
|
||||||
|
- "${PANEL_APP_PORT_HTTP}:4533"
|
||||||
|
volumes:
|
||||||
|
- "./data/data:/data"
|
||||||
|
- "${MUSIC_PATH}:/music:ro"
|
||||||
|
environment:
|
||||||
|
ND_SCANSCHEDULE: 1h
|
||||||
|
ND_LOGLEVEL: info
|
||||||
|
ND_SESSIONTIMEOUT: 24h
|
||||||
|
ND_BASEURL: ""
|
||||||
|
user: 1000:1000
|
||||||
|
image: deluan/navidrome:pr-2295
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
networks:
|
||||||
|
1panel-network:
|
||||||
|
external: true
|
32
apps/next-terminal/1.3.9/data.yml
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
additionalProperties:
|
||||||
|
formFields:
|
||||||
|
- default: 40058
|
||||||
|
edit: true
|
||||||
|
envKey: PANEL_APP_PORT_HTTP
|
||||||
|
labelEn: Port
|
||||||
|
labelZh: 端口
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
||||||
|
- default: ''
|
||||||
|
edit: true
|
||||||
|
envKey: PANEL_APP_PORT_SSH
|
||||||
|
labelEn: SSH Port
|
||||||
|
labelZh: SSH端口
|
||||||
|
required: false
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
||||||
|
- default: "false"
|
||||||
|
edit: true
|
||||||
|
envKey: SSHD_SWITCH
|
||||||
|
labelEn: Enable SSH (true or false)
|
||||||
|
labelZh: 启用SSH (true/false)
|
||||||
|
required: true
|
||||||
|
type: text
|
||||||
|
- default: ./ssh/id_rsa
|
||||||
|
edit: true
|
||||||
|
envKey: SSH_KEY_PATH
|
||||||
|
labelEn: SSH key file(/root/.ssh/id_rsa)
|
||||||
|
labelZh: SSH 私钥文件(/root/.ssh/id_rsa)
|
||||||
|
required: true
|
||||||
|
type: text
|
37
apps/next-terminal/1.3.9/docker-compose.yml
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
nt-guacd:
|
||||||
|
container_name: ${CONTAINER_NAME}-guacd
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
volumes:
|
||||||
|
- "./data:/usr/local/next-terminal/data"
|
||||||
|
image: dushixiang/guacd:1.5.2
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
next-terminal:
|
||||||
|
container_name: ${CONTAINER_NAME}
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
ports:
|
||||||
|
- "${PANEL_APP_PORT_HTTP}:8088"
|
||||||
|
- "${PANEL_APP_PORT_SSH}:8089"
|
||||||
|
volumes:
|
||||||
|
- "./data:/usr/local/next-terminal/data"
|
||||||
|
- "/etc/localtime:/etc/localtime"
|
||||||
|
- "${SSH_KEY_PATH}:/root/.ssh/id_rsa"
|
||||||
|
environment:
|
||||||
|
DB: sqlite
|
||||||
|
GUACD_HOSTNAME: nt-guacd
|
||||||
|
GUACD_PORT: 4822
|
||||||
|
SSHD_ENABLE: ${SSHD_SWITCH}
|
||||||
|
image: dushixiang/next-terminal:v1.3.9
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
networks:
|
||||||
|
1panel-network:
|
||||||
|
external: true
|
49
apps/next-terminal/1.3.9/ssh/id_rsa
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
-----BEGIN OPENSSH PRIVATE KEY-----
|
||||||
|
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAACFwAAAAdzc2gtcn
|
||||||
|
NhAAAAAwEAAQAAAgEAqNqKouPlvUBbLv4BUSMxaZu4rFBMKLcl2MSetFAx/Ya/e5JFQ9rZ
|
||||||
|
RhMmZqx7gfj6/OQTXw9qN43k0XKy0Y9u3APtt9OZ9Y5StcmXljQhy8EQOF+MyZAEY3HpM7
|
||||||
|
4xIV+v16z1mBrczZcFUbALVdijPAWhhMZxxhaN+EA8IfA0ByoE++w6XjvrYEOhW2qCMptL
|
||||||
|
TV6ZSUW7IOOoa/VzZBujUqgXrqiOshVy79mZi/mg5Sctp727JHr4PAw4yEqDHkLX4D97Rc
|
||||||
|
Qy8FMbmw40my6G+P22YywCdwVXlgZOq1dCuCRVAzl811nnTSLigyll3DBOilkp0RsDATUv
|
||||||
|
xCYc8UbwIrlUGDFKz8f54BN2kIgUX7OKVFOefhnpwpasZ8BjF+4A+3b5PkxQEg4SYiYWJc
|
||||||
|
RDIs9pCuSG2kX45PhbGMoWfbqU63pftM2fVtWiStMOZysvfkaLVUhJPQT3TZhiO84mkz6S
|
||||||
|
juQO2+b7Olb+rSe0naOzewvi72fFzbAOSEe4hj4Ewh38u1gYge5kOSg/SaHcYvVa2OU9Fz
|
||||||
|
iS5BCKKfcGtvkxl/HNDlNndCVw4DZHxmIkWDDa6uLI3qWn5A+AVP2D8zMTSmn/gkPxkYE5
|
||||||
|
lkhWr4aM0/purV2JeupZzSDYa0zWL+6SuEWDL1qw9oglDm209go6jBbjEtaMDxt9YpkCcX
|
||||||
|
kAAAdQPAxkLDwMZCwAAAAHc3NoLXJzYQAAAgEAqNqKouPlvUBbLv4BUSMxaZu4rFBMKLcl
|
||||||
|
2MSetFAx/Ya/e5JFQ9rZRhMmZqx7gfj6/OQTXw9qN43k0XKy0Y9u3APtt9OZ9Y5StcmXlj
|
||||||
|
Qhy8EQOF+MyZAEY3HpM74xIV+v16z1mBrczZcFUbALVdijPAWhhMZxxhaN+EA8IfA0ByoE
|
||||||
|
++w6XjvrYEOhW2qCMptLTV6ZSUW7IOOoa/VzZBujUqgXrqiOshVy79mZi/mg5Sctp727JH
|
||||||
|
r4PAw4yEqDHkLX4D97RcQy8FMbmw40my6G+P22YywCdwVXlgZOq1dCuCRVAzl811nnTSLi
|
||||||
|
gyll3DBOilkp0RsDATUvxCYc8UbwIrlUGDFKz8f54BN2kIgUX7OKVFOefhnpwpasZ8BjF+
|
||||||
|
4A+3b5PkxQEg4SYiYWJcRDIs9pCuSG2kX45PhbGMoWfbqU63pftM2fVtWiStMOZysvfkaL
|
||||||
|
VUhJPQT3TZhiO84mkz6SjuQO2+b7Olb+rSe0naOzewvi72fFzbAOSEe4hj4Ewh38u1gYge
|
||||||
|
5kOSg/SaHcYvVa2OU9FziS5BCKKfcGtvkxl/HNDlNndCVw4DZHxmIkWDDa6uLI3qWn5A+A
|
||||||
|
VP2D8zMTSmn/gkPxkYE5lkhWr4aM0/purV2JeupZzSDYa0zWL+6SuEWDL1qw9oglDm209g
|
||||||
|
o6jBbjEtaMDxt9YpkCcXkAAAADAQABAAACAE2riU34SrtNGSR6jpyF9brAeKg6n22zIWOe
|
||||||
|
venvYa9fBkGPPPFDf+It+OINwRo+LyWYvBhj/NXlHTYC7qJaugHWhMikOxOrDfy06FedT1
|
||||||
|
ZsTkvAGAC3kG01/rFgcTUK0NYCp036PUsMhtPWiMBKUHvRk0SCC9+0jEV/Nqnd1fDdsUE4
|
||||||
|
nniuU00KjvR//7fLm03Rj+0WeEdesSBH3XZVCEGDNLGQs2LTXvVZQLoUb6A471VTfvv+3K
|
||||||
|
SycoQfUkTfNnHegZPL9ip58B7Y3/Xp5wgtnHHt0oxxFqLZ7+H816HghIJhNT3SCwV+YHc4
|
||||||
|
2bP5PIeDECsxo6YwkvJFHdcWbGqtUEDawJ+sUit0iBnByvbDRT5iMgcszekdv4FC7YhWxp
|
||||||
|
nSJCU2GOWIeFKjxcqYkIyYNjJ2+Agh7JQME7pYfeXeyqWlewLi61Xp3jzAU6exH8l/6m0w
|
||||||
|
luzKDaoyw4XR9apIGkRSbmgi7sMhCqpxgWUuOYZj4cqxOXJsaR9vgdwOpvrvMMTahIjQSc
|
||||||
|
Es2qzsqvoyqV0pAufOAgO77NgawhGpO6E8nOm2W5TFvfAQLXdjcb7drKTgeSLgfLPeVITH
|
||||||
|
0a6AYyGij6N1QkOEADH3AwapJwbV6WFb0n/n6CnAfcfZ9ZDRhHC8R14Mc+EhZ2KiwwvKdk
|
||||||
|
qrchmspx6dWEs/nLABAAABAB7tCOMMbB4KC4/e2GIQCbW1DiTQOWwpGFTjhRf8f41fU6Wg
|
||||||
|
yT5W7CN4olPUWOnCs+CtyKdCtQdhZzMxhE9Kj01S0hBCJeNQibIq8CKmzab7XvSnSRdzsT
|
||||||
|
qm7hyo7Yvo3EFeBxHTaOAQ99CcgevX+CYGibj6EXs35vqjRXZ9OEnBJ+bbMJGU5JCINeb8
|
||||||
|
ZiC9T/TTXBgemPYcmKb+LzxgJWco8hI9W9t37OmrAagdeXo3P1KWym0rWknlxF9glOdgZe
|
||||||
|
WsxcaErNhOos6tD2Jq/WUjQdEDwoYscpm5QMwkNqWKdFa/WK60S4e/bZdK/JOV4Dbd0Ukz
|
||||||
|
pl77sLYP+TT+wMcAAAEBANIwTNTjtoRws0XMioRg1yPU9XA577ZFh0E0qVFyhOKlAaZQo/
|
||||||
|
qElZkaqd3IAkxXtJ9T80r5mMZxJL/9PBQIWLCSkvUC91qMNyBw0W9lr5S10JAl5vG27WOt
|
||||||
|
cGFJzdWa3g9DwZuyr5bTh62zV9ET1v/vr33fGf60g8H9SMQcb2oPqqkoZHMEcgeqhrd843
|
||||||
|
zBm7nuFkY74WaCH1n78vkazKSGKVbUxwdh9MgMRW6mYf/HkAM7nuMqcubyZ4oF3OmCEizd
|
||||||
|
NBoEjAJtQNI5dms0BPuZBoqu1av52F9IIX+PI4miI5E7i8DNImMJQozCLlG4QWBrjd6oAp
|
||||||
|
UXqBWs+gg7lQEAAAEBAM2n6Vz3tsP4Y2JP3rKHUcCA5JuuzHVuemGj18C6Xh6cdYUy7RSe
|
||||||
|
F042HBRl/3nuV4H4+lfr3Ur5yCERBdyOUeeuGfNlZhWXwwy+myYSUtT/dNGN5P8wFK/sxc
|
||||||
|
pmbqM9Sl/TlEudYwqMBZzlzquzys3UBtEmtsM8Bgdxwd+vn94a4nKkGr5X0SfE8evpZWuS
|
||||||
|
dQywRfA0aPxSwORoTmYzr6yEWQzywYUlC1Gd9hW6Fy8lYKGx9SZXnrvxsRQBQwAQbnvHGL
|
||||||
|
FbF138AwwkrKJPtedQZkAs4teFg8ggPuA3SpWFcjEJGKQYwkpMxjHmiP9AvS0t34PJOiYa
|
||||||
|
i9cQ/l2FBHkAAAAWeW91cl9lbWFpbEBleGFtcGxlLmNvbQECAwQF
|
||||||
|
-----END OPENSSH PRIVATE KEY-----
|
73
apps/next-terminal/README.md
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
# Next Terminal
|
||||||
|
|
||||||
|
[![Docker guacd build](https://github.com/dushixiang/next-terminal/actions/workflows/docker-guacd.yml/badge.svg)](https://github.com/dushixiang/next-terminal/actions/workflows/docker-guacd.yml)
|
||||||
|
[![Docker next-terminal build](https://github.com/dushixiang/next-terminal/actions/workflows/docker-next-terminal.yml/badge.svg)](https://github.com/dushixiang/next-terminal/actions/workflows/docker-next-terminal.yml)
|
||||||
|
|
||||||
|
## 快速了解
|
||||||
|
|
||||||
|
Next Terminal是一个简单好用安全的开源交互审计系统,支持RDP、SSH、VNC、Telnet、Kubernetes协议。
|
||||||
|
|
||||||
|
目前支持的功能有:
|
||||||
|
|
||||||
|
- 授权凭证管理
|
||||||
|
- 资产管理(支持RDP、SSH、VNC、TELNET协议)
|
||||||
|
- 指令管理
|
||||||
|
- 批量执行命令
|
||||||
|
- 在线会话管理(监控、强制断开)
|
||||||
|
- 离线会话管理(查看录屏)
|
||||||
|
- 双因素认证
|
||||||
|
- 资产标签
|
||||||
|
- 资产授权
|
||||||
|
- 多用户&用户分组
|
||||||
|
- 计划任务
|
||||||
|
- ssh server
|
||||||
|
- 登录策略
|
||||||
|
- 系统监控
|
||||||
|
|
||||||
|
## 在线体验
|
||||||
|
|
||||||
|
**web**
|
||||||
|
|
||||||
|
https://next.typesafe.cn/ 账号:test 密码:test
|
||||||
|
|
||||||
|
**ssh server**
|
||||||
|
|
||||||
|
主机:next.typesafe.cn
|
||||||
|
端口:2022
|
||||||
|
账号:test 密码:test
|
||||||
|
|
||||||
|
## 协议与条款
|
||||||
|
|
||||||
|
如您需要在企业网络中使用 next-terminal,建议先征求 IT 管理员的同意。下载、使用或分发 next-terminal 前,您必须同意 [协议](./LICENSE) 条款与限制。本项目不提供任何担保,亦不承担任何责任。
|
||||||
|
|
||||||
|
## 快速安装
|
||||||
|
|
||||||
|
- [安装文档](https://next-terminal.typesafe.cn)
|
||||||
|
|
||||||
|
默认账号密码为 admin/admin 。
|
||||||
|
|
||||||
|
## 手动编译
|
||||||
|
|
||||||
|
1. 找一台Linux 机器或者Mac
|
||||||
|
2. 安装 go 1.18 或以上版本
|
||||||
|
3. 安装 nodejs 16,安装 npm 或 yarn
|
||||||
|
4. 进入 web 目录 执行 yarn 或 npm install
|
||||||
|
5. 返回上级目录,也就是项目根目录,执行 sh build.sh
|
||||||
|
|
||||||
|
## 问题反馈
|
||||||
|
|
||||||
|
- Issues
|
||||||
|
- 微信群 加我微信拉你进群 (请备注 next-terminal)
|
||||||
|
|
||||||
|
<img src="https://github.com/dushixiang/next-terminal/raw/master/wx.png" width="300" height="auto"/>
|
||||||
|
|
||||||
|
- QQ群 938145268
|
||||||
|
- Telegram https://t.me/next_terminal
|
||||||
|
|
||||||
|
## 安全问题
|
||||||
|
|
||||||
|
如果您在使用过程中发现了安全问题,请发送邮件至 helloworld1024@foxmail.com 联系我,谢谢。
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Next Terminal 使用 [AGPL-3.0](./LICENSE) 开源协议,请自觉遵守。
|
20
apps/next-terminal/data.yml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
name: Next Terminal
|
||||||
|
tags:
|
||||||
|
- 工具
|
||||||
|
title: 一个简单好用安全的开源交互审计系统,支持RDP、SSH、VNC、Telnet、Kubernetes协议
|
||||||
|
type: 工具
|
||||||
|
description: 一个简单好用安全的开源交互审计系统,支持RDP、SSH、VNC、Telnet、Kubernetes协议
|
||||||
|
additionalProperties:
|
||||||
|
key: next-terminal
|
||||||
|
name: Next Terminal
|
||||||
|
tags:
|
||||||
|
- Tool
|
||||||
|
shortDescZh: 一个简单好用安全的开源交互审计系统,支持RDP、SSH、VNC、Telnet、Kubernetes协议
|
||||||
|
shortDescEn: A simple, easy-to-use and secure open source interactive audit system that supports RDP, SSH, VNC, Telnet, and Kubernetes protocols
|
||||||
|
type: tool
|
||||||
|
crossVersionUpdate: true
|
||||||
|
limit: 0
|
||||||
|
recommend: 0
|
||||||
|
website: https://next-terminal.typesafe.cn/
|
||||||
|
github: https://github.com/dushixiang/next-terminal
|
||||||
|
document: https://next-terminal.typesafe.cn/docs/
|
BIN
apps/next-terminal/logo.png
Normal file
After Width: | Height: | Size: 5.5 KiB |
18
apps/onedev/8.6.12/data.yml
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
additionalProperties:
|
||||||
|
formFields:
|
||||||
|
- default: 40085
|
||||||
|
edit: true
|
||||||
|
envKey: PANEL_APP_PORT_HTTP
|
||||||
|
labelEn: Port
|
||||||
|
labelZh: 端口
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
||||||
|
- default: 40086
|
||||||
|
edit: true
|
||||||
|
envKey: PANEL_APP_PORT_SSH
|
||||||
|
labelEn: SSH Port
|
||||||
|
labelZh: SSH端口
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
20
apps/onedev/8.6.12/docker-compose.yml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
onedev:
|
||||||
|
container_name: ${CONTAINER_NAME}
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
ports:
|
||||||
|
- "${PANEL_APP_PORT_HTTP}:6610"
|
||||||
|
- "${PANEL_APP_PORT_SSH}:6611"
|
||||||
|
volumes:
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
- "./data:/opt/onedev"
|
||||||
|
image: 1dev/server:8.6.12
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
networks:
|
||||||
|
1panel-network:
|
||||||
|
external: true
|
140
apps/onedev/README.md
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
<div class='d-none'>
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
> 1. Do not worry about security advisories above. They are fixed as soon as discovered and published to notify users</span>
|
||||||
|
> 2. We develop OneDev at <a href="https://code.onedev.io/onedev/server">code.onedev.io</a> for sake of dogfooding. All issues and pull requests should be submitted there
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<h1>Self-hosted Git Server with Kanban and CI/CD</h1>
|
||||||
|
|
||||||
|
<h2>
|
||||||
|
<a href="https://docs.onedev.io">Quickstart</a>
|
||||||
|
| <a href="https://docs.onedev.io/category/installation-guide">Installation Guide</a>
|
||||||
|
| <a href="https://docs.onedev.io">All Documentation</a>
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p style="margin-bottom: 20px;">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
## Out-of-box Symbol Search and Navigation
|
||||||
|
|
||||||
|
Of course IDE is good at doing this, but often we need to search in old commits (investigate issues in release versions etc), and switching commits in IDE can be troublesome and slow.
|
||||||
|
|
||||||
|
It works by analyzing source code with ANTLR, extracting symbols for storage incrementally, fast and space efficient. Now supports Java, JavaScript, C, C++, CSharp, Go, PHP, Python, CSS, SCSS, LESS and R. GitHub adds this feature several years ago, but seems that it only works for main branch, and GitLab has to configure CI job to generate and upload LSIF which is troublesome and can occupy considerable space if you do it for each commit.
|
||||||
|
|
||||||
|
You can also jump to symbol definition in diff while reviewing commits or pull requests.
|
||||||
|
|
||||||
|
![searchsymbol](https://github.com/theonedev/onedev/raw/main/doc/images/search-symbol.gif)
|
||||||
|
|
||||||
|
![jumpsymbol](https://github.com/theonedev/onedev/raw/main/doc/images/symbol.gif)
|
||||||
|
|
||||||
|
## Code Search with Regular Expression
|
||||||
|
|
||||||
|
You may switch to any commit, and search code with regular expression. OneDev under the hood indexes the code with Lucene incrementally. At search time, literal tri-grams in the regular expression are extracted for a coarse search, followed by exact match in the result. This makes the regex search blazing fast, even for large repositories like Linux.
|
||||||
|
|
||||||
|
![regex](https://github.com/theonedev/onedev/raw/main/doc/images/regex-search.gif)
|
||||||
|
|
||||||
|
## Annotate Source/Diff with Static Analysis Result to Facilitate Code Review
|
||||||
|
|
||||||
|
Of course this can be done by many third party applications at GitHub, however they display the result on their own applications, and this makes review activities such as adding comment over analysis result difficult. Not to mention that you need to pay for these services.
|
||||||
|
|
||||||
|
![annotation](https://github.com/theonedev/onedev/raw/main/doc/images/annotation.png)
|
||||||
|
|
||||||
|
## Customizable Issue State and Field, with Deep CI/CD Integration
|
||||||
|
|
||||||
|
The simple open/close state of GitHub/GitLab issues does not work well for many workflows. Considering issues submitted by customers:
|
||||||
|
|
||||||
|
1. If developer closes issue upon committing the code, customer will be notified and may ask for the release fixing the issue.
|
||||||
|
2. If developer closes the issue at release time, QA might be confused at what issues to test as they all remain open at test time.
|
||||||
|
|
||||||
|
With customizable issue states, we may address the issue with four states: open, committed, test ready and released:
|
||||||
|
|
||||||
|
1. When code is committed, issue transits to committed state automatically
|
||||||
|
2. When a test build is created and deployed, the issue transits to test ready state automatically. QA will be notified and can check issue detail to know which environment the test build is deployed into.
|
||||||
|
3. When test passes, and a release build is created, customers submitting the issue will be notified and they can check issue detail to see which release contains the fix.
|
||||||
|
|
||||||
|
![boards](https://github.com/theonedev/onedev/raw/main/doc/images/boards.png)
|
||||||
|
|
||||||
|
![fixing-build](https://github.com/theonedev/onedev/raw/main/doc/images/fixing-build.png)
|
||||||
|
|
||||||
|
## Service Desk to Create/Discuss Issues via Email
|
||||||
|
|
||||||
|
Service desk allows your users to submit tickets via email without the need to have a OneDev account. These tickets can then be created in desired projects, and assigned to appropriate members in your team. All further discussions over the tickets can take place completely in email, with discussion contents posted to ticket as comments. User will also get notifications when there are any ticket activities, for instance, when a relevant release is created or deployed
|
||||||
|
|
||||||
|
![service-desk.png](https://github.com/theonedev/onedev/raw/main/doc/images/service-desk.png)
|
||||||
|
|
||||||
|
## A powerful and Intuitive Query Language
|
||||||
|
|
||||||
|
Thanks to ANTLR again, OneDev ships sophisticated query languages for projects, commits, issues, builds, and pull requests, with intuitive auto-completions and hints. For instance, it enables our customers finding fixed issues between their running release and latest release, and enables us to find all commits submitted by someone touching specified modules, etc.
|
||||||
|
|
||||||
|
Queries can be saved and subscribed, so that you won't miss anything interested.
|
||||||
|
|
||||||
|
![query](https://github.com/theonedev/onedev/raw/main/doc/images/query.gif)
|
||||||
|
|
||||||
|
## A Full-fledge CI/CD Engine without Writing Yaml
|
||||||
|
|
||||||
|
OneDev ships with GUI to generate CI/CD Yaml. No need to google around for Yaml grammars. A one-liner docker command to start OneDev server and you have a local CI/CD runner automatically. Concerns about server capability to run massive jobs? Another one-liner to connect self-updating agent from any machine. Want auto-scale CI/CD farm? A helm one-liner to deploy OneDev into k8s cluster.
|
||||||
|
|
||||||
|
Build pipeline, matrix jobs, typed parameters, parameter chaining, step templates, build promotions… too many neat features to elaborate…
|
||||||
|
|
||||||
|
![job-def](https://github.com/theonedev/onedev/raw/main/doc/images/job-command.gif)
|
||||||
|
|
||||||
|
![run-job](https://github.com/theonedev/onedev/raw/main/doc/images/build-option.gif)
|
||||||
|
|
||||||
|
![pipeline.gif](https://github.com/theonedev/onedev/raw/main/doc/images/pipeline.gif)
|
||||||
|
|
||||||
|
## Flexible Pull Request Review Policy and Reviewer Suggestion
|
||||||
|
|
||||||
|
Specify pull request review policy based on author, branch, and changed files. OneDev can leverage git change history to suggest most appropriate reviewers for pull requests touching certain files.
|
||||||
|
|
||||||
|
![review-policy](https://github.com/theonedev/onedev/raw/main/doc/images/review-policy.gif)
|
||||||
|
|
||||||
|
## Lightweight Review without Pull Request
|
||||||
|
|
||||||
|
Comment on any part of code or diff to start a lightweight review without opening pull request. Review comments live through code modification and even file rename to serve as documentation.
|
||||||
|
|
||||||
|
Each discussion is threaded so that you can easily know discussions with new comments/updates.
|
||||||
|
|
||||||
|
![file-comment](https://github.com/theonedev/onedev/raw/main/doc/images/file-comment.gif)
|
||||||
|
|
||||||
|
![thread-comments](https://github.com/theonedev/onedev/raw/main/doc/images/threaded-comments.png)
|
||||||
|
|
||||||
|
## Command Palette to Access Features Quickly
|
||||||
|
|
||||||
|
Press cmd/ctrl-k to bring up command palette from anywhere. Search projects, files, issues, pull requests, builds, and various settings and jump to them without leaving your keyboard
|
||||||
|
|
||||||
|
![command-palette.gif](https://github.com/theonedev/onedev/raw/main/doc/images/command-palette.gif)
|
||||||
|
|
||||||
|
## Write Markdown Pleasantly With a Smart Editor
|
||||||
|
|
||||||
|
When embedding an image in a markdown file in GitHub/GitLab, you need to upload the image in a separate page, and then figure out the relative path to reference that image. With OneDev, you simply upload the image to desired folder in same editor, and the link will be generated automatically.
|
||||||
|
|
||||||
|
OneDev tracks your cursor in edit window and scrolls the preview window as necessary so that you can always preview what you are typing.
|
||||||
|
|
||||||
|
![markdown](https://github.com/theonedev/onedev/raw/main/doc/images/markdown.gif)
|
||||||
|
|
||||||
|
## SLOC Trend By Language
|
||||||
|
|
||||||
|
OneDev inspects git history of main branch to calculate trend of source lines of code by language efficiently.
|
||||||
|
|
||||||
|
![stats](https://github.com/theonedev/onedev/raw/main/doc/images/stats.png)
|
||||||
|
|
||||||
|
## Project Hierarchy to Facilitate Setting Inheritance
|
||||||
|
|
||||||
|
Organization is ideal for public service. However for self-hosted internal use, we feel that a hierarchical structure is more practical to organize projects. Child projects can inherit settings from parent project and can selectively override some of them if necessary. This reduces a lot of overhead to manage a lot of projects in the company.
|
||||||
|
|
||||||
|
## Fast and Reliable with Moderate Resource Usage
|
||||||
|
|
||||||
|
OneDev is carefully designed with performance in mind. With a 2 core 2GB box, you will get all features above for medium sized projects.
|
||||||
|
It has been intensively used for more than 5 years, with battle-proven reliability. Fixing bugs is our highest priority, and there is
|
||||||
|
normally few to no known bugs in the wild.
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
# Special Thanks
|
||||||
|
|
||||||
|
![yourkit](https://www.yourkit.com/images/yklogo.png)
|
||||||
|
|
||||||
|
[YourKit](https://yourkit.com) supports this project by providing a free open source license of their excellent Java profiler
|
20
apps/onedev/data.yml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
name: OneDev
|
||||||
|
tags:
|
||||||
|
- CI/CD
|
||||||
|
title: 具有 CI/CD 和Kanban的自托管 Git 服务器
|
||||||
|
type: CI/CD
|
||||||
|
description: 具有 CI/CD 和Kanban的自托管 Git 服务器
|
||||||
|
additionalProperties:
|
||||||
|
key: onedev
|
||||||
|
name: OneDev
|
||||||
|
tags:
|
||||||
|
- CI/CD
|
||||||
|
shortDescZh: 具有 CI/CD 和Kanban的自托管 Git 服务器
|
||||||
|
shortDescEn: Self-hosted Git Server with CI/CD and Kanban
|
||||||
|
type: tool
|
||||||
|
crossVersionUpdate: true
|
||||||
|
limit: 0
|
||||||
|
recommend: 0
|
||||||
|
website: https://onedev.io
|
||||||
|
github: https://github.com/theonedev/onedev
|
||||||
|
document: https://docs.onedev.io
|
BIN
apps/onedev/logo.png
Normal file
After Width: | Height: | Size: 5.2 KiB |
33
apps/openlitespeed/1.7.18-lsphp74/data.yml
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
additionalProperties:
|
||||||
|
formFields:
|
||||||
|
- default: 80
|
||||||
|
disabled: true
|
||||||
|
envKey: PANEL_APP_PORT_HTTP
|
||||||
|
labelEn: HTTP Port
|
||||||
|
labelZh: HTTP端口
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
||||||
|
- default: 443
|
||||||
|
disabled: true
|
||||||
|
envKey: PANEL_APP_PORT_HTTPS
|
||||||
|
labelEn: HTTPS Port
|
||||||
|
labelZh: HTTPS端口
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
||||||
|
- default: 40113
|
||||||
|
edit: true
|
||||||
|
envKey: PANEL_APP_PORT_CONSOLE
|
||||||
|
labelEn: Console Port
|
||||||
|
labelZh: 控制台端口
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
||||||
|
- default: Asia/Shanghai
|
||||||
|
edit: true
|
||||||
|
envKey: TIME_ZONE
|
||||||
|
labelEn: Time zone
|
||||||
|
labelZh: 时区
|
||||||
|
required: true
|
||||||
|
type: text
|
@ -0,0 +1,660 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
DEFAULT_VH_ROOT='/var/www/vhosts'
|
||||||
|
VH_DOC_ROOT=''
|
||||||
|
VHNAME=''
|
||||||
|
APP_NAME=''
|
||||||
|
DOMAIN=''
|
||||||
|
WWW_UID=''
|
||||||
|
WWW_GID=''
|
||||||
|
WP_CONST_CONF=''
|
||||||
|
PUB_IP=$(curl -s http://checkip.amazonaws.com)
|
||||||
|
DB_HOST='mysql'
|
||||||
|
PLUGINLIST="litespeed-cache.zip"
|
||||||
|
THEME='twentytwenty'
|
||||||
|
EPACE=' '
|
||||||
|
|
||||||
|
echow(){
|
||||||
|
FLAG=${1}
|
||||||
|
shift
|
||||||
|
echo -e "\033[1m${EPACE}${FLAG}\033[0m${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
help_message(){
|
||||||
|
echo -e "\033[1mOPTIONS\033[0m"
|
||||||
|
echow '-A, -app [wordpress] -D, --domain [DOMAIN_NAME]'
|
||||||
|
echo "${EPACE}${EPACE}Example: appinstallctl.sh --app wordpress --domain example.com"
|
||||||
|
echow '-H, --help'
|
||||||
|
echo "${EPACE}${EPACE}Display help and exit."
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
check_input(){
|
||||||
|
if [ -z "${1}" ]; then
|
||||||
|
help_message
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
linechange(){
|
||||||
|
LINENUM=$(grep -n "${1}" ${2} | cut -d: -f 1)
|
||||||
|
if [ -n "${LINENUM}" ] && [ "${LINENUM}" -eq "${LINENUM}" ] 2>/dev/null; then
|
||||||
|
sed -i "${LINENUM}d" ${2}
|
||||||
|
sed -i "${LINENUM}i${3}" ${2}
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
ck_ed(){
|
||||||
|
if [ ! -f /bin/ed ]; then
|
||||||
|
echo "Install ed package.."
|
||||||
|
apt-get install ed -y > /dev/null 2>&1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
ck_unzip(){
|
||||||
|
if [ ! -f /usr/bin/unzip ]; then
|
||||||
|
echo "Install unzip package.."
|
||||||
|
apt-get install unzip -y > /dev/null 2>&1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
get_owner(){
|
||||||
|
WWW_UID=$(stat -c "%u" ${DEFAULT_VH_ROOT})
|
||||||
|
WWW_GID=$(stat -c "%g" ${DEFAULT_VH_ROOT})
|
||||||
|
if [ ${WWW_UID} -eq 0 ] || [ ${WWW_GID} -eq 0 ]; then
|
||||||
|
WWW_UID=1000
|
||||||
|
WWW_GID=1000
|
||||||
|
echo "Set owner to ${WWW_UID}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
get_db_pass(){
|
||||||
|
if [ -f ${DEFAULT_VH_ROOT}/${1}/.db_pass ]; then
|
||||||
|
SQL_DB=$(grep -i Database ${VH_ROOT}/.db_pass | awk -F ':' '{print $2}' | tr -d '"')
|
||||||
|
SQL_USER=$(grep -i Username ${VH_ROOT}/.db_pass | awk -F ':' '{print $2}' | tr -d '"')
|
||||||
|
SQL_PASS=$(grep -i Password ${VH_ROOT}/.db_pass | awk -F ':' '{print $2}' | tr -d '"')
|
||||||
|
else
|
||||||
|
echo 'db pass file can not locate, skip wp-config pre-config.'
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
set_vh_docroot(){
|
||||||
|
if [ "${VHNAME}" != '' ]; then
|
||||||
|
VH_ROOT="${DEFAULT_VH_ROOT}/${VHNAME}"
|
||||||
|
VH_DOC_ROOT="${DEFAULT_VH_ROOT}/${VHNAME}/html"
|
||||||
|
WP_CONST_CONF="${VH_DOC_ROOT}/wp-content/plugins/litespeed-cache/data/const.default.ini"
|
||||||
|
elif [ -d ${DEFAULT_VH_ROOT}/${1}/html ]; then
|
||||||
|
VH_ROOT="${DEFAULT_VH_ROOT}/${1}"
|
||||||
|
VH_DOC_ROOT="${DEFAULT_VH_ROOT}/${1}/html"
|
||||||
|
WP_CONST_CONF="${VH_DOC_ROOT}/wp-content/plugins/litespeed-cache/data/const.default.ini"
|
||||||
|
else
|
||||||
|
echo "${DEFAULT_VH_ROOT}/${1}/html does not exist, please add domain first! Abort!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
check_sql_native(){
|
||||||
|
local COUNTER=0
|
||||||
|
local LIMIT_NUM=100
|
||||||
|
until [ "$(curl -v mysql:3306 2>&1 | grep -i 'native\|Connected')" ]; do
|
||||||
|
echo "Counter: ${COUNTER}/${LIMIT_NUM}"
|
||||||
|
COUNTER=$((COUNTER+1))
|
||||||
|
if [ ${COUNTER} = 10 ]; then
|
||||||
|
echo '--- MySQL is starting, please wait... ---'
|
||||||
|
elif [ ${COUNTER} = ${LIMIT_NUM} ]; then
|
||||||
|
echo '--- MySQL is timeout, exit! ---'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
install_wp_plugin(){
|
||||||
|
for PLUGIN in ${PLUGINLIST}; do
|
||||||
|
wget -q -P ${VH_DOC_ROOT}/wp-content/plugins/ https://downloads.wordpress.org/plugin/${PLUGIN}
|
||||||
|
if [ ${?} = 0 ]; then
|
||||||
|
ck_unzip
|
||||||
|
unzip -qq -o ${VH_DOC_ROOT}/wp-content/plugins/${PLUGIN} -d ${VH_DOC_ROOT}/wp-content/plugins/
|
||||||
|
else
|
||||||
|
echo "${PLUGINLIST} FAILED to download"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
rm -f ${VH_DOC_ROOT}/wp-content/plugins/*.zip
|
||||||
|
}
|
||||||
|
|
||||||
|
set_htaccess(){
|
||||||
|
if [ ! -f ${VH_DOC_ROOT}/.htaccess ]; then
|
||||||
|
touch ${VH_DOC_ROOT}/.htaccess
|
||||||
|
fi
|
||||||
|
cat << EOM > ${VH_DOC_ROOT}/.htaccess
|
||||||
|
# BEGIN WordPress
|
||||||
|
<IfModule mod_rewrite.c>
|
||||||
|
RewriteEngine On
|
||||||
|
RewriteBase /
|
||||||
|
RewriteRule ^index\.php$ - [L]
|
||||||
|
RewriteCond %{REQUEST_FILENAME} !-f
|
||||||
|
RewriteCond %{REQUEST_FILENAME} !-d
|
||||||
|
RewriteRule . /index.php [L]
|
||||||
|
</IfModule>
|
||||||
|
# END WordPress
|
||||||
|
EOM
|
||||||
|
}
|
||||||
|
|
||||||
|
get_theme_name(){
|
||||||
|
THEME_NAME=$(grep WP_DEFAULT_THEME ${VH_DOC_ROOT}/wp-includes/default-constants.php | grep -v '!' | awk -F "'" '{print $4}')
|
||||||
|
echo "${THEME_NAME}" | grep 'twenty' >/dev/null 2>&1
|
||||||
|
if [ ${?} = 0 ]; then
|
||||||
|
THEME="${THEME_NAME}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
set_lscache(){
|
||||||
|
cat << EOM > "${WP_CONST_CONF}"
|
||||||
|
;
|
||||||
|
; This is the predefined default LSCWP configuration file
|
||||||
|
;
|
||||||
|
; All the keys and values please refer \`src/const.cls.php\`
|
||||||
|
;
|
||||||
|
; Comments start with \`;\`
|
||||||
|
;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- General ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
; O_AUTO_UPGRADE
|
||||||
|
auto_upgrade = false
|
||||||
|
; O_API_KEY
|
||||||
|
api_key = ''
|
||||||
|
; O_SERVER_IP
|
||||||
|
server_ip = ''
|
||||||
|
; O_NEWS
|
||||||
|
news = false
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- Cache ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
cache-priv = true
|
||||||
|
cache-commenter = true
|
||||||
|
cache-rest = true
|
||||||
|
cache-page_login = true
|
||||||
|
cache-favicon = true
|
||||||
|
cache-resources = true
|
||||||
|
cache-browser = false
|
||||||
|
cache-mobile = false
|
||||||
|
cache-mobile_rules = 'Mobile
|
||||||
|
Android
|
||||||
|
Silk/
|
||||||
|
Kindle
|
||||||
|
BlackBerry
|
||||||
|
Opera Mini
|
||||||
|
Opera Mobi'
|
||||||
|
cache-exc_useragents = ''
|
||||||
|
cache-exc_cookies = ''
|
||||||
|
cache-exc_qs = ''
|
||||||
|
cache-exc_cat = ''
|
||||||
|
cache-exc_tag = ''
|
||||||
|
cache-force_uri = ''
|
||||||
|
cache-force_pub_uri = ''
|
||||||
|
cache-priv_uri = ''
|
||||||
|
cache-exc = ''
|
||||||
|
cache-exc_roles = ''
|
||||||
|
cache-drop_qs = 'fbclid
|
||||||
|
gclid
|
||||||
|
utm*
|
||||||
|
_ga'
|
||||||
|
cache-ttl_pub = 604800
|
||||||
|
cache-ttl_priv = 1800
|
||||||
|
cache-ttl_frontpage = 604800
|
||||||
|
cache-ttl_feed = 604800
|
||||||
|
; O_CACHE_TTL_REST
|
||||||
|
cache-ttl_rest = 604800
|
||||||
|
cache-ttl_browser = 31557600
|
||||||
|
cache-login_cookie = ''
|
||||||
|
cache-vary_group = ''
|
||||||
|
cache-ttl_status = '403 3600
|
||||||
|
404 3600
|
||||||
|
500 3600'
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- Purge ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
; O_PURGE_ON_UPGRADE
|
||||||
|
purge-upgrade = true
|
||||||
|
; O_PURGE_STALE
|
||||||
|
purge-stale = true
|
||||||
|
purge-post_all = false
|
||||||
|
purge-post_f = true
|
||||||
|
purge-post_h = true
|
||||||
|
purge-post_p = true
|
||||||
|
purge-post_pwrp = true
|
||||||
|
purge-post_a = true
|
||||||
|
purge-post_y = false
|
||||||
|
purge-post_m = true
|
||||||
|
purge-post_d = false
|
||||||
|
purge-post_t = true
|
||||||
|
purge-post_pt = true
|
||||||
|
purge-timed_urls = ''
|
||||||
|
purge-timed_urls_time = ''
|
||||||
|
purge-hook_all = 'switch_theme
|
||||||
|
wp_create_nav_menu
|
||||||
|
wp_update_nav_menu
|
||||||
|
wp_delete_nav_menu
|
||||||
|
create_term
|
||||||
|
edit_terms
|
||||||
|
delete_term
|
||||||
|
add_link
|
||||||
|
edit_link
|
||||||
|
delete_link'
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- ESI ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
; O_ESI
|
||||||
|
esi = false
|
||||||
|
; O_ESI_CACHE_ADMBAR
|
||||||
|
esi-cache_admbar = true
|
||||||
|
; O_ESI_CACHE_COMMFORM
|
||||||
|
esi-cache_commform = true
|
||||||
|
; O_ESI_NONCE
|
||||||
|
esi-nonce = 'stats_nonce
|
||||||
|
subscribe_nonce'
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- Utilities ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
util-heartbeat = true
|
||||||
|
util-instant_click = false
|
||||||
|
util-check_advcache = true
|
||||||
|
util-no_https_vary = false
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- Debug ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
; O_DEBUG_DISABLE_ALL
|
||||||
|
debug-disable_all = false
|
||||||
|
; O_DEBUG
|
||||||
|
debug = false
|
||||||
|
; O_DEBUG_IPS
|
||||||
|
debug-ips = '127.0.0.1'
|
||||||
|
; O_DEBUG_LEVEL
|
||||||
|
debug-level = false
|
||||||
|
; O_DEBUG_FILESIZE
|
||||||
|
debug-filesize = 3
|
||||||
|
; O_DEBUG_COOKIE
|
||||||
|
debug-cookie = false
|
||||||
|
; O_DEBUG_COLLAPS_QS
|
||||||
|
debug-collaps_qs = false
|
||||||
|
; O_DEBUG_INC
|
||||||
|
debug-inc = ''
|
||||||
|
; O_DEBUG_EXC
|
||||||
|
debug-exc = ''
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- DB Optm ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
; O_DB_OPTM_REVISIONS_MAX
|
||||||
|
db_optm-revisions_max = 0
|
||||||
|
; O_DB_OPTM_REVISIONS_AGE
|
||||||
|
db_optm-revisions_age = 0
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- HTML Optm ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
; O_OPTM_CSS_MIN
|
||||||
|
optm-css_min = false
|
||||||
|
optm-css_inline_min = false
|
||||||
|
; O_OPTM_CSS_COMB
|
||||||
|
optm-css_comb = false
|
||||||
|
optm-css_comb_priority = false
|
||||||
|
; O_OPTM_CSS_HTTP2
|
||||||
|
optm-css_http2 = false
|
||||||
|
optm-css_exc = ''
|
||||||
|
; O_OPTM_JS_MIN
|
||||||
|
optm-js_min = false
|
||||||
|
optm-js_inline_min = false
|
||||||
|
; O_OPTM_JS_COMB
|
||||||
|
optm-js_comb = false
|
||||||
|
optm-js_comb_priority = false
|
||||||
|
; O_OPTM_JS_HTTP2
|
||||||
|
optm-js_http2 = false
|
||||||
|
; O_OPTM_EXC_JQ
|
||||||
|
optm-js_exc = ''
|
||||||
|
optm-ttl = 604800
|
||||||
|
optm-html_min = false
|
||||||
|
optm-qs_rm = false
|
||||||
|
optm-ggfonts_rm = false
|
||||||
|
; O_OPTM_CSS_ASYNC
|
||||||
|
optm-css_async = false
|
||||||
|
; O_OPTM_CCSS_GEN
|
||||||
|
optm-ccss_gen = true
|
||||||
|
; O_OPTM_CCSS_ASYNC
|
||||||
|
optm-ccss_async = true
|
||||||
|
; O_OPTM_CSS_ASYNC_INLINE
|
||||||
|
optm-css_async_inline = true
|
||||||
|
; O_OPTM_CSS_FONT_DISPLAY
|
||||||
|
optm-css_font_display = false
|
||||||
|
; O_OPTM_JS_DEFER
|
||||||
|
optm-js_defer = false
|
||||||
|
; O_OPTM_JS_INLINE_DEFER
|
||||||
|
optm-js_inline_defer = false
|
||||||
|
optm-emoji_rm = false
|
||||||
|
optm-exc_jq = true
|
||||||
|
optm-ggfonts_async = false
|
||||||
|
optm-max_size = 2
|
||||||
|
optm-rm_comment = false
|
||||||
|
optm-exc_roles = ''
|
||||||
|
optm-ccss_con = ''
|
||||||
|
optm-js_defer_exc = ''
|
||||||
|
; O_OPTM_DNS_PREFETCH
|
||||||
|
optm-dns_prefetch = ''
|
||||||
|
; O_OPTM_DNS_PREFETCH_CTRL
|
||||||
|
optm-dns_prefetch_ctrl = false
|
||||||
|
optm-exc = ''
|
||||||
|
; O_OPTM_CCSS_SEP_POSTTYPE
|
||||||
|
optm-ccss_sep_posttype = ''
|
||||||
|
; O_OPTM_CCSS_SEP_URI
|
||||||
|
optm-ccss_sep_uri = ''
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- Object Cache ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
object = true
|
||||||
|
object-kind = false
|
||||||
|
;object-host = 'localhost'
|
||||||
|
object-host = '/var/www/memcached.sock'
|
||||||
|
;object-port = 11211
|
||||||
|
cache_object_port = ''
|
||||||
|
object-life = 360
|
||||||
|
object-persistent = true
|
||||||
|
object-admin = true
|
||||||
|
object-transients = true
|
||||||
|
object-db_id = 0
|
||||||
|
object-user = ''
|
||||||
|
object-pswd = ''
|
||||||
|
object-global_groups = 'users
|
||||||
|
userlogins
|
||||||
|
usermeta
|
||||||
|
user_meta
|
||||||
|
site-transient
|
||||||
|
site-options
|
||||||
|
site-lookup
|
||||||
|
blog-lookup
|
||||||
|
blog-details
|
||||||
|
rss
|
||||||
|
global-posts
|
||||||
|
blog-id-cache'
|
||||||
|
object-non_persistent_groups = 'comment
|
||||||
|
counts
|
||||||
|
plugins
|
||||||
|
wc_session_id'
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- Discussion ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
; O_DISCUSS_AVATAR_CACHE
|
||||||
|
discuss-avatar_cache = false
|
||||||
|
; O_DISCUSS_AVATAR_CRON
|
||||||
|
discuss-avatar_cron = false
|
||||||
|
; O_DISCUSS_AVATAR_CACHE_TTL
|
||||||
|
discuss-avatar_cache_ttl = 604800
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- Media ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
; O_MEDIA_LAZY
|
||||||
|
media-lazy = false
|
||||||
|
; O_MEDIA_LAZY_PLACEHOLDER
|
||||||
|
media-lazy_placeholder = ''
|
||||||
|
; O_MEDIA_PLACEHOLDER_RESP
|
||||||
|
media-placeholder_resp = false
|
||||||
|
; O_MEDIA_PLACEHOLDER_RESP_COLOR
|
||||||
|
media-placeholder_resp_color = '#cfd4db'
|
||||||
|
; O_MEDIA_PLACEHOLDER_RESP_GENERATOR
|
||||||
|
media-placeholder_resp_generator = false
|
||||||
|
; O_MEDIA_PLACEHOLDER_RESP_SVG
|
||||||
|
media-placeholder_resp_svg = '<svg xmlns="http://www.w3.org/2000/svg" width="{width}" height="{height}" viewBox="0 0 {width} {height}"><rect width="100%" height="100%" fill="{color}"/></svg>'
|
||||||
|
; O_MEDIA_PLACEHOLDER_LQIP
|
||||||
|
media-placeholder_lqip = false
|
||||||
|
; O_MEDIA_PLACEHOLDER_LQIP_QUAL
|
||||||
|
media-placeholder_lqip_qual = 4
|
||||||
|
; O_MEDIA_PLACEHOLDER_RESP_ASYNC
|
||||||
|
media-placeholder_resp_async = true
|
||||||
|
; O_MEDIA_IFRAME_LAZY
|
||||||
|
media-iframe_lazy = false
|
||||||
|
; O_MEDIA_LAZYJS_INLINE
|
||||||
|
media-lazyjs_inline = false
|
||||||
|
; O_MEDIA_LAZY_EXC
|
||||||
|
media-lazy_exc = ''
|
||||||
|
; O_MEDIA_LAZY_CLS_EXC
|
||||||
|
media-lazy_cls_exc = ''
|
||||||
|
; O_MEDIA_LAZY_PARENT_CLS_EXC
|
||||||
|
media-lazy_parent_cls_exc = ''
|
||||||
|
; O_MEDIA_IFRAME_LAZY_CLS_EXC
|
||||||
|
media-iframe_lazy_cls_exc = ''
|
||||||
|
; O_MEDIA_IFRAME_LAZY_PARENT_CLS_EXC
|
||||||
|
media-iframe_lazy_parent_cls_exc = ''
|
||||||
|
; O_MEDIA_LAZY_URI_EXC
|
||||||
|
media-lazy_uri_exc = ''
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- Image Optm ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
img_optm-auto = false
|
||||||
|
img_optm-cron = true
|
||||||
|
img_optm-ori = true
|
||||||
|
img_optm-rm_bkup = false
|
||||||
|
img_optm-webp = false
|
||||||
|
img_optm-lossless = false
|
||||||
|
img_optm-exif = false
|
||||||
|
img_optm-webp_replace = false
|
||||||
|
img_optm-webp_attr = 'img.src
|
||||||
|
div.data-thumb
|
||||||
|
img.data-src
|
||||||
|
div.data-large_image
|
||||||
|
img.retina_logo_url
|
||||||
|
div.data-parallax-image
|
||||||
|
video.poster'
|
||||||
|
img_optm-webp_replace_srcset = false
|
||||||
|
img_optm-jpg_quality = 82
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- Crawler ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
crawler = false
|
||||||
|
crawler-inc_posts = true
|
||||||
|
crawler-inc_pages = true
|
||||||
|
crawler-inc_cats = true
|
||||||
|
crawler-inc_tags = true
|
||||||
|
crawler-exc_cpt = ''
|
||||||
|
crawler-order_links = 'date_desc'
|
||||||
|
crawler-usleep = 500
|
||||||
|
crawler-run_duration = 400
|
||||||
|
crawler-run_interval = 600
|
||||||
|
crawler-crawl_interval = 302400
|
||||||
|
crawler-threads = 3
|
||||||
|
crawler-timeout = 30
|
||||||
|
crawler-load_limit = 1
|
||||||
|
; O_CRAWLER_SITEMAP
|
||||||
|
crawler-sitemap = ''
|
||||||
|
; O_CRAWLER_DROP_DOMAIN
|
||||||
|
crawler-drop_domain = true
|
||||||
|
crawler-roles = ''
|
||||||
|
crawler-cookies = ''
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- Misc ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
; O_MISC_HTACCESS_FRONT
|
||||||
|
misc-htaccess_front = ''
|
||||||
|
; O_MISC_HTACCESS_BACK
|
||||||
|
misc-htaccess_back = ''
|
||||||
|
; O_MISC_HEARTBEAT_FRONT
|
||||||
|
misc-heartbeat_front = false
|
||||||
|
; O_MISC_HEARTBEAT_FRONT_TTL
|
||||||
|
misc-heartbeat_front_ttl = 60
|
||||||
|
; O_MISC_HEARTBEAT_BACK
|
||||||
|
misc-heartbeat_back = false
|
||||||
|
; O_MISC_HEARTBEAT_BACK_TTL
|
||||||
|
misc-heartbeat_back_ttl = 60
|
||||||
|
; O_MISC_HEARTBEAT_EDITOR
|
||||||
|
misc-heartbeat_editor = false
|
||||||
|
; O_MISC_HEARTBEAT_EDITOR_TTL
|
||||||
|
misc-heartbeat_editor_ttl = 15
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- CDN ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
cdn = false
|
||||||
|
cdn-ori = ''
|
||||||
|
cdn-ori_dir = ''
|
||||||
|
cdn-exc = ''
|
||||||
|
cdn-remote_jq = false
|
||||||
|
cdn-quic = false
|
||||||
|
cdn-quic_email = ''
|
||||||
|
cdn-quic_key = ''
|
||||||
|
cdn-cloudflare = false
|
||||||
|
cdn-cloudflare_email = ''
|
||||||
|
cdn-cloudflare_key = ''
|
||||||
|
cdn-cloudflare_name = ''
|
||||||
|
cdn-cloudflare_zone = ''
|
||||||
|
; \`cdn-mapping\` needs to be put in the end with a section tag
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- CDN 2 ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
; <------------ CDN Mapping Example BEGIN -------------------->
|
||||||
|
; Need to keep the section tag \`[cdn-mapping]\` before list.
|
||||||
|
;
|
||||||
|
; NOTE 1) Need to set all child options to make all resources to be replaced without missing.
|
||||||
|
; NOTE 2) \`url[n]\` option must have to enable the row setting of \`n\`.
|
||||||
|
; NOTE 3) This section needs to be put in the end of this .ini file
|
||||||
|
;
|
||||||
|
; To enable the 2nd mapping record by default, please remove the \`;;\` in the related lines.
|
||||||
|
[cdn-mapping]
|
||||||
|
url[0] = ''
|
||||||
|
inc_js[0] = true
|
||||||
|
inc_css[0] = true
|
||||||
|
inc_img[0] = true
|
||||||
|
filetype[0] = '.aac
|
||||||
|
.css
|
||||||
|
.eot
|
||||||
|
.gif
|
||||||
|
.jpeg
|
||||||
|
.js
|
||||||
|
.jpg
|
||||||
|
.less
|
||||||
|
.mp3
|
||||||
|
.mp4
|
||||||
|
.ogg
|
||||||
|
.otf
|
||||||
|
.pdf
|
||||||
|
.png
|
||||||
|
.svg
|
||||||
|
.ttf
|
||||||
|
.woff'
|
||||||
|
;;url[1] = 'https://2nd_CDN_url.com/'
|
||||||
|
;;filetype[1] = '.webm'
|
||||||
|
; <------------ CDN Mapping Example END ------------------>
|
||||||
|
EOM
|
||||||
|
|
||||||
|
THEME_PATH="${VH_DOC_ROOT}/wp-content/themes/${THEME}"
|
||||||
|
if [ ! -f ${THEME_PATH}/functions.php ]; then
|
||||||
|
cat >> "${THEME_PATH}/functions.php" <<END
|
||||||
|
<?php
|
||||||
|
require_once( WP_CONTENT_DIR.'/../wp-admin/includes/plugin.php' );
|
||||||
|
\$path = 'litespeed-cache/litespeed-cache.php' ;
|
||||||
|
if (!is_plugin_active( \$path )) {
|
||||||
|
activate_plugin( \$path ) ;
|
||||||
|
rename( __FILE__ . '.bk', __FILE__ );
|
||||||
|
}
|
||||||
|
END
|
||||||
|
elif [ ! -f ${THEME_PATH}/functions.php.bk ]; then
|
||||||
|
cp ${THEME_PATH}/functions.php ${THEME_PATH}/functions.php.bk
|
||||||
|
ck_ed
|
||||||
|
ed ${THEME_PATH}/functions.php << END >>/dev/null 2>&1
|
||||||
|
2i
|
||||||
|
require_once( WP_CONTENT_DIR.'/../wp-admin/includes/plugin.php' );
|
||||||
|
\$path = 'litespeed-cache/litespeed-cache.php' ;
|
||||||
|
if (!is_plugin_active( \$path )) {
|
||||||
|
activate_plugin( \$path ) ;
|
||||||
|
rename( __FILE__ . '.bk', __FILE__ );
|
||||||
|
}
|
||||||
|
.
|
||||||
|
w
|
||||||
|
q
|
||||||
|
END
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
preinstall_wordpress(){
|
||||||
|
if [ "${VHNAME}" != '' ]; then
|
||||||
|
get_db_pass ${VHNAME}
|
||||||
|
else
|
||||||
|
get_db_pass ${DOMAIN}
|
||||||
|
fi
|
||||||
|
if [ ! -f ${VH_DOC_ROOT}/wp-config.php ] && [ -f ${VH_DOC_ROOT}/wp-config-sample.php ]; then
|
||||||
|
cp ${VH_DOC_ROOT}/wp-config-sample.php ${VH_DOC_ROOT}/wp-config.php
|
||||||
|
NEWDBPWD="define('DB_PASSWORD', '${SQL_PASS}');"
|
||||||
|
linechange 'DB_PASSWORD' ${VH_DOC_ROOT}/wp-config.php "${NEWDBPWD}"
|
||||||
|
NEWDBPWD="define('DB_USER', '${SQL_USER}');"
|
||||||
|
linechange 'DB_USER' ${VH_DOC_ROOT}/wp-config.php "${NEWDBPWD}"
|
||||||
|
NEWDBPWD="define('DB_NAME', '${SQL_DB}');"
|
||||||
|
linechange 'DB_NAME' ${VH_DOC_ROOT}/wp-config.php "${NEWDBPWD}"
|
||||||
|
#NEWDBPWD="define('DB_HOST', '${PUB_IP}');"
|
||||||
|
NEWDBPWD="define('DB_HOST', '${DB_HOST}');"
|
||||||
|
linechange 'DB_HOST' ${VH_DOC_ROOT}/wp-config.php "${NEWDBPWD}"
|
||||||
|
elif [ -f ${VH_DOC_ROOT}/wp-config.php ]; then
|
||||||
|
echo "${VH_DOC_ROOT}/wp-config.php already exist, exit !"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo 'Skip!'
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
app_wordpress_dl(){
|
||||||
|
if [ ! -f "${VH_DOC_ROOT}/wp-config.php" ] && [ ! -f "${VH_DOC_ROOT}/wp-config-sample.php" ]; then
|
||||||
|
wp core download \
|
||||||
|
--allow-root \
|
||||||
|
--quiet
|
||||||
|
else
|
||||||
|
echo 'wordpress already exist, abort!'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
change_owner(){
|
||||||
|
if [ "${VHNAME}" != '' ]; then
|
||||||
|
chown -R ${WWW_UID}:${WWW_GID} ${DEFAULT_VH_ROOT}/${VHNAME}
|
||||||
|
else
|
||||||
|
chown -R ${WWW_UID}:${WWW_GID} ${DEFAULT_VH_ROOT}/${DOMAIN}
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
main(){
|
||||||
|
set_vh_docroot ${DOMAIN}
|
||||||
|
get_owner
|
||||||
|
cd ${VH_DOC_ROOT}
|
||||||
|
if [ "${APP_NAME}" = 'wordpress' ] || [ "${APP_NAME}" = 'wp' ]; then
|
||||||
|
check_sql_native
|
||||||
|
app_wordpress_dl
|
||||||
|
preinstall_wordpress
|
||||||
|
install_wp_plugin
|
||||||
|
set_htaccess
|
||||||
|
get_theme_name
|
||||||
|
set_lscache
|
||||||
|
change_owner
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
echo "APP: ${APP_NAME} not support, exit!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
check_input ${1}
|
||||||
|
while [ ! -z "${1}" ]; do
|
||||||
|
case ${1} in
|
||||||
|
-[hH] | -help | --help)
|
||||||
|
help_message
|
||||||
|
;;
|
||||||
|
-[aA] | -app | --app) shift
|
||||||
|
check_input "${1}"
|
||||||
|
APP_NAME="${1}"
|
||||||
|
;;
|
||||||
|
-[dD] | -domain | --domain) shift
|
||||||
|
check_input "${1}"
|
||||||
|
DOMAIN="${1}"
|
||||||
|
;;
|
||||||
|
-vhname | --vhname) shift
|
||||||
|
VHNAME="${1}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
help_message
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
main
|
@ -0,0 +1,18 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
BOTCRON='/var/spool/cron/crontabs/root'
|
||||||
|
|
||||||
|
cert_hook(){
|
||||||
|
grep 'acme' ${BOTCRON} >/dev/null
|
||||||
|
if [ ${?} = 0 ]; then
|
||||||
|
grep 'lswsctrl' ${BOTCRON} >/dev/null
|
||||||
|
if [ ${?} = 0 ]; then
|
||||||
|
echo 'Hook already exist, skip!'
|
||||||
|
else
|
||||||
|
sed -i 's/--cron/--cron --renew-hook "\/usr\/local\/lsws\/bin\/lswsctrl restart"/g' ${BOTCRON}
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "[X] ${BOTCRON} does not exist, please check it later!"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
cert_hook
|
@ -0,0 +1,160 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
CK_RESULT=''
|
||||||
|
LSDIR='/usr/local/lsws'
|
||||||
|
LS_HTTPD_CONF="${LSDIR}/conf/httpd_config.xml"
|
||||||
|
OLS_HTTPD_CONF="${LSDIR}/conf/httpd_config.conf"
|
||||||
|
EPACE=' '
|
||||||
|
|
||||||
|
echow(){
|
||||||
|
FLAG=${1}
|
||||||
|
shift
|
||||||
|
echo -e "\033[1m${EPACE}${FLAG}\033[0m${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
help_message(){
|
||||||
|
echo -e "\033[1mOPTIONS\033[0m"
|
||||||
|
echow '-A, --add [DOMAIN_NAME]'
|
||||||
|
echo "${EPACE}${EPACE}Will add domain to listener and creat a virtual host from template"
|
||||||
|
echow '-D, --del [DOMAIN_NAME]'
|
||||||
|
echo "${EPACE}${EPACE}Will delete domain from listener"
|
||||||
|
echow '-H, --help'
|
||||||
|
echo "${EPACE}${EPACE}Display help."
|
||||||
|
}
|
||||||
|
|
||||||
|
check_lsv(){
|
||||||
|
if [ -f ${LSDIR}/bin/openlitespeed ]; then
|
||||||
|
LSV='openlitespeed'
|
||||||
|
elif [ -f ${LSDIR}/bin/litespeed ]; then
|
||||||
|
LSV='lsws'
|
||||||
|
else
|
||||||
|
echo 'Version not exist, abort!'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
dot_escape(){
|
||||||
|
ESCAPE=$(echo ${1} | sed 's/\./\\./g')
|
||||||
|
}
|
||||||
|
|
||||||
|
check_duplicate(){
|
||||||
|
CK_RESULT=$(grep -E "${1}" ${2})
|
||||||
|
}
|
||||||
|
|
||||||
|
fst_match_line(){
|
||||||
|
FIRST_LINE_NUM=$(grep -n -m 1 ${1} ${2} | awk -F ':' '{print $1}')
|
||||||
|
}
|
||||||
|
fst_match_after(){
|
||||||
|
FIRST_NUM_AFTER=$(tail -n +${1} ${2} | grep -n -m 1 ${3} | awk -F ':' '{print $1}')
|
||||||
|
}
|
||||||
|
lst_match_line(){
|
||||||
|
fst_match_after ${1} ${2} ${3}
|
||||||
|
LAST_LINE_NUM=$((${FIRST_LINE_NUM}+${FIRST_NUM_AFTER}-1))
|
||||||
|
}
|
||||||
|
|
||||||
|
check_input(){
|
||||||
|
if [ -z "${1}" ]; then
|
||||||
|
help_message
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
check_www(){
|
||||||
|
CHECK_WWW=$(echo ${1} | cut -c1-4)
|
||||||
|
if [[ ${CHECK_WWW} == www. ]] ; then
|
||||||
|
echo 'www domain shoudnt be passed!'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
www_domain(){
|
||||||
|
check_www ${1}
|
||||||
|
WWW_DOMAIN=$(echo www.${1})
|
||||||
|
}
|
||||||
|
|
||||||
|
add_ls_domain(){
|
||||||
|
fst_match_line 'docker.xml</templateFile>' ${LS_HTTPD_CONF}
|
||||||
|
NEWNUM=$((FIRST_LINE_NUM+2))
|
||||||
|
sed -i "${NEWNUM}i \ \ \ \ \ \ <member>\n \ \ \ \ \ \ \ <vhName>${DOMAIN}</vhName>\n \ \ \ \ \ \ \ <vhDomain>${DOMAIN},${WWW_DOMAIN}</vhDomain>\n \ \ \ \ \ \ </member>" ${LS_HTTPD_CONF}
|
||||||
|
}
|
||||||
|
|
||||||
|
add_ols_domain(){
|
||||||
|
perl -0777 -p -i -e 's/(vhTemplate docker \{[^}]+)\}*(^.*listeners.*$)/\1$2
|
||||||
|
member '${DOMAIN}' {
|
||||||
|
vhDomain '${DOMAIN},${WWW_DOMAIN}'
|
||||||
|
}/gmi' ${OLS_HTTPD_CONF}
|
||||||
|
}
|
||||||
|
|
||||||
|
add_domain(){
|
||||||
|
check_lsv
|
||||||
|
dot_escape ${1}
|
||||||
|
DOMAIN=${ESCAPE}
|
||||||
|
www_domain ${1}
|
||||||
|
if [ "${LSV}" = 'lsws' ]; then
|
||||||
|
check_duplicate "vhDomain.*${DOMAIN}" ${LS_HTTPD_CONF}
|
||||||
|
if [ "${CK_RESULT}" != '' ]; then
|
||||||
|
echo "# It appears the domain already exist! Check the ${LS_HTTPD_CONF} if you believe this is a mistake!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
elif [ "${LSV}" = 'openlitespeed' ]; then
|
||||||
|
check_duplicate "member.*${DOMAIN}" ${OLS_HTTPD_CONF}
|
||||||
|
if [ "${CK_RESULT}" != '' ]; then
|
||||||
|
echo "# It appears the domain already exist! Check the ${OLS_HTTPD_CONF} if you believe this is a mistake!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
add_ls_domain
|
||||||
|
add_ols_domain
|
||||||
|
}
|
||||||
|
|
||||||
|
del_ls_domain(){
|
||||||
|
fst_match_line "<vhName>*${1}" ${LS_HTTPD_CONF}
|
||||||
|
FIRST_LINE_NUM=$((FIRST_LINE_NUM-1))
|
||||||
|
lst_match_line ${FIRST_LINE_NUM} ${LS_HTTPD_CONF} '</member>'
|
||||||
|
sed -i "${FIRST_LINE_NUM},${LAST_LINE_NUM}d" ${LS_HTTPD_CONF}
|
||||||
|
}
|
||||||
|
|
||||||
|
del_ols_domain(){
|
||||||
|
fst_match_line ${1} ${OLS_HTTPD_CONF}
|
||||||
|
lst_match_line ${FIRST_LINE_NUM} ${OLS_HTTPD_CONF} '}'
|
||||||
|
sed -i "${FIRST_LINE_NUM},${LAST_LINE_NUM}d" ${OLS_HTTPD_CONF}
|
||||||
|
}
|
||||||
|
|
||||||
|
del_domain(){
|
||||||
|
check_lsv
|
||||||
|
dot_escape ${1}
|
||||||
|
DOMAIN=${ESCAPE}
|
||||||
|
if [ "${LSV}" = 'lsws' ]; then
|
||||||
|
check_duplicate "vhDomain.*${DOMAIN}" ${LS_HTTPD_CONF}
|
||||||
|
if [ "${CK_RESULT}" = '' ]; then
|
||||||
|
echo "# Domain non-exist! Check the ${LS_HTTPD_CONF} if you believe this is a mistake!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
elif [ "${LSV}" = 'openlitespeed' ]; then
|
||||||
|
check_duplicate "member.*${DOMAIN}" ${OLS_HTTPD_CONF}
|
||||||
|
if [ "${CK_RESULT}" = '' ]; then
|
||||||
|
echo "# Domain non-exist! Check the ${OLS_HTTPD_CONF} if you believe this is a mistake!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
del_ls_domain ${1}
|
||||||
|
del_ols_domain ${1}
|
||||||
|
}
|
||||||
|
|
||||||
|
check_input ${1}
|
||||||
|
while [ ! -z "${1}" ]; do
|
||||||
|
case ${1} in
|
||||||
|
-[hH] | -help | --help)
|
||||||
|
help_message
|
||||||
|
;;
|
||||||
|
-[aA] | -add | --add) shift
|
||||||
|
add_domain ${1}
|
||||||
|
;;
|
||||||
|
-[dD] | -del | --del | --delete) shift
|
||||||
|
del_domain ${1}
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
help_message
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
236
apps/openlitespeed/1.7.18-lsphp74/data/bin/container/owaspctl.sh
Normal file
@ -0,0 +1,236 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
LSDIR='/usr/local/lsws'
|
||||||
|
OWASP_DIR="${LSDIR}/conf/owasp"
|
||||||
|
RULE_FILE='modsec_includes.conf'
|
||||||
|
LS_HTTPD_CONF="${LSDIR}/conf/httpd_config.xml"
|
||||||
|
OLS_HTTPD_CONF="${LSDIR}/conf/httpd_config.conf"
|
||||||
|
EPACE=' '
|
||||||
|
OWASP_V='3.3.4'
|
||||||
|
|
||||||
|
echow(){
|
||||||
|
FLAG=${1}
|
||||||
|
shift
|
||||||
|
echo -e "\033[1m${EPACE}${FLAG}\033[0m${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
help_message(){
|
||||||
|
echo -e "\033[1mOPTIONS\033[0m"
|
||||||
|
echow '-E, --enable'
|
||||||
|
echo "${EPACE}${EPACE}Will Enable mod_secure module with latest OWASP version of rules"
|
||||||
|
echow '-D, --disable'
|
||||||
|
echo "${EPACE}${EPACE}Will Disable mod_secure module with latest OWASP version of rules"
|
||||||
|
echow '-H, --help'
|
||||||
|
echo "${EPACE}${EPACE}Display help and exit."
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
check_lsv(){
|
||||||
|
if [ -f ${LSDIR}/bin/openlitespeed ]; then
|
||||||
|
LSV='openlitespeed'
|
||||||
|
elif [ -f ${LSDIR}/bin/litespeed ]; then
|
||||||
|
LSV='lsws'
|
||||||
|
else
|
||||||
|
echo 'Version not exist, abort!'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
check_input(){
|
||||||
|
if [ -z "${1}" ]; then
|
||||||
|
help_message
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
mk_owasp_dir(){
|
||||||
|
if [ -d ${OWASP_DIR} ] ; then
|
||||||
|
rm -rf ${OWASP_DIR}
|
||||||
|
fi
|
||||||
|
mkdir -p ${OWASP_DIR}
|
||||||
|
if [ ${?} -ne 0 ] ; then
|
||||||
|
echo "Unable to create directory: ${OWASP_DIR}, exit!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
fst_match_line(){
|
||||||
|
FIRST_LINE_NUM=$(grep -n -m 1 "${1}" ${2} | awk -F ':' '{print $1}')
|
||||||
|
}
|
||||||
|
fst_match_after(){
|
||||||
|
FIRST_NUM_AFTER=$(tail -n +${1} ${2} | grep -n -m 1 ${3} | awk -F ':' '{print $1}')
|
||||||
|
}
|
||||||
|
lst_match_line(){
|
||||||
|
fst_match_after ${1} ${2} ${3}
|
||||||
|
LAST_LINE_NUM=$((${FIRST_LINE_NUM}+${FIRST_NUM_AFTER}-1))
|
||||||
|
}
|
||||||
|
|
||||||
|
enable_ols_modsec(){
|
||||||
|
grep 'module mod_security {' ${OLS_HTTPD_CONF} >/dev/null 2>&1
|
||||||
|
if [ ${?} -eq 0 ] ; then
|
||||||
|
echo "Already configured for modsecurity."
|
||||||
|
else
|
||||||
|
echo 'Enable modsecurity'
|
||||||
|
sed -i "s=module cache=module mod_security {\nmodsecurity on\
|
||||||
|
\nmodsecurity_rules \`\nSecRuleEngine On\n\`\nmodsecurity_rules_file \
|
||||||
|
${OWASP_DIR}/${RULE_FILE}\n ls_enabled 1\n}\
|
||||||
|
\n\nmodule cache=" ${OLS_HTTPD_CONF}
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
enable_ls_modsec(){
|
||||||
|
grep '<enableCensorship>1</enableCensorship>' ${LS_HTTPD_CONF} >/dev/null 2>&1
|
||||||
|
if [ ${?} -eq 0 ] ; then
|
||||||
|
echo "LSWS already configured for modsecurity"
|
||||||
|
else
|
||||||
|
echo 'Enable modsecurity'
|
||||||
|
sed -i \
|
||||||
|
"s=<enableCensorship>0</enableCensorship>=<enableCensorship>1</enableCensorship>=" ${LS_HTTPD_CONF}
|
||||||
|
sed -i \
|
||||||
|
"s=</censorshipControl>=</censorshipControl>\n\
|
||||||
|
<censorshipRuleSet>\n\
|
||||||
|
<name>ModSec</name>\n\
|
||||||
|
<enabled>1</enabled>\n\
|
||||||
|
<ruleSet>include ${OWASP_DIR}/modsec_includes.conf</ruleSet>\n\
|
||||||
|
</censorshipRuleSet>=" ${LS_HTTPD_CONF}
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
enable_modsec(){
|
||||||
|
if [ "${LSV}" = 'lsws' ]; then
|
||||||
|
enable_ls_modsec
|
||||||
|
elif [ "${LSV}" = 'openlitespeed' ]; then
|
||||||
|
enable_ols_modsec
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
disable_ols_modesec(){
|
||||||
|
grep 'module mod_security {' ${OLS_HTTPD_CONF} >/dev/null 2>&1
|
||||||
|
if [ ${?} -eq 0 ] ; then
|
||||||
|
echo 'Disable modsecurity'
|
||||||
|
fst_match_line 'module mod_security' ${OLS_HTTPD_CONF}
|
||||||
|
lst_match_line ${FIRST_LINE_NUM} ${OLS_HTTPD_CONF} '}'
|
||||||
|
sed -i "${FIRST_LINE_NUM},${LAST_LINE_NUM}d" ${OLS_HTTPD_CONF}
|
||||||
|
else
|
||||||
|
echo 'Already disabled for modsecurity'
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
disable_ls_modesec(){
|
||||||
|
grep '<enableCensorship>0</enableCensorship>' ${LS_HTTPD_CONF}
|
||||||
|
if [ ${?} -eq 0 ] ; then
|
||||||
|
echo 'Already disabled for modsecurity'
|
||||||
|
else
|
||||||
|
echo 'Disable modsecurity'
|
||||||
|
sed -i \
|
||||||
|
"s=<enableCensorship>1</enableCensorship>=<enableCensorship>0</enableCensorship>=" ${LS_HTTPD_CONF}
|
||||||
|
fst_match_line 'censorshipRuleSet' ${LS_HTTPD_CONF}
|
||||||
|
lst_match_line ${FIRST_LINE_NUM} ${LS_HTTPD_CONF} '/censorshipRuleSet'
|
||||||
|
sed -i "${FIRST_LINE_NUM},${LAST_LINE_NUM}d" ${LS_HTTPD_CONF}
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
disable_modsec(){
|
||||||
|
check_lsv
|
||||||
|
if [ "${LSV}" = 'lsws' ]; then
|
||||||
|
disable_ls_modesec
|
||||||
|
elif [ "${LSV}" = 'openlitespeed' ]; then
|
||||||
|
disable_ols_modesec
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
install_unzip(){
|
||||||
|
if [ ! -f /usr/bin/unzip ]; then
|
||||||
|
echo 'Install Unzip'
|
||||||
|
apt update >/dev/null 2>&1
|
||||||
|
apt-get install unzip -y >/dev/null 2>&1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
install_owasp(){
|
||||||
|
cd ${OWASP_DIR}
|
||||||
|
echo 'Download OWASP rules'
|
||||||
|
wget -q https://github.com/coreruleset/coreruleset/archive/refs/tags/v${OWASP_V}.zip
|
||||||
|
unzip -qq v${OWASP_V}.zip
|
||||||
|
rm -f v${OWASP_V}.zip
|
||||||
|
mv coreruleset-* owasp-modsecurity-crs
|
||||||
|
}
|
||||||
|
|
||||||
|
configure_owasp(){
|
||||||
|
echo 'Config OWASP rules.'
|
||||||
|
cd ${OWASP_DIR}
|
||||||
|
echo "include modsecurity.conf
|
||||||
|
include owasp-modsecurity-crs/crs-setup.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-901-INITIALIZATION.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-903.9001-DRUPAL-EXCLUSION-RULES.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-903.9002-WORDPRESS-EXCLUSION-RULES.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-903.9003-NEXTCLOUD-EXCLUSION-RULES.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-903.9004-DOKUWIKI-EXCLUSION-RULES.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-903.9005-CPANEL-EXCLUSION-RULES.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-903.9006-XENFORO-EXCLUSION-RULES.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-905-COMMON-EXCEPTIONS.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-910-IP-REPUTATION.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-911-METHOD-ENFORCEMENT.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-912-DOS-PROTECTION.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-913-SCANNER-DETECTION.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-921-PROTOCOL-ATTACK.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-930-APPLICATION-ATTACK-LFI.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-931-APPLICATION-ATTACK-RFI.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-932-APPLICATION-ATTACK-RCE.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-933-APPLICATION-ATTACK-PHP.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-934-APPLICATION-ATTACK-NODEJS.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-942-APPLICATION-ATTACK-SQLI.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-943-APPLICATION-ATTACK-SESSION-FIXATION.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-944-APPLICATION-ATTACK-JAVA.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf
|
||||||
|
include owasp-modsecurity-crs/rules/RESPONSE-950-DATA-LEAKAGES.conf
|
||||||
|
include owasp-modsecurity-crs/rules/RESPONSE-951-DATA-LEAKAGES-SQL.conf
|
||||||
|
include owasp-modsecurity-crs/rules/RESPONSE-952-DATA-LEAKAGES-JAVA.conf
|
||||||
|
include owasp-modsecurity-crs/rules/RESPONSE-953-DATA-LEAKAGES-PHP.conf
|
||||||
|
include owasp-modsecurity-crs/rules/RESPONSE-954-DATA-LEAKAGES-IIS.conf
|
||||||
|
include owasp-modsecurity-crs/rules/RESPONSE-959-BLOCKING-EVALUATION.conf
|
||||||
|
include owasp-modsecurity-crs/rules/RESPONSE-980-CORRELATION.conf
|
||||||
|
include owasp-modsecurity-crs/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf">modsec_includes.conf
|
||||||
|
echo "SecRuleEngine On">modsecurity.conf
|
||||||
|
cd ${OWASP_DIR}/owasp-modsecurity-crs
|
||||||
|
if [ -f crs-setup.conf.example ]; then
|
||||||
|
mv crs-setup.conf.example crs-setup.conf
|
||||||
|
fi
|
||||||
|
cd ${OWASP_DIR}/owasp-modsecurity-crs/rules
|
||||||
|
if [ -f REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example ]; then
|
||||||
|
mv REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
|
||||||
|
fi
|
||||||
|
if [ -f RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example ]; then
|
||||||
|
mv RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
main_owasp(){
|
||||||
|
mk_owasp_dir
|
||||||
|
install_unzip
|
||||||
|
install_owasp
|
||||||
|
configure_owasp
|
||||||
|
check_lsv
|
||||||
|
enable_modsec
|
||||||
|
}
|
||||||
|
|
||||||
|
check_input ${1}
|
||||||
|
while [ ! -z "${1}" ]; do
|
||||||
|
case ${1} in
|
||||||
|
-[hH] | -help | --help)
|
||||||
|
help_message
|
||||||
|
;;
|
||||||
|
-[eE] | -enable | --enable)
|
||||||
|
main_owasp
|
||||||
|
;;
|
||||||
|
-[dD] | -disable | --disable)
|
||||||
|
disable_modsec
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
help_message
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
@ -0,0 +1,84 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
LSDIR='/usr/local/lsws'
|
||||||
|
EPACE=' '
|
||||||
|
|
||||||
|
echow(){
|
||||||
|
FLAG=${1}
|
||||||
|
shift
|
||||||
|
echo -e "\033[1m${EPACE}${FLAG}\033[0m${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
help_message(){
|
||||||
|
echo -e "\033[1mOPTIONS\033[0m"
|
||||||
|
echow '-S, --serial [YOUR_SERIAL|TRIAL]'
|
||||||
|
echo "${EPACE}${EPACE}Will apply and register the serial to LSWS."
|
||||||
|
echow '-H, --help'
|
||||||
|
echo "${EPACE}${EPACE}Display help and exit."
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
check_input(){
|
||||||
|
if [ -z "${1}" ]; then
|
||||||
|
help_message
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
backup_old(){
|
||||||
|
if [ -f ${1} ] && [ ! -f ${1}_old ]; then
|
||||||
|
mv ${1} ${1}_old
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
detect_ols(){
|
||||||
|
if [ -e ${LSDIR}/bin/openlitespeed ]; then
|
||||||
|
echo '[X] Detect OpenLiteSpeed, abort!'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
apply_serial(){
|
||||||
|
detect_ols
|
||||||
|
check_input ${1}
|
||||||
|
echo ${1} | grep -i 'trial' >/dev/null
|
||||||
|
if [ ${?} = 0 ]; then
|
||||||
|
echo 'Apply Trial License'
|
||||||
|
if [ ! -e ${LSDIR}/conf/serial.no ] && [ ! -e ${LSDIR}/conf/license.key ]; then
|
||||||
|
rm -f ${LSDIR}/conf/trial.key*
|
||||||
|
wget -P ${LSDIR}/conf -q http://license.litespeedtech.com/reseller/trial.key
|
||||||
|
echo 'Apply trial finished'
|
||||||
|
else
|
||||||
|
echo "Please backup and remove your existing license, apply abort!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "Apply Serial number: ${1}"
|
||||||
|
backup_old ${LSDIR}/conf/serial.no
|
||||||
|
backup_old ${LSDIR}/conf/license.key
|
||||||
|
backup_old ${LSDIR}/conf/trial.key
|
||||||
|
echo "${1}" > ${LSDIR}/conf/serial.no
|
||||||
|
${LSDIR}/bin/lshttpd -r
|
||||||
|
if [ -f ${LSDIR}/conf/license.key ]; then
|
||||||
|
echo '[O] Apply success'
|
||||||
|
else
|
||||||
|
echo '[X] Apply failed, please check!'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
check_input ${1}
|
||||||
|
while [ ! -z "${1}" ]; do
|
||||||
|
case ${1} in
|
||||||
|
-[hH] | -help | --help)
|
||||||
|
help_message
|
||||||
|
;;
|
||||||
|
-[sS] | -serial | --serial) shift
|
||||||
|
apply_serial "${1}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
help_message
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
2
apps/openlitespeed/1.7.18-lsphp74/data/sites/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
*
|
||||||
|
!.gitignore
|
30
apps/openlitespeed/1.7.18-lsphp74/docker-compose.yml
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
litespeed:
|
||||||
|
container_name: ${CONTAINER_NAME}
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
logging:
|
||||||
|
driver: none
|
||||||
|
volumes:
|
||||||
|
- ./data/lsws/conf:/usr/local/lsws/conf
|
||||||
|
- ./data/lsws/admin-conf:/usr/local/lsws/admin/conf
|
||||||
|
- ./data/bin/container:/usr/local/bin
|
||||||
|
- ./data/sites:/var/www/vhosts/
|
||||||
|
- ./data/acme:/root/.acme.sh/
|
||||||
|
- ./data/logs:/usr/local/lsws/logs/
|
||||||
|
ports:
|
||||||
|
- "${PANEL_APP_PORT_HTTP}:80"
|
||||||
|
- "${PANEL_APP_PORT_HTTPS}:443"
|
||||||
|
- "${PANEL_APP_PORT_HTTPS}:443/udp"
|
||||||
|
- "${PANEL_APP_PORT_CONSOLE}:7080"
|
||||||
|
environment:
|
||||||
|
- TZ=${TIME_ZONE}
|
||||||
|
image: litespeedtech/openlitespeed:1.7.18-lsphp74
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
networks:
|
||||||
|
1panel-network:
|
||||||
|
external: true
|
33
apps/openlitespeed/1.7.18-lsphp81/data.yml
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
additionalProperties:
|
||||||
|
formFields:
|
||||||
|
- default: 80
|
||||||
|
disabled: true
|
||||||
|
envKey: PANEL_APP_PORT_HTTP
|
||||||
|
labelEn: HTTP Port
|
||||||
|
labelZh: HTTP端口
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
||||||
|
- default: 443
|
||||||
|
disabled: true
|
||||||
|
envKey: PANEL_APP_PORT_HTTPS
|
||||||
|
labelEn: HTTPS Port
|
||||||
|
labelZh: HTTPS端口
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
||||||
|
- default: 40113
|
||||||
|
edit: true
|
||||||
|
envKey: PANEL_APP_PORT_CONSOLE
|
||||||
|
labelEn: Console Port
|
||||||
|
labelZh: 控制台端口
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
||||||
|
- default: Asia/Shanghai
|
||||||
|
edit: true
|
||||||
|
envKey: TIME_ZONE
|
||||||
|
labelEn: Time zone
|
||||||
|
labelZh: 时区
|
||||||
|
required: true
|
||||||
|
type: text
|
@ -0,0 +1,660 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
DEFAULT_VH_ROOT='/var/www/vhosts'
|
||||||
|
VH_DOC_ROOT=''
|
||||||
|
VHNAME=''
|
||||||
|
APP_NAME=''
|
||||||
|
DOMAIN=''
|
||||||
|
WWW_UID=''
|
||||||
|
WWW_GID=''
|
||||||
|
WP_CONST_CONF=''
|
||||||
|
PUB_IP=$(curl -s http://checkip.amazonaws.com)
|
||||||
|
DB_HOST='mysql'
|
||||||
|
PLUGINLIST="litespeed-cache.zip"
|
||||||
|
THEME='twentytwenty'
|
||||||
|
EPACE=' '
|
||||||
|
|
||||||
|
echow(){
|
||||||
|
FLAG=${1}
|
||||||
|
shift
|
||||||
|
echo -e "\033[1m${EPACE}${FLAG}\033[0m${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
help_message(){
|
||||||
|
echo -e "\033[1mOPTIONS\033[0m"
|
||||||
|
echow '-A, -app [wordpress] -D, --domain [DOMAIN_NAME]'
|
||||||
|
echo "${EPACE}${EPACE}Example: appinstallctl.sh --app wordpress --domain example.com"
|
||||||
|
echow '-H, --help'
|
||||||
|
echo "${EPACE}${EPACE}Display help and exit."
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
check_input(){
|
||||||
|
if [ -z "${1}" ]; then
|
||||||
|
help_message
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
linechange(){
|
||||||
|
LINENUM=$(grep -n "${1}" ${2} | cut -d: -f 1)
|
||||||
|
if [ -n "${LINENUM}" ] && [ "${LINENUM}" -eq "${LINENUM}" ] 2>/dev/null; then
|
||||||
|
sed -i "${LINENUM}d" ${2}
|
||||||
|
sed -i "${LINENUM}i${3}" ${2}
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
ck_ed(){
|
||||||
|
if [ ! -f /bin/ed ]; then
|
||||||
|
echo "Install ed package.."
|
||||||
|
apt-get install ed -y > /dev/null 2>&1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
ck_unzip(){
|
||||||
|
if [ ! -f /usr/bin/unzip ]; then
|
||||||
|
echo "Install unzip package.."
|
||||||
|
apt-get install unzip -y > /dev/null 2>&1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
get_owner(){
|
||||||
|
WWW_UID=$(stat -c "%u" ${DEFAULT_VH_ROOT})
|
||||||
|
WWW_GID=$(stat -c "%g" ${DEFAULT_VH_ROOT})
|
||||||
|
if [ ${WWW_UID} -eq 0 ] || [ ${WWW_GID} -eq 0 ]; then
|
||||||
|
WWW_UID=1000
|
||||||
|
WWW_GID=1000
|
||||||
|
echo "Set owner to ${WWW_UID}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
get_db_pass(){
|
||||||
|
if [ -f ${DEFAULT_VH_ROOT}/${1}/.db_pass ]; then
|
||||||
|
SQL_DB=$(grep -i Database ${VH_ROOT}/.db_pass | awk -F ':' '{print $2}' | tr -d '"')
|
||||||
|
SQL_USER=$(grep -i Username ${VH_ROOT}/.db_pass | awk -F ':' '{print $2}' | tr -d '"')
|
||||||
|
SQL_PASS=$(grep -i Password ${VH_ROOT}/.db_pass | awk -F ':' '{print $2}' | tr -d '"')
|
||||||
|
else
|
||||||
|
echo 'db pass file can not locate, skip wp-config pre-config.'
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
set_vh_docroot(){
|
||||||
|
if [ "${VHNAME}" != '' ]; then
|
||||||
|
VH_ROOT="${DEFAULT_VH_ROOT}/${VHNAME}"
|
||||||
|
VH_DOC_ROOT="${DEFAULT_VH_ROOT}/${VHNAME}/html"
|
||||||
|
WP_CONST_CONF="${VH_DOC_ROOT}/wp-content/plugins/litespeed-cache/data/const.default.ini"
|
||||||
|
elif [ -d ${DEFAULT_VH_ROOT}/${1}/html ]; then
|
||||||
|
VH_ROOT="${DEFAULT_VH_ROOT}/${1}"
|
||||||
|
VH_DOC_ROOT="${DEFAULT_VH_ROOT}/${1}/html"
|
||||||
|
WP_CONST_CONF="${VH_DOC_ROOT}/wp-content/plugins/litespeed-cache/data/const.default.ini"
|
||||||
|
else
|
||||||
|
echo "${DEFAULT_VH_ROOT}/${1}/html does not exist, please add domain first! Abort!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
check_sql_native(){
|
||||||
|
local COUNTER=0
|
||||||
|
local LIMIT_NUM=100
|
||||||
|
until [ "$(curl -v mysql:3306 2>&1 | grep -i 'native\|Connected')" ]; do
|
||||||
|
echo "Counter: ${COUNTER}/${LIMIT_NUM}"
|
||||||
|
COUNTER=$((COUNTER+1))
|
||||||
|
if [ ${COUNTER} = 10 ]; then
|
||||||
|
echo '--- MySQL is starting, please wait... ---'
|
||||||
|
elif [ ${COUNTER} = ${LIMIT_NUM} ]; then
|
||||||
|
echo '--- MySQL is timeout, exit! ---'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
install_wp_plugin(){
|
||||||
|
for PLUGIN in ${PLUGINLIST}; do
|
||||||
|
wget -q -P ${VH_DOC_ROOT}/wp-content/plugins/ https://downloads.wordpress.org/plugin/${PLUGIN}
|
||||||
|
if [ ${?} = 0 ]; then
|
||||||
|
ck_unzip
|
||||||
|
unzip -qq -o ${VH_DOC_ROOT}/wp-content/plugins/${PLUGIN} -d ${VH_DOC_ROOT}/wp-content/plugins/
|
||||||
|
else
|
||||||
|
echo "${PLUGINLIST} FAILED to download"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
rm -f ${VH_DOC_ROOT}/wp-content/plugins/*.zip
|
||||||
|
}
|
||||||
|
|
||||||
|
set_htaccess(){
|
||||||
|
if [ ! -f ${VH_DOC_ROOT}/.htaccess ]; then
|
||||||
|
touch ${VH_DOC_ROOT}/.htaccess
|
||||||
|
fi
|
||||||
|
cat << EOM > ${VH_DOC_ROOT}/.htaccess
|
||||||
|
# BEGIN WordPress
|
||||||
|
<IfModule mod_rewrite.c>
|
||||||
|
RewriteEngine On
|
||||||
|
RewriteBase /
|
||||||
|
RewriteRule ^index\.php$ - [L]
|
||||||
|
RewriteCond %{REQUEST_FILENAME} !-f
|
||||||
|
RewriteCond %{REQUEST_FILENAME} !-d
|
||||||
|
RewriteRule . /index.php [L]
|
||||||
|
</IfModule>
|
||||||
|
# END WordPress
|
||||||
|
EOM
|
||||||
|
}
|
||||||
|
|
||||||
|
get_theme_name(){
|
||||||
|
THEME_NAME=$(grep WP_DEFAULT_THEME ${VH_DOC_ROOT}/wp-includes/default-constants.php | grep -v '!' | awk -F "'" '{print $4}')
|
||||||
|
echo "${THEME_NAME}" | grep 'twenty' >/dev/null 2>&1
|
||||||
|
if [ ${?} = 0 ]; then
|
||||||
|
THEME="${THEME_NAME}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
set_lscache(){
|
||||||
|
cat << EOM > "${WP_CONST_CONF}"
|
||||||
|
;
|
||||||
|
; This is the predefined default LSCWP configuration file
|
||||||
|
;
|
||||||
|
; All the keys and values please refer \`src/const.cls.php\`
|
||||||
|
;
|
||||||
|
; Comments start with \`;\`
|
||||||
|
;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- General ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
; O_AUTO_UPGRADE
|
||||||
|
auto_upgrade = false
|
||||||
|
; O_API_KEY
|
||||||
|
api_key = ''
|
||||||
|
; O_SERVER_IP
|
||||||
|
server_ip = ''
|
||||||
|
; O_NEWS
|
||||||
|
news = false
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- Cache ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
cache-priv = true
|
||||||
|
cache-commenter = true
|
||||||
|
cache-rest = true
|
||||||
|
cache-page_login = true
|
||||||
|
cache-favicon = true
|
||||||
|
cache-resources = true
|
||||||
|
cache-browser = false
|
||||||
|
cache-mobile = false
|
||||||
|
cache-mobile_rules = 'Mobile
|
||||||
|
Android
|
||||||
|
Silk/
|
||||||
|
Kindle
|
||||||
|
BlackBerry
|
||||||
|
Opera Mini
|
||||||
|
Opera Mobi'
|
||||||
|
cache-exc_useragents = ''
|
||||||
|
cache-exc_cookies = ''
|
||||||
|
cache-exc_qs = ''
|
||||||
|
cache-exc_cat = ''
|
||||||
|
cache-exc_tag = ''
|
||||||
|
cache-force_uri = ''
|
||||||
|
cache-force_pub_uri = ''
|
||||||
|
cache-priv_uri = ''
|
||||||
|
cache-exc = ''
|
||||||
|
cache-exc_roles = ''
|
||||||
|
cache-drop_qs = 'fbclid
|
||||||
|
gclid
|
||||||
|
utm*
|
||||||
|
_ga'
|
||||||
|
cache-ttl_pub = 604800
|
||||||
|
cache-ttl_priv = 1800
|
||||||
|
cache-ttl_frontpage = 604800
|
||||||
|
cache-ttl_feed = 604800
|
||||||
|
; O_CACHE_TTL_REST
|
||||||
|
cache-ttl_rest = 604800
|
||||||
|
cache-ttl_browser = 31557600
|
||||||
|
cache-login_cookie = ''
|
||||||
|
cache-vary_group = ''
|
||||||
|
cache-ttl_status = '403 3600
|
||||||
|
404 3600
|
||||||
|
500 3600'
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- Purge ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
; O_PURGE_ON_UPGRADE
|
||||||
|
purge-upgrade = true
|
||||||
|
; O_PURGE_STALE
|
||||||
|
purge-stale = true
|
||||||
|
purge-post_all = false
|
||||||
|
purge-post_f = true
|
||||||
|
purge-post_h = true
|
||||||
|
purge-post_p = true
|
||||||
|
purge-post_pwrp = true
|
||||||
|
purge-post_a = true
|
||||||
|
purge-post_y = false
|
||||||
|
purge-post_m = true
|
||||||
|
purge-post_d = false
|
||||||
|
purge-post_t = true
|
||||||
|
purge-post_pt = true
|
||||||
|
purge-timed_urls = ''
|
||||||
|
purge-timed_urls_time = ''
|
||||||
|
purge-hook_all = 'switch_theme
|
||||||
|
wp_create_nav_menu
|
||||||
|
wp_update_nav_menu
|
||||||
|
wp_delete_nav_menu
|
||||||
|
create_term
|
||||||
|
edit_terms
|
||||||
|
delete_term
|
||||||
|
add_link
|
||||||
|
edit_link
|
||||||
|
delete_link'
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- ESI ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
; O_ESI
|
||||||
|
esi = false
|
||||||
|
; O_ESI_CACHE_ADMBAR
|
||||||
|
esi-cache_admbar = true
|
||||||
|
; O_ESI_CACHE_COMMFORM
|
||||||
|
esi-cache_commform = true
|
||||||
|
; O_ESI_NONCE
|
||||||
|
esi-nonce = 'stats_nonce
|
||||||
|
subscribe_nonce'
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- Utilities ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
util-heartbeat = true
|
||||||
|
util-instant_click = false
|
||||||
|
util-check_advcache = true
|
||||||
|
util-no_https_vary = false
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- Debug ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
; O_DEBUG_DISABLE_ALL
|
||||||
|
debug-disable_all = false
|
||||||
|
; O_DEBUG
|
||||||
|
debug = false
|
||||||
|
; O_DEBUG_IPS
|
||||||
|
debug-ips = '127.0.0.1'
|
||||||
|
; O_DEBUG_LEVEL
|
||||||
|
debug-level = false
|
||||||
|
; O_DEBUG_FILESIZE
|
||||||
|
debug-filesize = 3
|
||||||
|
; O_DEBUG_COOKIE
|
||||||
|
debug-cookie = false
|
||||||
|
; O_DEBUG_COLLAPS_QS
|
||||||
|
debug-collaps_qs = false
|
||||||
|
; O_DEBUG_INC
|
||||||
|
debug-inc = ''
|
||||||
|
; O_DEBUG_EXC
|
||||||
|
debug-exc = ''
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- DB Optm ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
; O_DB_OPTM_REVISIONS_MAX
|
||||||
|
db_optm-revisions_max = 0
|
||||||
|
; O_DB_OPTM_REVISIONS_AGE
|
||||||
|
db_optm-revisions_age = 0
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- HTML Optm ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
; O_OPTM_CSS_MIN
|
||||||
|
optm-css_min = false
|
||||||
|
optm-css_inline_min = false
|
||||||
|
; O_OPTM_CSS_COMB
|
||||||
|
optm-css_comb = false
|
||||||
|
optm-css_comb_priority = false
|
||||||
|
; O_OPTM_CSS_HTTP2
|
||||||
|
optm-css_http2 = false
|
||||||
|
optm-css_exc = ''
|
||||||
|
; O_OPTM_JS_MIN
|
||||||
|
optm-js_min = false
|
||||||
|
optm-js_inline_min = false
|
||||||
|
; O_OPTM_JS_COMB
|
||||||
|
optm-js_comb = false
|
||||||
|
optm-js_comb_priority = false
|
||||||
|
; O_OPTM_JS_HTTP2
|
||||||
|
optm-js_http2 = false
|
||||||
|
; O_OPTM_EXC_JQ
|
||||||
|
optm-js_exc = ''
|
||||||
|
optm-ttl = 604800
|
||||||
|
optm-html_min = false
|
||||||
|
optm-qs_rm = false
|
||||||
|
optm-ggfonts_rm = false
|
||||||
|
; O_OPTM_CSS_ASYNC
|
||||||
|
optm-css_async = false
|
||||||
|
; O_OPTM_CCSS_GEN
|
||||||
|
optm-ccss_gen = true
|
||||||
|
; O_OPTM_CCSS_ASYNC
|
||||||
|
optm-ccss_async = true
|
||||||
|
; O_OPTM_CSS_ASYNC_INLINE
|
||||||
|
optm-css_async_inline = true
|
||||||
|
; O_OPTM_CSS_FONT_DISPLAY
|
||||||
|
optm-css_font_display = false
|
||||||
|
; O_OPTM_JS_DEFER
|
||||||
|
optm-js_defer = false
|
||||||
|
; O_OPTM_JS_INLINE_DEFER
|
||||||
|
optm-js_inline_defer = false
|
||||||
|
optm-emoji_rm = false
|
||||||
|
optm-exc_jq = true
|
||||||
|
optm-ggfonts_async = false
|
||||||
|
optm-max_size = 2
|
||||||
|
optm-rm_comment = false
|
||||||
|
optm-exc_roles = ''
|
||||||
|
optm-ccss_con = ''
|
||||||
|
optm-js_defer_exc = ''
|
||||||
|
; O_OPTM_DNS_PREFETCH
|
||||||
|
optm-dns_prefetch = ''
|
||||||
|
; O_OPTM_DNS_PREFETCH_CTRL
|
||||||
|
optm-dns_prefetch_ctrl = false
|
||||||
|
optm-exc = ''
|
||||||
|
; O_OPTM_CCSS_SEP_POSTTYPE
|
||||||
|
optm-ccss_sep_posttype = ''
|
||||||
|
; O_OPTM_CCSS_SEP_URI
|
||||||
|
optm-ccss_sep_uri = ''
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- Object Cache ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
object = true
|
||||||
|
object-kind = false
|
||||||
|
;object-host = 'localhost'
|
||||||
|
object-host = '/var/www/memcached.sock'
|
||||||
|
;object-port = 11211
|
||||||
|
cache_object_port = ''
|
||||||
|
object-life = 360
|
||||||
|
object-persistent = true
|
||||||
|
object-admin = true
|
||||||
|
object-transients = true
|
||||||
|
object-db_id = 0
|
||||||
|
object-user = ''
|
||||||
|
object-pswd = ''
|
||||||
|
object-global_groups = 'users
|
||||||
|
userlogins
|
||||||
|
usermeta
|
||||||
|
user_meta
|
||||||
|
site-transient
|
||||||
|
site-options
|
||||||
|
site-lookup
|
||||||
|
blog-lookup
|
||||||
|
blog-details
|
||||||
|
rss
|
||||||
|
global-posts
|
||||||
|
blog-id-cache'
|
||||||
|
object-non_persistent_groups = 'comment
|
||||||
|
counts
|
||||||
|
plugins
|
||||||
|
wc_session_id'
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- Discussion ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
; O_DISCUSS_AVATAR_CACHE
|
||||||
|
discuss-avatar_cache = false
|
||||||
|
; O_DISCUSS_AVATAR_CRON
|
||||||
|
discuss-avatar_cron = false
|
||||||
|
; O_DISCUSS_AVATAR_CACHE_TTL
|
||||||
|
discuss-avatar_cache_ttl = 604800
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- Media ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
; O_MEDIA_LAZY
|
||||||
|
media-lazy = false
|
||||||
|
; O_MEDIA_LAZY_PLACEHOLDER
|
||||||
|
media-lazy_placeholder = ''
|
||||||
|
; O_MEDIA_PLACEHOLDER_RESP
|
||||||
|
media-placeholder_resp = false
|
||||||
|
; O_MEDIA_PLACEHOLDER_RESP_COLOR
|
||||||
|
media-placeholder_resp_color = '#cfd4db'
|
||||||
|
; O_MEDIA_PLACEHOLDER_RESP_GENERATOR
|
||||||
|
media-placeholder_resp_generator = false
|
||||||
|
; O_MEDIA_PLACEHOLDER_RESP_SVG
|
||||||
|
media-placeholder_resp_svg = '<svg xmlns="http://www.w3.org/2000/svg" width="{width}" height="{height}" viewBox="0 0 {width} {height}"><rect width="100%" height="100%" fill="{color}"/></svg>'
|
||||||
|
; O_MEDIA_PLACEHOLDER_LQIP
|
||||||
|
media-placeholder_lqip = false
|
||||||
|
; O_MEDIA_PLACEHOLDER_LQIP_QUAL
|
||||||
|
media-placeholder_lqip_qual = 4
|
||||||
|
; O_MEDIA_PLACEHOLDER_RESP_ASYNC
|
||||||
|
media-placeholder_resp_async = true
|
||||||
|
; O_MEDIA_IFRAME_LAZY
|
||||||
|
media-iframe_lazy = false
|
||||||
|
; O_MEDIA_LAZYJS_INLINE
|
||||||
|
media-lazyjs_inline = false
|
||||||
|
; O_MEDIA_LAZY_EXC
|
||||||
|
media-lazy_exc = ''
|
||||||
|
; O_MEDIA_LAZY_CLS_EXC
|
||||||
|
media-lazy_cls_exc = ''
|
||||||
|
; O_MEDIA_LAZY_PARENT_CLS_EXC
|
||||||
|
media-lazy_parent_cls_exc = ''
|
||||||
|
; O_MEDIA_IFRAME_LAZY_CLS_EXC
|
||||||
|
media-iframe_lazy_cls_exc = ''
|
||||||
|
; O_MEDIA_IFRAME_LAZY_PARENT_CLS_EXC
|
||||||
|
media-iframe_lazy_parent_cls_exc = ''
|
||||||
|
; O_MEDIA_LAZY_URI_EXC
|
||||||
|
media-lazy_uri_exc = ''
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- Image Optm ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
img_optm-auto = false
|
||||||
|
img_optm-cron = true
|
||||||
|
img_optm-ori = true
|
||||||
|
img_optm-rm_bkup = false
|
||||||
|
img_optm-webp = false
|
||||||
|
img_optm-lossless = false
|
||||||
|
img_optm-exif = false
|
||||||
|
img_optm-webp_replace = false
|
||||||
|
img_optm-webp_attr = 'img.src
|
||||||
|
div.data-thumb
|
||||||
|
img.data-src
|
||||||
|
div.data-large_image
|
||||||
|
img.retina_logo_url
|
||||||
|
div.data-parallax-image
|
||||||
|
video.poster'
|
||||||
|
img_optm-webp_replace_srcset = false
|
||||||
|
img_optm-jpg_quality = 82
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- Crawler ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
crawler = false
|
||||||
|
crawler-inc_posts = true
|
||||||
|
crawler-inc_pages = true
|
||||||
|
crawler-inc_cats = true
|
||||||
|
crawler-inc_tags = true
|
||||||
|
crawler-exc_cpt = ''
|
||||||
|
crawler-order_links = 'date_desc'
|
||||||
|
crawler-usleep = 500
|
||||||
|
crawler-run_duration = 400
|
||||||
|
crawler-run_interval = 600
|
||||||
|
crawler-crawl_interval = 302400
|
||||||
|
crawler-threads = 3
|
||||||
|
crawler-timeout = 30
|
||||||
|
crawler-load_limit = 1
|
||||||
|
; O_CRAWLER_SITEMAP
|
||||||
|
crawler-sitemap = ''
|
||||||
|
; O_CRAWLER_DROP_DOMAIN
|
||||||
|
crawler-drop_domain = true
|
||||||
|
crawler-roles = ''
|
||||||
|
crawler-cookies = ''
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- Misc ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
; O_MISC_HTACCESS_FRONT
|
||||||
|
misc-htaccess_front = ''
|
||||||
|
; O_MISC_HTACCESS_BACK
|
||||||
|
misc-htaccess_back = ''
|
||||||
|
; O_MISC_HEARTBEAT_FRONT
|
||||||
|
misc-heartbeat_front = false
|
||||||
|
; O_MISC_HEARTBEAT_FRONT_TTL
|
||||||
|
misc-heartbeat_front_ttl = 60
|
||||||
|
; O_MISC_HEARTBEAT_BACK
|
||||||
|
misc-heartbeat_back = false
|
||||||
|
; O_MISC_HEARTBEAT_BACK_TTL
|
||||||
|
misc-heartbeat_back_ttl = 60
|
||||||
|
; O_MISC_HEARTBEAT_EDITOR
|
||||||
|
misc-heartbeat_editor = false
|
||||||
|
; O_MISC_HEARTBEAT_EDITOR_TTL
|
||||||
|
misc-heartbeat_editor_ttl = 15
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- CDN ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
cdn = false
|
||||||
|
cdn-ori = ''
|
||||||
|
cdn-ori_dir = ''
|
||||||
|
cdn-exc = ''
|
||||||
|
cdn-remote_jq = false
|
||||||
|
cdn-quic = false
|
||||||
|
cdn-quic_email = ''
|
||||||
|
cdn-quic_key = ''
|
||||||
|
cdn-cloudflare = false
|
||||||
|
cdn-cloudflare_email = ''
|
||||||
|
cdn-cloudflare_key = ''
|
||||||
|
cdn-cloudflare_name = ''
|
||||||
|
cdn-cloudflare_zone = ''
|
||||||
|
; \`cdn-mapping\` needs to be put in the end with a section tag
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
;; -------------- CDN 2 ----------------- ;;
|
||||||
|
;; -------------------------------------------------- ;;
|
||||||
|
; <------------ CDN Mapping Example BEGIN -------------------->
|
||||||
|
; Need to keep the section tag \`[cdn-mapping]\` before list.
|
||||||
|
;
|
||||||
|
; NOTE 1) Need to set all child options to make all resources to be replaced without missing.
|
||||||
|
; NOTE 2) \`url[n]\` option must have to enable the row setting of \`n\`.
|
||||||
|
; NOTE 3) This section needs to be put in the end of this .ini file
|
||||||
|
;
|
||||||
|
; To enable the 2nd mapping record by default, please remove the \`;;\` in the related lines.
|
||||||
|
[cdn-mapping]
|
||||||
|
url[0] = ''
|
||||||
|
inc_js[0] = true
|
||||||
|
inc_css[0] = true
|
||||||
|
inc_img[0] = true
|
||||||
|
filetype[0] = '.aac
|
||||||
|
.css
|
||||||
|
.eot
|
||||||
|
.gif
|
||||||
|
.jpeg
|
||||||
|
.js
|
||||||
|
.jpg
|
||||||
|
.less
|
||||||
|
.mp3
|
||||||
|
.mp4
|
||||||
|
.ogg
|
||||||
|
.otf
|
||||||
|
.pdf
|
||||||
|
.png
|
||||||
|
.svg
|
||||||
|
.ttf
|
||||||
|
.woff'
|
||||||
|
;;url[1] = 'https://2nd_CDN_url.com/'
|
||||||
|
;;filetype[1] = '.webm'
|
||||||
|
; <------------ CDN Mapping Example END ------------------>
|
||||||
|
EOM
|
||||||
|
|
||||||
|
THEME_PATH="${VH_DOC_ROOT}/wp-content/themes/${THEME}"
|
||||||
|
if [ ! -f ${THEME_PATH}/functions.php ]; then
|
||||||
|
cat >> "${THEME_PATH}/functions.php" <<END
|
||||||
|
<?php
|
||||||
|
require_once( WP_CONTENT_DIR.'/../wp-admin/includes/plugin.php' );
|
||||||
|
\$path = 'litespeed-cache/litespeed-cache.php' ;
|
||||||
|
if (!is_plugin_active( \$path )) {
|
||||||
|
activate_plugin( \$path ) ;
|
||||||
|
rename( __FILE__ . '.bk', __FILE__ );
|
||||||
|
}
|
||||||
|
END
|
||||||
|
elif [ ! -f ${THEME_PATH}/functions.php.bk ]; then
|
||||||
|
cp ${THEME_PATH}/functions.php ${THEME_PATH}/functions.php.bk
|
||||||
|
ck_ed
|
||||||
|
ed ${THEME_PATH}/functions.php << END >>/dev/null 2>&1
|
||||||
|
2i
|
||||||
|
require_once( WP_CONTENT_DIR.'/../wp-admin/includes/plugin.php' );
|
||||||
|
\$path = 'litespeed-cache/litespeed-cache.php' ;
|
||||||
|
if (!is_plugin_active( \$path )) {
|
||||||
|
activate_plugin( \$path ) ;
|
||||||
|
rename( __FILE__ . '.bk', __FILE__ );
|
||||||
|
}
|
||||||
|
.
|
||||||
|
w
|
||||||
|
q
|
||||||
|
END
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
preinstall_wordpress(){
|
||||||
|
if [ "${VHNAME}" != '' ]; then
|
||||||
|
get_db_pass ${VHNAME}
|
||||||
|
else
|
||||||
|
get_db_pass ${DOMAIN}
|
||||||
|
fi
|
||||||
|
if [ ! -f ${VH_DOC_ROOT}/wp-config.php ] && [ -f ${VH_DOC_ROOT}/wp-config-sample.php ]; then
|
||||||
|
cp ${VH_DOC_ROOT}/wp-config-sample.php ${VH_DOC_ROOT}/wp-config.php
|
||||||
|
NEWDBPWD="define('DB_PASSWORD', '${SQL_PASS}');"
|
||||||
|
linechange 'DB_PASSWORD' ${VH_DOC_ROOT}/wp-config.php "${NEWDBPWD}"
|
||||||
|
NEWDBPWD="define('DB_USER', '${SQL_USER}');"
|
||||||
|
linechange 'DB_USER' ${VH_DOC_ROOT}/wp-config.php "${NEWDBPWD}"
|
||||||
|
NEWDBPWD="define('DB_NAME', '${SQL_DB}');"
|
||||||
|
linechange 'DB_NAME' ${VH_DOC_ROOT}/wp-config.php "${NEWDBPWD}"
|
||||||
|
#NEWDBPWD="define('DB_HOST', '${PUB_IP}');"
|
||||||
|
NEWDBPWD="define('DB_HOST', '${DB_HOST}');"
|
||||||
|
linechange 'DB_HOST' ${VH_DOC_ROOT}/wp-config.php "${NEWDBPWD}"
|
||||||
|
elif [ -f ${VH_DOC_ROOT}/wp-config.php ]; then
|
||||||
|
echo "${VH_DOC_ROOT}/wp-config.php already exist, exit !"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo 'Skip!'
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
app_wordpress_dl(){
|
||||||
|
if [ ! -f "${VH_DOC_ROOT}/wp-config.php" ] && [ ! -f "${VH_DOC_ROOT}/wp-config-sample.php" ]; then
|
||||||
|
wp core download \
|
||||||
|
--allow-root \
|
||||||
|
--quiet
|
||||||
|
else
|
||||||
|
echo 'wordpress already exist, abort!'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
change_owner(){
|
||||||
|
if [ "${VHNAME}" != '' ]; then
|
||||||
|
chown -R ${WWW_UID}:${WWW_GID} ${DEFAULT_VH_ROOT}/${VHNAME}
|
||||||
|
else
|
||||||
|
chown -R ${WWW_UID}:${WWW_GID} ${DEFAULT_VH_ROOT}/${DOMAIN}
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
main(){
|
||||||
|
set_vh_docroot ${DOMAIN}
|
||||||
|
get_owner
|
||||||
|
cd ${VH_DOC_ROOT}
|
||||||
|
if [ "${APP_NAME}" = 'wordpress' ] || [ "${APP_NAME}" = 'wp' ]; then
|
||||||
|
check_sql_native
|
||||||
|
app_wordpress_dl
|
||||||
|
preinstall_wordpress
|
||||||
|
install_wp_plugin
|
||||||
|
set_htaccess
|
||||||
|
get_theme_name
|
||||||
|
set_lscache
|
||||||
|
change_owner
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
echo "APP: ${APP_NAME} not support, exit!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
check_input ${1}
|
||||||
|
while [ ! -z "${1}" ]; do
|
||||||
|
case ${1} in
|
||||||
|
-[hH] | -help | --help)
|
||||||
|
help_message
|
||||||
|
;;
|
||||||
|
-[aA] | -app | --app) shift
|
||||||
|
check_input "${1}"
|
||||||
|
APP_NAME="${1}"
|
||||||
|
;;
|
||||||
|
-[dD] | -domain | --domain) shift
|
||||||
|
check_input "${1}"
|
||||||
|
DOMAIN="${1}"
|
||||||
|
;;
|
||||||
|
-vhname | --vhname) shift
|
||||||
|
VHNAME="${1}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
help_message
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
main
|
@ -0,0 +1,18 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
BOTCRON='/var/spool/cron/crontabs/root'
|
||||||
|
|
||||||
|
cert_hook(){
|
||||||
|
grep 'acme' ${BOTCRON} >/dev/null
|
||||||
|
if [ ${?} = 0 ]; then
|
||||||
|
grep 'lswsctrl' ${BOTCRON} >/dev/null
|
||||||
|
if [ ${?} = 0 ]; then
|
||||||
|
echo 'Hook already exist, skip!'
|
||||||
|
else
|
||||||
|
sed -i 's/--cron/--cron --renew-hook "\/usr\/local\/lsws\/bin\/lswsctrl restart"/g' ${BOTCRON}
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "[X] ${BOTCRON} does not exist, please check it later!"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
cert_hook
|
@ -0,0 +1,160 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
CK_RESULT=''
|
||||||
|
LSDIR='/usr/local/lsws'
|
||||||
|
LS_HTTPD_CONF="${LSDIR}/conf/httpd_config.xml"
|
||||||
|
OLS_HTTPD_CONF="${LSDIR}/conf/httpd_config.conf"
|
||||||
|
EPACE=' '
|
||||||
|
|
||||||
|
echow(){
|
||||||
|
FLAG=${1}
|
||||||
|
shift
|
||||||
|
echo -e "\033[1m${EPACE}${FLAG}\033[0m${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
help_message(){
|
||||||
|
echo -e "\033[1mOPTIONS\033[0m"
|
||||||
|
echow '-A, --add [DOMAIN_NAME]'
|
||||||
|
echo "${EPACE}${EPACE}Will add domain to listener and creat a virtual host from template"
|
||||||
|
echow '-D, --del [DOMAIN_NAME]'
|
||||||
|
echo "${EPACE}${EPACE}Will delete domain from listener"
|
||||||
|
echow '-H, --help'
|
||||||
|
echo "${EPACE}${EPACE}Display help."
|
||||||
|
}
|
||||||
|
|
||||||
|
check_lsv(){
|
||||||
|
if [ -f ${LSDIR}/bin/openlitespeed ]; then
|
||||||
|
LSV='openlitespeed'
|
||||||
|
elif [ -f ${LSDIR}/bin/litespeed ]; then
|
||||||
|
LSV='lsws'
|
||||||
|
else
|
||||||
|
echo 'Version not exist, abort!'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
dot_escape(){
|
||||||
|
ESCAPE=$(echo ${1} | sed 's/\./\\./g')
|
||||||
|
}
|
||||||
|
|
||||||
|
check_duplicate(){
|
||||||
|
CK_RESULT=$(grep -E "${1}" ${2})
|
||||||
|
}
|
||||||
|
|
||||||
|
fst_match_line(){
|
||||||
|
FIRST_LINE_NUM=$(grep -n -m 1 ${1} ${2} | awk -F ':' '{print $1}')
|
||||||
|
}
|
||||||
|
fst_match_after(){
|
||||||
|
FIRST_NUM_AFTER=$(tail -n +${1} ${2} | grep -n -m 1 ${3} | awk -F ':' '{print $1}')
|
||||||
|
}
|
||||||
|
lst_match_line(){
|
||||||
|
fst_match_after ${1} ${2} ${3}
|
||||||
|
LAST_LINE_NUM=$((${FIRST_LINE_NUM}+${FIRST_NUM_AFTER}-1))
|
||||||
|
}
|
||||||
|
|
||||||
|
check_input(){
|
||||||
|
if [ -z "${1}" ]; then
|
||||||
|
help_message
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
check_www(){
|
||||||
|
CHECK_WWW=$(echo ${1} | cut -c1-4)
|
||||||
|
if [[ ${CHECK_WWW} == www. ]] ; then
|
||||||
|
echo 'www domain shoudnt be passed!'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
www_domain(){
|
||||||
|
check_www ${1}
|
||||||
|
WWW_DOMAIN=$(echo www.${1})
|
||||||
|
}
|
||||||
|
|
||||||
|
add_ls_domain(){
|
||||||
|
fst_match_line 'docker.xml</templateFile>' ${LS_HTTPD_CONF}
|
||||||
|
NEWNUM=$((FIRST_LINE_NUM+2))
|
||||||
|
sed -i "${NEWNUM}i \ \ \ \ \ \ <member>\n \ \ \ \ \ \ \ <vhName>${DOMAIN}</vhName>\n \ \ \ \ \ \ \ <vhDomain>${DOMAIN},${WWW_DOMAIN}</vhDomain>\n \ \ \ \ \ \ </member>" ${LS_HTTPD_CONF}
|
||||||
|
}
|
||||||
|
|
||||||
|
add_ols_domain(){
|
||||||
|
perl -0777 -p -i -e 's/(vhTemplate docker \{[^}]+)\}*(^.*listeners.*$)/\1$2
|
||||||
|
member '${DOMAIN}' {
|
||||||
|
vhDomain '${DOMAIN},${WWW_DOMAIN}'
|
||||||
|
}/gmi' ${OLS_HTTPD_CONF}
|
||||||
|
}
|
||||||
|
|
||||||
|
add_domain(){
|
||||||
|
check_lsv
|
||||||
|
dot_escape ${1}
|
||||||
|
DOMAIN=${ESCAPE}
|
||||||
|
www_domain ${1}
|
||||||
|
if [ "${LSV}" = 'lsws' ]; then
|
||||||
|
check_duplicate "vhDomain.*${DOMAIN}" ${LS_HTTPD_CONF}
|
||||||
|
if [ "${CK_RESULT}" != '' ]; then
|
||||||
|
echo "# It appears the domain already exist! Check the ${LS_HTTPD_CONF} if you believe this is a mistake!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
elif [ "${LSV}" = 'openlitespeed' ]; then
|
||||||
|
check_duplicate "member.*${DOMAIN}" ${OLS_HTTPD_CONF}
|
||||||
|
if [ "${CK_RESULT}" != '' ]; then
|
||||||
|
echo "# It appears the domain already exist! Check the ${OLS_HTTPD_CONF} if you believe this is a mistake!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
add_ls_domain
|
||||||
|
add_ols_domain
|
||||||
|
}
|
||||||
|
|
||||||
|
del_ls_domain(){
|
||||||
|
fst_match_line "<vhName>*${1}" ${LS_HTTPD_CONF}
|
||||||
|
FIRST_LINE_NUM=$((FIRST_LINE_NUM-1))
|
||||||
|
lst_match_line ${FIRST_LINE_NUM} ${LS_HTTPD_CONF} '</member>'
|
||||||
|
sed -i "${FIRST_LINE_NUM},${LAST_LINE_NUM}d" ${LS_HTTPD_CONF}
|
||||||
|
}
|
||||||
|
|
||||||
|
del_ols_domain(){
|
||||||
|
fst_match_line ${1} ${OLS_HTTPD_CONF}
|
||||||
|
lst_match_line ${FIRST_LINE_NUM} ${OLS_HTTPD_CONF} '}'
|
||||||
|
sed -i "${FIRST_LINE_NUM},${LAST_LINE_NUM}d" ${OLS_HTTPD_CONF}
|
||||||
|
}
|
||||||
|
|
||||||
|
del_domain(){
|
||||||
|
check_lsv
|
||||||
|
dot_escape ${1}
|
||||||
|
DOMAIN=${ESCAPE}
|
||||||
|
if [ "${LSV}" = 'lsws' ]; then
|
||||||
|
check_duplicate "vhDomain.*${DOMAIN}" ${LS_HTTPD_CONF}
|
||||||
|
if [ "${CK_RESULT}" = '' ]; then
|
||||||
|
echo "# Domain non-exist! Check the ${LS_HTTPD_CONF} if you believe this is a mistake!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
elif [ "${LSV}" = 'openlitespeed' ]; then
|
||||||
|
check_duplicate "member.*${DOMAIN}" ${OLS_HTTPD_CONF}
|
||||||
|
if [ "${CK_RESULT}" = '' ]; then
|
||||||
|
echo "# Domain non-exist! Check the ${OLS_HTTPD_CONF} if you believe this is a mistake!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
del_ls_domain ${1}
|
||||||
|
del_ols_domain ${1}
|
||||||
|
}
|
||||||
|
|
||||||
|
check_input ${1}
|
||||||
|
while [ ! -z "${1}" ]; do
|
||||||
|
case ${1} in
|
||||||
|
-[hH] | -help | --help)
|
||||||
|
help_message
|
||||||
|
;;
|
||||||
|
-[aA] | -add | --add) shift
|
||||||
|
add_domain ${1}
|
||||||
|
;;
|
||||||
|
-[dD] | -del | --del | --delete) shift
|
||||||
|
del_domain ${1}
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
help_message
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
236
apps/openlitespeed/1.7.18-lsphp81/data/bin/container/owaspctl.sh
Normal file
@ -0,0 +1,236 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
LSDIR='/usr/local/lsws'
|
||||||
|
OWASP_DIR="${LSDIR}/conf/owasp"
|
||||||
|
RULE_FILE='modsec_includes.conf'
|
||||||
|
LS_HTTPD_CONF="${LSDIR}/conf/httpd_config.xml"
|
||||||
|
OLS_HTTPD_CONF="${LSDIR}/conf/httpd_config.conf"
|
||||||
|
EPACE=' '
|
||||||
|
OWASP_V='3.3.4'
|
||||||
|
|
||||||
|
echow(){
|
||||||
|
FLAG=${1}
|
||||||
|
shift
|
||||||
|
echo -e "\033[1m${EPACE}${FLAG}\033[0m${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
help_message(){
|
||||||
|
echo -e "\033[1mOPTIONS\033[0m"
|
||||||
|
echow '-E, --enable'
|
||||||
|
echo "${EPACE}${EPACE}Will Enable mod_secure module with latest OWASP version of rules"
|
||||||
|
echow '-D, --disable'
|
||||||
|
echo "${EPACE}${EPACE}Will Disable mod_secure module with latest OWASP version of rules"
|
||||||
|
echow '-H, --help'
|
||||||
|
echo "${EPACE}${EPACE}Display help and exit."
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
check_lsv(){
|
||||||
|
if [ -f ${LSDIR}/bin/openlitespeed ]; then
|
||||||
|
LSV='openlitespeed'
|
||||||
|
elif [ -f ${LSDIR}/bin/litespeed ]; then
|
||||||
|
LSV='lsws'
|
||||||
|
else
|
||||||
|
echo 'Version not exist, abort!'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
check_input(){
|
||||||
|
if [ -z "${1}" ]; then
|
||||||
|
help_message
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
mk_owasp_dir(){
|
||||||
|
if [ -d ${OWASP_DIR} ] ; then
|
||||||
|
rm -rf ${OWASP_DIR}
|
||||||
|
fi
|
||||||
|
mkdir -p ${OWASP_DIR}
|
||||||
|
if [ ${?} -ne 0 ] ; then
|
||||||
|
echo "Unable to create directory: ${OWASP_DIR}, exit!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
fst_match_line(){
|
||||||
|
FIRST_LINE_NUM=$(grep -n -m 1 "${1}" ${2} | awk -F ':' '{print $1}')
|
||||||
|
}
|
||||||
|
fst_match_after(){
|
||||||
|
FIRST_NUM_AFTER=$(tail -n +${1} ${2} | grep -n -m 1 ${3} | awk -F ':' '{print $1}')
|
||||||
|
}
|
||||||
|
lst_match_line(){
|
||||||
|
fst_match_after ${1} ${2} ${3}
|
||||||
|
LAST_LINE_NUM=$((${FIRST_LINE_NUM}+${FIRST_NUM_AFTER}-1))
|
||||||
|
}
|
||||||
|
|
||||||
|
enable_ols_modsec(){
|
||||||
|
grep 'module mod_security {' ${OLS_HTTPD_CONF} >/dev/null 2>&1
|
||||||
|
if [ ${?} -eq 0 ] ; then
|
||||||
|
echo "Already configured for modsecurity."
|
||||||
|
else
|
||||||
|
echo 'Enable modsecurity'
|
||||||
|
sed -i "s=module cache=module mod_security {\nmodsecurity on\
|
||||||
|
\nmodsecurity_rules \`\nSecRuleEngine On\n\`\nmodsecurity_rules_file \
|
||||||
|
${OWASP_DIR}/${RULE_FILE}\n ls_enabled 1\n}\
|
||||||
|
\n\nmodule cache=" ${OLS_HTTPD_CONF}
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
enable_ls_modsec(){
|
||||||
|
grep '<enableCensorship>1</enableCensorship>' ${LS_HTTPD_CONF} >/dev/null 2>&1
|
||||||
|
if [ ${?} -eq 0 ] ; then
|
||||||
|
echo "LSWS already configured for modsecurity"
|
||||||
|
else
|
||||||
|
echo 'Enable modsecurity'
|
||||||
|
sed -i \
|
||||||
|
"s=<enableCensorship>0</enableCensorship>=<enableCensorship>1</enableCensorship>=" ${LS_HTTPD_CONF}
|
||||||
|
sed -i \
|
||||||
|
"s=</censorshipControl>=</censorshipControl>\n\
|
||||||
|
<censorshipRuleSet>\n\
|
||||||
|
<name>ModSec</name>\n\
|
||||||
|
<enabled>1</enabled>\n\
|
||||||
|
<ruleSet>include ${OWASP_DIR}/modsec_includes.conf</ruleSet>\n\
|
||||||
|
</censorshipRuleSet>=" ${LS_HTTPD_CONF}
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
enable_modsec(){
|
||||||
|
if [ "${LSV}" = 'lsws' ]; then
|
||||||
|
enable_ls_modsec
|
||||||
|
elif [ "${LSV}" = 'openlitespeed' ]; then
|
||||||
|
enable_ols_modsec
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
disable_ols_modesec(){
|
||||||
|
grep 'module mod_security {' ${OLS_HTTPD_CONF} >/dev/null 2>&1
|
||||||
|
if [ ${?} -eq 0 ] ; then
|
||||||
|
echo 'Disable modsecurity'
|
||||||
|
fst_match_line 'module mod_security' ${OLS_HTTPD_CONF}
|
||||||
|
lst_match_line ${FIRST_LINE_NUM} ${OLS_HTTPD_CONF} '}'
|
||||||
|
sed -i "${FIRST_LINE_NUM},${LAST_LINE_NUM}d" ${OLS_HTTPD_CONF}
|
||||||
|
else
|
||||||
|
echo 'Already disabled for modsecurity'
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
disable_ls_modesec(){
|
||||||
|
grep '<enableCensorship>0</enableCensorship>' ${LS_HTTPD_CONF}
|
||||||
|
if [ ${?} -eq 0 ] ; then
|
||||||
|
echo 'Already disabled for modsecurity'
|
||||||
|
else
|
||||||
|
echo 'Disable modsecurity'
|
||||||
|
sed -i \
|
||||||
|
"s=<enableCensorship>1</enableCensorship>=<enableCensorship>0</enableCensorship>=" ${LS_HTTPD_CONF}
|
||||||
|
fst_match_line 'censorshipRuleSet' ${LS_HTTPD_CONF}
|
||||||
|
lst_match_line ${FIRST_LINE_NUM} ${LS_HTTPD_CONF} '/censorshipRuleSet'
|
||||||
|
sed -i "${FIRST_LINE_NUM},${LAST_LINE_NUM}d" ${LS_HTTPD_CONF}
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
disable_modsec(){
|
||||||
|
check_lsv
|
||||||
|
if [ "${LSV}" = 'lsws' ]; then
|
||||||
|
disable_ls_modesec
|
||||||
|
elif [ "${LSV}" = 'openlitespeed' ]; then
|
||||||
|
disable_ols_modesec
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
install_unzip(){
|
||||||
|
if [ ! -f /usr/bin/unzip ]; then
|
||||||
|
echo 'Install Unzip'
|
||||||
|
apt update >/dev/null 2>&1
|
||||||
|
apt-get install unzip -y >/dev/null 2>&1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
install_owasp(){
|
||||||
|
cd ${OWASP_DIR}
|
||||||
|
echo 'Download OWASP rules'
|
||||||
|
wget -q https://github.com/coreruleset/coreruleset/archive/refs/tags/v${OWASP_V}.zip
|
||||||
|
unzip -qq v${OWASP_V}.zip
|
||||||
|
rm -f v${OWASP_V}.zip
|
||||||
|
mv coreruleset-* owasp-modsecurity-crs
|
||||||
|
}
|
||||||
|
|
||||||
|
configure_owasp(){
|
||||||
|
echo 'Config OWASP rules.'
|
||||||
|
cd ${OWASP_DIR}
|
||||||
|
echo "include modsecurity.conf
|
||||||
|
include owasp-modsecurity-crs/crs-setup.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-901-INITIALIZATION.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-903.9001-DRUPAL-EXCLUSION-RULES.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-903.9002-WORDPRESS-EXCLUSION-RULES.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-903.9003-NEXTCLOUD-EXCLUSION-RULES.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-903.9004-DOKUWIKI-EXCLUSION-RULES.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-903.9005-CPANEL-EXCLUSION-RULES.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-903.9006-XENFORO-EXCLUSION-RULES.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-905-COMMON-EXCEPTIONS.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-910-IP-REPUTATION.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-911-METHOD-ENFORCEMENT.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-912-DOS-PROTECTION.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-913-SCANNER-DETECTION.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-921-PROTOCOL-ATTACK.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-930-APPLICATION-ATTACK-LFI.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-931-APPLICATION-ATTACK-RFI.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-932-APPLICATION-ATTACK-RCE.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-933-APPLICATION-ATTACK-PHP.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-934-APPLICATION-ATTACK-NODEJS.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-942-APPLICATION-ATTACK-SQLI.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-943-APPLICATION-ATTACK-SESSION-FIXATION.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-944-APPLICATION-ATTACK-JAVA.conf
|
||||||
|
include owasp-modsecurity-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf
|
||||||
|
include owasp-modsecurity-crs/rules/RESPONSE-950-DATA-LEAKAGES.conf
|
||||||
|
include owasp-modsecurity-crs/rules/RESPONSE-951-DATA-LEAKAGES-SQL.conf
|
||||||
|
include owasp-modsecurity-crs/rules/RESPONSE-952-DATA-LEAKAGES-JAVA.conf
|
||||||
|
include owasp-modsecurity-crs/rules/RESPONSE-953-DATA-LEAKAGES-PHP.conf
|
||||||
|
include owasp-modsecurity-crs/rules/RESPONSE-954-DATA-LEAKAGES-IIS.conf
|
||||||
|
include owasp-modsecurity-crs/rules/RESPONSE-959-BLOCKING-EVALUATION.conf
|
||||||
|
include owasp-modsecurity-crs/rules/RESPONSE-980-CORRELATION.conf
|
||||||
|
include owasp-modsecurity-crs/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf">modsec_includes.conf
|
||||||
|
echo "SecRuleEngine On">modsecurity.conf
|
||||||
|
cd ${OWASP_DIR}/owasp-modsecurity-crs
|
||||||
|
if [ -f crs-setup.conf.example ]; then
|
||||||
|
mv crs-setup.conf.example crs-setup.conf
|
||||||
|
fi
|
||||||
|
cd ${OWASP_DIR}/owasp-modsecurity-crs/rules
|
||||||
|
if [ -f REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example ]; then
|
||||||
|
mv REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
|
||||||
|
fi
|
||||||
|
if [ -f RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example ]; then
|
||||||
|
mv RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
main_owasp(){
|
||||||
|
mk_owasp_dir
|
||||||
|
install_unzip
|
||||||
|
install_owasp
|
||||||
|
configure_owasp
|
||||||
|
check_lsv
|
||||||
|
enable_modsec
|
||||||
|
}
|
||||||
|
|
||||||
|
check_input ${1}
|
||||||
|
while [ ! -z "${1}" ]; do
|
||||||
|
case ${1} in
|
||||||
|
-[hH] | -help | --help)
|
||||||
|
help_message
|
||||||
|
;;
|
||||||
|
-[eE] | -enable | --enable)
|
||||||
|
main_owasp
|
||||||
|
;;
|
||||||
|
-[dD] | -disable | --disable)
|
||||||
|
disable_modsec
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
help_message
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
@ -0,0 +1,84 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
LSDIR='/usr/local/lsws'
|
||||||
|
EPACE=' '
|
||||||
|
|
||||||
|
echow(){
|
||||||
|
FLAG=${1}
|
||||||
|
shift
|
||||||
|
echo -e "\033[1m${EPACE}${FLAG}\033[0m${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
help_message(){
|
||||||
|
echo -e "\033[1mOPTIONS\033[0m"
|
||||||
|
echow '-S, --serial [YOUR_SERIAL|TRIAL]'
|
||||||
|
echo "${EPACE}${EPACE}Will apply and register the serial to LSWS."
|
||||||
|
echow '-H, --help'
|
||||||
|
echo "${EPACE}${EPACE}Display help and exit."
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
check_input(){
|
||||||
|
if [ -z "${1}" ]; then
|
||||||
|
help_message
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
backup_old(){
|
||||||
|
if [ -f ${1} ] && [ ! -f ${1}_old ]; then
|
||||||
|
mv ${1} ${1}_old
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
detect_ols(){
|
||||||
|
if [ -e ${LSDIR}/bin/openlitespeed ]; then
|
||||||
|
echo '[X] Detect OpenLiteSpeed, abort!'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
apply_serial(){
|
||||||
|
detect_ols
|
||||||
|
check_input ${1}
|
||||||
|
echo ${1} | grep -i 'trial' >/dev/null
|
||||||
|
if [ ${?} = 0 ]; then
|
||||||
|
echo 'Apply Trial License'
|
||||||
|
if [ ! -e ${LSDIR}/conf/serial.no ] && [ ! -e ${LSDIR}/conf/license.key ]; then
|
||||||
|
rm -f ${LSDIR}/conf/trial.key*
|
||||||
|
wget -P ${LSDIR}/conf -q http://license.litespeedtech.com/reseller/trial.key
|
||||||
|
echo 'Apply trial finished'
|
||||||
|
else
|
||||||
|
echo "Please backup and remove your existing license, apply abort!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "Apply Serial number: ${1}"
|
||||||
|
backup_old ${LSDIR}/conf/serial.no
|
||||||
|
backup_old ${LSDIR}/conf/license.key
|
||||||
|
backup_old ${LSDIR}/conf/trial.key
|
||||||
|
echo "${1}" > ${LSDIR}/conf/serial.no
|
||||||
|
${LSDIR}/bin/lshttpd -r
|
||||||
|
if [ -f ${LSDIR}/conf/license.key ]; then
|
||||||
|
echo '[O] Apply success'
|
||||||
|
else
|
||||||
|
echo '[X] Apply failed, please check!'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
check_input ${1}
|
||||||
|
while [ ! -z "${1}" ]; do
|
||||||
|
case ${1} in
|
||||||
|
-[hH] | -help | --help)
|
||||||
|
help_message
|
||||||
|
;;
|
||||||
|
-[sS] | -serial | --serial) shift
|
||||||
|
apply_serial "${1}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
help_message
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
2
apps/openlitespeed/1.7.18-lsphp81/data/sites/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
*
|
||||||
|
!.gitignore
|
30
apps/openlitespeed/1.7.18-lsphp81/docker-compose.yml
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
litespeed:
|
||||||
|
container_name: ${CONTAINER_NAME}
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
logging:
|
||||||
|
driver: none
|
||||||
|
volumes:
|
||||||
|
- ./data/lsws/conf:/usr/local/lsws/conf
|
||||||
|
- ./data/lsws/admin-conf:/usr/local/lsws/admin/conf
|
||||||
|
- ./data/bin/container:/usr/local/bin
|
||||||
|
- ./data/sites:/var/www/vhosts/
|
||||||
|
- ./data/acme:/root/.acme.sh/
|
||||||
|
- ./data/logs:/usr/local/lsws/logs/
|
||||||
|
ports:
|
||||||
|
- "${PANEL_APP_PORT_HTTP}:80"
|
||||||
|
- "${PANEL_APP_PORT_HTTPS}:443"
|
||||||
|
- "${PANEL_APP_PORT_HTTPS}:443/udp"
|
||||||
|
- "${PANEL_APP_PORT_CONSOLE}:7080"
|
||||||
|
environment:
|
||||||
|
- TZ=${TIME_ZONE}
|
||||||
|
image: litespeedtech/openlitespeed:1.7.18-lsphp81
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
networks:
|
||||||
|
1panel-network:
|
||||||
|
external: true
|
43
apps/openlitespeed/README.md
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
# 使用说明
|
||||||
|
|
||||||
|
安装完成后,在容器功能界面,连接容器终端,执行以下命令创建管理员账户密码
|
||||||
|
|
||||||
|
```
|
||||||
|
/usr/local/lsws/admin/misc/admpass.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
# 原始相关
|
||||||
|
|
||||||
|
OpenLiteSpeed Web Server
|
||||||
|
========
|
||||||
|
|
||||||
|
Description
|
||||||
|
--------
|
||||||
|
|
||||||
|
OpenLiteSpeed is a high-performance, lightweight, open source HTTP server developed and copyrighted by
|
||||||
|
LiteSpeed Technologies. Users are free to download, use, distribute, and modify OpenLiteSpeed and its
|
||||||
|
source code in accordance with the precepts of the GPLv3 license.
|
||||||
|
|
||||||
|
This is the official repository for OpenLiteSpeed's source code. It is maintained by LiteSpeed
|
||||||
|
Technologies.
|
||||||
|
|
||||||
|
Documentation
|
||||||
|
--------
|
||||||
|
|
||||||
|
Users can find all OpenLiteSpeed documentation on the [OpenLiteSpeed site](https://openlitespeed.org),
|
||||||
|
but here are some quick links to important parts of the site:
|
||||||
|
|
||||||
|
[Installation](https://openlitespeed.org/kb/category/installation/)
|
||||||
|
|
||||||
|
[Configuration](https://openlitespeed.org/kb/category/configuration/)
|
||||||
|
|
||||||
|
[Road map](https://openlitespeed.org/mediawiki/index.php/Road_Map)
|
||||||
|
|
||||||
|
[Release log](https://openlitespeed.org/release-log/)
|
||||||
|
|
||||||
|
Get in Touch
|
||||||
|
--------
|
||||||
|
|
||||||
|
OpenLiteSpeed has a [Google Group](https://groups.google.com/forum/#!forum/openlitespeed-development). If
|
||||||
|
you find a bug, want to request new features, or just want to talk about OpenLiteSpeed, this is the place
|
||||||
|
to do it.
|
20
apps/openlitespeed/data.yml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
name: OpenLiteSpeed
|
||||||
|
tags:
|
||||||
|
- Web 服务器
|
||||||
|
title: 一个高性能、轻量级、开源 的HTTP 服务器
|
||||||
|
type: Web 服务器
|
||||||
|
description: 一个高性能、轻量级、开源 的HTTP 服务器
|
||||||
|
additionalProperties:
|
||||||
|
key: openlitespeed
|
||||||
|
name: OpenLiteSpeed
|
||||||
|
tags:
|
||||||
|
- Server
|
||||||
|
shortDescZh: 一个高性能、轻量级、开源 的HTTP 服务器
|
||||||
|
shortDescEn: A high-performance, lightweight, open source HTTP server
|
||||||
|
type: runtime
|
||||||
|
crossVersionUpdate: true
|
||||||
|
limit: 1
|
||||||
|
recommend: 0
|
||||||
|
website: https://openlitespeed.org
|
||||||
|
github: https://github.com/litespeedtech/openlitespeed
|
||||||
|
document: https://openlitespeed.org/#install
|
BIN
apps/openlitespeed/logo.png
Normal file
After Width: | Height: | Size: 6.9 KiB |
10
apps/pingvin-share/0.17.4/data.yml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
additionalProperties:
|
||||||
|
formFields:
|
||||||
|
- default: 40068
|
||||||
|
edit: true
|
||||||
|
envKey: PANEL_APP_PORT_HTTP
|
||||||
|
labelEn: Port
|
||||||
|
labelZh: 端口
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
19
apps/pingvin-share/0.17.4/docker-compose.yml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
pingvin-share:
|
||||||
|
container_name: ${CONTAINER_NAME}
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
ports:
|
||||||
|
- "${PANEL_APP_PORT_HTTP}:3000"
|
||||||
|
volumes:
|
||||||
|
- "./data/data:/opt/app/backend/data"
|
||||||
|
- "./data/images:/opt/app/frontend/public/img"
|
||||||
|
image: stonith404/pingvin-share:v0.17.4
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
networks:
|
||||||
|
1panel-network:
|
||||||
|
external: true
|
126
apps/pingvin-share/README.md
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
# <div align="center"><img src="https://user-images.githubusercontent.com/58886915/166198400-c2134044-1198-4647-a8b6-da9c4a204c68.svg" width="40"/> </br>Pingvin Share</div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
_选择合适的语言阅读: [西班牙语](https://github.com/stonith404/pingvin-share/blob/main/docs/README.es.md), [英语](https://github.com/stonith404/pingvin-share/blob/main/README.md), [简体中文](https://github.com/stonith404/pingvin-share/blob/main/docs/README.zh-cn.md)_
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Pingvin Share 是一个可自建的文件分享平台,是 WeTransfer 的一个替代品
|
||||||
|
|
||||||
|
## ✨ 特性
|
||||||
|
|
||||||
|
- 通过可自定义后缀的链接分享文件
|
||||||
|
- 可自定义任意大小的文件上传限制 (受制于托管所在的硬盘大小)
|
||||||
|
- 对共享链接设置有效期限
|
||||||
|
- 对共享链接设置访问次数和访问密码
|
||||||
|
- 通过邮件自动发送共享链接
|
||||||
|
- 整合 ClamAV 进行反病毒检查
|
||||||
|
|
||||||
|
## 🐧 了解一下 Pingvin Share
|
||||||
|
|
||||||
|
- [示例网站](https://pingvin-share.dev.eliasschneider.com)
|
||||||
|
- [DB Tech 推荐视频](https://www.youtube.com/watch?v=rWwNeZCOPJA)
|
||||||
|
|
||||||
|
<img src="https://user-images.githubusercontent.com/58886915/225038319-b2ef742c-3a74-4eb6-9689-4207a36842a4.png" width="700"/>
|
||||||
|
|
||||||
|
## ⌨️ 自建指南
|
||||||
|
|
||||||
|
> 注意:Pingvin Share 仍处于开发阶段并且可能存在 bugs
|
||||||
|
|
||||||
|
### Docker 部署 (推荐)
|
||||||
|
|
||||||
|
1. 下载 `docker-compose.yml`
|
||||||
|
2. 运行命令 `docker-compose up -d`
|
||||||
|
|
||||||
|
现在网站运行在 `http://localhost:3000`,尝试一下你本地的 Pingvin Share 🐧!
|
||||||
|
|
||||||
|
### Stand-alone 部署
|
||||||
|
|
||||||
|
必须的依赖:
|
||||||
|
|
||||||
|
- [Node.js](https://nodejs.org/en/download/) >= 16
|
||||||
|
- [Git](https://git-scm.com/downloads)
|
||||||
|
- [pm2](https://pm2.keymetrics.io/) 用于后台运行 Pingvin Share
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/stonith404/pingvin-share
|
||||||
|
cd pingvin-share
|
||||||
|
|
||||||
|
# 获取最新的版本
|
||||||
|
git fetch --tags && git checkout $(git describe --tags `git rev-list --tags --max-count=1`)
|
||||||
|
|
||||||
|
# 启动后端 backend
|
||||||
|
cd backend
|
||||||
|
npm install
|
||||||
|
npm run build
|
||||||
|
pm2 start --name="pingvin-share-backend" npm -- run prod
|
||||||
|
|
||||||
|
# 启动前端 frontend
|
||||||
|
cd ../frontend
|
||||||
|
npm install
|
||||||
|
npm run build
|
||||||
|
pm2 start --name="pingvin-share-frontend" npm -- run start
|
||||||
|
```
|
||||||
|
|
||||||
|
现在网站运行在 `http://localhost:3000`,尝试一下你本地的 Pingvin Share 🐧!
|
||||||
|
|
||||||
|
### 整合组件
|
||||||
|
|
||||||
|
#### ClamAV (仅限 Docker 部署)
|
||||||
|
|
||||||
|
扫描上传文件中是否存在可疑文件,如果存在 ClamAV 会自动移除
|
||||||
|
|
||||||
|
1. 在 docker-compose 配置中添加 ClamAV 容器 (见 `docker-compose.yml` 注释部分) 并启动容器
|
||||||
|
2. Docker 会在启动 Pingvin Share 前启动 ClamAV,也许会花费 1-2 分钟
|
||||||
|
3. Pingvin Share 日志中应该有 "ClamAV is active"
|
||||||
|
|
||||||
|
请注意 ClamAV 会消耗很多 [系统资源(特别是内存)](https://docs.clamav.net/manual/Installing/Docker.html#memory-ram-requirements)
|
||||||
|
|
||||||
|
### 更多资源
|
||||||
|
|
||||||
|
- [群晖 NAS 配置](https://mariushosting.com/how-to-install-pingvin-share-on-your-synology-nas/)
|
||||||
|
|
||||||
|
### 升级
|
||||||
|
|
||||||
|
因为 Pingvin Share 仍处在开发阶段,在升级前请务必阅读 release notes 避免不可逆的改变
|
||||||
|
|
||||||
|
#### Docker 升级
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose pull
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Stand-alone 升级
|
||||||
|
|
||||||
|
1. 停止正在运行的 app
|
||||||
|
```bash
|
||||||
|
pm2 stop pingvin-share-backend pingvin-share-frontend
|
||||||
|
```
|
||||||
|
2. 重复 [installation guide](#stand-alone-installation) 中的步骤,除了 `git clone` 这一步
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd pingvin-share
|
||||||
|
|
||||||
|
# 获取最新的版本
|
||||||
|
git fetch --tags && git checkout $(git describe --tags `git rev-list --tags --max-count=1`)
|
||||||
|
|
||||||
|
# 启动后端 backend
|
||||||
|
cd backend
|
||||||
|
npm run build
|
||||||
|
pm2 restart pingvin-share-backend
|
||||||
|
|
||||||
|
# 启动前端 frontend
|
||||||
|
cd ../frontend
|
||||||
|
npm run build
|
||||||
|
pm2 restart pingvin-share-frontend
|
||||||
|
```
|
||||||
|
|
||||||
|
### 自定义品牌
|
||||||
|
|
||||||
|
你可以在管理员配置页面改变网站的名字和 logo
|
||||||
|
|
||||||
|
## 🖤 提交贡献
|
||||||
|
|
||||||
|
非常欢迎向 Pingvin Share 提交贡献! 请阅读 [contribution guide](https://github.com/stonith404/pingvin-share/blob/main/CONTRIBUTING.md) 来提交你的贡献
|
20
apps/pingvin-share/data.yml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
name: Pingvin Share
|
||||||
|
tags:
|
||||||
|
- 工具
|
||||||
|
title: 一个可自建的文件分享平台
|
||||||
|
type: 工具
|
||||||
|
description: 一个可自建的文件分享平台
|
||||||
|
additionalProperties:
|
||||||
|
key: pingvin-share
|
||||||
|
name: Pingvin Share
|
||||||
|
tags:
|
||||||
|
- Tool
|
||||||
|
shortDescZh: 一个可自建的文件分享平台
|
||||||
|
shortDescEn: s self-hosted file sharing platform
|
||||||
|
type: tool
|
||||||
|
crossVersionUpdate: true
|
||||||
|
limit: 0
|
||||||
|
recommend: 0
|
||||||
|
website: https://github.com/stonith404/pingvin-share
|
||||||
|
github: https://github.com/stonith404/pingvin-share
|
||||||
|
document: https://github.com/stonith404/pingvin-share
|
BIN
apps/pingvin-share/logo.png
Normal file
After Width: | Height: | Size: 8.3 KiB |
17
apps/searxng/2023.7.1-5720844f/data.yml
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
additionalProperties:
|
||||||
|
formFields:
|
||||||
|
- default: 40032
|
||||||
|
edit: true
|
||||||
|
envKey: PANEL_APP_PORT_HTTP
|
||||||
|
labelEn: Port
|
||||||
|
labelZh: 端口
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
||||||
|
- default: http://localhost:40032
|
||||||
|
edit: true
|
||||||
|
envKey: SEARXNG_EXTERNAL_URL
|
||||||
|
labelEn: External URL
|
||||||
|
labelZh: 外部访问地址
|
||||||
|
required: true
|
||||||
|
type: text
|
20
apps/searxng/2023.7.1-5720844f/docker-compose.yml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
searxng:
|
||||||
|
container_name: ${CONTAINER_NAME}
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
ports:
|
||||||
|
- "${PANEL_APP_PORT_HTTP}:8080"
|
||||||
|
volumes:
|
||||||
|
- "./data:/etc/searxng"
|
||||||
|
environment:
|
||||||
|
- BASE_URL=${SEARXNG_EXTERNAL_URL}
|
||||||
|
image: searxng/searxng:2023.7.1-5720844f
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
networks:
|
||||||
|
1panel-network:
|
||||||
|
external: true
|
82
apps/searxng/README.md
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
------------------------------------------------------------------------
|
||||||
|
|
||||||
|
<img src="https://raw.githubusercontent.com/searxng/searxng/master/src/brand/searxng.svg" alt="SearXNGlogo" width="15%">
|
||||||
|
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Privacy-respecting, hackable [meta search engine](https://en.wikipedia.org/wiki/Metasearch_engine)
|
||||||
|
|
||||||
|
[Searx.space](https://searx.space) lists ready-to-use running instances.
|
||||||
|
|
||||||
|
A [user](https://docs.searxng.org/user),[admin](https://docs.searxng.org/admin) and[developer](https://docs.searxng.org/dev) handbook is available on the[homepage](https://docs.searxng.org/).
|
||||||
|
|
||||||
|
[![SearXNG
|
||||||
|
install](https://img.shields.io/badge/-install-blue)](https://docs.searxng.org/admin/installation.html) [![SearXNG
|
||||||
|
homepage](https://img.shields.io/badge/-homepage-blue)](https://docs.searxng.org/) [![SearXNGwiki](https://img.shields.io/badge/-wiki-blue)](https://github.com/searxng/searxng/wiki) [![AGPLLicense](https://img.shields.io/badge/license-AGPL-blue.svg)](https://github.com/searxng/searxng/blob/master/LICENSE) [![Issues](https://img.shields.io/github/issues/searxng/searxng?color=yellow&label=issues)](https://github.com/searxng/searxng/issues) [![commits](https://img.shields.io/github/commit-activity/y/searxng/searxng?color=yellow&label=commits)](https://github.com/searxng/searxng/commits/master) [![weblate](https://translate.codeberg.org/widgets/searxng/-/searxng/svg-badge.svg)](https://translate.codeberg.org/projects/searxng/) <a href="https://docs.searxng.org/"><img src="https://raw.githubusercontent.com/searxng/searxng/master/src/brand/searxng-wordmark.svg" alt="SearXNGlogo" width="1.4%"></a>
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Contact
|
||||||
|
|
||||||
|
Ask questions or just chat about SearXNG on
|
||||||
|
|
||||||
|
IRC
|
||||||
|
|
||||||
|
[#searxng on libera.chat](https://web.libera.chat/?channel=#searxng) which is bridged to Matrix.
|
||||||
|
|
||||||
|
Matrix
|
||||||
|
|
||||||
|
[#searxng:matrix.org](https://matrix.to/#/#searxng:matrix.org)
|
||||||
|
|
||||||
|
# Differences to searx
|
||||||
|
|
||||||
|
SearXNG is a fork of [searx](https://github.com/searx/searx), with notable changes:
|
||||||
|
|
||||||
|
## User experience
|
||||||
|
|
||||||
|
- Reworked (and still simple) theme:
|
||||||
|
- Usable on desktop, tablet and mobile.
|
||||||
|
- Light and dark versions (available in the preferences).
|
||||||
|
- Right-to-left language support.
|
||||||
|
- [Screenshots](https://dev.searxng.org/screenshots.html)
|
||||||
|
- The translations are up to date, you can contribute on [Weblate](https://translate.codeberg.org/projects/searxng/searxng/)
|
||||||
|
- The preferences page has been updated:
|
||||||
|
- Browse which engines are reliable or not.
|
||||||
|
- Engines are grouped inside each tab.
|
||||||
|
- Each engine has a description.
|
||||||
|
- Thanks to the anonymous metrics, it is easier to report malfunctioning engines, so they get fixed quicker
|
||||||
|
- [Turn off metrics on the server](https://docs.searxng.org/admin/engines/settings.html#general)if you don\'t want them recorded.
|
||||||
|
- Administrators can [block and/or replace the URLs in the search results](https://github.com/searxng/searxng/blob/5c1c0817c3996c5670a545d05831d234d21e6217/searx/settings.yml#L191-L199)
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
- No need for [Morty](https://github.com/asciimoo/morty) to proxy images, even on a public instance.
|
||||||
|
- No need for [Filtron](https://github.com/searxng/filtron) to block bots, as there is now a built-in [limiter](https://docs.searxng.org/src/searx.plugins.limiter.html).
|
||||||
|
- A well maintained [Dockerimage](https://github.com/searxng/searxng-docker), now also built for ARM64 and ARM/v7 architectures. (Alternatively there are up to date installation scripts.)
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
- Readable debug log.
|
||||||
|
- Contributing is easier, thanks to the [Development Quickstart](https://docs.searxng.org/dev/quickstart.html) guide.
|
||||||
|
- A lot of code cleanup and bugfixes.
|
||||||
|
- Up to date list dependencies.
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
Help translate SearXNG at [Weblate](https://translate.codeberg.org/projects/searxng/searxng/)
|
||||||
|
|
||||||
|
![](https://translate.codeberg.org/widgets/searxng/-/multi-auto.svg)
|
||||||
|
|
||||||
|
# Codespaces
|
||||||
|
|
||||||
|
You can contribute from your browser using [GitHub Codespaces](https://docs.github.com/en/codespaces/overview):
|
||||||
|
|
||||||
|
- Fork the repository
|
||||||
|
- Click on the `<> Code` green button
|
||||||
|
- Click on the `Codespaces` tab instead of `Local`
|
||||||
|
- Click on `Create codespace on master`
|
||||||
|
- VSCode is going to start in the browser
|
||||||
|
- Wait for `git pull && make install` to appears and then to disapear
|
||||||
|
- You have [120 hours per month](https://github.com/settings/billing)(see also your [list of existing Codespaces](https://github.com/codespaces))
|
||||||
|
- You can start SearXNG using `make run` in the terminal or by pressing `Ctrl+Shift+B`.
|
20
apps/searxng/data.yml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
name: SearXNG
|
||||||
|
tags:
|
||||||
|
- 建站
|
||||||
|
title: 一个免费的互联网元聚合搜索引擎
|
||||||
|
type: 建站
|
||||||
|
description: 一个免费的互联网元聚合搜索引擎
|
||||||
|
additionalProperties:
|
||||||
|
key: searxng
|
||||||
|
name: SearXNG
|
||||||
|
tags:
|
||||||
|
- WebSite
|
||||||
|
shortDescZh: 一个免费的互联网元聚合搜索引擎
|
||||||
|
shortDescEn: A free internet meta-aggregator search engine
|
||||||
|
type: website
|
||||||
|
crossVersionUpdate: true
|
||||||
|
limit: 0
|
||||||
|
recommend: 0
|
||||||
|
website: https://github.com/searxng/searxng
|
||||||
|
github: https://github.com/searxng/searxng
|
||||||
|
document: https://docs.searxng.org/
|
BIN
apps/searxng/logo.png
Normal file
After Width: | Height: | Size: 4.4 KiB |
10
apps/vocechat/0.3.36/data.yml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
additionalProperties:
|
||||||
|
formFields:
|
||||||
|
- default: 40067
|
||||||
|
edit: true
|
||||||
|
envKey: PANEL_APP_PORT_HTTP
|
||||||
|
labelEn: Port
|
||||||
|
labelZh: 端口
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
18
apps/vocechat/0.3.36/docker-compose.yml
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
vocechat:
|
||||||
|
container_name: ${CONTAINER_NAME}
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
ports:
|
||||||
|
- "${PANEL_APP_PORT_HTTP}:3000"
|
||||||
|
volumes:
|
||||||
|
- "./data:/home/vocechat-server/data"
|
||||||
|
image: privoce/vocechat-server:v0.3.36
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
networks:
|
||||||
|
1panel-network:
|
||||||
|
external: true
|
77
apps/vocechat/README.md
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
# Web Client of VoceChat
|
||||||
|
|
||||||
|
<center>
|
||||||
|
<img src="https://voce.chat/apple-touch-icon.png" width="100" height="100">
|
||||||
|
</center>
|
||||||
|
<p>
|
||||||
|
<center>
|
||||||
|
|
||||||
|
[![contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/privoce/vocechat-web/issues)
|
||||||
|
![GitHub issues](https://img.shields.io/github/issues-raw/Privoce/vocechat-web) ![GitHub](https://img.shields.io/github/license/privoce/vocechat-web) ![GitHub top language](https://img.shields.io/github/languages/top/privoce/vocechat-web) ![Docker Pulls](https://img.shields.io/docker/pulls/privoce/vocechat-server)
|
||||||
|
|
||||||
|
</center>
|
||||||
|
|
||||||
|
- 🎉 Powered by React & Redux Toolkit
|
||||||
|
- ✅ Typescript
|
||||||
|
- 📦 PWA
|
||||||
|
- 📢 Notification
|
||||||
|
|
||||||
|
## Host your server! Or use our test server
|
||||||
|
|
||||||
|
- Host your own Voce server ([docker image](https://hub.docker.com/r/privoce/vocechat-server/tags)):
|
||||||
|
Run on x86_64 platform:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run -d --restart=always \
|
||||||
|
-p 3000:3000 \
|
||||||
|
--name vocechat-server \
|
||||||
|
privoce/vocechat-server:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
For more server hosting instructions, see our documentation: https://doc.voce.chat/
|
||||||
|
|
||||||
|
## Preview
|
||||||
|
|
||||||
|
- official site: https://voce.chat
|
||||||
|
- live demo: https://privoce.voce.chat/
|
||||||
|
- demo API Docs (Swagger): https://dev.voce.chat/api/swagger
|
||||||
|
|
||||||
|
- design: https://www.figma.com/file/EHnNr53kNmDWgUT86It6CH/UI
|
||||||
|
- text editor: https://plate.udecode.io/docs/installation
|
||||||
|
- markdown editor: https://nhn.github.io/tui.editor/latest/
|
||||||
|
- redux: [@reduxjs/toolkit](https://redux-toolkit.js.org/introduction/getting-started)
|
||||||
|
- indexDB wrapper: https://github.com/localForage/localForage
|
||||||
|
|
||||||
|
## Local Development
|
||||||
|
|
||||||
|
- `git clone https://github.com/Privoce/vocechat-web vocechat-web`
|
||||||
|
|
||||||
|
- `cd vocechat-web & yarn install`
|
||||||
|
|
||||||
|
- `yarn start`
|
||||||
|
|
||||||
|
- Open `localhost:3009`
|
||||||
|
|
||||||
|
### Tools Recommended
|
||||||
|
|
||||||
|
- [VS Code](https://code.visualstudio.com/) Editor Recommended
|
||||||
|
- VS Code plugins:
|
||||||
|
- [dbaeumer.vscode-eslint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint): ESLint
|
||||||
|
- [esbenp.prettier-vscode](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode): Prettier
|
||||||
|
- [dsznajder.es7-react-js-snippets](https://marketplace.visualstudio.com/items?itemName=dsznajder.es7-react-js-snippets): Extensions for React, React-Native and Redux in JS/TS with ES7+ syntax
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
[GPL v3](https://github.com/Privoce/vocechat-web/blob/main/LICENSE)
|
||||||
|
|
||||||
|
## Thanks all the contributors
|
||||||
|
|
||||||
|
<a href="https://github.com/privoce/vocechat-web/graphs/contributors">
|
||||||
|
<img src="https://contrib.rocks/image?repo=privoce/vocechat-web" />
|
||||||
|
</a>
|
||||||
|
|
||||||
|
Discuss collaboration: han@privoce.com or https://bridger.chat/han
|
||||||
|
|
||||||
|
Telegram group: https://t.me/opencfdchannel VoceChat: https://voce.chat
|
||||||
|
|
||||||
|
Telegram channel: https://t.me/vocechat_group VoceChat Channel: https://privoce.voce.chat
|
20
apps/vocechat/data.yml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
name: VoceChat
|
||||||
|
tags:
|
||||||
|
- 工具
|
||||||
|
title: 一款支持独立部署的个人云社交媒体聊天服务
|
||||||
|
type: 工具
|
||||||
|
description: 一款支持独立部署的个人云社交媒体聊天服务
|
||||||
|
additionalProperties:
|
||||||
|
key: vocechat
|
||||||
|
name: VoceChat
|
||||||
|
tags:
|
||||||
|
- Tool
|
||||||
|
shortDescZh: 一款支持独立部署的个人云社交媒体聊天服务
|
||||||
|
shortDescEn: a secure chat software that supports independent deployment
|
||||||
|
type: tool
|
||||||
|
crossVersionUpdate: true
|
||||||
|
limit: 0
|
||||||
|
recommend: 0
|
||||||
|
website: https://voce.chat
|
||||||
|
github: https://github.com/Privoce/vocechat-web
|
||||||
|
document: https://doc.voce.chat
|
BIN
apps/vocechat/logo.png
Normal file
After Width: | Height: | Size: 22 KiB |
10
apps/yesplaymusic/0.4.7/data.yml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
additionalProperties:
|
||||||
|
formFields:
|
||||||
|
- default: 40075
|
||||||
|
edit: true
|
||||||
|
envKey: PANEL_APP_PORT_HTTP
|
||||||
|
labelEn: Port
|
||||||
|
labelZh: 端口
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
16
apps/yesplaymusic/0.4.7/docker-compose.yml
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
yesplaymusic:
|
||||||
|
container_name: ${CONTAINER_NAME}
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
- 1panel-network
|
||||||
|
ports:
|
||||||
|
- "${PANEL_APP_PORT_HTTP}:80"
|
||||||
|
image: fogforest/yesplaymusic:0.4.7
|
||||||
|
labels:
|
||||||
|
createdBy: "Apps"
|
||||||
|
|
||||||
|
networks:
|
||||||
|
1panel-network:
|
||||||
|
external: true
|
260
apps/yesplaymusic/README.md
Normal file
@ -0,0 +1,260 @@
|
|||||||
|
<br />
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://music.qier222.com" target="blank">
|
||||||
|
<img src="https://github.com/qier222/YesPlayMusic/raw/master/images/logo.png" alt="Logo" width="156" height="156">
|
||||||
|
</a>
|
||||||
|
<h2 align="center" style="font-weight: 600">YesPlayMusic</h2>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
高颜值的第三方网易云播放器
|
||||||
|
<br />
|
||||||
|
<a href="https://music.qier222.com" target="blank"><strong>🌎 访问DEMO</strong></a> |
|
||||||
|
<a href="#%EF%B8%8F-安装" target="blank"><strong>📦️ 下载安装包</strong></a> |
|
||||||
|
<a href="https://t.me/yesplaymusic" target="blank"><strong>💬 加入交流群</strong></a>
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
</p>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
[![Library][library-screenshot]](https://music.qier222.com)
|
||||||
|
|
||||||
|
|
||||||
|
## 全新版本
|
||||||
|
全新2.0 Alpha测试版已发布,欢迎前往 [Releases](https://github.com/qier222/YesPlayMusic/releases) 页面下载。
|
||||||
|
当前版本将会进入维护模式,除重大bug修复外,不会再更新新功能。
|
||||||
|
|
||||||
|
## ✨ 特性
|
||||||
|
|
||||||
|
- ✅ 使用 Vue.js 全家桶开发
|
||||||
|
- 🔴 网易云账号登录(扫码/手机/邮箱登录)
|
||||||
|
- 📺 支持 MV 播放
|
||||||
|
- 📃 支持歌词显示
|
||||||
|
- 📻 支持私人 FM / 每日推荐歌曲
|
||||||
|
- 🚫🤝 无任何社交功能
|
||||||
|
- 🌎️ 海外用户可直接播放(需要登录网易云账号)
|
||||||
|
- 🔐 支持 [UnblockNeteaseMusic](https://github.com/UnblockNeteaseMusic/server#音源清单),自动使用[各类音源](https://github.com/UnblockNeteaseMusic/server#音源清单)替换变灰歌曲链接 (网页版不支持)
|
||||||
|
- 「各类音源」指默认启用的音源。
|
||||||
|
- YouTube 音源需自行安装 `yt-dlp`。
|
||||||
|
- ✔️ 每日自动签到(手机端和电脑端同时签到)
|
||||||
|
- 🌚 Light/Dark Mode 自动切换
|
||||||
|
- 👆 支持 Touch Bar
|
||||||
|
- 🖥️ 支持 PWA,可在 Chrome/Edge 里点击地址栏右边的 ➕ 安装到电脑
|
||||||
|
- 🟥 支持 Last.fm Scrobble
|
||||||
|
- ☁️ 支持音乐云盘
|
||||||
|
- ⌨️ 自定义快捷键和全局快捷键
|
||||||
|
- 🎧 支持 Mpris
|
||||||
|
- 🛠 更多特性开发中
|
||||||
|
|
||||||
|
## 📦️ 安装
|
||||||
|
|
||||||
|
Electron 版本由 [@hawtim](https://github.com/hawtim) 和 [@qier222](https://github.com/qier222) 适配并维护,支持 macOS、Windows、Linux。
|
||||||
|
|
||||||
|
访问本项目的 [Releases](https://github.com/qier222/YesPlayMusic/releases)
|
||||||
|
页面下载安装包。
|
||||||
|
|
||||||
|
- macOS 用户可以通过 Homebrew 来安装:`brew install --cask yesplaymusic`
|
||||||
|
|
||||||
|
- Windows 用户可以通过 Scoop 来安装:`scoop install extras/yesplaymusic`
|
||||||
|
|
||||||
|
## ⚙️ 部署至 Vercel
|
||||||
|
|
||||||
|
除了下载安装包使用,你还可以将本项目部署到 Vercel 或你的服务器上。下面是部署到 Vercel 的方法。
|
||||||
|
|
||||||
|
本项目的 Demo (https://music.qier222.com) 就是部署在 Vercel 上的网站。
|
||||||
|
|
||||||
|
[![Powered by Vercel](https://www.datocms-assets.com/31049/1618983297-powered-by-vercel.svg)](https://vercel.com/?utm_source=ohmusic&utm_campaign=oss)
|
||||||
|
|
||||||
|
1. 部署网易云 API,详情参见 [Binaryify/NeteaseCloudMusicApi](https://neteasecloudmusicapi.vercel.app/#/?id=%e5%ae%89%e8%a3%85)
|
||||||
|
。你也可以将 API 部署到 Vercel。
|
||||||
|
|
||||||
|
2. 点击本仓库右上角的 Fork,复制本仓库到你的 GitHub 账号。
|
||||||
|
|
||||||
|
3. 点击仓库的 Add File,选择 Create new file,输入 `vercel.json`,将下面的内容复制粘贴到文件中,并将 `https://your-netease-api.example.com` 替换为你刚刚部署的网易云 API 地址:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"rewrites": [
|
||||||
|
{
|
||||||
|
"source": "/api/:match*",
|
||||||
|
"destination": "https://your-netease-api.example.com/:match*"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
4. 打开 [Vercel.com](https://vercel.com),使用 GitHub 登录。
|
||||||
|
|
||||||
|
5. 点击 Import Git Repository 并选择你刚刚复制的仓库并点击 Import。
|
||||||
|
|
||||||
|
6. 点击 PERSONAL ACCOUNT 旁边的 Select。
|
||||||
|
|
||||||
|
7. 点击 Environment Variables,填写 Name 为 `VUE_APP_NETEASE_API_URL`,Value 为 `/api`,点击 Add。最后点击底部的 Deploy 就可以部署到
|
||||||
|
Vercel 了。
|
||||||
|
|
||||||
|
## ⚙️ 部署到自己的服务器
|
||||||
|
|
||||||
|
除了部署到 Vercel,你还可以部署到自己的服务器上
|
||||||
|
|
||||||
|
1. 部署网易云 API,详情参见 [Binaryify/NeteaseCloudMusicApi](https://github.com/Binaryify/NeteaseCloudMusicApi)
|
||||||
|
2. 克隆本仓库
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git clone --recursive https://github.com/qier222/YesPlayMusic.git
|
||||||
|
```
|
||||||
|
|
||||||
|
3. 安装依赖
|
||||||
|
|
||||||
|
```sh
|
||||||
|
yarn install
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
4. (可选)使用 Nginx 反向代理 API,将 API 路径映射为 `/api`,如果 API 和网页不在同一个域名下的话(跨域),会有一些 bug。
|
||||||
|
|
||||||
|
5. 复制 `/.env.example` 文件为 `/.env`,修改里面 `VUE_APP_NETEASE_API_URL` 的值为网易云 API 地址。本地开发的话可以填写 API 地址为 `http://localhost:3000`,YesPlayMusic 地址为 `http://localhost:8080`。如果你使用了反向代理 API,可以填写 API 地址为 `/api`。
|
||||||
|
|
||||||
|
```
|
||||||
|
VUE_APP_NETEASE_API_URL=http://localhost:3000
|
||||||
|
```
|
||||||
|
|
||||||
|
6. 编译打包
|
||||||
|
|
||||||
|
```sh
|
||||||
|
yarn run build
|
||||||
|
```
|
||||||
|
|
||||||
|
7. 将 `/dist` 目录下的文件上传到你的 Web 服务器
|
||||||
|
|
||||||
|
## ⚙️ Docker 部署
|
||||||
|
|
||||||
|
1. 构建 Docker Image
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker build -t yesplaymusic .
|
||||||
|
```
|
||||||
|
|
||||||
|
2. 启动 Docker Container
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker run -d --name YesPlayMusic -p 80:80 yesplaymusic
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Docker Compose 启动
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
YesPlayMusic 地址为 `http://localhost`
|
||||||
|
|
||||||
|
## ⚙️ 部署至 Replit
|
||||||
|
|
||||||
|
1. 新建 Repl,选择 Bash 模板
|
||||||
|
|
||||||
|
2. 在 Replit shell 中运行以下命令
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bash <(curl -s -L https://raw.githubusercontent.com/qier222/YesPlayMusic/main/install-replit.sh)
|
||||||
|
```
|
||||||
|
|
||||||
|
3. 首次运行成功后,只需点击绿色按钮 `Run` 即可再次运行
|
||||||
|
|
||||||
|
4. 由于 replit 个人版限制内存为 1G(教育版为 3G),构建过程中可能会失败,请再次运行上述命令或运行以下命令:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd /home/runner/${REPL_SLUG}/music && yarn installl && yarn run build
|
||||||
|
```
|
||||||
|
|
||||||
|
## 👷♂️ 打包客户端
|
||||||
|
|
||||||
|
如果在 Release 页面没有找到适合你的设备的安装包的话,你可以根据下面的步骤来打包自己的客户端。
|
||||||
|
|
||||||
|
1. 打包 Electron 需要用到 Node.js 和 Yarn。可前往 [Node.js 官网](https://nodejs.org/zh-cn/) 下载安装包。安装 Node.js
|
||||||
|
后可在终端里执行 `npm install -g yarn` 来安装 Yarn。
|
||||||
|
|
||||||
|
2. 使用 `git clone --recursive https://github.com/qier222/YesPlayMusic.git` 克隆本仓库到本地。
|
||||||
|
|
||||||
|
3. 使用 `yarn install` 安装项目依赖。
|
||||||
|
|
||||||
|
4. 复制 `/.env.example` 文件为 `/.env` 。
|
||||||
|
|
||||||
|
5. 选择下列表格的命令来打包适合的你的安装包,打包出来的文件在 `/dist_electron` 目录下。了解更多信息可访问 [electron-builder 文档](https://www.electron.build/cli)
|
||||||
|
|
||||||
|
| 命令 | 说明 |
|
||||||
|
| ------------------------------------------ | ------------------------- |
|
||||||
|
| `yarn electron:build --windows nsis:ia32` | Windows 32 位 |
|
||||||
|
| `yarn electron:build --windows nsis:arm64` | Windows ARM |
|
||||||
|
| `yarn electron:build --linux deb:armv7l` | Debian armv7l(树莓派等) |
|
||||||
|
| `yarn electron:build --macos dir:arm64` | macOS ARM |
|
||||||
|
|
||||||
|
## :computer: 配置开发环境
|
||||||
|
|
||||||
|
本项目由 [NeteaseCloudMusicApi](https://github.com/Binaryify/NeteaseCloudMusicApi) 提供 API。
|
||||||
|
|
||||||
|
运行本项目
|
||||||
|
|
||||||
|
```shell
|
||||||
|
# 安装依赖
|
||||||
|
yarn install
|
||||||
|
|
||||||
|
# 创建本地环境变量
|
||||||
|
cp .env.example .env
|
||||||
|
|
||||||
|
# 运行(网页端)
|
||||||
|
yarn serve
|
||||||
|
|
||||||
|
# 运行(electron)
|
||||||
|
yarn electron:serve
|
||||||
|
```
|
||||||
|
|
||||||
|
本地运行 NeteaseCloudMusicApi,或者将 API [部署至 Vercel](#%EF%B8%8F-部署至-vercel)
|
||||||
|
|
||||||
|
```shell
|
||||||
|
# 运行 API (默认 3000 端口)
|
||||||
|
yarn netease_api:run
|
||||||
|
```
|
||||||
|
|
||||||
|
## ☑️ Todo
|
||||||
|
|
||||||
|
查看 Todo 请访问本项目的 [Projects](https://github.com/qier222/YesPlayMusic/projects/1)
|
||||||
|
|
||||||
|
欢迎提 Issue 和 Pull request。
|
||||||
|
|
||||||
|
## 📜 开源许可
|
||||||
|
|
||||||
|
本项目仅供个人学习研究使用,禁止用于商业及非法用途。
|
||||||
|
|
||||||
|
基于 [MIT license](https://opensource.org/licenses/MIT) 许可进行开源。
|
||||||
|
|
||||||
|
## 灵感来源
|
||||||
|
|
||||||
|
API 源代码来自 [Binaryify/NeteaseCloudMusicApi](https://github.com/Binaryify/NeteaseCloudMusicApi)
|
||||||
|
|
||||||
|
- [Apple Music](https://music.apple.com)
|
||||||
|
- [YouTube Music](https://music.youtube.com)
|
||||||
|
- [Spotify](https://www.spotify.com)
|
||||||
|
- [网易云音乐](https://music.163.com)
|
||||||
|
|
||||||
|
## 🖼️ 截图
|
||||||
|
|
||||||
|
![lyrics][lyrics-screenshot]
|
||||||
|
![library-dark][library-dark-screenshot]
|
||||||
|
![album][album-screenshot]
|
||||||
|
![home-2][home-2-screenshot]
|
||||||
|
![artist][artist-screenshot]
|
||||||
|
![search][search-screenshot]
|
||||||
|
![home][home-screenshot]
|
||||||
|
![explore][explore-screenshot]
|
||||||
|
|
||||||
|
<!-- MARKDOWN LINKS & IMAGES -->
|
||||||
|
<!-- https://www.markdownguide.org/basic-syntax/#reference-style-links -->
|
||||||
|
|
||||||
|
[album-screenshot]: https://github.com/qier222/YesPlayMusic/raw/master/images/album.png
|
||||||
|
[artist-screenshot]: https://github.com/qier222/YesPlayMusic/raw/master/images/artist.png
|
||||||
|
[explore-screenshot]: https://github.com/qier222/YesPlayMusic/raw/master/images/explore.png
|
||||||
|
[home-screenshot]: https://github.com/qier222/YesPlayMusic/raw/master/images/home.png
|
||||||
|
[home-2-screenshot]: https://github.com/qier222/YesPlayMusic/raw/master/images/home-2.png
|
||||||
|
[lyrics-screenshot]: https://github.com/qier222/YesPlayMusic/raw/master/images/lyrics.png
|
||||||
|
[library-screenshot]: https://github.com/qier222/YesPlayMusic/raw/master/images/library.png
|
||||||
|
[library-dark-screenshot]: https://github.com/qier222/YesPlayMusic/raw/master/images/library-dark.png
|
||||||
|
[search-screenshot]: https://github.com/qier222/YesPlayMusic/raw/master/images/search.png
|
20
apps/yesplaymusic/data.yml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
name: YesPlayMusic
|
||||||
|
tags:
|
||||||
|
- 工具
|
||||||
|
title: 一款高颜值的第三方网易云播放器
|
||||||
|
type: 工具
|
||||||
|
description: 一款高颜值的第三方网易云播放器
|
||||||
|
additionalProperties:
|
||||||
|
key: yesplaymusic
|
||||||
|
name: YesPlayMusic
|
||||||
|
tags:
|
||||||
|
- Tool
|
||||||
|
shortDescZh: 一款高颜值的第三方网易云播放器
|
||||||
|
shortDescEn: A high-end third-party NetEase cloud player
|
||||||
|
type: tool
|
||||||
|
crossVersionUpdate: true
|
||||||
|
limit: 0
|
||||||
|
recommend: 0
|
||||||
|
website: https://music.qier222.com/
|
||||||
|
github: https://github.com/qier222/YesPlayMusic
|
||||||
|
document: https://github.com/qier222/YesPlayMusic
|
BIN
apps/yesplaymusic/logo.png
Normal file
After Width: | Height: | Size: 23 KiB |
87
apps/yourls/1.9.2/data.yml
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
additionalProperties:
|
||||||
|
formFields:
|
||||||
|
- child:
|
||||||
|
default: ""
|
||||||
|
envKey: PANEL_DB_HOST
|
||||||
|
labelEn: Database Service
|
||||||
|
labelZh: 数据库服务
|
||||||
|
required: true
|
||||||
|
type: service
|
||||||
|
default: mysql
|
||||||
|
labelEn: Database Service
|
||||||
|
labelZh: 数据库服务
|
||||||
|
params:
|
||||||
|
- envKey: YOURLS_DB_PORT
|
||||||
|
key: mysql
|
||||||
|
type: param
|
||||||
|
value: "3306"
|
||||||
|
- envKey: YOURLS_DB_PORT
|
||||||
|
key: postgresql
|
||||||
|
type: param
|
||||||
|
value: "5432"
|
||||||
|
required: true
|
||||||
|
type: apps
|
||||||
|
values:
|
||||||
|
- label: MySQL
|
||||||
|
value: mysql
|
||||||
|
- default: yourls
|
||||||
|
envKey: PANEL_DB_NAME
|
||||||
|
labelEn: Database
|
||||||
|
labelZh: 数据库名
|
||||||
|
random: true
|
||||||
|
required: true
|
||||||
|
rule: paramCommon
|
||||||
|
type: text
|
||||||
|
- default: yourls
|
||||||
|
envKey: PANEL_DB_USER
|
||||||
|
labelEn: User
|
||||||
|
labelZh: 数据库用户
|
||||||
|
random: true
|
||||||
|
required: true
|
||||||
|
rule: paramCommon
|
||||||
|
type: text
|
||||||
|
- default: yourls
|
||||||
|
envKey: PANEL_DB_USER_PASSWORD
|
||||||
|
labelEn: Password
|
||||||
|
labelZh: 数据库用户密码
|
||||||
|
random: true
|
||||||
|
required: true
|
||||||
|
rule: paramComplexity
|
||||||
|
type: password
|
||||||
|
- default: yourls_
|
||||||
|
envKey: PANEL_DB_PREFIX
|
||||||
|
labelEn: Database prefix
|
||||||
|
labelZh: 数据库前缀
|
||||||
|
required: true
|
||||||
|
type: text
|
||||||
|
- default: 40037
|
||||||
|
edit: true
|
||||||
|
envKey: PANEL_APP_PORT_HTTP
|
||||||
|
labelEn: Port
|
||||||
|
labelZh: 端口
|
||||||
|
required: true
|
||||||
|
rule: paramPort
|
||||||
|
type: number
|
||||||
|
- default: yourls
|
||||||
|
envKey: USERNAME
|
||||||
|
labelEn: User
|
||||||
|
labelZh: 用户
|
||||||
|
random: true
|
||||||
|
required: true
|
||||||
|
rule: paramCommon
|
||||||
|
type: text
|
||||||
|
- default: yourls
|
||||||
|
envKey: PASSWORD
|
||||||
|
labelEn: Password
|
||||||
|
labelZh: 用户密码
|
||||||
|
random: true
|
||||||
|
required: true
|
||||||
|
rule: paramComplexity
|
||||||
|
type: password
|
||||||
|
- default: http://localhost:40037
|
||||||
|
edit: true
|
||||||
|
envKey: YOURLS_EXTERNAL_URL
|
||||||
|
labelEn: External URL
|
||||||
|
labelZh: 外部访问地址
|
||||||
|
required: true
|
||||||
|
type: text
|