From acd7bd7c11fa2cdd293269ba1a35e7c07d891d80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=BE=E5=A8=81?= Date: Wed, 8 Mar 2023 18:49:37 +0800 Subject: [PATCH] first commit --- .gitignore | 3 + .vscode/settings.json | 3 + README.md | 21 + app.md | 62 +++ cloudreve/cloudreve/cloudreve.db | 0 cloudreve/cloudreve/conf.ini | 0 cloudreve/docker-compose.yml | 33 ++ cloudreve/readme.md | 2 + crawlab/docker-compose.bak.yml | 77 ++++ crawlab/docker-compose.yml | 29 ++ dnsmasq/dnsmasq_hosts | 41 ++ dnsmasq/docker-compose.yml | 20 + dnsmasq/readme.md | 5 + dnsmasq/resolv.dnsmasq | 2 + drone/README.md | 31 ++ drone/docker-compose-gitlab.yml | 64 +++ drone/docker-compose.yml | 63 +++ drone/settings.xml | 15 + fast-poster/docker-compose.yml | 19 + gitea/docker-compose.yml | 43 ++ gitea/readme.md | 8 + gitlab-runner/docker-compose.yml | 13 + gitlab-runner/readme.md | 6 + gitlab/docker-compose.yml | 24 + gitlab/readme.md | 8 + grafana/docker-compose.yml | 23 + grafana/readme.md | 5 + harbor/readme.md | 123 +++++ influxdb/docker-compose.yml | 58 +++ influxdb/readme.md | 1 + mongodb/docker-compose.yml | 30 ++ moodle/docker-compose.yml | 45 ++ moodle/readme.md | 3 + mysql/docker-compose.yml | 14 + mysql/etc/my.cnf | 48 ++ nexus/docker-compose.yml | 11 + nexus/readme.md | 6 + nginx/data/conf.d/cloudreve.conf | 18 + nginx/data/conf.d/crawlab.conf | 18 + nginx/data/conf.d/drone.conf | 18 + nginx/data/conf.d/fast-poster.conf | 18 + nginx/data/conf.d/gitea.conf | 18 + nginx/data/conf.d/gitlab.conf | 18 + nginx/data/conf.d/grafana.conf | 18 + nginx/data/conf.d/harbor.conf | 18 + nginx/data/conf.d/home-assistant.conf | 18 + nginx/data/conf.d/mongo-express.conf | 18 + nginx/data/conf.d/moodle.conf | 18 + nginx/data/conf.d/nexus.conf | 18 + nginx/data/conf.d/portainer.conf | 18 + nginx/data/conf.d/postgresql-adminer.conf | 18 + nginx/data/conf.d/sonarqube.conf | 18 + nginx/data/conf.d/uptime-kuma.conf | 23 + nginx/data/conf/nginx.conf | 63 +++ nginx/docker-compose.yml | 50 +++ nginx/readme.md | 1 + nginx/ssl/certificate.crt | 32 ++ nginx/ssl/certificate.pfx | Bin 0 -> 2993 bytes nginx/ssl/chain.crt | 30 ++ nginx/ssl/chain_old.crt | 31 ++ nginx/ssl/detail.txt | 28 ++ nginx/ssl/fullchain.crt | 63 +++ nginx/ssl/private.pem | 28 ++ nginx/ssl/public.pem | 9 + nginx/test.sh | 18 + online_drone/README.md | 31 ++ online_drone/docker-compose.yml | 63 +++ online_drone/settings.xml | 15 + online_gitea/docker-compose.yml | 28 ++ online_gitea/readme.md | 5 + pgadmin/docker-compose.yml | 13 + portainer/docker-compose.yml | 12 + postgresql/docker-compose.yml | 19 + prometheus/docker-compose.yml | 38 ++ prometheus/prometheus/prometheus.yml | 27 ++ prometheus/readme.md | 11 + redis/conf/redis.conf | 423 ++++++++++++++++++ redis/docker-compose.yml | 14 + redis/start.sh | 13 + redis/stop.sh | 13 + sonarqube/README.md | 35 ++ sonarqube/docker-compose.yml | 41 ++ .../extensions/sonar-l10n-zh-plugin-9.8.jar | Bin 0 -> 69316 bytes telegraf/docker-compose.yml | 18 + uptime-kuma/docker-compose.yml | 11 + uptime-kuma/readme.md | 5 + uptime-kuma/uptime-kuma/error.log | 204 +++++++++ 87 files changed, 2644 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/settings.json create mode 100644 README.md create mode 100644 app.md create mode 100644 cloudreve/cloudreve/cloudreve.db create mode 100644 cloudreve/cloudreve/conf.ini create mode 100644 cloudreve/docker-compose.yml create mode 100644 cloudreve/readme.md create mode 100644 crawlab/docker-compose.bak.yml create mode 100644 crawlab/docker-compose.yml create mode 100644 dnsmasq/dnsmasq_hosts create mode 100644 dnsmasq/docker-compose.yml create mode 100644 dnsmasq/readme.md create mode 100644 dnsmasq/resolv.dnsmasq create mode 100644 drone/README.md create mode 100644 drone/docker-compose-gitlab.yml create mode 100644 drone/docker-compose.yml create mode 100644 drone/settings.xml create mode 100644 fast-poster/docker-compose.yml create mode 100644 gitea/docker-compose.yml create mode 100644 gitea/readme.md create mode 100644 gitlab-runner/docker-compose.yml create mode 100644 gitlab-runner/readme.md create mode 100644 gitlab/docker-compose.yml create mode 100644 gitlab/readme.md create mode 100644 grafana/docker-compose.yml create mode 100644 grafana/readme.md create mode 100644 harbor/readme.md create mode 100644 influxdb/docker-compose.yml create mode 100644 influxdb/readme.md create mode 100644 mongodb/docker-compose.yml create mode 100644 moodle/docker-compose.yml create mode 100644 moodle/readme.md create mode 100644 mysql/docker-compose.yml create mode 100644 mysql/etc/my.cnf create mode 100644 nexus/docker-compose.yml create mode 100644 nexus/readme.md create mode 100644 nginx/data/conf.d/cloudreve.conf create mode 100644 nginx/data/conf.d/crawlab.conf create mode 100644 nginx/data/conf.d/drone.conf create mode 100644 nginx/data/conf.d/fast-poster.conf create mode 100644 nginx/data/conf.d/gitea.conf create mode 100644 nginx/data/conf.d/gitlab.conf create mode 100644 nginx/data/conf.d/grafana.conf create mode 100644 nginx/data/conf.d/harbor.conf create mode 100644 nginx/data/conf.d/home-assistant.conf create mode 100644 nginx/data/conf.d/mongo-express.conf create mode 100644 nginx/data/conf.d/moodle.conf create mode 100644 nginx/data/conf.d/nexus.conf create mode 100644 nginx/data/conf.d/portainer.conf create mode 100644 nginx/data/conf.d/postgresql-adminer.conf create mode 100644 nginx/data/conf.d/sonarqube.conf create mode 100644 nginx/data/conf.d/uptime-kuma.conf create mode 100644 nginx/data/conf/nginx.conf create mode 100644 nginx/docker-compose.yml create mode 100644 nginx/readme.md create mode 100644 nginx/ssl/certificate.crt create mode 100644 nginx/ssl/certificate.pfx create mode 100644 nginx/ssl/chain.crt create mode 100644 nginx/ssl/chain_old.crt create mode 100644 nginx/ssl/detail.txt create mode 100644 nginx/ssl/fullchain.crt create mode 100644 nginx/ssl/private.pem create mode 100644 nginx/ssl/public.pem create mode 100644 nginx/test.sh create mode 100644 online_drone/README.md create mode 100644 online_drone/docker-compose.yml create mode 100644 online_drone/settings.xml create mode 100644 online_gitea/docker-compose.yml create mode 100644 online_gitea/readme.md create mode 100644 pgadmin/docker-compose.yml create mode 100644 portainer/docker-compose.yml create mode 100644 postgresql/docker-compose.yml create mode 100644 prometheus/docker-compose.yml create mode 100644 prometheus/prometheus/prometheus.yml create mode 100644 prometheus/readme.md create mode 100644 redis/conf/redis.conf create mode 100644 redis/docker-compose.yml create mode 100644 redis/start.sh create mode 100644 redis/stop.sh create mode 100644 sonarqube/README.md create mode 100644 sonarqube/docker-compose.yml create mode 100644 sonarqube/extensions/sonar-l10n-zh-plugin-9.8.jar create mode 100644 telegraf/docker-compose.yml create mode 100644 uptime-kuma/docker-compose.yml create mode 100644 uptime-kuma/readme.md create mode 100644 uptime-kuma/uptime-kuma/error.log diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e22b35c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ + +/harbor/harbor-offline-installer-v2.7.0.tgz +/uptime-kuma/uptime-kuma/kuma* \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..30de70f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "editor.acceptSuggestionOnEnter": "on" +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..34436ed --- /dev/null +++ b/README.md @@ -0,0 +1,21 @@ +使用switchHosts做本地dns解析,启动时,需要使用管理员身份 + +harbor中的nginx端口使用非80端口,目前使用的是6080 + +# ubuntu系统启用root用户远程登陆 + +[ubuntu系统启用root用户远程登录](http://t.zoukankan.com/weifeng1463-p-15293210.html) + +# 私人网盘:cloudreve + +https://docs.cloudreve.org/getting-started/install + +# docker配置国内源 + +https://blog.csdn.net/gengkui9897/article/details/127348289 + + + +# maven私有仓库 nexus + +[(115条消息) DockerCompose - 部署 Nexus 私服_docker-compose nexus_云原生.乔豆麻袋.cn的博客-CSDN博客](https://blog.csdn.net/qiaohao0206/article/details/125471721) diff --git a/app.md b/app.md new file mode 100644 index 0000000..b904638 --- /dev/null +++ b/app.md @@ -0,0 +1,62 @@ +1. Active Directory Domain Admin +2. Google Workspace Admin Console +3. GitLab +4. Liferay TFS +5. Smartfind Express +6. SLO/LEAP FE +7. Tririga +8. Moodle +9. Oracle MHC Document Express +10. MHC DSS +11. Filenexus +12. Lawson ADFS Integration +13. eDoc +14. Serv-U (FTP) +15. SchoolBooks +16. TaxFactory +17. Azure/VIsual Studio/Microsoft +18. PowerBi/SSRS Reporting Server +19. Kinsey Clever Schoology +20. Illuminate +21. Seesaw +22. SchoolMessenger +23. Schoolmint/Whetstone +24. SchoolMint/SchoolChoice +25. Istation I-Ready +26. Azure/Intune/Office 365 +27. Mosyle AWS/App Stream +28. Apple DEP +29. Apple Classroom Manager +30. Adobe Admin Console +31. Lucid Admin Console Confluence +32. Jira +33. DBA’s and IC Super User +34. Lawson/Infor Super User +35. Enrich +36. Tangara +37. Specified Security applications +38. Tenable SC +39. And other applications as defined. + + +## 更多项目 + +### 基于模板的word生成 + +[https://github.com/Sayi/poi-tl](https://github.com/Sayi/poi-tl) + +### 海报生成(中文) + +[https://github.com/psoho/fast-poster](https://github.com/psoho/fast-poster) + +### 可视化HTML编辑 + +[https://github.com/GrapesJS/grapesjs](https://github.com/GrapesJS/grapesjs) + +### 工作流 + +[https://docs.camunda.org/manual/7.15/](https://docs.camunda.org/manual/7.15/) + +### 工作流可视化 + +[https://bpmn.io/](https://bpmn.io/) diff --git a/cloudreve/cloudreve/cloudreve.db b/cloudreve/cloudreve/cloudreve.db new file mode 100644 index 0000000..e69de29 diff --git a/cloudreve/cloudreve/conf.ini b/cloudreve/cloudreve/conf.ini new file mode 100644 index 0000000..e69de29 diff --git a/cloudreve/docker-compose.yml b/cloudreve/docker-compose.yml new file mode 100644 index 0000000..02cc3e5 --- /dev/null +++ b/cloudreve/docker-compose.yml @@ -0,0 +1,33 @@ +version: "3.8" +services: + cloudreve: + container_name: cloudreve + image: cloudreve/cloudreve:latest + restart: unless-stopped + ports: + - "5212:5212" + volumes: + - temp_data:/data + - ./cloudreve/uploads:/cloudreve/uploads + - ./cloudreve/conf.ini:/cloudreve/conf.ini + - ./cloudreve/cloudreve.db:/cloudreve/cloudreve.db + - ./cloudreve/avatar:/cloudreve/avatar + depends_on: + - aria2 + aria2: + container_name: aria2 + image: p3terx/aria2-pro + restart: unless-stopped + environment: + - RPC_SECRET=your_aria_rpc_token + - RPC_PORT=6800 + volumes: + - ./aria2/config:/config + - temp_data:/data +volumes: + temp_data: + driver: local + driver_opts: + type: none + device: $PWD/data + o: bind diff --git a/cloudreve/readme.md b/cloudreve/readme.md new file mode 100644 index 0000000..df38c3c --- /dev/null +++ b/cloudreve/readme.md @@ -0,0 +1,2 @@ +[Info] 2023-01-27 17:52:26 Admin user name: admin@cloudreve.org +[Info] 2023-01-27 17:52:26 Admin password: 6opLNrQt diff --git a/crawlab/docker-compose.bak.yml b/crawlab/docker-compose.bak.yml new file mode 100644 index 0000000..6389359 --- /dev/null +++ b/crawlab/docker-compose.bak.yml @@ -0,0 +1,77 @@ +version: '3.3' +services: + master: + image: tikazyq/crawlab:latest + container_name: master + ports: + - "8080:8080" # frontend port mapping 前端端口映射 + depends_on: + - mongo + - redis + volumes: + - "./master/log:/var/logs/crawlab" # log persistent 日志持久化 + environment: + # CRAWLAB_API_ADDRESS: "https://:" # backend API address 后端 API 地址. 适用于 https 或者源码部署 + CRAWLAB_SERVER_MASTER: "Y" # whether to be master node 是否为主节点,主节点为 Y,工作节点为 N + CRAWLAB_MONGO_HOST: "mongo" # MongoDB host address MongoDB 的地址,在 docker compose 网络中,直接引用服务名称 + # CRAWLAB_MONGO_PORT: "27017" # MongoDB port MongoDB 的端口 + # CRAWLAB_MONGO_DB: "crawlab_test" # MongoDB database MongoDB 的数据库 + # CRAWLAB_MONGO_USERNAME: "username" # MongoDB username MongoDB 的用户名 + # CRAWLAB_MONGO_PASSWORD: "password" # MongoDB password MongoDB 的密码 + # CRAWLAB_MONGO_AUTHSOURCE: "admin" # MongoDB auth source MongoDB 的验证源 + CRAWLAB_REDIS_ADDRESS: "redis" # Redis host address Redis 的地址,在 docker compose 网络中,直接引用服务名称 + # CRAWLAB_REDIS_PORT: "6379" # Redis port Redis 的端口 + # CRAWLAB_REDIS_DATABASE: "1" # Redis database Redis 的数据库 + # CRAWLAB_REDIS_PASSWORD: "password" # Redis password Redis 的密码 + # CRAWLAB_LOG_LEVEL: "info" # log level 日志级别. 默认为 info + # CRAWLAB_LOG_ISDELETEPERIODICALLY: "N" # whether to periodically delete log files 是否周期性删除日志文件. 默认不删除 + # CRAWLAB_LOG_DELETEFREQUENCY: "@hourly" # frequency of deleting log files 删除日志文件的频率. 默认为每小时 + # CRAWLAB_SERVER_REGISTER_TYPE: "mac" # node register type 节点注册方式. 默认为 mac 地址,也可设置为 ip(防止 mac 地址冲突) + # CRAWLAB_SERVER_REGISTER_IP: "127.0.0.1" # node register ip 节点注册IP. 节点唯一识别号,只有当 CRAWLAB_SERVER_REGISTER_TYPE 为 "ip" 时才生效 + # CRAWLAB_TASK_WORKERS: 8 # number of task executors 任务执行器个数(并行执行任务数) + # CRAWLAB_RPC_WORKERS: 16 # number of RPC workers RPC 工作协程个数 + # CRAWLAB_SERVER_LANG_NODE: "Y" # whether to pre-install Node.js 预安装 Node.js 语言环境 + # CRAWLAB_SERVER_LANG_JAVA: "Y" # whether to pre-install Java 预安装 Java 语言环境 + # CRAWLAB_SETTING_ALLOWREGISTER: "N" # whether to allow user registration 是否允许用户注册 + # CRAWLAB_SETTING_ENABLETUTORIAL: "N" # whether to enable tutorial 是否启用教程 + # CRAWLAB_NOTIFICATION_MAIL_SERVER: smtp.exmaple.com # STMP server address STMP 服务器地址 + # CRAWLAB_NOTIFICATION_MAIL_PORT: 465 # STMP server port STMP 服务器端口 + # CRAWLAB_NOTIFICATION_MAIL_SENDEREMAIL: admin@exmaple.com # sender email 发送者邮箱 + # CRAWLAB_NOTIFICATION_MAIL_SENDERIDENTITY: admin@exmaple.com # sender ID 发送者 ID + # CRAWLAB_NOTIFICATION_MAIL_SMTP_USER: username # SMTP username SMTP 用户名 + # CRAWLAB_NOTIFICATION_MAIL_SMTP_PASSWORD: password # SMTP password SMTP 密码 + worker: + image: tikazyq/crawlab:latest + container_name: worker + environment: + CRAWLAB_SERVER_MASTER: "N" + CRAWLAB_MONGO_HOST: "mongo" + CRAWLAB_REDIS_ADDRESS: "redis" + depends_on: + - mongo + - redis + # environment: + # MONGO_INITDB_ROOT_USERNAME: username + # MONGO_INITDB_ROOT_PASSWORD: password + volumes: + - "./worker/log:/var/logs/crawlab" # log persistent 日志持久化 + mongo: + image: mongo:latest + restart: always + volumes: + - "./mongo/data/db:/data/db" # make data persistent 持久化 + # ports: + # - "27017:27017" # expose port to host machine 暴露接口到宿主机 + redis: + image: redis:latest + restart: always + # command: redis-server --requirepass "password" # set redis password 设置 Redis 密码 + volumes: + - "./redis/data:/data" # make data persistent 持久化 + # ports: + # - "6379:6379" # expose port to host machine 暴露接口到宿主机 + # splash: # use Splash to run spiders on dynamic pages + # image: scrapinghub/splash + # container_name: splash + # ports: + # - "8050:8050" \ No newline at end of file diff --git a/crawlab/docker-compose.yml b/crawlab/docker-compose.yml new file mode 100644 index 0000000..086b9ad --- /dev/null +++ b/crawlab/docker-compose.yml @@ -0,0 +1,29 @@ +version: '3.3' +services: + master: + image: crawlabteam/crawlab + container_name: crawlab-master + ports: + - "8080:8080" # frontend port mapping 前端端口映射 + depends_on: + - crawlab-mongo + volumes: + - "./master:/data" + environment: + CRAWLAB_NODE_MASTER: "Y" # Y: 主节点 + CRAWLAB_MONGO_HOST: "crawlab-mongo" # mongo host address. 在 Docker-Compose 网络中,直接引用 service 名称 + CRAWLAB_MONGO_PORT: "27017" # mongo port + CRAWLAB_MONGO_DB: "crawlab" # mongo database + CRAWLAB_MONGO_USERNAME: "username" # mongo username + CRAWLAB_MONGO_PASSWORD: "password" # mongo password + CRAWLAB_MONGO_AUTHSOURCE: "admin" # mongo auth source + crawlab-mongo: + image: mongo:4.2 + container_name: crawlab-mongo + environment: + MONGO_INITDB_ROOT_USERNAME: "username" # mongo username + MONGO_INITDB_ROOT_PASSWORD: "password" # mongo password + volumes: + - "./mongo/data/db:/data/db" # 持久化 mongo 数据 + # ports: + # - "27017:27017" # 开放 mongo 端口到宿主机 \ No newline at end of file diff --git a/dnsmasq/dnsmasq_hosts b/dnsmasq/dnsmasq_hosts new file mode 100644 index 0000000..c90436c --- /dev/null +++ b/dnsmasq/dnsmasq_hosts @@ -0,0 +1,41 @@ +192.168.31.249 portainer.test.com +192.168.31.249 portainer.local.com +192.168.31.249 cloudreve.local.com +192.168.31.249 gitlab.local.com +192.168.31.249 drone.local.com +192.168.31.249 harbor.local.com +192.168.31.249 homeassistant.local.com +192.168.31.249 mongodb.local.com +192.168.31.249 mysql.local.com +192.168.31.249 uptime-kuma.local.com +192.168.31.249 crawlab.local.com +192.168.31.249 portainer.windymuse.site +192.168.31.249 cloudreve.windymuse.site +192.168.31.249 gitlab.windymuse.site +192.168.31.249 drone.windymuse.site +192.168.31.249 harbor.windymuse.site +192.168.31.249 homeassistant.windymuse.site +192.168.31.249 mongodb.windymuse.site +192.168.31.249 mysql.windymuse.site +192.168.31.249 uptime-kuma.windymuse.site +192.168.31.249 crawlab.windymuse.site +192.168.31.249 portainer.windymuse.top +192.168.31.249 cloudreve.windymuse.top +192.168.31.249 gitlab.windymuse.top +192.168.31.249 drone.windymuse.top +192.168.31.249 harbor.windymuse.top +192.168.31.249 homeassistant.windymuse.top +192.168.31.249 mongodb.windymuse.top +192.168.31.249 mysql.windymuse.top +192.168.31.249 uptime-kuma.windymuse.top +192.168.31.249 crawlab.windymuse.top +192.168.31.249 portainer.windymuse.fun +192.168.31.249 cloudreve.windymuse.fun +192.168.31.249 gitlab.windymuse.fun +192.168.31.249 drone.windymuse.fun +192.168.31.249 harbor.windymuse.fun +192.168.31.249 homeassistant.windymuse.fun +192.168.31.249 mongodb.windymuse.fun +192.168.31.249 mysql.windymuse.fun +192.168.31.249 uptime-kuma.windymuse.fun +192.168.31.249 crawlab.windymuse.fun diff --git a/dnsmasq/docker-compose.yml b/dnsmasq/docker-compose.yml new file mode 100644 index 0000000..bfffe75 --- /dev/null +++ b/dnsmasq/docker-compose.yml @@ -0,0 +1,20 @@ +version: '2' +services: + registry: + image: jpillora/dnsmasq + # image: andyshinn/dnsmasq:latest + container_name: my_dns_server + restart: always + tty: true + cap_add: + - NET_ADMIN + ports: + - 192.168.31.249:53:53/tcp + - 192.168.31.249:53:53/udp + - 8090:8080 + environment: + - HTTP_USER=admin + - HTTP_PASS=123456 + volumes: + - ./dnsmasq_hosts:/etc/my_dnsmasq_hosts + - ./resolv.dnsmasq:/etc/my_resolv.dnsmasq diff --git a/dnsmasq/readme.md b/dnsmasq/readme.md new file mode 100644 index 0000000..89ebf48 --- /dev/null +++ b/dnsmasq/readme.md @@ -0,0 +1,5 @@ +https://www.jianshu.com/p/6f9203ace607 + + + +https://dandelioncloud.cn/article/details/1596683573434466305 diff --git a/dnsmasq/resolv.dnsmasq b/dnsmasq/resolv.dnsmasq new file mode 100644 index 0000000..f5d24a1 --- /dev/null +++ b/dnsmasq/resolv.dnsmasq @@ -0,0 +1,2 @@ +nameserver 114.114.114.114 +nameserver 8.8.8.8 diff --git a/drone/README.md b/drone/README.md new file mode 100644 index 0000000..1038ed9 --- /dev/null +++ b/drone/README.md @@ -0,0 +1,31 @@ +# 基于gitlab的drone部署 + +[GitLab | Drone](https://docs.drone.io/server/provider/gitlab/) + +[基于gitlab的drone的搭建和使用 - 系统运维 - 亿速云 (yisu.com)](https://www.yisu.com/zixun/15849.html) + +# drone的pipeline quickstart + +[Docker Pipelines | Drone](https://docs.drone.io/quickstart/docker/) + +# drone 部署 springboot + +[(101条消息) Drone CI/CD系列(三)——java语言(Springboot)之配置.drone.yml文件_Juinjonn的博客-CSDN博客_drone springboot](https://blog.csdn.net/Bert_Chen/article/details/123611752) + +# 基于gitea的部署 + +https://docs.drone.io/server/provider/gitea/ + +# 解决settings页面没有Trusted的问题 + +https://blog.csdn.net/qq_35425070/article/details/106822191 + +# [gitea & drone webhook推送不成功](https://www.cnblogs.com/shiningrise/p/16944140.html) + +https://www.cnblogs.com/shiningrise/p/16944140.html + + + +# Maven 项目使用 Drone 实现 CI/CD(含镜像源配置) + +https://www.jianshu.com/p/65bdd465a5b2 diff --git a/drone/docker-compose-gitlab.yml b/drone/docker-compose-gitlab.yml new file mode 100644 index 0000000..fca2113 --- /dev/null +++ b/drone/docker-compose-gitlab.yml @@ -0,0 +1,64 @@ +# https://www.yisu.com/zixun/15849.html +# https://docs.drone.io/server/provider/gitlab/ +version: '3' +services: + drone-server: + restart: always ## 容器自动重启 + image: drone/drone:2 + container_name: drone-server-cloudnative + networks: ## 使用自定义网络,也可以不写 + - drone-net-cloudnative + ports: + - "9901:80" ## 映射到宿主机的端口 + volumes: + - ./data:/var/lib/drone + environment: + - DRONE_SERVER_HOST=192.168.31.249:9901 ## 端口需要和映射至宿主机的一致 + - DRONE_SERVER_PROTO=http + - DRONE_RPC_SECRET=7e52616bc93b86d114f95de534011d82 ## openssl rand -hex 16 自动生成 + + # true 表示允许注册,false 表示关闭注册功能,此时只有 DRONE_ADMIN 中指定的账户才能登录 + - DRONE_OPEN=true + # Drone 外网地址 + - DRONE_HOST=https://drone.windymuse.site + # - DRONE_HOST=http://192.168.31.249:9901 + # 使用 GitLab + - DRONE_GITLAB=true + # GitLab 的 Client ID + - DRONE_GITLAB_CLIENT_ID=193b8ca7beee9bcaa5dd8540e85e0f967d94177a1b4956648c25a15f380a9cad + # GitLab 的 Secret + - DRONE_GITLAB_CLIENT_SECRET=103071657036dfacb44dedb049a2fd4a3cf874f16a4cf7af352641cf44edda61 + # GitLab 的 URL + - DRONE_GITLAB_SERVER=http://192.168.31.249:8929 + # 设置admin权限,以使用Trusted功能 + # https://blog.csdn.net/qq_35425070/article/details/106822146 + # https://blog.csdn.net/qq_35425070/article/details/106822191 + - DRONE_USER_CREATE=admin:true,token:gLBwGdBXUCTri6gEDDsLZW0ekoZqfcpq + drone-runner-docker: + restart: always ## 容器自动重启 + image: drone/drone-runner-docker:1 + container_name: drone-runner-docker-cloudnative + networks: + - drone-net-cloudnative + ports: + - "9902:3000" ## 映射到宿主机的端口,用于提供web页面,显示任务执行情况,可不映射 + volumes: + - /var/run/docker.sock:/var/run/docker.sock + environment: + - DRONE_RPC_PROTO=http + - DRONE_RPC_HOST=drone-server-cloudnative + - DRONE_RPC_SECRET=7e52616bc93b86d114f95de534011d82 ## 与server服务中保持一致 + - DRONE_RUNNER_NAME=docker-worker + - DRONE_RUNNER_CAPACITY=2 + - TZ=Asia/Shanghai + - DRONE_DEBUG=true + #- DRONE_LOGS_DEBUG=true + #- DRONE_LOGS_TRACE=true + #- DRONE_UI_USERNAME=admin ## runner的web页面用户信息 + #- DRONE_UI_PASSWORD=password + depends_on: + - drone-server + +networks: ## 可以不自定义 + drone-net-cloudnative: + driver: bridge diff --git a/drone/docker-compose.yml b/drone/docker-compose.yml new file mode 100644 index 0000000..9af8aae --- /dev/null +++ b/drone/docker-compose.yml @@ -0,0 +1,63 @@ +# https://www.yisu.com/zixun/15849.html +# https://docs.drone.io/server/provider/gitlab/ +version: '3' +services: + drone-server: + restart: always ## 容器自动重启 + image: drone/drone:2 + container_name: drone-server-cloudnative + networks: ## 使用自定义网络,也可以不写 + - drone-net-cloudnative + ports: + - "9901:80" ## 映射到宿主机的端口 + volumes: + - ./data:/var/lib/drone + environment: + - DRONE_SERVER_HOST=drone.windymuse.site ## 端口需要和映射至宿主机的一致 + - DRONE_SERVER_PROTO=https + - DRONE_RPC_SECRET=7e52616bc93b86d114f95de534011d82 ## openssl rand -hex 16 自动生成 + # true 表示允许注册,false 表示关闭注册功能,此时只有 DRONE_ADMIN 中指定的账户才能登录 + - DRONE_OPEN=true + # Drone 外网地址 + - DRONE_HOST=https://drone.windymuse.site + # 使用 Gitea + - DRONE_GITEA=true + # Gitea 的 Client ID + - DRONE_GITEA_CLIENT_ID=fa766513-c894-47b2-8886-6f990a998647 + # Gitea 的 Secret + - DRONE_GITEA_CLIENT_SECRET=gto_jejijdu5ubefxudmno2w2zk5fiq3b2vztnrtgkhdinjrelklsfzq + # Gitea 的 URL + - DRONE_GITEA_SERVER=https://gitea.windymuse.site + # 设置admin权限,以使用Trusted功能 + # https://blog.csdn.net/qq_35425070/article/details/106822146 + # https://blog.csdn.net/qq_35425070/article/details/106822191 + # ,token:Ac7W1qgPyqxe9u00lI9E2IBrXpT8T6CA + - DRONE_USER_CREATE=username:maidong,admin:true + drone-runner-docker: + restart: always ## 容器自动重启 + image: drone/drone-runner-docker:1 + container_name: drone-runner-docker-cloudnative + networks: + - drone-net-cloudnative + ports: + - "9902:3000" ## 映射到宿主机的端口,用于提供web页面,显示任务执行情况,可不映射 + volumes: + - /var/run/docker.sock:/var/run/docker.sock + environment: + - DRONE_RPC_PROTO=http + - DRONE_RPC_HOST=drone-server-cloudnative + - DRONE_RPC_SECRET=7e52616bc93b86d114f95de534011d82 ## 与server服务中保持一致 + - DRONE_RUNNER_NAME=docker-worker + - DRONE_RUNNER_CAPACITY=2 + - TZ=Asia/Shanghai + - DRONE_DEBUG=true + #- DRONE_LOGS_DEBUG=true + #- DRONE_LOGS_TRACE=true + - DRONE_UI_USERNAME=admin ## runner的web页面用户信息 + - DRONE_UI_PASSWORD=password + depends_on: + - drone-server + +networks: ## 可以不自定义 + drone-net-cloudnative: + driver: bridge diff --git a/drone/settings.xml b/drone/settings.xml new file mode 100644 index 0000000..9eab572 --- /dev/null +++ b/drone/settings.xml @@ -0,0 +1,15 @@ + + /root/.m2/repository + + + alimaven + aliyun + central + http://maven.aliyun.com/nexus/content/groups/public + + + + org.apache.maven.plugins + org.codehaus.mojo + + \ No newline at end of file diff --git a/fast-poster/docker-compose.yml b/fast-poster/docker-compose.yml new file mode 100644 index 0000000..ef36620 --- /dev/null +++ b/fast-poster/docker-compose.yml @@ -0,0 +1,19 @@ +version: "3" + +networks: + default: + name: 'fastposter-net' + +services: + server: + image: tangweixin/fast-poster + container_name: fast-poster + restart: always + ports: + - "5000:5000" + environment: + TZ: Asia/Shanghai + TOKEN: ApfrIzxCoK1DwNZOEJCwlrnv6QZ0PCdv + POSTER_URI_PREFIX: https://fast-poster.windymuse.site/ + volumes: + - ./data:/app/data diff --git a/gitea/docker-compose.yml b/gitea/docker-compose.yml new file mode 100644 index 0000000..cad7c17 --- /dev/null +++ b/gitea/docker-compose.yml @@ -0,0 +1,43 @@ +version: "3" + +networks: + gitea: + external: false + +services: + server: + image: gitea/gitea:1.18.1 + container_name: gitea + environment: + - USER_UID=1000 + - USER_GID=1000 + - GITEA__database__DB_TYPE=mysql + - GITEA__database__HOST=gitea_db:3306 + - GITEA__database__NAME=gitea + - GITEA__database__USER=gitea + - GITEA__database__PASSWD=gitea + restart: always + networks: + - gitea + volumes: + - ./gitea:/data + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + ports: + - "3000:3000" + - "222:22" + depends_on: + - gitea_db + + gitea_db: + image: mysql:8 + restart: always + environment: + - MYSQL_ROOT_PASSWORD=gitea + - MYSQL_USER=gitea + - MYSQL_PASSWORD=gitea + - MYSQL_DATABASE=gitea + networks: + - gitea + volumes: + - ./mysql:/var/lib/mysql diff --git a/gitea/readme.md b/gitea/readme.md new file mode 100644 index 0000000..ee6822a --- /dev/null +++ b/gitea/readme.md @@ -0,0 +1,8 @@ +# [gitea & drone webhook推送不成功](https://www.cnblogs.com/shiningrise/p/16944140.html) + +https://www.cnblogs.com/shiningrise/p/16944140.html + + +用户名:maidong + +密码:123456 diff --git a/gitlab-runner/docker-compose.yml b/gitlab-runner/docker-compose.yml new file mode 100644 index 0000000..eb1d505 --- /dev/null +++ b/gitlab-runner/docker-compose.yml @@ -0,0 +1,13 @@ +version: '3' +services: + + # https://blog.csdn.net/fengtao0821/article/details/110526941 + gitlab-runner: + image: gitlab/gitlab-runner + restart: always + container_name: gitlab-runner + user: root + privileged: true + volumes: + - ./config:/etc/gitlab-runner + - /var/run/docker.sock:/var/run/docker.sock diff --git a/gitlab-runner/readme.md b/gitlab-runner/readme.md new file mode 100644 index 0000000..7aee5c3 --- /dev/null +++ b/gitlab-runner/readme.md @@ -0,0 +1,6 @@ +## 由于使用了 /var/run/docker.sock,所以需要给予权限,比如使用root用户,在docker-compose文件中如下填写即可 + + + user: root + + privileged: true diff --git a/gitlab/docker-compose.yml b/gitlab/docker-compose.yml new file mode 100644 index 0000000..6aa55a2 --- /dev/null +++ b/gitlab/docker-compose.yml @@ -0,0 +1,24 @@ +version: '3' +services: + gitlab: + image: 'gitlab/gitlab-ce:latest' + container_name: gitlab + restart: always + environment: + GITLAB_OMNIBUS_CONFIG: | + external_url 'http://192.168.31.249:8929' #若有域名可以写域名 + gitlab_rails['gitlab_shell_ssh_port'] = 2224 + ports: + - '8929:8929' + - '2224:22' + logging: + driver: "json-file" + options: + max-size: 1024m + volumes: + #将相关配置映射到当前目录下的config目录 + - './config:/etc/gitlab' + #将日志映射到当前目录下的logs目录 + - './logs:/var/log/gitlab' + #将数据映射到当前目录下的data目录 + - './data:/var/opt/gitlab' diff --git a/gitlab/readme.md b/gitlab/readme.md new file mode 100644 index 0000000..d1ac36c --- /dev/null +++ b/gitlab/readme.md @@ -0,0 +1,8 @@ +初始root密码 + +在容器中的/etc/gitlab/initial_root_password中 + +即,在挂载文件config/initial_root_password中寻找 + + +修改后的密码:gitlab@123 diff --git a/grafana/docker-compose.yml b/grafana/docker-compose.yml new file mode 100644 index 0000000..05f1d8a --- /dev/null +++ b/grafana/docker-compose.yml @@ -0,0 +1,23 @@ +version: '3' + +services: + + grafana: + image: grafana/grafana + container_name: grafana + restart: always + user: root + ports: + - "3100:3000" + environment: + - HTTP_USER=admin + - HTTP_PASS=admin + - INFLUXDB_HOST=influxdb + - INFLUXDB_PORT=8186 + - INFLUXDB_NAME=telegraf + - INFLUXDB_USER=root + - INFLUXDB_PASS=root + volumes: + - "./grafana:/var/lib/grafana" + + diff --git a/grafana/readme.md b/grafana/readme.md new file mode 100644 index 0000000..068d4d1 --- /dev/null +++ b/grafana/readme.md @@ -0,0 +1,5 @@ + + +https://blog.csdn.net/weixin_46557630/article/details/127071444 + +https://blog.csdn.net/qq_36595568/article/details/124285925 diff --git a/harbor/readme.md b/harbor/readme.md new file mode 100644 index 0000000..88662b7 --- /dev/null +++ b/harbor/readme.md @@ -0,0 +1,123 @@ +[离线安装 Harbor v2 | AtomPi's Blog](https://blog.atompi.com/2020/08/03/%E7%A6%BB%E7%BA%BF%E5%AE%89%E8%A3%85%20Harbor%20v2/) + +默认用户名: + +admin + +默认密码:Harbor12345 + +Harbor12345 + +### 开始部署 + +* 下载离线安装程序 + +下载地址: `https://github.com/vmware/harbor/releases` + +选择: `harbor-offline-installer-.tgz` + +* 压安装包 + +| + +``` +# tar -xf harbor-offline-installer-xxx.tgz +``` + +* 配置 Harbor + +配置文件模板为: `harbor.yml.tmpl` + +复制模板文件,并命名为 `harbor.yml` + +在 `harbor.yml` 中有两类参数:必需参数和可选参数。 + +* 必选参数:需要在配置文件中设置这些参数。如果用户在 `harbor.yml` 中更新它们并运行 `install.sh` 脚本以重新安装 Harbor ,它们将生效。 +* 可选参数:这些参数对于更新是可选的,即用户可以将它们保留为默认值,并在启动 Harbour 后在 Web UI 上更新它们。如果它们设置在 `harbor.yml` 中,它们只会在第一次启动 Harbour 时生效。后续在 Web UI 中的更新将忽略 `harbor.yml` 中这些参数。 + +*在这里,我只列出部分必选参数的配置,具体参数说明见文章末尾处给出的官方安装文档连接* + +1. 必选参数: + +* `hostname`: 访问 harbor 的域名,可以使用主机 IP ,但建议使用域名 + +`hostname = reg.atompi.com` + +* `http / https`: 访问 harbor 的 url 协议,若只使用 `http` ,则注释掉 `https` 项即可(如下),若启用 `https` 请参考 [Configuring Harbor with HTTPS Access](https://goharbor.io/docs/2.0.0/install-config/configure-https/) + +| + +``` +# http related config +http: + # port for http, default is 80. If https enabled, this port will redirect to https port + port: 80 + +# https related config +#https: + # https port for harbor, default is 443 + #port: 443 + # The path of cert and key files for nginx + #certificate: /your/certificate/path + #private_key: /your/private/key/path +``` + +* `harbor_admin_password`: 超级管理员用户 `admin` 的登录密码 +* `database.password`: 数据库 root 用户密码,用于指定 Harbor 默认数据库 root 用户密码,生产环境建议修改这个值为复杂密码 + +| + +``` +database: + # The password for the root user of Harbor DB. Change this before any production use. + password: root123 +``` + +* `data_volume`: 由于 Harbor 所有组件都使用 docker 容器化部署,所以需要将容器数据持久化到宿主机目录,该配置项就是指定持久化目录的挂载点,建议在某目录下创建 `harbor` 文件夹,并作为挂载点,便于统一管理和迁移。 + +| + +``` +data_volume: /data/harbor +``` + +### 执行 install.sh 开始安装 + +默认情况下,不带任何参数的 `install.sh` 脚本只安装 Harbor 主服务,如果需要安装其他附加服务,可带指定参数安装,可安装的附加服务有: + +| + +``` +Harbor with Notary ( --with-notary ):一个允许任何人信任任意数据集合的项目,用于运行和与可信集合交互。 +Harbor with Clair (--with-clair): Docker 镜像安全漏洞扫描工具 +Harbor with Chart Repository Service (--with-chartmuseum): Helm 包管理工具 +``` + +这里我们安装带 Helm 包管理的 Harbor + +| + +``` +sudo ./install.sh --with-chartmuseum +``` + +### 登录 harbor 并配置 Docker “insecure-registries” + +* Web UI 地址: `http://reg.atompi.com` +* docker login + +修改 docker daemon 配置文件 `/etc/docker/daemon.json` ,添加如下配置项: + +| + +``` +{ + "insecure-registries": ["reg.atompi.com"] +} +``` + +docker 登录 registry + +``` +# docker login reg.atompi.com +``` diff --git a/influxdb/docker-compose.yml b/influxdb/docker-compose.yml new file mode 100644 index 0000000..74709a6 --- /dev/null +++ b/influxdb/docker-compose.yml @@ -0,0 +1,58 @@ +version: '3.7' + +services: + telegraf: + image: telegraf + container_name: telegraf + restart: always + volumes: + - ./telegraf:/etc/telegraf + - /sys:/rootfs/sys:ro + - /proc:/rootfs/proc:ro + - /var/run/docker.sock:/var/run/docker.sock:ro + environment: + - 'HOST_PROC=/rootfs/proc' + - 'HOST_SYS=/rootfs/sys' + - /etc/localtime:/etc/localtime:ro + networks: + - monitor + depends_on: + - influxdb + + influxdb: + # image: influxdb:2.0 + image: influxdb:1.8 + container_name: influxdb + restart: always + environment: + # - DOCKER_INFLUXDB_INIT_MODE=setup + # - DOCKER_INFLUXDB_INIT_USERNAME=my-user + # - DOCKER_INFLUXDB_INIT_PASSWORD=my-password + # - DOCKER_INFLUXDB_INIT_ORG=my-org + # - DOCKER_INFLUXDB_INIT_BUCKET=my-bucket + + # - INFLUXDB_DB=db0 + - INFLUXDB_HTTP_AUTH_ENABLED=true + - INFLUXDB_ADMIN_USER=telegraf + - INFLUXDB_ADMIN_PASSWORD=telegraf + # - PRE_CREATE_DB=telegraf + # - ADMIN_USER="telegraf" + # - INFLUXDB_INIT_PWD="telegraf" + # - GOGC=10 + # - INFLUXDB_DATA_INDEX_VERSION=tsi1 + ports: + - "8086:8086" + expose: + - "8090" + - "8099" + volumes: + # - "./influxdb/data:/var/lib/influxdb2" + # - "./influxdb/config:/etc/influxdb2" + - "./influxdb/db:/var/lib/influxdb" + networks: + - monitor + +networks: + monitor: + name: 'influxdb-net' + diff --git a/influxdb/readme.md b/influxdb/readme.md new file mode 100644 index 0000000..3f50d0c --- /dev/null +++ b/influxdb/readme.md @@ -0,0 +1 @@ +https://blog.csdn.net/qq_32096997/article/details/115010804 diff --git a/mongodb/docker-compose.yml b/mongodb/docker-compose.yml new file mode 100644 index 0000000..e2df783 --- /dev/null +++ b/mongodb/docker-compose.yml @@ -0,0 +1,30 @@ +# https://juejin.cn/post/7018489702651002887 +version: '3.3' +services: + mongodb: + container_name: mongodb + image: mongo:4.4.14 + restart: always + ports: + - 27017:27017 + volumes: + - ./data/db:/data/db + - ./data/log:/var/log/mongodb + - ./data/config:/etc/mongo + environment: + - MONGO_INITDB_ROOT_USERNAME=admin + - MONGO_INITDB_ROOT_PASSWORD=admin + mongo-express: + image: mongo-express:0.54.0 + container_name: mongo-express + restart: always + ports: + - 8081:8081 + environment: + - ME_CONFIG_MONGODB_ADMINUSERNAME=root + - ME_CONFIG_MONGODB_ADMINPASSWORD=root + - ME_CONFIG_MONGODB_SERVER=mongodb + +networks: + default: + name: mongodb_network \ No newline at end of file diff --git a/moodle/docker-compose.yml b/moodle/docker-compose.yml new file mode 100644 index 0000000..3907e5c --- /dev/null +++ b/moodle/docker-compose.yml @@ -0,0 +1,45 @@ +version: '2' +services: + mariadb: + image: docker.io/bitnami/mariadb:10.6 + restart: always + environment: + # ALLOW_EMPTY_PASSWORD is recommended only for development. + - ALLOW_EMPTY_PASSWORD=yes + - MARIADB_USER=bn_moodle + - MARIADB_DATABASE=bitnami_moodle + - MARIADB_CHARACTER_SET=utf8mb4 + - MARIADB_COLLATE=utf8mb4_unicode_ci + volumes: + - 'mariadb_data:/bitnami/mariadb' + moodle: + image: docker.io/bitnami/moodle:4.1 + restart: always + ports: + - '8180:8080' + - '8143:8443' + environment: + - MOODLE_USERNAME=user + - MOODLE_PASSWORD=bitnami + - MOODLE_DATABASE_HOST=mariadb + - MOODLE_DATABASE_PORT_NUMBER=3306 + - MOODLE_DATABASE_USER=bn_moodle + - MOODLE_DATABASE_NAME=bitnami_moodle + - MOODLE_SITE_NAME=maidong + - MOODLE_HOST=moodle.windymuse.site + - MOODLE_REVERSEPROXY=true + - MOODLE_SSLPROXY=true + # ALLOW_EMPTY_PASSWORD is recommended only for development. + - ALLOW_EMPTY_PASSWORD=yes + volumes: + - 'moodle_data:/bitnami/moodle' + - 'moodledata_data:/bitnami/moodledata' + depends_on: + - mariadb +volumes: + mariadb_data: + driver: local + moodle_data: + driver: local + moodledata_data: + driver: local \ No newline at end of file diff --git a/moodle/readme.md b/moodle/readme.md new file mode 100644 index 0000000..1bf8131 --- /dev/null +++ b/moodle/readme.md @@ -0,0 +1,3 @@ +部署文档 + +https://hub.docker.com/r/bitnami/moodle diff --git a/mysql/docker-compose.yml b/mysql/docker-compose.yml new file mode 100644 index 0000000..42d9e73 --- /dev/null +++ b/mysql/docker-compose.yml @@ -0,0 +1,14 @@ +version: '3.1' +services: + db: + container_name: mysql57 + image: mysql:5.7 + volumes: + - ./data/db:/var/lib/mysql + - ./etc/my.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf + restart: always + ports: + - 33306:3306 + environment: + MYSQL_ROOT_PASSWORD: 123456 + secure_file_priv: diff --git a/mysql/etc/my.cnf b/mysql/etc/my.cnf new file mode 100644 index 0000000..f890079 --- /dev/null +++ b/mysql/etc/my.cnf @@ -0,0 +1,48 @@ +[mysqld] +character-set-server=utf8mb4 +log-bin=mysql-bin +server-id=1 +pid-file = /var/run/mysqld/mysqld.pid +socket = /var/run/mysqld/mysqld.sock +datadir = /var/lib/mysql +sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION +symbolic-links=0 +secure_file_priv = +wait_timeout=120 +interactive_timeout=120 +default-time_zone = '+8:00' +skip-external-locking +skip-name-resolve +open_files_limit = 10240 +max_connections = 1000 +max_connect_errors = 6000 +table_open_cache = 800 +max_allowed_packet = 40m +sort_buffer_size = 2M +join_buffer_size = 1M +thread_cache_size = 32 +query_cache_size = 64M +transaction_isolation = READ-COMMITTED +tmp_table_size = 128M +max_heap_table_size = 128M +log-bin = mysql-bin +sync-binlog = 1 +binlog_format = ROW +binlog_cache_size = 1M +key_buffer_size = 128M +read_buffer_size = 2M +read_rnd_buffer_size = 4M +bulk_insert_buffer_size = 64M +lower_case_table_names = 1 +explicit_defaults_for_timestamp=true +skip_name_resolve = ON +event_scheduler = ON +log_bin_trust_function_creators = 1 +innodb_buffer_pool_size = 512M +innodb_flush_log_at_trx_commit = 1 +innodb_file_per_table = 1 +innodb_log_buffer_size = 4M +innodb_log_file_size = 256M +innodb_max_dirty_pages_pct = 90 +innodb_read_io_threads = 4 +innodb_write_io_threads = 4 \ No newline at end of file diff --git a/nexus/docker-compose.yml b/nexus/docker-compose.yml new file mode 100644 index 0000000..cf061a6 --- /dev/null +++ b/nexus/docker-compose.yml @@ -0,0 +1,11 @@ +version: "3.9" +services: + nexus: + image: sonatype/nexus3:latest + container_name: nexus + restart: always + volumes: + # 自定义数据卷位置为当前目录下的 data 目录 + - ./data:/nexus-data + ports: + - "8082:8081" \ No newline at end of file diff --git a/nexus/readme.md b/nexus/readme.md new file mode 100644 index 0000000..6ddb88b --- /dev/null +++ b/nexus/readme.md @@ -0,0 +1,6 @@ +# 需要给予权限 chmod -R 777 . + + +admin的初始密码被储存在data中(容器内的/nexus-data中)的admin.password中 + +admin的密码被设置为 admin123 diff --git a/nginx/data/conf.d/cloudreve.conf b/nginx/data/conf.d/cloudreve.conf new file mode 100644 index 0000000..233d626 --- /dev/null +++ b/nginx/data/conf.d/cloudreve.conf @@ -0,0 +1,18 @@ + +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name cloudreve.windymuse.site; + + ssl_certificate /ssl/fullchain.crt; + ssl_certificate_key /ssl/private.pem; + + ssl_session_timeout 10m; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + client_max_body_size 100m; + + location / { + proxy_pass http://192.168.31.249:5212; + } +} diff --git a/nginx/data/conf.d/crawlab.conf b/nginx/data/conf.d/crawlab.conf new file mode 100644 index 0000000..a55c807 --- /dev/null +++ b/nginx/data/conf.d/crawlab.conf @@ -0,0 +1,18 @@ + +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name crawlab.windymuse.site; + + ssl_certificate /ssl/fullchain.crt; + ssl_certificate_key /ssl/private.pem; + + ssl_session_timeout 10m; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + client_max_body_size 100m; + + location / { + proxy_pass http://192.168.31.249:8080; + } +} \ No newline at end of file diff --git a/nginx/data/conf.d/drone.conf b/nginx/data/conf.d/drone.conf new file mode 100644 index 0000000..551b20a --- /dev/null +++ b/nginx/data/conf.d/drone.conf @@ -0,0 +1,18 @@ + +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name drone.windymuse.site; + + ssl_certificate /ssl/fullchain.crt; + ssl_certificate_key /ssl/private.pem; + + ssl_session_timeout 10m; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + client_max_body_size 100m; + + location / { + proxy_pass http://192.168.31.249:9901; + } +} diff --git a/nginx/data/conf.d/fast-poster.conf b/nginx/data/conf.d/fast-poster.conf new file mode 100644 index 0000000..5dabd8c --- /dev/null +++ b/nginx/data/conf.d/fast-poster.conf @@ -0,0 +1,18 @@ + +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name fast-poster.windymuse.site; + + ssl_certificate /ssl/fullchain.crt; + ssl_certificate_key /ssl/private.pem; + + ssl_session_timeout 10m; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + client_max_body_size 100m; + + location / { + proxy_pass http://192.168.31.249:5000; + } +} diff --git a/nginx/data/conf.d/gitea.conf b/nginx/data/conf.d/gitea.conf new file mode 100644 index 0000000..69e9b8e --- /dev/null +++ b/nginx/data/conf.d/gitea.conf @@ -0,0 +1,18 @@ + +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name gitea.windymuse.site; + + ssl_certificate /ssl/fullchain.crt; + ssl_certificate_key /ssl/private.pem; + + ssl_session_timeout 10m; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + client_max_body_size 100m; + + location / { + proxy_pass http://192.168.31.249:3000; + } +} \ No newline at end of file diff --git a/nginx/data/conf.d/gitlab.conf b/nginx/data/conf.d/gitlab.conf new file mode 100644 index 0000000..bac1cb3 --- /dev/null +++ b/nginx/data/conf.d/gitlab.conf @@ -0,0 +1,18 @@ + +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name gitlab.windymuse.site; + + ssl_certificate /ssl/fullchain.crt; + ssl_certificate_key /ssl/private.pem; + + ssl_session_timeout 10m; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + client_max_body_size 100m; + + location / { + proxy_pass http://192.168.31.249:8929; + } +} diff --git a/nginx/data/conf.d/grafana.conf b/nginx/data/conf.d/grafana.conf new file mode 100644 index 0000000..f417fd1 --- /dev/null +++ b/nginx/data/conf.d/grafana.conf @@ -0,0 +1,18 @@ + +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name grafana.windymuse.site; + + ssl_certificate /ssl/fullchain.crt; + ssl_certificate_key /ssl/private.pem; + + ssl_session_timeout 10m; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + client_max_body_size 100m; + + location / { + proxy_pass http://192.168.31.249:3100; + } +} diff --git a/nginx/data/conf.d/harbor.conf b/nginx/data/conf.d/harbor.conf new file mode 100644 index 0000000..81f6869 --- /dev/null +++ b/nginx/data/conf.d/harbor.conf @@ -0,0 +1,18 @@ + +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name harbor.windymuse.site; + + ssl_certificate /ssl/fullchain.crt; + ssl_certificate_key /ssl/private.pem; + + ssl_session_timeout 10m; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + client_max_body_size 100m; + + location / { + proxy_pass http://192.168.31.249:6080; + } +} diff --git a/nginx/data/conf.d/home-assistant.conf b/nginx/data/conf.d/home-assistant.conf new file mode 100644 index 0000000..a5d3149 --- /dev/null +++ b/nginx/data/conf.d/home-assistant.conf @@ -0,0 +1,18 @@ + +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name home-assistant.windymuse.site; + + ssl_certificate /ssl/fullchain.crt; + ssl_certificate_key /ssl/private.pem; + + ssl_session_timeout 10m; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + client_max_body_size 100m; + + location / { + proxy_pass http://192.168.31.249:8123; + } +} diff --git a/nginx/data/conf.d/mongo-express.conf b/nginx/data/conf.d/mongo-express.conf new file mode 100644 index 0000000..c0beed1 --- /dev/null +++ b/nginx/data/conf.d/mongo-express.conf @@ -0,0 +1,18 @@ + +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name momgo-express.windymuse.site; + + ssl_certificate /ssl/fullchain.crt; + ssl_certificate_key /ssl/private.pem; + + ssl_session_timeout 10m; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + client_max_body_size 100m; + + location / { + proxy_pass http://192.168.31.249:8081; + } +} diff --git a/nginx/data/conf.d/moodle.conf b/nginx/data/conf.d/moodle.conf new file mode 100644 index 0000000..26bc4aa --- /dev/null +++ b/nginx/data/conf.d/moodle.conf @@ -0,0 +1,18 @@ + +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name moodle.windymuse.site; + + ssl_certificate /ssl/fullchain.crt; + ssl_certificate_key /ssl/private.pem; + + ssl_session_timeout 10m; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + client_max_body_size 100m; + + location / { + proxy_pass http://192.168.31.249:8180; + } +} diff --git a/nginx/data/conf.d/nexus.conf b/nginx/data/conf.d/nexus.conf new file mode 100644 index 0000000..2b36680 --- /dev/null +++ b/nginx/data/conf.d/nexus.conf @@ -0,0 +1,18 @@ + +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name nexus.windymuse.site; + + ssl_certificate /ssl/fullchain.crt; + ssl_certificate_key /ssl/private.pem; + + ssl_session_timeout 10m; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + client_max_body_size 100m; + + location / { + proxy_pass http://192.168.31.249:8082; + } +} diff --git a/nginx/data/conf.d/portainer.conf b/nginx/data/conf.d/portainer.conf new file mode 100644 index 0000000..089e31e --- /dev/null +++ b/nginx/data/conf.d/portainer.conf @@ -0,0 +1,18 @@ + +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name portainer.windymuse.site; + + ssl_certificate /ssl/fullchain.crt; + ssl_certificate_key /ssl/private.pem; + + ssl_session_timeout 10m; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + client_max_body_size 100m; + + location / { + proxy_pass http://192.168.31.249:9009; + } +} diff --git a/nginx/data/conf.d/postgresql-adminer.conf b/nginx/data/conf.d/postgresql-adminer.conf new file mode 100644 index 0000000..0ef0820 --- /dev/null +++ b/nginx/data/conf.d/postgresql-adminer.conf @@ -0,0 +1,18 @@ + +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name postgresql-adminer.windymuse.site; + + ssl_certificate /ssl/fullchain.crt; + ssl_certificate_key /ssl/private.pem; + + ssl_session_timeout 10m; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + client_max_body_size 100m; + + location / { + proxy_pass http://192.168.31.249:8888; + } +} diff --git a/nginx/data/conf.d/sonarqube.conf b/nginx/data/conf.d/sonarqube.conf new file mode 100644 index 0000000..6efbfe2 --- /dev/null +++ b/nginx/data/conf.d/sonarqube.conf @@ -0,0 +1,18 @@ + +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name sonarqube.windymuse.site; + + ssl_certificate /ssl/fullchain.crt; + ssl_certificate_key /ssl/private.pem; + + ssl_session_timeout 10m; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + client_max_body_size 100m; + + location / { + proxy_pass http://192.168.31.249:9000; + } +} \ No newline at end of file diff --git a/nginx/data/conf.d/uptime-kuma.conf b/nginx/data/conf.d/uptime-kuma.conf new file mode 100644 index 0000000..6e03ac7 --- /dev/null +++ b/nginx/data/conf.d/uptime-kuma.conf @@ -0,0 +1,23 @@ + + +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name uptime-kuma.windymuse.site; + + ssl_certificate /ssl/fullchain.crt; + ssl_certificate_key /ssl/private.pem; + + ssl_session_timeout 10m; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + client_max_body_size 100m; + + location / { + proxy_pass http://192.168.31.249:3001; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + } +} diff --git a/nginx/data/conf/nginx.conf b/nginx/data/conf/nginx.conf new file mode 100644 index 0000000..ad1eb62 --- /dev/null +++ b/nginx/data/conf/nginx.conf @@ -0,0 +1,63 @@ +user root; +worker_processes 1; + +error_log /var/log/nginx/error.log warn; +pid /var/run/nginx.pid; + +events { + worker_connections 1024; +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /var/log/nginx/access.log main; + + sendfile on; + #tcp_nopush on; + + keepalive_timeout 65; + + #gzip on; + + # https://blog.csdn.net/weixin_44972135/article/details/92806391 + client_max_body_size 1024m; + client_body_buffer_size 10m; + client_header_buffer_size 10m; + proxy_buffers 4 128k; + proxy_busy_buffers_size 128k; + + server { + listen 80; + server_name *.windymuse.site; + + location / { + rewrite ^(.*)$ https://$host$1 permanent; + } + } + + server { + listen 80; + server_name *.windymuse.top; + + location / { + rewrite ^(.*)$ https://$host$1 permanent; + } + } + + server { + listen 80; + server_name *.windymuse.fun; + + location / { + rewrite ^(.*)$ https://$host$1 permanent; + } + } + + include /etc/nginx/conf.d/*.conf; +} diff --git a/nginx/docker-compose.yml b/nginx/docker-compose.yml new file mode 100644 index 0000000..b508e5a --- /dev/null +++ b/nginx/docker-compose.yml @@ -0,0 +1,50 @@ +version: '3' +services: + nginx-proxy: + restart: always + image: nginx + container_name: nginx-proxy + ports: + - 80:80 + - 443:443 + volumes: + - ./data/conf.d:/etc/nginx/conf.d + - ./data/log:/var/log/nginx + - ./data/conf/nginx.conf:/etc/nginx/nginx.conf + - ./ssl:/ssl + # - /usr/local/myApp:/usr/share/nginx/html + # - /etc/letsencrypt:/etc/letsencrypt + + # https://blog.csdn.net/qq_42700766/article/details/128492794 + # username:admin + # password:admin + nginx-ui: + restart: always + image: crazyleojay/nginx_ui:latest + container_name: nginx-ui + ports: + - 8880:80 + - 8889:8889 + volumes: + - ./data/conf/nginx.conf:/install/nginx/conf/nginx.conf + - ./data/conf.d:/etc/nginx/conf.d + + # https://blog.csdn.net/feifeiyechuan/article/details/115344837 + # https://www.cnblogs.com/Yogile/p/15002756.html + # https://kevinmeng.fitit100.com/archives/shi-yong-nginxwebui-kuai-su-an-zhuang-he-pei-zhi-nginx + # username:admin + # password:admin/Admin123 + nginx-web-ui: + restart: always + image: cym1102/nginxwebui:latest + container_name: nginx-web-ui + privileged: true + volumes: + - ./nginxWebUI:/home/nginxWebUI + - ./data/conf.d:/etc/nginx/conf.d + - ./data/log:/var/log/nginx + - ./data/conf/nginx.conf:/etc/nginx/nginx.conf + - ./ssl:/ssl + environment: + BOOT_OPTIONS: "--server.port=8899" + network_mode: "host" \ No newline at end of file diff --git a/nginx/readme.md b/nginx/readme.md new file mode 100644 index 0000000..12a67d0 --- /dev/null +++ b/nginx/readme.md @@ -0,0 +1 @@ +ssl中的证书可用于 windymuse.top , *.windymuse.top , windymuse.site , *.windymuse.site , windymuse.fun , *.windymuse.fun diff --git a/nginx/ssl/certificate.crt b/nginx/ssl/certificate.crt new file mode 100644 index 0000000..795b4a2 --- /dev/null +++ b/nginx/ssl/certificate.crt @@ -0,0 +1,32 @@ +-----BEGIN CERTIFICATE----- +MIIFcjCCBFqgAwIBAgISA20ByOOc1b5C/yvbTOXmrX7rMA0GCSqGSIb3DQEBCwUA +MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD +EwJSMzAeFw0yMzAyMDUyMDM0MDVaFw0yMzA1MDYyMDM0MDRaMBgxFjAUBgNVBAMT +DXdpbmR5bXVzZS50b3AwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDF +VdsL4OvpVLh4UQ43cwP8bSIVJw/BjJPeKDDqZQu8n54vuPY9evvMQp626vfXW8/h +is2RzIrAcb3rHj/AFWhSUREstaHwviHkBn7zwUneHqHgBlgUoZ9eiAYPjV8oaYDw ++0grbcwG/bzThV7SNGJeyzVwU/VQJmB5JqPuyAn4iip4xpe8F3RyHgJYUVwSMlIA +yiocbhsXzLRP25S0mIJyW7KUwyINP3H2LvZR8A2KS+aaRISlT5QOyBlbpBJjbKsQ +d9+kkdTTy7v0hJqWXSRp1octeF301vX9KjDmLftLLbI9QrK1c7pr4T6E9/oxK8Y0 +NG+DLeRiPw7H5OoZqtJZAgMBAAGjggKaMIICljAOBgNVHQ8BAf8EBAMCBaAwHQYD +VR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0O +BBYEFBo5kDgeqx9VTXnikannqfzQiaKKMB8GA1UdIwQYMBaAFBQusxe3WFbLrlAJ +QOYfr52LFMLGMFUGCCsGAQUFBwEBBEkwRzAhBggrBgEFBQcwAYYVaHR0cDovL3Iz +Lm8ubGVuY3Iub3JnMCIGCCsGAQUFBzAChhZodHRwOi8vcjMuaS5sZW5jci5vcmcv +MGsGA1UdEQRkMGKCDyoud2luZHltdXNlLmZ1boIQKi53aW5keW11c2Uuc2l0ZYIP +Ki53aW5keW11c2UudG9wgg13aW5keW11c2UuZnVugg53aW5keW11c2Uuc2l0ZYIN +d2luZHltdXNlLnRvcDBMBgNVHSAERTBDMAgGBmeBDAECATA3BgsrBgEEAYLfEwEB +ATAoMCYGCCsGAQUFBwIBFhpodHRwOi8vY3BzLmxldHNlbmNyeXB0Lm9yZzCCAQMG +CisGAQQB1nkCBAIEgfQEgfEA7wB1AHoyjFTYty22IOo44FIe6YQWcDIThU070ivB +OlejUutSAAABhiOAJCMAAAQDAEYwRAIgAwOZRKfr7aNRx8ce3ITEuRSdiStvmn4Y +EnRHEoiI6EkCIHJoJUrIEDqxcrBU9oWpYUGyyNiod+RkFK0eGZ+Dp45zAHYA6D7Q +2j71BjUy51covIlryQPTy9ERa+zraeF3fW0GvW4AAAGGI4AkEwAABAMARzBFAiBE +MIwKdMz2ASinPTBilXPjfxL5drx0AaCfnLvNlYeWKAIhAIOokwFKSXNTo9mOCmsv +A/xKN5IMZEIkmq9ZH3yN2uFWMA0GCSqGSIb3DQEBCwUAA4IBAQAr+T18EScuvHXY +rh+OdNz6TkeAwZEE94274GFMyQmZfCy4YFU3gOkBS6Fr9UyqT74nicuqx2BWEHyZ +wxKFBYoSdxzQzLQaAwYWKTI5lJ5YzL+Na3UEgFQMgnQAu33WUmN1TGaDZRkU7nwt +CBB5IHrMggdmuqWhpTZNjLwESVywpsnBj3AVFTgiVeNo9JflcEzBtnztYxtDKuLa +AatN2y3g7JG8ubxJIK4W+nbgWMadMz9Z6unpRl/G+lxF+5elbl3Ecc5nysW+nBNV +P3QjplirAFYhvguRs0qIdt9KZerdVqmtcF2lI2AoIwLP4w89CaSw3nTBA3LYyyzx +fz1vLQXy +-----END CERTIFICATE----- \ No newline at end of file diff --git a/nginx/ssl/certificate.pfx b/nginx/ssl/certificate.pfx new file mode 100644 index 0000000000000000000000000000000000000000..9519e417ddbd13a812aa41cce2099527dad96ff1 GIT binary patch literal 2993 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 literal 0 HcmV?d00001 diff --git a/nginx/ssl/chain.crt b/nginx/ssl/chain.crt new file mode 100644 index 0000000..5128e26 --- /dev/null +++ b/nginx/ssl/chain.crt @@ -0,0 +1,30 @@ +-----BEGIN CERTIFICATE----- +MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjAwOTA0MDAwMDAw +WhcNMjUwOTE1MTYwMDAwWjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg +RW5jcnlwdDELMAkGA1UEAxMCUjMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC7AhUozPaglNMPEuyNVZLD+ILxmaZ6QoinXSaqtSu5xUyxr45r+XXIo9cP +R5QUVTVXjJ6oojkZ9YI8QqlObvU7wy7bjcCwXPNZOOftz2nwWgsbvsCUJCWH+jdx +sxPnHKzhm+/b5DtFUkWWqcFTzjTIUu61ru2P3mBw4qVUq7ZtDpelQDRrK9O8Zutm +NHz6a4uPVymZ+DAXXbpyb/uBxa3Shlg9F8fnCbvxK/eG3MHacV3URuPMrSXBiLxg +Z3Vms/EY96Jc5lP/Ooi2R6X/ExjqmAl3P51T+c8B5fWmcBcUr2Ok/5mzk53cU6cG +/kiFHaFpriV1uxPMUgP17VGhi9sVAgMBAAGjggEIMIIBBDAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYB +Af8CAQAwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYfr52LFMLGMB8GA1UdIwQYMBaA +FHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcw +AoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzAnBgNVHR8EIDAeMBygGqAYhhZodHRw +Oi8veDEuYy5sZW5jci5vcmcvMCIGA1UdIAQbMBkwCAYGZ4EMAQIBMA0GCysGAQQB +gt8TAQEBMA0GCSqGSIb3DQEBCwUAA4ICAQCFyk5HPqP3hUSFvNVneLKYY611TR6W +PTNlclQtgaDqw+34IL9fzLdwALduO/ZelN7kIJ+m74uyA+eitRY8kc607TkC53wl +ikfmZW4/RvTZ8M6UK+5UzhK8jCdLuMGYL6KvzXGRSgi3yLgjewQtCPkIVz6D2QQz +CkcheAmCJ8MqyJu5zlzyZMjAvnnAT45tRAxekrsu94sQ4egdRCnbWSDtY7kh+BIm +lJNXoB1lBMEKIq4QDUOXoRgffuDghje1WrG9ML+Hbisq/yFOGwXD9RiX8F6sw6W4 +avAuvDszue5L3sz85K+EC4Y/wFVDNvZo4TYXao6Z0f+lQKc0t8DQYzk1OXVu8rp2 +yJMC6alLbBfODALZvYH7n7do1AZls4I9d1P4jnkDrQoxB3UqQ9hVl3LEKQ73xF1O +yK5GhDDX8oVfGKF5u+decIsH4YaTw7mP3GFxJSqv3+0lUFJoi5Lc5da149p90Ids +hCExroL1+7mryIkXPeFM5TgO9r0rvZaBFOvV2z0gp35Z0+L4WPlbuEjN/lxPFin+ +HlUjr8gRsI3qfJOQFy/9rKIJR0Y/8Omwt/8oTWgy1mdeHmmjk7j1nYsvC9JSQ6Zv +MldlTTKB3zhThV1+XWYp6rjd5JW1zbVWEkLNxE7GJThEUG3szgBVGP7pSWTUTsqX +nLRbwHOoq7hHwg== +-----END CERTIFICATE----- \ No newline at end of file diff --git a/nginx/ssl/chain_old.crt b/nginx/ssl/chain_old.crt new file mode 100644 index 0000000..adb46c8 --- /dev/null +++ b/nginx/ssl/chain_old.crt @@ -0,0 +1,31 @@ +-----BEGIN CERTIFICATE----- +MIIFYDCCBEigAwIBAgIQQAF3ITfU6UK47naqPGQKtzANBgkqhkiG9w0BAQsFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTIxMDEyMDE5MTQwM1oXDTI0MDkzMDE4MTQwM1ow +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCt6CRz9BQ385ueK1coHIe+3LffOJCMbjzmV6B493XC +ov71am72AE8o295ohmxEk7axY/0UEmu/H9LqMZshftEzPLpI9d1537O4/xLxIZpL +wYqGcWlKZmZsj348cL+tKSIG8+TA5oCu4kuPt5l+lAOf00eXfJlII1PoOK5PCm+D +LtFJV4yAdLbaL9A4jXsDcCEbdfIwPPqPrt3aY6vrFk/CjhFLfs8L6P+1dy70sntK +4EwSJQxwjQMpoOFTJOwT2e4ZvxCzSow/iaNhUd6shweU9GNx7C7ib1uYgeGJXDR5 +bHbvO5BieebbpJovJsXQEOEO3tkQjhb7t/eo98flAgeYjzYIlefiN5YNNnWe+w5y +sR2bvAP5SQXYgd0FtCrWQemsAXaVCg/Y39W9Eh81LygXbNKYwagJZHduRze6zqxZ +Xmidf3LWicUGQSk+WT7dJvUkyRGnWqNMQB9GoZm1pzpRboY7nn1ypxIFeFntPlF4 +FQsDj43QLwWyPntKHEtzBRL8xurgUBN8Q5N0s8p0544fAQjQMNRbcTa0B7rBMDBc +SLeCO5imfWCKoqMpgsy6vYMEG6KDA0Gh1gXxG8K28Kh8hjtGqEgqiNx2mna/H2ql +PRmP6zjzZN7IKw0KKP/32+IVQtQi0Cdd4Xn+GOdwiK1O5tmLOsbdJ1Fu/7xk9TND +TwIDAQABo4IBRjCCAUIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +SwYIKwYBBQUHAQEEPzA9MDsGCCsGAQUFBzAChi9odHRwOi8vYXBwcy5pZGVudHJ1 +c3QuY29tL3Jvb3RzL2RzdHJvb3RjYXgzLnA3YzAfBgNVHSMEGDAWgBTEp7Gkeyxx ++tvhS5B1/8QVYIWJEDBUBgNVHSAETTBLMAgGBmeBDAECATA/BgsrBgEEAYLfEwEB +ATAwMC4GCCsGAQUFBwIBFiJodHRwOi8vY3BzLnJvb3QteDEubGV0c2VuY3J5cHQu +b3JnMDwGA1UdHwQ1MDMwMaAvoC2GK2h0dHA6Ly9jcmwuaWRlbnRydXN0LmNvbS9E +U1RST09UQ0FYM0NSTC5jcmwwHQYDVR0OBBYEFHm0WeZ7tuXkAXOACIjIGlj26Ztu +MA0GCSqGSIb3DQEBCwUAA4IBAQAKcwBslm7/DlLQrt2M51oGrS+o44+/yQoDFVDC +5WxCu2+b9LRPwkSICHXM6webFGJueN7sJ7o5XPWioW5WlHAQU7G75K/QosMrAdSW +9MUgNTP52GE24HGNtLi1qoJFlcDyqSMo59ahy2cI2qBDLKobkx/J3vWraV0T9VuG +WCLKTVXkcGdtwlfFRjlBz4pYg1htmf5X6DYO8A4jqv2Il9DjXA6USbW1FzXSLr9O +he8Y4IWS6wY7bCkjCWDcRQJMEhg76fsO3txE+FiYruq9RUWhiF1myv4Q6W+CyBFC +Dfvp7OOGAN6dEOM4+qR9sdjoSYKEBpsr6GtPAQw4dy753ec5 +-----END CERTIFICATE----- \ No newline at end of file diff --git a/nginx/ssl/detail.txt b/nginx/ssl/detail.txt new file mode 100644 index 0000000..a574b8c --- /dev/null +++ b/nginx/ssl/detail.txt @@ -0,0 +1,28 @@ +****************************************************************** +【来此加密】 +https://letsencrypt.osfipin.com/ +****************************************************************** +1. 域名: +windymuse.top,*.windymuse.top,windymuse.site,*.windymuse.site,windymuse.fun,*.windymuse.fun +------------------------------------------------------------------ +2. 域名详情: +https://acme-v02.api.letsencrypt.org/acme/order/303940600/163098956576 +------------------------------------------------------------------ +3. 到期时间: +2023-05-07 04:34:04 +------------------------------------------------------------------ +4. 文件说明: +fullchain.crt: 证书和证书链 +certificate.crt: 证书 +chain.crt: 证书链 +chain_old.crt: 低版本系统证书链 +private.pem: 密钥(请妥善保存) +public.pem: 公钥 +certificate.pfx: pfx格式证书(使用pfx导入密码) +------------------------------------------------------------------ +5. pfx导入密码: +20f31a +****************************************************************** +联系邮箱: +support@mail.osfipin.com +****************************************************************** \ No newline at end of file diff --git a/nginx/ssl/fullchain.crt b/nginx/ssl/fullchain.crt new file mode 100644 index 0000000..faeabd2 --- /dev/null +++ b/nginx/ssl/fullchain.crt @@ -0,0 +1,63 @@ +-----BEGIN CERTIFICATE----- +MIIFcjCCBFqgAwIBAgISA20ByOOc1b5C/yvbTOXmrX7rMA0GCSqGSIb3DQEBCwUA +MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD +EwJSMzAeFw0yMzAyMDUyMDM0MDVaFw0yMzA1MDYyMDM0MDRaMBgxFjAUBgNVBAMT +DXdpbmR5bXVzZS50b3AwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDF +VdsL4OvpVLh4UQ43cwP8bSIVJw/BjJPeKDDqZQu8n54vuPY9evvMQp626vfXW8/h +is2RzIrAcb3rHj/AFWhSUREstaHwviHkBn7zwUneHqHgBlgUoZ9eiAYPjV8oaYDw ++0grbcwG/bzThV7SNGJeyzVwU/VQJmB5JqPuyAn4iip4xpe8F3RyHgJYUVwSMlIA +yiocbhsXzLRP25S0mIJyW7KUwyINP3H2LvZR8A2KS+aaRISlT5QOyBlbpBJjbKsQ +d9+kkdTTy7v0hJqWXSRp1octeF301vX9KjDmLftLLbI9QrK1c7pr4T6E9/oxK8Y0 +NG+DLeRiPw7H5OoZqtJZAgMBAAGjggKaMIICljAOBgNVHQ8BAf8EBAMCBaAwHQYD +VR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0O +BBYEFBo5kDgeqx9VTXnikannqfzQiaKKMB8GA1UdIwQYMBaAFBQusxe3WFbLrlAJ +QOYfr52LFMLGMFUGCCsGAQUFBwEBBEkwRzAhBggrBgEFBQcwAYYVaHR0cDovL3Iz +Lm8ubGVuY3Iub3JnMCIGCCsGAQUFBzAChhZodHRwOi8vcjMuaS5sZW5jci5vcmcv +MGsGA1UdEQRkMGKCDyoud2luZHltdXNlLmZ1boIQKi53aW5keW11c2Uuc2l0ZYIP +Ki53aW5keW11c2UudG9wgg13aW5keW11c2UuZnVugg53aW5keW11c2Uuc2l0ZYIN +d2luZHltdXNlLnRvcDBMBgNVHSAERTBDMAgGBmeBDAECATA3BgsrBgEEAYLfEwEB +ATAoMCYGCCsGAQUFBwIBFhpodHRwOi8vY3BzLmxldHNlbmNyeXB0Lm9yZzCCAQMG +CisGAQQB1nkCBAIEgfQEgfEA7wB1AHoyjFTYty22IOo44FIe6YQWcDIThU070ivB +OlejUutSAAABhiOAJCMAAAQDAEYwRAIgAwOZRKfr7aNRx8ce3ITEuRSdiStvmn4Y +EnRHEoiI6EkCIHJoJUrIEDqxcrBU9oWpYUGyyNiod+RkFK0eGZ+Dp45zAHYA6D7Q +2j71BjUy51covIlryQPTy9ERa+zraeF3fW0GvW4AAAGGI4AkEwAABAMARzBFAiBE +MIwKdMz2ASinPTBilXPjfxL5drx0AaCfnLvNlYeWKAIhAIOokwFKSXNTo9mOCmsv +A/xKN5IMZEIkmq9ZH3yN2uFWMA0GCSqGSIb3DQEBCwUAA4IBAQAr+T18EScuvHXY +rh+OdNz6TkeAwZEE94274GFMyQmZfCy4YFU3gOkBS6Fr9UyqT74nicuqx2BWEHyZ +wxKFBYoSdxzQzLQaAwYWKTI5lJ5YzL+Na3UEgFQMgnQAu33WUmN1TGaDZRkU7nwt +CBB5IHrMggdmuqWhpTZNjLwESVywpsnBj3AVFTgiVeNo9JflcEzBtnztYxtDKuLa +AatN2y3g7JG8ubxJIK4W+nbgWMadMz9Z6unpRl/G+lxF+5elbl3Ecc5nysW+nBNV +P3QjplirAFYhvguRs0qIdt9KZerdVqmtcF2lI2AoIwLP4w89CaSw3nTBA3LYyyzx +fz1vLQXy +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjAwOTA0MDAwMDAw +WhcNMjUwOTE1MTYwMDAwWjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg +RW5jcnlwdDELMAkGA1UEAxMCUjMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC7AhUozPaglNMPEuyNVZLD+ILxmaZ6QoinXSaqtSu5xUyxr45r+XXIo9cP +R5QUVTVXjJ6oojkZ9YI8QqlObvU7wy7bjcCwXPNZOOftz2nwWgsbvsCUJCWH+jdx +sxPnHKzhm+/b5DtFUkWWqcFTzjTIUu61ru2P3mBw4qVUq7ZtDpelQDRrK9O8Zutm +NHz6a4uPVymZ+DAXXbpyb/uBxa3Shlg9F8fnCbvxK/eG3MHacV3URuPMrSXBiLxg +Z3Vms/EY96Jc5lP/Ooi2R6X/ExjqmAl3P51T+c8B5fWmcBcUr2Ok/5mzk53cU6cG +/kiFHaFpriV1uxPMUgP17VGhi9sVAgMBAAGjggEIMIIBBDAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYB +Af8CAQAwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYfr52LFMLGMB8GA1UdIwQYMBaA +FHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcw +AoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzAnBgNVHR8EIDAeMBygGqAYhhZodHRw +Oi8veDEuYy5sZW5jci5vcmcvMCIGA1UdIAQbMBkwCAYGZ4EMAQIBMA0GCysGAQQB +gt8TAQEBMA0GCSqGSIb3DQEBCwUAA4ICAQCFyk5HPqP3hUSFvNVneLKYY611TR6W +PTNlclQtgaDqw+34IL9fzLdwALduO/ZelN7kIJ+m74uyA+eitRY8kc607TkC53wl +ikfmZW4/RvTZ8M6UK+5UzhK8jCdLuMGYL6KvzXGRSgi3yLgjewQtCPkIVz6D2QQz +CkcheAmCJ8MqyJu5zlzyZMjAvnnAT45tRAxekrsu94sQ4egdRCnbWSDtY7kh+BIm +lJNXoB1lBMEKIq4QDUOXoRgffuDghje1WrG9ML+Hbisq/yFOGwXD9RiX8F6sw6W4 +avAuvDszue5L3sz85K+EC4Y/wFVDNvZo4TYXao6Z0f+lQKc0t8DQYzk1OXVu8rp2 +yJMC6alLbBfODALZvYH7n7do1AZls4I9d1P4jnkDrQoxB3UqQ9hVl3LEKQ73xF1O +yK5GhDDX8oVfGKF5u+decIsH4YaTw7mP3GFxJSqv3+0lUFJoi5Lc5da149p90Ids +hCExroL1+7mryIkXPeFM5TgO9r0rvZaBFOvV2z0gp35Z0+L4WPlbuEjN/lxPFin+ +HlUjr8gRsI3qfJOQFy/9rKIJR0Y/8Omwt/8oTWgy1mdeHmmjk7j1nYsvC9JSQ6Zv +MldlTTKB3zhThV1+XWYp6rjd5JW1zbVWEkLNxE7GJThEUG3szgBVGP7pSWTUTsqX +nLRbwHOoq7hHwg== +-----END CERTIFICATE----- \ No newline at end of file diff --git a/nginx/ssl/private.pem b/nginx/ssl/private.pem new file mode 100644 index 0000000..786a146 --- /dev/null +++ b/nginx/ssl/private.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDFVdsL4OvpVLh4 +UQ43cwP8bSIVJw/BjJPeKDDqZQu8n54vuPY9evvMQp626vfXW8/his2RzIrAcb3r +Hj/AFWhSUREstaHwviHkBn7zwUneHqHgBlgUoZ9eiAYPjV8oaYDw+0grbcwG/bzT +hV7SNGJeyzVwU/VQJmB5JqPuyAn4iip4xpe8F3RyHgJYUVwSMlIAyiocbhsXzLRP +25S0mIJyW7KUwyINP3H2LvZR8A2KS+aaRISlT5QOyBlbpBJjbKsQd9+kkdTTy7v0 +hJqWXSRp1octeF301vX9KjDmLftLLbI9QrK1c7pr4T6E9/oxK8Y0NG+DLeRiPw7H +5OoZqtJZAgMBAAECggEAEXz6XKMiRRts/byxNdjLkaNaUeWUT+LVd+q36w3pbF34 +9uG9cNVlW0TMLAnGzR8l3Scf8Lvf0A5EdoHHxI4hIKpuizfNkjhHaJ3qwk9u7HBq +iCAHzkxEg2wqnVY6CKrQ8opSawbf/f6erWA0dwyNazk3Ey1doCzGf/YcsRypRY1R +EKB5X4U8buT03MwQGCnU242XYW9CB+pkRsA8lADAmatJ9WlUQ0lujw5ftX3lHESx +gHuzZbJxQsqGqmLq9RGPRY54KV1E2fIVYBj+c2uMxAf2Rz4N3SJt1LhPElHeZ0sm +XHfx0rBAjXgzE0iTKz6si5wL9dOp5ips/TNpJ8kYwQKBgQD3axGSfIpPQ8876t+M +MiQRYAvt2rrWTZnj4Ijahm4jI/dcZ2q1+1gisJ6uTv966phd9rQf7ULtJeHspn8z +w9hnh/JjEn6RPZUlsql5fjyYT0T0tBvoC8DJwegT1JnBu05KQbSzt0bcGpL46Cui +EETeg8nvRqV5pF66FdkVeK1ymwKBgQDMLhR91/F3gt/jQ8uDhg2ts60uMeR7e160 +4V9GVca7O4gkx6WSTT6tZiO6y1T0NBLWsRY3hbhsJQeb6wZPG9qYjY7BVpihxSiD +HqqIN2v/x9kNOEnmQTpck9jd1Ze4Ga1wHBHzPY4MQhwtIN5lXA93GocU9VIgQkUK +T0u6Cqz0GwKBgDWuIjrhEHUQJkc+t0/IlTC74PqzKTRT096wGaEn539yTznaKjnf +lYi5P0RcWWvGuFYyr3P52zpurKzWluSZSjt0MG+0VIeYj+KE9+YnMGhvUmuxJBjd +a++aRYr/5ng09lCAHv+a9SHOFjMw1D6uPvL0LvzeHArfUboYAWh6LU+fAoGAYvN+ +CNLregDaIhjL+2yvGlx2dGnHkjRi3IRQmRSe4ERkoXaD/lgjJQPYEwHRpRvLeXKP +Es9iZj635k9LWnFkSgRoh7hA9j1HeewVtzgsxeQDg82gus8nyo/4TOHjylvfWvKv +nFNbkQNFBnXkcfjgodcgWf7eEzYqoWl2iK39zbsCgYEA282e6wVhosqASeBZHf5t +AWGZdPBCdgXMJjUcn0hAJoN5rKgPxcHqvjj7RmPLgrFLSzuFfkKtAAG5SPY3uB1y +xMAOnrBhWwQOuBTgmezBzCkecgqEOmVQUlGSdEnPDTycpoZDYIvPqcVY1l4c/vLG +l0Ev8CfJhtpY3EinDwDL0lE= +-----END PRIVATE KEY----- diff --git a/nginx/ssl/public.pem b/nginx/ssl/public.pem new file mode 100644 index 0000000..ac11d1f --- /dev/null +++ b/nginx/ssl/public.pem @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxVXbC+Dr6VS4eFEON3MD +/G0iFScPwYyT3igw6mULvJ+eL7j2PXr7zEKetur311vP4YrNkcyKwHG96x4/wBVo +UlERLLWh8L4h5AZ+88FJ3h6h4AZYFKGfXogGD41fKGmA8PtIK23MBv2804Ve0jRi +Xss1cFP1UCZgeSaj7sgJ+IoqeMaXvBd0ch4CWFFcEjJSAMoqHG4bF8y0T9uUtJiC +cluylMMiDT9x9i72UfANikvmmkSEpU+UDsgZW6QSY2yrEHffpJHU08u79ISall0k +adaHLXhd9Nb1/Sow5i37Sy2yPUKytXO6a+E+hPf6MSvGNDRvgy3kYj8Ox+TqGarS +WQIDAQAB +-----END PUBLIC KEY----- diff --git a/nginx/test.sh b/nginx/test.sh new file mode 100644 index 0000000..9fb4240 --- /dev/null +++ b/nginx/test.sh @@ -0,0 +1,18 @@ +#!/bin/bash +cat ./data/conf.d/*.conf | grep "server_name" | grep -v "#" >> 1.txt #这里需要改成你的nginx路径 +sed -i "s#server_name##g" 1.txt +sed -i "s#;##g" 1.txt + +DomainList=`cat 1.txt | xargs` + +for i in $DomainList + do + DomainResults=`dig $i |grep "192.168.31.249" | wc -l` + if [ $DomainResults -eq 0 ];then + echo "$i 没有解析" >> ErrorDomainList.txt #没有解析的域名存入这个文件里面 + else + echo "$i" >> 3.txt #最终有解析的域名存入这个文件 + + + fi + done \ No newline at end of file diff --git a/online_drone/README.md b/online_drone/README.md new file mode 100644 index 0000000..1038ed9 --- /dev/null +++ b/online_drone/README.md @@ -0,0 +1,31 @@ +# 基于gitlab的drone部署 + +[GitLab | Drone](https://docs.drone.io/server/provider/gitlab/) + +[基于gitlab的drone的搭建和使用 - 系统运维 - 亿速云 (yisu.com)](https://www.yisu.com/zixun/15849.html) + +# drone的pipeline quickstart + +[Docker Pipelines | Drone](https://docs.drone.io/quickstart/docker/) + +# drone 部署 springboot + +[(101条消息) Drone CI/CD系列(三)——java语言(Springboot)之配置.drone.yml文件_Juinjonn的博客-CSDN博客_drone springboot](https://blog.csdn.net/Bert_Chen/article/details/123611752) + +# 基于gitea的部署 + +https://docs.drone.io/server/provider/gitea/ + +# 解决settings页面没有Trusted的问题 + +https://blog.csdn.net/qq_35425070/article/details/106822191 + +# [gitea & drone webhook推送不成功](https://www.cnblogs.com/shiningrise/p/16944140.html) + +https://www.cnblogs.com/shiningrise/p/16944140.html + + + +# Maven 项目使用 Drone 实现 CI/CD(含镜像源配置) + +https://www.jianshu.com/p/65bdd465a5b2 diff --git a/online_drone/docker-compose.yml b/online_drone/docker-compose.yml new file mode 100644 index 0000000..506115a --- /dev/null +++ b/online_drone/docker-compose.yml @@ -0,0 +1,63 @@ +# https://www.yisu.com/zixun/15849.html +# https://docs.drone.io/server/provider/gitlab/ +version: '3' +services: + drone-server: + restart: always ## 容器自动重启 + image: drone/drone:2 + container_name: drone-server-cloudnative + networks: ## 使用自定义网络,也可以不写 + - drone-net-cloudnative + ports: + - "9901:80" ## 映射到宿主机的端口 + volumes: + - ./data:/var/lib/drone + environment: + - DRONE_SERVER_HOST=drone.windymuse.com.cn ## 端口需要和映射至宿主机的一致 + - DRONE_SERVER_PROTO=https + - DRONE_RPC_SECRET=7e52616bc93b86d114f95de534011d82 ## openssl rand -hex 16 自动生成 + # true 表示允许注册,false 表示关闭注册功能,此时只有 DRONE_ADMIN 中指定的账户才能登录 + - DRONE_OPEN=true + # Drone 外网地址 + - DRONE_HOST=https://drone.windymuse.com.cn + # 使用 Gitea + - DRONE_GITEA=true + # Gitea 的 Client ID + - DRONE_GITEA_CLIENT_ID=d1da07a5-1033-467b-b579-a6a411b20f0f + # Gitea 的 Secret + - DRONE_GITEA_CLIENT_SECRET=gto_ujniibp4ju546mnptk76homqkj5kcbtsuqgpu2dqdztdzkffcwkq + # Gitea 的 URL + - DRONE_GITEA_SERVER=https://gitea.windymuse.com.cn + # 设置admin权限,以使用Trusted功能 + # https://blog.csdn.net/qq_35425070/article/details/106822146 + # https://blog.csdn.net/qq_35425070/article/details/106822191 + # ,token:Ac7W1qgPyqxe9u00lI9E2IBrXpT8T6CA + - DRONE_USER_CREATE=username:maidong,admin:true + drone-runner-docker: + restart: always ## 容器自动重启 + image: drone/drone-runner-docker:1 + container_name: drone-runner-docker-cloudnative + networks: + - drone-net-cloudnative + ports: + - "9902:3000" ## 映射到宿主机的端口,用于提供web页面,显示任务执行情况,可不映射 + volumes: + - /var/run/docker.sock:/var/run/docker.sock + environment: + - DRONE_RPC_PROTO=http + - DRONE_RPC_HOST=drone-server-cloudnative + - DRONE_RPC_SECRET=7e52616bc93b86d114f95de534011d82 ## 与server服务中保持一致 + - DRONE_RUNNER_NAME=docker-worker + - DRONE_RUNNER_CAPACITY=2 + - TZ=Asia/Shanghai + - DRONE_DEBUG=true + #- DRONE_LOGS_DEBUG=true + #- DRONE_LOGS_TRACE=true + - DRONE_UI_USERNAME=admin ## runner的web页面用户信息 + - DRONE_UI_PASSWORD=password + depends_on: + - drone-server + +networks: ## 可以不自定义 + drone-net-cloudnative: + driver: bridge diff --git a/online_drone/settings.xml b/online_drone/settings.xml new file mode 100644 index 0000000..9eab572 --- /dev/null +++ b/online_drone/settings.xml @@ -0,0 +1,15 @@ + + /root/.m2/repository + + + alimaven + aliyun + central + http://maven.aliyun.com/nexus/content/groups/public + + + + org.apache.maven.plugins + org.codehaus.mojo + + \ No newline at end of file diff --git a/online_gitea/docker-compose.yml b/online_gitea/docker-compose.yml new file mode 100644 index 0000000..0b9078e --- /dev/null +++ b/online_gitea/docker-compose.yml @@ -0,0 +1,28 @@ +version: "3" + +networks: + gitea: + external: false + +services: + server: + image: gitea/gitea:1.18.1 + container_name: gitea + environment: + - USER_UID=1000 + - USER_GID=1000 + - GITEA__database__DB_TYPE=mysql + - GITEA__database__HOST=rm-wz9yxho9eg3x33hpono.mysql.rds.aliyuncs.com:3306 + - GITEA__database__NAME=gitea + - GITEA__database__USER=gitea + - GITEA__database__PASSWD=ALVPD3iumzjBX4hiMjo3AWYN + restart: always + networks: + - gitea + volumes: + - ./gitea:/data + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + ports: + - "3000:3000" + - "222:22" diff --git a/online_gitea/readme.md b/online_gitea/readme.md new file mode 100644 index 0000000..18a0e18 --- /dev/null +++ b/online_gitea/readme.md @@ -0,0 +1,5 @@ + + +# [gitea & drone webhook推送不成功](https://www.cnblogs.com/shiningrise/p/16944140.html) + +https://www.cnblogs.com/shiningrise/p/16944140.html diff --git a/pgadmin/docker-compose.yml b/pgadmin/docker-compose.yml new file mode 100644 index 0000000..3355f21 --- /dev/null +++ b/pgadmin/docker-compose.yml @@ -0,0 +1,13 @@ +version: '3' +services: + pgweb: + image: dpage/pgadmin4 + container_name: pgadmin + ports: + - "18081:80" + environment: + PGADMIN_DEFAULT_EMAIL: "zeng32@qq.com" + PGADMIN_DEFAULT_PASSWORD: "123456" + volumes: + - ./pgadmin:/var/lib/pgadmin + restart: always \ No newline at end of file diff --git a/portainer/docker-compose.yml b/portainer/docker-compose.yml new file mode 100644 index 0000000..2a4f7d6 --- /dev/null +++ b/portainer/docker-compose.yml @@ -0,0 +1,12 @@ +version: "3.2" +services: + portainer: + image: portainer/portainer-ce + container_name: portainer + restart: always + ports: + - "8008:8000" + - "9009:9000" + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - ./data:/data \ No newline at end of file diff --git a/postgresql/docker-compose.yml b/postgresql/docker-compose.yml new file mode 100644 index 0000000..4cf2de1 --- /dev/null +++ b/postgresql/docker-compose.yml @@ -0,0 +1,19 @@ +version: '3.1' +services: + postgresql: + image: postgres:14 + container_name: postgresql + restart: always + environment: + POSTGRES_PASSWORD: root + ports: + - 5432:5432 + volumes: + - ./data:/var/lib/postgresql/data + + adminer: + image: adminer + container_name: postgresql-adminer + restart: always + ports: + - 8888:8080 \ No newline at end of file diff --git a/prometheus/docker-compose.yml b/prometheus/docker-compose.yml new file mode 100644 index 0000000..cf2018a --- /dev/null +++ b/prometheus/docker-compose.yml @@ -0,0 +1,38 @@ +version: '3' + +services: + + node_exporter: + image: prom/node-exporter:latest + container_name: node_exporter + command: + - '--path.rootfs=/host' + pid: host + user: root + restart: unless-stopped + environment: + - TZ=Asia/Shanghai + ports: + - 9100:9100 + volumes: + - '/:/host:ro,rslave' + + prometheus: + image: prom/prometheus:latest + restart: always + container_name: prometheus + hostname: prometheus + environment: + - TZ=Asia/Shanghai + ports: + - 9090:9090 + command: + - '--config.file=/etc/prometheus/prometheus.yml' + - '--storage.tsdb.path=/prometheus' + - '--web.console.libraries=/usr/share/prometheus/console_libraries' + - '--web.console.templates=/usr/share/prometheus/consoles' + - '--storage.tsdb.retention.time=7d' + - '--web.external-url=prometheus' + volumes: + - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml + - ./promdata:/prometheus diff --git a/prometheus/prometheus/prometheus.yml b/prometheus/prometheus/prometheus.yml new file mode 100644 index 0000000..cc9ef27 --- /dev/null +++ b/prometheus/prometheus/prometheus.yml @@ -0,0 +1,27 @@ +# my global config +global: + scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. + evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. + # scrape_timeout is set to the global default (10s). + +# Alertmanager configuration +alerting: + alertmanagers: + - static_configs: + - targets: + # - alertmanager:9093 + +# Load rules once and periodically evaluate them according to the global 'evaluation_interval'. +rule_files: + # - "first_rules.yml" + # - "second_rules.yml" + +# A scrape configuration containing exactly one endpoint to scrape: +# Here it's Prometheus itself. +scrape_configs: + # The job name is added as a label `job=` to any timeseries scraped from this config. + - job_name: 'node-exporter' + static_configs: + - targets: ['192.168.31.249:9100'] + labels: + host: myhost01 diff --git a/prometheus/readme.md b/prometheus/readme.md new file mode 100644 index 0000000..2567c93 --- /dev/null +++ b/prometheus/readme.md @@ -0,0 +1,11 @@ + + +# docker-compose搭建prometheus+grafana监控体系详细步骤说明(实战) + +https://blog.csdn.net/qq_36595568/article/details/124285925 + + + +# grafana监控id: 1860 + +https://grafana.com/grafana/dashboards/1860-node-exporter-full/ diff --git a/redis/conf/redis.conf b/redis/conf/redis.conf new file mode 100644 index 0000000..f440e3d --- /dev/null +++ b/redis/conf/redis.conf @@ -0,0 +1,423 @@ +# Note on units: when memory size is needed, it is possible to specifiy +# it in the usual form of 1k 5GB 4M and so forth: +# +# 1k => 1000 bytes +# 1kb => 1024 bytes +# 1m => 1000000 bytes +# 1mb => 1024*1024 bytes +# 1g => 1000000000 bytes +# 1gb => 1024*1024*1024 bytes +# +# units are case insensitive so 1GB 1Gb 1gB are all the same. + +# Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 +# 启用守护进程后,Redis会把pid写到一个pidfile中,在/var/run/redis.pid +daemonize no + +# 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定 +pidfile /var/run/redis.pid + +# 指定Redis监听端口,默认端口为6379 +# 如果指定0端口,表示Redis不监听TCP连接 +port 6379 + +# 绑定的主机地址 +# 你可以绑定单一接口,如果没有绑定,所有接口都会监听到来的连接 +bind 0.0.0.0 + +# Specify the path for the unix socket that will be used to listen for +# incoming connections. There is no default, so Redis will not listen +# on a unix socket when not specified. +# +# unixsocket /tmp/redis.sock +# unixsocketperm 755 + +# 当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能 +timeout 0 + +# 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose +# debug (很多信息, 对开发/测试比较有用) +# verbose (many rarely useful info, but not a mess like the debug level) +# notice (moderately verbose, what you want in production probably) +# warning (only very important / critical messages are logged) +loglevel verbose + +# 日志记录方式,默认为标准输出,如果配置为redis为守护进程方式运行,而这里又配置为标准输出,则日志将会发送给/dev/null +logfile /logs/redis.log + +# To enable logging to the system logger, just set 'syslog-enabled' to yes, +# and optionally update the other syslog parameters to suit your needs. +# syslog-enabled no + +# Specify the syslog identity. +# syslog-ident redis + +# Specify the syslog facility. Must be USER or between LOCAL0-LOCAL7. +# syslog-facility local0 + +# 设置数据库的数量,默认数据库为0,可以使用select 命令在连接上指定数据库id +# dbid是从0到‘databases’-1的数目 +databases 16 + +################################ SNAPSHOTTING ################################# +# 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合 +# Save the DB on disk: +# +# save +# +# Will save the DB if both the given number of seconds and the given +# number of write operations against the DB occurred. +# +# 满足以下条件将会同步数据: +# 900秒(15分钟)内有1个更改 +# 300秒(5分钟)内有10个更改 +# 60秒内有10000个更改 +# Note: 可以把所有“save”行注释掉,这样就取消同步操作了 + +save 900 1 +save 300 10 +save 60 10000 + +# 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大 +rdbcompression yes + +# 指定本地数据库文件名,默认值为dump.rdb +dbfilename dump.rdb + +# 工作目录. +# 指定本地数据库存放目录,文件名由上一个dbfilename配置项指定 +# +# Also the Append Only File will be created inside this directory. +# +# 注意,这里只能指定一个目录,不能指定文件名 +dir ./ + +################################# REPLICATION ################################# + +# 主从复制。使用slaveof从 Redis服务器复制一个Redis实例。注意,该配置仅限于当前slave有效 +# so for example it is possible to configure the slave to save the DB with a +# different interval, or to listen to another port, and so on. +# 设置当本机为slav服务时,设置master服务的ip地址及端口,在Redis启动时,它会自动从master进行数据同步 +# slaveof + + +# 当master服务设置了密码保护时,slav服务连接master的密码 +# 下文的“requirepass”配置项可以指定密码 +# masterauth + +# When a slave lost the connection with the master, or when the replication +# is still in progress, the slave can act in two different ways: +# +# 1) if slave-serve-stale-data is set to 'yes' (the default) the slave will +# still reply to client requests, possibly with out of data data, or the +# data set may just be empty if this is the first synchronization. +# +# 2) if slave-serve-stale data is set to 'no' the slave will reply with +# an error "SYNC with master in progress" to all the kind of commands +# but to INFO and SLAVEOF. +# +slave-serve-stale-data yes + +# Slaves send PINGs to server in a predefined interval. It's possible to change +# this interval with the repl_ping_slave_period option. The default value is 10 +# seconds. +# +# repl-ping-slave-period 10 + +# The following option sets a timeout for both Bulk transfer I/O timeout and +# master data or ping response timeout. The default value is 60 seconds. +# +# It is important to make sure that this value is greater than the value +# specified for repl-ping-slave-period otherwise a timeout will be detected +# every time there is low traffic between the master and the slave. +# +# repl-timeout 60 + +################################## SECURITY ################################### + +# Warning: since Redis is pretty fast an outside user can try up to +# 150k passwords per second against a good box. This means that you should +# use a very strong password otherwise it will be very easy to break. +# 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过auth 命令提供密码,默认关闭 +requirepass redis +# Command renaming. +# +# It is possilbe to change the name of dangerous commands in a shared +# environment. For instance the CONFIG command may be renamed into something +# of hard to guess so that it will be still available for internal-use +# tools but not available for general clients. +# +# Example: +# +# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 +# +# It is also possilbe to completely kill a command renaming it into +# an empty string: +# +# rename-command CONFIG "" + +################################### LIMITS #################################### + +# 设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数, +# 如果设置maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max Number of clients reached错误信息 +# maxclients 128 + +# Don't use more memory than the specified amount of bytes. +# When the memory limit is reached Redis will try to remove keys with an +# EXPIRE set. It will try to start freeing keys that are going to expire +# in little time and preserve keys with a longer time to live. +# Redis will also try to remove objects from free lists if possible. +# +# If all this fails, Redis will start to reply with errors to commands +# that will use more memory, like SET, LPUSH, and so on, and will continue +# to reply to most read-only commands like GET. +# +# WARNING: maxmemory can be a good idea mainly if you want to use Redis as a +# 'state' server or cache, not as a real DB. When Redis is used as a real +# database the memory usage will grow over the weeks, it will be obvious if +# it is going to use too much memory in the long run, and you'll have the time +# to upgrade. With maxmemory after the limit is reached you'll start to get +# errors for write operations, and this may even lead to DB inconsistency. +# 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key, +# 当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。 +# Redis新的vm机制,会把Key存放内存,Value会存放在swap区 +# maxmemory + +# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory +# is reached? You can select among five behavior: +# +# volatile-lru -> remove the key with an expire set using an LRU algorithm +# allkeys-lru -> remove any key accordingly to the LRU algorithm +# volatile-random -> remove a random key with an expire set +# allkeys->random -> remove a random key, any key +# volatile-ttl -> remove the key with the nearest expire time (minor TTL) +# noeviction -> don't expire at all, just return an error on write operations +# +# Note: with all the kind of policies, Redis will return an error on write +# operations, when there are not suitable keys for eviction. +# +# At the date of writing this commands are: set setnx setex append +# incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd +# sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby +# zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby +# getset mset msetnx exec sort +# +# The default is: +# +# maxmemory-policy volatile-lru + +# LRU and minimal TTL algorithms are not precise algorithms but approximated +# algorithms (in order to save memory), so you can select as well the sample +# size to check. For instance for default Redis will check three keys and +# pick the one that was used less recently, you can change the sample size +# using the following configuration directive. +# +# maxmemory-samples 3 + +############################## APPEND ONLY MODE ############################### + +# +# Note that you can have both the async dumps and the append only file if you +# like (you have to comment the "save" statements above to disable the dumps). +# Still if append only mode is enabled Redis will load the data from the +# log file at startup ignoring the dump.rdb file. +# 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。 +# 因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no +# IMPORTANT: Check the BGREWRITEAOF to check how to rewrite the append +# log file in background when it gets too big. + +appendonly yes + +# 指定更新日志文件名,默认为appendonly.aof +# appendfilename appendonly.aof + +# The fsync() call tells the Operating System to actually write data on disk +# instead to wait for more data in the output buffer. Some OS will really flush +# data on disk, some other OS will just try to do it ASAP. + +# 指定更新日志条件,共有3个可选值: +# no:表示等操作系统进行数据缓存同步到磁盘(快) +# always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全) +# everysec:表示每秒同步一次(折衷,默认值) + +appendfsync everysec +# appendfsync no + +# When the AOF fsync policy is set to always or everysec, and a background +# saving process (a background save or AOF log background rewriting) is +# performing a lot of I/O against the disk, in some Linux configurations +# Redis may block too long on the fsync() call. Note that there is no fix for +# this currently, as even performing fsync in a different thread will block +# our synchronous write(2) call. +# +# In order to mitigate this problem it's possible to use the following option +# that will prevent fsync() from being called in the main process while a +# BGSAVE or BGREWRITEAOF is in progress. +# +# This means that while another child is saving the durability of Redis is +# the same as "appendfsync none", that in pratical terms means that it is +# possible to lost up to 30 seconds of log in the worst scenario (with the +# default Linux settings). +# +# If you have latency problems turn this to "yes". Otherwise leave it as +# "no" that is the safest pick from the point of view of durability. +no-appendfsync-on-rewrite no + +# Automatic rewrite of the append only file. +# Redis is able to automatically rewrite the log file implicitly calling +# BGREWRITEAOF when the AOF log size will growth by the specified percentage. +# +# This is how it works: Redis remembers the size of the AOF file after the +# latest rewrite (or if no rewrite happened since the restart, the size of +# the AOF at startup is used). +# +# This base size is compared to the current size. If the current size is +# bigger than the specified percentage, the rewrite is triggered. Also +# you need to specify a minimal size for the AOF file to be rewritten, this +# is useful to avoid rewriting the AOF file even if the percentage increase +# is reached but it is still pretty small. +# +# Specify a precentage of zero in order to disable the automatic AOF +# rewrite feature. + +auto-aof-rewrite-percentage 100 +auto-aof-rewrite-min-size 64mb + +################################## SLOW LOG ################################### + +# The Redis Slow Log is a system to log queries that exceeded a specified +# execution time. The execution time does not include the I/O operations +# like talking with the client, sending the reply and so forth, +# but just the time needed to actually execute the command (this is the only +# stage of command execution where the thread is blocked and can not serve +# other requests in the meantime). +# +# You can configure the slow log with two parameters: one tells Redis +# what is the execution time, in microseconds, to exceed in order for the +# command to get logged, and the other parameter is the length of the +# slow log. When a new command is logged the oldest one is removed from the +# queue of logged commands. + +# The following time is expressed in microseconds, so 1000000 is equivalent +# to one second. Note that a negative number disables the slow log, while +# a value of zero forces the logging of every command. +slowlog-log-slower-than 10000 + +# There is no limit to this length. Just be aware that it will consume memory. +# You can reclaim memory used by the slow log with SLOWLOG RESET. +slowlog-max-len 1024 + +################################ VIRTUAL MEMORY ############################### + +### WARNING! Virtual Memory is deprecated in Redis 2.4 +### The use of Virtual Memory is strongly discouraged. + +### WARNING! Virtual Memory is deprecated in Redis 2.4 +### The use of Virtual Memory is strongly discouraged. + +# Virtual Memory allows Redis to work with datasets bigger than the actual +# amount of RAM needed to hold the whole dataset in memory. +# In order to do so very used keys are taken in memory while the other keys +# are swapped into a swap file, similarly to what operating systems do +# with memory pages. +# 指定是否启用虚拟内存机制,默认值为no, +# VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中 +# 把vm-enabled设置为yes,根据需要设置好接下来的三个VM参数,就可以启动VM了 +# vm-enabled no +# vm-enabled yes + +# This is the path of the Redis swap file. As you can guess, swap files +# can't be shared by different Redis instances, so make sure to use a swap +# file for every redis process you are running. Redis will complain if the +# swap file is already in use. +# +# Redis交换文件最好的存储是SSD(固态硬盘) +# 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享 +# *** WARNING *** if you are using a shared hosting the default of putting +# the swap file under /tmp is not secure. Create a dir with access granted +# only to Redis user and configure Redis to create the swap file there. +# vm-swap-file /tmp/redis.swap + +# With vm-max-memory 0 the system will swap everything it can. Not a good +# default, just specify the max amount of RAM you can in bytes, but it's +# better to leave some margin. For instance specify an amount of RAM +# that's more or less between 60 and 80% of your free RAM. +# 将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多少,所有索引数据都是内存存储的(Redis的索引数据就是keys) +# 也就是说当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0 +# vm-max-memory 0 + +# Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的数据大小来设定的。 +# 建议如果存储很多小对象,page大小最后设置为32或64bytes;如果存储很大的对象,则可以使用更大的page,如果不确定,就使用默认值 +# vm-page-size 32 + +# 设置swap文件中的page数量由于页表(一种表示页面空闲或使用的bitmap)是存放在内存中的,在磁盘上每8个pages将消耗1byte的内存 +# swap空间总容量为 vm-page-size * vm-pages +# +# With the default of 32-bytes memory pages and 134217728 pages Redis will +# use a 4 GB swap file, that will use 16 MB of RAM for the page table. +# +# It's better to use the smallest acceptable value for your application, +# but the default is large in order to work in most conditions. +# vm-pages 134217728 + +# Max number of VM I/O threads running at the same time. +# This threads are used to read/write data from/to swap file, since they +# also encode and decode objects from disk to memory or the reverse, a bigger +# number of threads can help with big objects even if they can't help with +# I/O itself as the physical device may not be able to couple with many +# reads/writes operations at the same time. +# 设置访问swap文件的I/O线程数,最后不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟,默认值为4 +# vm-max-threads 4 + +############################### ADVANCED CONFIG ############################### + +# Hashes are encoded in a special way (much more memory efficient) when they +# have at max a given numer of elements, and the biggest element does not +# exceed a given threshold. You can configure this limits with the following +# configuration directives. +# 指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法 +# hash-max-zipmap-entries 512 +# hash-max-zipmap-value 64 + +# Similarly to hashes, small lists are also encoded in a special way in order +# to save a lot of space. The special representation is only used when +# you are under the following limits: +list-max-ziplist-entries 512 +list-max-ziplist-value 64 + +# Sets have a special encoding in just one case: when a set is composed +# of just strings that happens to be integers in radix 10 in the range +# of 64 bit signed integers. +# The following configuration setting sets the limit in the size of the +# set in order to use this special memory saving encoding. +set-max-intset-entries 512 + +# Similarly to hashes and lists, sorted sets are also specially encoded in +# order to save a lot of space. This encoding is only used when the length and +# elements of a sorted set are below the following limits: +zset-max-ziplist-entries 128 +zset-max-ziplist-value 64 + +# Active rehashing uses 1 millisecond every 100 milliseconds of CPU time in +# order to help rehashing the main Redis hash table (the one mapping top-level +# keys to values). The hash table implementation redis uses (see dict.c) +# performs a lazy rehashing: the more operation you run into an hash table +# that is rhashing, the more rehashing "steps" are performed, so if the +# server is idle the rehashing is never complete and some more memory is used +# by the hash table. +# +# The default is to use this millisecond 10 times every second in order to +# active rehashing the main dictionaries, freeing memory when possible. +# +# If unsure: +# use "activerehashing no" if you have hard latency requirements and it is +# not a good thing in your environment that Redis can reply form time to time +# to queries with 2 milliseconds delay. +# 指定是否激活重置哈希,默认为开启 +activerehashing yes + +################################## INCLUDES ################################### + +# 指定包含其他的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各实例又拥有自己的特定配置文件 +# include /path/to/local.conf +# include /path/to/other.conf \ No newline at end of file diff --git a/redis/docker-compose.yml b/redis/docker-compose.yml new file mode 100644 index 0000000..edd5001 --- /dev/null +++ b/redis/docker-compose.yml @@ -0,0 +1,14 @@ +# https://zhuanlan.zhihu.com/p/384332104 +version: '3' +services: + redis: + image: redis:4.0.1 + restart: always + container_name: redis-401 + volumes: + - ./data:/data + - ./conf/redis.conf:/usr/local/etc/redis/redis.conf + - ./logs:/logs + command: redis-server /usr/local/etc/redis/redis.conf + ports: + - '6379:6379' diff --git a/redis/start.sh b/redis/start.sh new file mode 100644 index 0000000..03a68b0 --- /dev/null +++ b/redis/start.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +set -e + +tm=`date +%Y%m%d-%H%M%S` +echo "=====================================================" +echo "Starting redis." +echo "Starting <${tm}>." +echo "=====================================================" +echo "Please ensure the config files right." +echo "=====================================================" + +docker-compose -p redis up -d diff --git a/redis/stop.sh b/redis/stop.sh new file mode 100644 index 0000000..cb55f19 --- /dev/null +++ b/redis/stop.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +set -e + +tm=`date +%Y%m%d-%H%M%S` +echo "=====================================================" +echo "Starting redis." +echo "Starting <${tm}>." +echo "=====================================================" +echo "Please ensure the config files right." +echo "=====================================================" + +docker-compose -p redis down diff --git a/sonarqube/README.md b/sonarqube/README.md new file mode 100644 index 0000000..fc5ab15 --- /dev/null +++ b/sonarqube/README.md @@ -0,0 +1,35 @@ +# 参考文档 + +[docker-compose部署SonarQube - 掘金 (juejin.cn)](https://juejin.cn/post/7027362354547392526) + +# 启动时候遇到的问题 + +## 权限问题 + +chmod -R 777 . + +## max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] + +[(101条消息) max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]_无关痛痒qaq的博客-CSDN博客](https://blog.csdn.net/qq_43655835/article/details/104633359) + +### 原因 + +**sonarqube底层用的是elasticsearch** + +# 默认用户名和密码 + +admin + +admin + +# 新密码 + +admin123 + +# 与gitlab集成 + +[(101条消息) SonarQube与GitLab集成_椰汁菠萝的博客-CSDN博客_gitlab sonarqube](https://blog.csdn.net/suo082407128/article/details/119328421) + +# 安装中文插件 + +[sonar+Jenkins 构建代码质量自动化分析平台 - 腾讯云开发者社区-腾讯云 (tencent.com)](https://cloud.tencent.com/developer/article/1698814#:~:text=%E7%99%BB%E9%99%86sonar%E5%90%8E%EF%BC%8C%E5%9C%A8Administration%E2%80%93%3ESystem%E2%80%93%3EUpdate,Center%E2%80%93%3EAvailable%E4%B8%AD%E6%90%9C%E7%B4%A2Chinese%E5%B0%B1%E5%8F%AF%E4%BB%A5%E7%9C%8B%E5%88%B0%E4%B8%AD%E6%96%87%E6%8F%92%E4%BB%B6%E5%8C%85%EF%BC%8C%E7%82%B9%E5%87%BBinstall%E5%8D%B3%E5%8F%AF%E5%AE%89%E8%A3%85%E3%80%82) diff --git a/sonarqube/docker-compose.yml b/sonarqube/docker-compose.yml new file mode 100644 index 0000000..0380aa7 --- /dev/null +++ b/sonarqube/docker-compose.yml @@ -0,0 +1,41 @@ +# https://juejin.cn/post/7027362354547392526 +version: '3' +services: + # postgres: + # image: postgres:12 + # restart: always + # container_name: postgres + # ports: + # - 5432:5432 + # volumes: + # - /opt/postgres/postgresql/:/var/lib/postgresql + # - /opt/postgres/data/:/var/lib/postgresql/data + # environment: + # TZ: Asia/Shanghai + # POSTGRES_USER: sonar + # POSTGRES_PASSWORD: sonar123 + # POSTGRES_DB: sonar + # networks: + # - sonar-network + sonar: + image: sonarqube:9.8-community + restart: always + container_name: sonar + # depends_on: + # - postgres + volumes: + - ./extensions:/opt/sonarqube/extensions + - ./logs:/opt/sonarqube/logs + - ./data:/opt/sonarqube/data + - ./conf:/opt/sonarqube/conf + ports: + - 9000:9000 + environment: + SONARQUBE_JDBC_USERNAME: postgres + SONARQUBE_JDBC_PASSWORD: root + SONARQUBE_JDBC_URL: jdbc:postgresql://192.168.31.249:5432/postgres + networks: + - sonar-network +networks: + sonar-network: + driver: bridge \ No newline at end of file diff --git a/sonarqube/extensions/sonar-l10n-zh-plugin-9.8.jar b/sonarqube/extensions/sonar-l10n-zh-plugin-9.8.jar new file mode 100644 index 0000000000000000000000000000000000000000..8fc7de884171fe5fd7305737508147855aaaffa7 GIT binary patch literal 69316 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 literal 0 HcmV?d00001 diff --git a/telegraf/docker-compose.yml b/telegraf/docker-compose.yml new file mode 100644 index 0000000..13c1afd --- /dev/null +++ b/telegraf/docker-compose.yml @@ -0,0 +1,18 @@ +version: '3' + +services: + + telegraf: + image: telegraf + container_name: telegraf + restart: always + volumes: + - ./telegraf:/etc/telegraf + - /sys:/rootfs/sys:ro + - /proc:/rootfs/proc:ro + - /var/run/docker.sock:/var/run/docker.sock:ro + environment: + - 'HOST_PROC=/rootfs/proc' + - 'HOST_SYS=/rootfs/sys' + - /etc/localtime:/etc/localtime:ro + diff --git a/uptime-kuma/docker-compose.yml b/uptime-kuma/docker-compose.yml new file mode 100644 index 0000000..1c31f6b --- /dev/null +++ b/uptime-kuma/docker-compose.yml @@ -0,0 +1,11 @@ +version: '3.3' + +services: + uptime-kuma: + image: louislam/uptime-kuma:latest + container_name: uptime-kuma + restart: always + volumes: + - ./uptime-kuma:/app/data + ports: + - 3001:3001 diff --git a/uptime-kuma/readme.md b/uptime-kuma/readme.md new file mode 100644 index 0000000..d3d6314 --- /dev/null +++ b/uptime-kuma/readme.md @@ -0,0 +1,5 @@ +用户名和密码 + +admin + +rwc@ync0gph1JRJ@bhp diff --git a/uptime-kuma/uptime-kuma/error.log b/uptime-kuma/uptime-kuma/error.log new file mode 100644 index 0000000..cd3c33e --- /dev/null +++ b/uptime-kuma/uptime-kuma/error.log @@ -0,0 +1,204 @@ +[2022-08-24 03:14:03] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 9, '200 - OK', 6, 1, '2022-08-24 03:14:01') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-08-27 03:14:02] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 1, '200 - ', 182, 1, '2022-08-27 03:14:00') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-08-29 03:14:02] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 4, '200 - ', 199, 1, '2022-08-29 03:14:00') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-08-31 03:14:04] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (61, false, 8, '200 - OK', 253, 1, '2022-08-31 03:14:02') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-09-02 03:14:03] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 3, '200 - ', 167, 1, '2022-09-02 03:14:01') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-09-06 03:14:02] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 7, '200 - OK', 6, 1, '2022-09-06 03:14:00') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-09-16 03:14:03] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 12, '200 - OK', 6, 1, '2022-09-16 03:14:01') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-10-29 03:14:03] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 2, '200 - ', 8, 1, '2022-10-29 03:14:01') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-11-05 03:14:05] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `status`, `time`) values (60, false, 5, 'certificate has expired', 0, '2022-11-05 03:14:04') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-11-12 03:14:06] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `status`, `time`) values (60, false, 5, 'certificate has expired', 0, '2022-11-12 03:14:05') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-11-13 03:14:05] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 11, '200 - OK', 10, 1, '2022-11-13 03:14:03') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-11-14 03:14:03] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 1, '200 - ', 158, 1, '2022-11-14 03:14:00') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-11-17 03:14:03] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 7, '200 - OK', 7, 1, '2022-11-17 03:14:01') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-11-19 03:14:07] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `status`, `time`) values (60, false, 5, 'certificate has expired', 0, '2022-11-19 03:14:05') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-11-20 03:14:02] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 7, '200 - OK', 6, 1, '2022-11-20 03:14:00') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-11-21 03:14:02] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 11, '200 - OK', 9, 1, '2022-11-21 03:14:00') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-11-30 03:14:02] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (64, false, 8, '200 - OK', 4296, 1, '2022-11-30 03:13:57') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-12-03 03:14:04] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 2, '200 - ', 9, 1, '2022-12-03 03:14:01') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-12-05 03:14:03] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (61, false, 13, '200 - OK', 6, 1, '2022-12-05 03:14:01') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-12-05 03:14:05] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 11, '200 - OK', 7, 1, '2022-12-05 03:14:01') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-12-06 03:14:04] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 1, '200 - ', 150, 1, '2022-12-06 03:14:02') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-12-07 03:14:03] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 14, '200 - OK', 7, 1, '2022-12-07 03:14:01') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-12-08 03:14:03] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 9, '200 - OK', 13, 1, '2022-12-08 03:14:01') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-12-10 03:14:03] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 14, '200 - OK', 9, 1, '2022-12-10 03:14:01') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-12-10 03:14:05] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (65, false, 8, '200 - OK', 4460, 1, '2022-12-10 03:13:58') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-12-10 03:14:06] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 7, '200 - OK', 9, 1, '2022-12-10 03:14:01') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-12-13 03:14:01] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `status`, `time`) values (60, false, 5, 'certificate has expired', 0, '2022-12-13 03:14:00') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-12-15 03:14:03] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 13, '200 - OK', 14, 1, '2022-12-15 03:14:01') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-12-19 03:14:02] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 14, '200 - OK', 6, 1, '2022-12-19 03:14:00') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-12-19 03:14:04] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 7, '200 - OK', 5, 1, '2022-12-19 03:14:00') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-12-19 03:14:05] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (64, false, 8, '200 - OK', 3822, 1, '2022-12-19 03:14:00') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-12-20 03:14:02] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `status`, `time`) values (60, false, 5, 'certificate has expired', 0, '2022-12-20 03:14:01') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-12-27 03:14:04] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `status`, `time`) values (60, false, 5, 'certificate has expired', 0, '2022-12-27 03:14:02') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-12-27 03:14:05] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (61, false, 3, '200 - ', 185, 1, '2022-12-27 03:14:02') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-12-28 03:14:03] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 9, '200 - OK', 7, 1, '2022-12-28 03:14:01') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2022-12-29 03:14:02] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 8, '200 - OK', 11, 1, '2022-12-29 03:14:01') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2023-01-01 03:14:02] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 8, '200 - OK', 10, 1, '2023-01-01 03:14:01') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2023-01-01 03:14:06] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 7, '200 - OK', 6, 1, '2023-01-01 03:14:04') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2023-01-03 03:14:04] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `status`, `time`) values (60, false, 5, 'certificate has expired', 0, '2023-01-03 03:14:03') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2023-01-04 03:14:03] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 8, '200 - OK', 9, 1, '2023-01-04 03:14:02') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2023-01-07 03:14:02] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 1, '200 - ', 149, 1, '2023-01-07 03:14:00') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2023-01-07 03:14:05] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 9, '200 - OK', 6, 1, '2023-01-07 03:14:03') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2023-01-08 03:14:04] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 14, '200 - OK', 6, 1, '2023-01-08 03:14:01') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2023-01-08 03:14:05] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 10, '200 - OK', 6, 1, '2023-01-08 03:14:01') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2023-01-08 03:14:08] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 6, '200 - OK', 6, 1, '2023-01-08 03:14:02') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2023-01-08 03:14:09] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 11, '200 - OK', 9, 1, '2023-01-08 03:14:03') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2023-01-10 03:14:06] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 5, '200 - OK', 7, 1, '2023-01-10 03:14:04') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2023-01-10 03:14:10] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 8, '200 - OK', 10, 1, '2023-01-10 03:14:09') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2023-01-11 03:14:04] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 6, '200 - OK', 5, 1, '2023-01-11 03:14:02') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2023-01-11 03:14:06] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (60, false, 4, '200 - ', 185, 1, '2023-01-11 03:14:03') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +} +[2023-01-11 03:14:08] [Error: insert into `heartbeat` (`duration`, `important`, `monitor_id`, `msg`, `ping`, `status`, `time`) values (61, false, 1, '200 - ', 148, 1, '2023-01-11 03:14:05') - SQLITE_BUSY: database is locked] { + errno: 5, + code: 'SQLITE_BUSY' +}