首页
留言
友链
关于
Search
1
思源笔记docker私有化部署及使用体验分享
2,528 阅读
2
windows11 远程提示:为安全考虑,已锁定该用户帐户,原因是登录尝试或密码更改尝试过多。
1,147 阅读
3
解决 nginxProxyManager 申请证书时的SSL失败问题
656 阅读
4
Pointer-Focus:一款功能强大的教学、录屏辅助软件
635 阅读
5
使用cspell对项目做拼写规范检查
598 阅读
Web前端
CSS
JavaScript
交互
Vue
小程序
后端
运维
项目
生活
其他
转载
软件
职场
登录
Search
标签搜索
docker
DevOps
magic-boot
Linux
酷壳
frp
RabbitMQ
gitlab
Node
git
工具
MybatisPlus
clickhouse
Syncthing
规范
前端
产品
nginx
markdown
axios
朱治龙
累计撰写
146
篇文章
累计收到
9
条评论
首页
栏目
Web前端
CSS
JavaScript
交互
Vue
小程序
后端
运维
项目
生活
其他
转载
软件
职场
页面
留言
友链
关于
搜索到
146
篇与
朱治龙
的结果
2025-01-24
FRP升级记录
背景介绍FRP 是一款非常优秀的内网穿透和反向代理软件,它允许用户通过公网访问内网资源,无需复杂的网络配置,极大地提高了工作效率。程序员的电脑基本上不关机,偶尔需要从其他电脑取些文件或远程处理点工作上的事,就非常需要这样的软件。2023年部署的时候 FRP 最新版本是 FRP 0.51.2,使用 docker 部署,从 0.52.0 开始,FRP 将配置文件由 ini 格式改为 toml 格式了,格式变更后,导致原来的配置文件不能复用,便一直未升级到最新版。年底趁手头紧要工作处理完了,便想着顺带升级一下。服务端升级服务端部署在腾讯云一台国内服务器上,使用 docker compose 编排,升级后的 docker-compose.yaml 文件内容如下:services: frps_work: restart: always network_mode: host volumes: - ./frps.toml:/etc/frp/frps.toml - ./logs:/etc/frp/logs container_name: frps_work image: snowdreamtech/frps:0.61.1frps.toml 文件内容如下:bindPort = 7200 auth.method = "token" auth.token = "admin" vhostHTTPPort = 89 vhostHTTPSPort = 4444 subDomainHost = "work.zhuzhilong.com" enablePrometheus = true webServer.addr = "0.0.0.0" webServer.port = 7202 # 由于使用nginx代理的时候开启了基于 webauth 的认证,这里我就不开启了 #webServer.user = "zhuzl" #webServer.password = "20080708"上面的配置中,我们配置了一个89端口的http服务,并使用 .work.zhuzhilong.com 的泛域名作为二级域名后缀。我们需要使用nginxProxyManager 配置一个代理,将 .work.zhuzhilong.com 的请求都代理到 89 端口:开启 SSL,这样代理的服务可以同时启用 http 服务及 https 服务访问:客户端升级之前买了一台迷你主机放在公司,作为开发服务器使用,使用的 Ubuntu 操作系统,使用 docker 部署的frpc客户端,修改后的 docker-compose.yaml 文件内容如下:services: frpczzl: restart: always network_mode: host volumes: # - ./frpc.ini:/etc/frp/frpc.ini - ./frpc.toml:/etc/frp/frpc.toml - ./logs/:/etc/frp/logs/ container_name: frpczzl # image: snowdreamtech/frpc:0.51.2 image: snowdreamtech/frpc:0.61.1frpc.toml 核心内容如下:user = "work" serverAddr = "119.29.149.159" serverPort = 7200 auth.token = "admin" # for tcp [[proxies]] name = "work-mysql-3306" type = "tcp" localIP = "127.0.0.1" localPort = 3306 remotePort = 3402 # for web [[proxies]] name = "work-http-123" httpUser = "zhuzl" httpPassword = "zhuzl" type = "http" localIP = "127.0.0.1" localPort = 80 subdomain = "123" [[proxies]] name = "work-http-spug" type = "http" localIP = "127.0.0.1" localPort = 80 subdomain = "spug" dashboardfrps中我们开启的webServer,可以通过 7202 端口查看 dashboard,界面截图如下:相关链接:Github:https://github.com/fatedier/frp官网:https://gofrp.org/
2025年01月24日
3 阅读
0 评论
0 点赞
2025-01-15
个人博客服务器迁移记录
背景说明由于 zhuzhilong.cn 域名未备案,在国内不能直接访问,于2023年5月15日,在腾讯云买了台轻量应用服务器(配置:2H2G60G30M)来部署未备案的网站,我的个人博客也迁移到了这个服务器上,服务器35元/月,价格也不算贵,一年的服务器费用大概35*12=420元,服务器基本信息如下:去年腾讯云搞活动,有一款配置差不多的轻量应用服务器只需要99元一年,并且可以续费两年:便新购了另外一台轻量应用服务器(配置:2H2G50G30M):这样算下来 3 年只需要 99+99+59.4=257.4 元,也就是3年的费用相当于原服务器一年费用的一半多一点,作为非营运网站,也没有较高的负载,能省一点是一点吧。服务器环境说明原服务器上部署了如下环境:宝塔面板MySQL 5.7php 5.6php 7.3以上环境都是基于宝塔面板进行集成安装的,宝塔面板在管理上挺方便,但是占用资源较多,且存在服务器信息泄露的风险,新服务器便计划采用如下环境:Dockerdocker compose + NginxProxyManagerdocker compose + php 5.6 Z + www.trswcm.comdocker compose + php 7.3 + blog.zhuzhilong.cn新服务器部署记录1、安装 DockerDocker 的安装参考 官网的安装文档(https://docs.docker.com/engine/install/)进行安装即可,如果是国内环境的话,推荐使用阿里云镜像2、添加 Docker 桥接网络推荐使用自定义 Docker 桥接网络,之前有服务器跑的容器多了,到后面会报创建网络失败的情况docker network create --subnet=172.66.0.0/16 --gateway=172.66.0.1 --opt "com.docker.network.bridge.default_bridge"="false" --opt "com.docker.network.bridge.name"="bridge_zzl" --opt "com.docker.network.bridge.enable_icc"="true" --opt "com.docker.network.bridge.enable_ip_masquerade"="true" --opt "com.docker.network.bridge.host_binding_ipv4"="0.0.0.0" --opt "com.docker.network.driver.mtu"="1500" bridge_zzl3、使用docker compose 部署 MySQL 5.7services: mysql: image: mysql:5.7 container_name: mysql-5.7 #使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限 #设置为true,不然数据卷可能挂载不了,启动不起 privileged: true restart: always networks: - net-zzl ports: - "3316:3306" environment: MYSQL_ROOT_PASSWORD: PASSWORD123 MYSQL_USER: zhuzl MYSQL_PASSWORD: PASSWORD123 TZ: Asia/Shanghai command: --wait_timeout=31536000 --interactive_timeout=31536000 --max_connections=1000 --default-authentication-plugin=mysql_native_password volumes: #映射mysql的数据目录到宿主机,保存数据 #- ./data:/var/lib/mysql - ./data:/www/server/data #根据宿主机下的配置文件创建容器 - ./config/my.cnf:/etc/mysql/my.cnf - ../hosts:/etc/hosts networks: net-zzl: name: bridge_zzl external: true config/my.cnf 内容:[client] #password = your_password port = 3306 socket = /tmp/mysql.sock default-character-set=utf8mb4 [mysqld] port = 3306 socket = /tmp/mysql.sock datadir = /www/server/data default_storage_engine = InnoDB character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci performance_schema_max_table_instances = 400 table_definition_cache = 400 skip-external-locking key_buffer_size = 64M max_allowed_packet = 1G table_open_cache = 128 sort_buffer_size = 16M net_buffer_length = 4K read_buffer_size = 16M read_rnd_buffer_size = 256K myisam_sort_buffer_size = 256M thread_cache_size = 512 tmp_table_size = 32M default_authentication_plugin = mysql_native_password lower_case_table_names = 1 sql-mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES explicit_defaults_for_timestamp = true #skip-name-resolve max_connections = 500 max_connect_errors = 100 open_files_limit = 65535 log-bin=mysql-bin binlog_format=mixed server-id = 1 # binlog_expire_logs_seconds = 600000 slow_query_log=1 slow-query-log-file=/www/server/data/mysql-slow.log long_query_time=3 #log_queries_not_using_indexes=on early-plugin-load = "" innodb_data_home_dir = /www/server/data innodb_data_file_path = ibdata1:10M:autoextend innodb_log_group_home_dir = /www/server/data innodb_buffer_pool_size = 4096M innodb_log_file_size = 2048M innodb_log_buffer_size = 512M innodb_flush_log_at_trx_commit = 1 innodb_lock_wait_timeout = 50 innodb_max_dirty_pages_pct = 90 innodb_read_io_threads = 16 innodb_write_io_threads = 16 [mysqldump] quick max_allowed_packet = 500M [mysql] no-auto-rehash default-character-set=utf8mb4 [myisamchk] key_buffer_size = 64M sort_buffer_size = 16M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout 4、使用docker compose 部署 nginxProxyManager官网部署文档:https://nginxproxymanager.com/guide/#quick-setupdocker-compose.yml 文件内容如下:services: npm: image: jc21/nginx-proxy-manager:latest container_name: npm restart: unless-stopped networks: - net-zzl environment: - ACME_AGREE=true - TZ=Asia/Shanghai ports: - 80:80 - 443:443 - 81:81 volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt - ../hosts:/etc/hosts networks: net-zzl: name: bridge_zzl external: true5、使用docker compose 部署 blog.zhuzhilong.cn 个人博客我的个人博客(blog.zhuzhilong.cn)使用 Typecho 搭建,核心需要的环境 是 php 7.x + mysql.docker-compose.yml 内容如下:services: zzlblog: image: nginx:latest container_name: zzlblog networks: - net-zzl ports: - 8100:80 environment: - TZ=Asia/Shanghai restart: always volumes: - ./www:/var/www/html - ./logs:/var/log/nginx - ./nginx:/etc/nginx/conf.d - ../hosts:/etc/hosts depends_on: - php73 php73: image: yearnfar/typecho-php:latest #image: tsund/php:7.2-fpm-alpine container_name: php73 restart: unless-stopped networks: - net-zzl ports: - 9073:9000 environment: - TZ=Asia/Shanghai volumes: - ./www:/var/www/html - ../hosts:/etc/hosts networks: net-zzl: name: bridge_zzl external: trueyearnfar/typecho-php:latest 镜像主要是参考 https://github.com/yearnfar/typecho-docker 在服务器上直接 build 生成的的镜像。nginx/default.conf 文件内容如下:server { listen 80; server_name localhost; root /var/www/html; index index.php; access_log /var/log/nginx/zzlblog_access.log main; error_log /var/log/nginx/zzlblog_error.log; if (!-e $request_filename) { rewrite ^(.*)$ /index.php$1 last; } location ~ [^/]\.php(/|$) { root /var/www/html; fastcgi_pass php73:9000; proxy_set_header Host $host; #fastcgi_pass hostserver:9073; fastcgi_index index.php; #ifastcgi_param PATH_INFO $fastcgi_path_info; #fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; #fastcgi_param SCRIPT_NAME $fastcgi_script_name; # fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; include fastcgi_params; } }5、使用docker compose 部署 www.trswcm.comwww.trswcm.com 是我维护了十多年的一个小众网站,主要是十多年前做TRS产品实施的时候分享一些项目实施经验,十多年过去已经很少更新了,不过一天还是有十多 UV 的访问量,还能帮助到一小部分特定人群,使用 QYKCMS 搭建,核心需要的环境 是 php 5.x+ mysql.docker-compose.yml 文件内容如下:services: trswcm: image: nginx container_name: trswcm networks: - net-zzl ports: - 8101:80 environment: - TZ=Asia/Shanghai restart: always volumes: - ./www:/var/www/html - ./logs:/var/log/nginx - ./nginx:/etc/nginx/conf.d - ../hosts:/etc/hosts depends_on: - php56 php56: image: raccourci/php56:latest container_name: php56 restart: unless-stopped networks: - net-zzl ports: - 9056:9000 environment: - TZ=Asia/Shanghai volumes: - ./www:/var/www/html - ../hosts:/etc/hosts networks: net-zzl: name: bridge_zzl external: truenginx/default.conf 文件内容如下:server { listen 80; server_name www.trswcm.com localhost; root /var/www/html; index index.html index.htm index.php default.php default.htm default.html; access_log /var/log/nginx/trswcm_access.log main; error_log /var/log/nginx/trswcm_error.log; #if (!-e $request_filename) { # rewrite ^(.*)$ /index.php$1 last; #} location ~ [^/]\.php(/|$) { root /var/www/html; fastcgi_pass php56:9000; proxy_set_header Host www.trswcm.com; #fastcgi_pass hostserver:9073; fastcgi_index index.php; #ifastcgi_param PATH_INFO $fastcgi_path_info; #fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; #fastcgi_param SCRIPT_NAME $fastcgi_script_name; # fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; include fastcgi_params; } }NginxProxyManager 配置Nginx Proxy Manager (NPM) 是一个基于 Nginx 的反向代理管理工具,旨在简化 Nginx 的配置和管理。它提供了一个直观的 Web 界面,使用户可以轻松地设置和管理反向代理、SSL 证书、访问控制等功能。在上面的章节中,我们使用 docker compose 的方式运行了 NginxProxyManager,我们可以通过UI界面进行可视化配置,最重要的是SSL证书配置及代理配置,以下是部分界面截图:
2025年01月15日
5 阅读
0 评论
0 点赞
2024-11-22
docker 版 gitlab 配置邮件推送
背景介绍作为一个老派程序员,偶尔能接到一些私单,不少私单涉及到代码安全问题,就不是很适合用Gitlab、Gitee 等在线代码托管服务了,于是在我的开发服务器上自己搭建了一个 git 服务,可选的git 服务有很多,如::Gitea、Gogs、Gitlab 等,由于公司环境基本上用 Gitlab,且Gitlab 功能足够强大,所以便选择了 Gitlab 作为服务端,Gitlab 在国内成立了极狐公司(https://gitlab.cn/)专门运营国内的 Gitlab,在部署的时候也就选择了 Gitlab 的极狐版本,部署的完整 docker-compose.yml 如下:services: gitlab: image: 'registry.gitlab.cn/omnibus/gitlab-jh:latest' # image: 'registry.gitlab.cn/omnibus/gitlab-jh:16.11.3' #image: 'registry.gitlab.cn/omnibus/gitlab-jh:16.7.7' restart: always container_name: gitlab hostname: 'git.work.zhuzhilong.com' environment: GITLAB_OMNIBUS_CONFIG: | external_url 'http://git.work.zhuzhilong.com' # Add any other gitlab.rb configuration here, each on its own line alertmanager['enable']=false networks: - net-zzl ports: - '8007:80' - '2223:22' volumes: - './config:/etc/gitlab' - './logs:/var/log/gitlab' - './data:/var/opt/gitlab' - ../hosts:/etc/hosts - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro shm_size: '256m' networks: net-zzl: name: bridge_zzl external: true在开发过程中,涉及多成员协作,而 Gitlab 自带的邮件服务还是很有必要的,所以本次我们就将我们的 gitlab 服务搭上邮件的快车。配置过程如下:1、进入 docker 容器docker exec -it gitlab /bin/bash2、编辑 /etc/gitlab/gitlab.rb 文件{alert type="info"}为避免出错,可在更改配置前备份系统,备份命令为:gitlab-rake gitlab:backup:create{/alert}修改涉及邮件发送相关的服务,主要配置信息如下:### GitLab email server settings ###! Docs: https://docs.gitlab.com/omnibus/settings/smtp.html ###! **Use smtp instead of sendmail/postfix.** gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.feishu.cn" gitlab_rails['smtp_port'] = 465 gitlab_rails['smtp_user_name'] = "sender@zhuzhilong.com" gitlab_rails['smtp_password'] = "xxxxxxxx" gitlab_rails['smtp_domain'] = "mail.feishu.cn" gitlab_rails['smtp_authentication'] = "login" # gitlab_rails['smtp_enable_starttls_auto'] = true gitlab_rails['smtp_tls'] = true gitlab_rails['smtp_pool'] = false ###! **Can be: 'none', 'peer', 'client_once', 'fail_if_no_peer_cert'** ###! Docs: http://api.rubyonrails.org/classes/ActionMailer/Base.html # gitlab_rails['smtp_openssl_verify_mode'] = 'none' # gitlab_rails['smtp_ca_path'] = "/etc/ssl/certs" # gitlab_rails['smtp_ca_file'] = "/etc/ssl/certs/ca-certificates.crt" ### Email Settings gitlab_rails['gitlab_email_enabled'] = true ##! If your SMTP server does not like the default 'From: gitlab@gitlab.example.com' ##! can change the 'From' with this setting. gitlab_rails['gitlab_email_from'] = 'xxxx@zhuzhilong.com' gitlab_rails['gitlab_email_display_name'] = '朱治龙git' gitlab_rails['gitlab_email_reply_to'] = 'reply@zhuzhilong.com' # gitlab_rails['gitlab_email_subject_suffix'] = '' # gitlab_rails['gitlab_email_smime_enabled'] = false # gitlab_rails['gitlab_email_smime_key_file'] = '/etc/gitlab/ssl/gitlab_smime.key' # gitlab_rails['gitlab_email_smime_cert_file'] = '/etc/gitlab/ssl/gitlab_smime.crt' # gitlab_rails['gitlab_email_smime_ca_certs_file'] = '/etc/gitlab/ssl/gitlab_smime_cas.crt' 3、使配置生效并重启服务gitlab-ctl reconfigure && gitlab-ctl restart4、验证邮件发送服务可在个人资料 -> 电子邮件 中添加新的邮件地址:添加后,对应的邮箱会收到如下验证邮件即表示配置成功了:
2024年11月22日
19 阅读
0 评论
0 点赞
2024-11-22
推荐一款好用的Linux Web 可视化管理工具——Cockpit
软件介绍Cockpit是一个易于使用、集成、易于浏览和开放的基于 Web 的服务器界面。支持多种linux发行版软件常用功能系统日志信息查看系统存储信息查看仪表盘系统配置与系统基本操作Docker容器监控系统网络监控Web命令行终端软件部署Cockpit 支持多种 Linux 发行版,各类型安装命令参见官网链接:https://cockpit-project.org/running.html。根据官网的安装说明,下面以 Ubuntu 为例进行简单讲解。安装命令如下:. /etc/os-release sudo apt install -t ${VERSION_CODENAME}-backports cockpit上面的命令执行效果如下:zhuzl@zhuzl-M9-PRO:~$ . /etc/os-release zhuzl@zhuzl-M9-PRO:~$ sudo apt install -t ${VERSION_CODENAME}-backports cockpit 正在读取软件包列表... 完成 正在分析软件包的依赖关系树... 完成 正在读取状态信息... 完成 将会同时安装下列软件: cockpit-bridge cockpit-networkmanager cockpit-packagekit cockpit-storaged cockpit-system cockpit-ws finalrd libblockdev-mdraid2 libbytesize-common libbytesize1 libpwquality-tools mdadm 建议安装: cockpit-doc cockpit-sosreport udisks2-btrfs udisks2-lvm2 sssd-dbus dracut-core 下列【新】软件包将被安装: cockpit cockpit-bridge cockpit-networkmanager cockpit-packagekit cockpit-storaged cockpit-system cockpit-ws finalrd libblockdev-mdraid2 libbytesize-common libbytesize1 libpwquality-tools mdadm 升级了 0 个软件包,新安装了 13 个软件包,要卸载 0 个软件包,有 122 个软件包未被升级。 需要下载 7,490 kB 的归档。 解压缩后会消耗 10.4 MB 的额外空间。 您希望继续执行吗? [Y/n] y 获取:1 http://cn.archive.ubuntu.com/ubuntu jammy-backports/universe amd64 cockpit-bridge amd64 324-1~bpo22.04.1 [393 kB] 获取:2 http://cn.archive.ubuntu.com/ubuntu jammy-backports/universe amd64 cockpit-ws amd64 324-1~bpo22.04.1 [882 kB] 获取:3 http://mirrors.tuna.tsinghua.edu.cn/ubuntu jammy/universe amd64 libpwquality-tools amd64 1.4.4-1build2 [9,752 B] 获取:4 http://cn.archive.ubuntu.com/ubuntu jammy-backports/universe amd64 cockpit-system all 324-1~bpo22.04.1 [3,204 kB] 获取:5 http://cn.archive.ubuntu.com/ubuntu jammy-backports/universe amd64 cockpit all 324-1~bpo22.04.1 [20.1 kB] 获取:6 http://cn.archive.ubuntu.com/ubuntu jammy-backports/universe amd64 cockpit-networkmanager all 324-1~bpo22.04.1 [846 kB] 获取:7 http://cn.archive.ubuntu.com/ubuntu jammy-backports/universe amd64 cockpit-packagekit all 324-1~bpo22.04.1 [844 kB] 获取:8 http://mirrors.tuna.tsinghua.edu.cn/ubuntu jammy/universe amd64 libbytesize-common all 2.6-1 [7,454 B] 获取:9 http://mirrors.tuna.tsinghua.edu.cn/ubuntu jammy/universe amd64 libbytesize1 amd64 2.6-1 [12.1 kB] 获取:10 http://mirrors.tuna.tsinghua.edu.cn/ubuntu jammy-updates/main amd64 mdadm amd64 4.2-0ubuntu2 [464 kB] 获取:11 http://mirrors.tuna.tsinghua.edu.cn/ubuntu jammy/universe amd64 libblockdev-mdraid2 amd64 2.26-1 [11.8 kB] 获取:12 http://cn.archive.ubuntu.com/ubuntu jammy-backports/universe amd64 cockpit-storaged all 324-1~bpo22.04.1 [789 kB] 获取:13 http://mirrors.tuna.tsinghua.edu.cn/ubuntu jammy/main amd64 finalrd all 9build1 [7,306 B] 已下载 7,490 kB,耗时 13秒 (577 kB/s) 正在预设定软件包 ... 正在选中未选择的软件包 cockpit-bridge。 (正在读取数据库 ... 系统当前共安装有 262830 个文件和目录。) 准备解压 .../00-cockpit-bridge_324-1~bpo22.04.1_amd64.deb ... 正在解压 cockpit-bridge (324-1~bpo22.04.1) ... 正在选中未选择的软件包 cockpit-ws。 准备解压 .../01-cockpit-ws_324-1~bpo22.04.1_amd64.deb ... 正在解压 cockpit-ws (324-1~bpo22.04.1) ... 正在选中未选择的软件包 libpwquality-tools。 准备解压 .../02-libpwquality-tools_1.4.4-1build2_amd64.deb ... 正在解压 libpwquality-tools (1.4.4-1build2) ... 正在选中未选择的软件包 cockpit-system。 准备解压 .../03-cockpit-system_324-1~bpo22.04.1_all.deb ... 正在解压 cockpit-system (324-1~bpo22.04.1) ... 正在选中未选择的软件包 cockpit。 准备解压 .../04-cockpit_324-1~bpo22.04.1_all.deb ... 正在解压 cockpit (324-1~bpo22.04.1) ... 正在选中未选择的软件包 cockpit-networkmanager。 准备解压 .../05-cockpit-networkmanager_324-1~bpo22.04.1_all.deb ... 正在解压 cockpit-networkmanager (324-1~bpo22.04.1) ... 正在选中未选择的软件包 cockpit-packagekit。 准备解压 .../06-cockpit-packagekit_324-1~bpo22.04.1_all.deb ... 正在解压 cockpit-packagekit (324-1~bpo22.04.1) ... 正在选中未选择的软件包 libbytesize-common。 准备解压 .../07-libbytesize-common_2.6-1_all.deb ... 正在解压 libbytesize-common (2.6-1) ... 正在选中未选择的软件包 libbytesize1:amd64。 准备解压 .../08-libbytesize1_2.6-1_amd64.deb ... 正在解压 libbytesize1:amd64 (2.6-1) ... 正在选中未选择的软件包 mdadm。 准备解压 .../09-mdadm_4.2-0ubuntu2_amd64.deb ... 正在解压 mdadm (4.2-0ubuntu2) ... 正在选中未选择的软件包 libblockdev-mdraid2:amd64。 准备解压 .../10-libblockdev-mdraid2_2.26-1_amd64.deb ... 正在解压 libblockdev-mdraid2:amd64 (2.26-1) ... 正在选中未选择的软件包 cockpit-storaged。 准备解压 .../11-cockpit-storaged_324-1~bpo22.04.1_all.deb ... 正在解压 cockpit-storaged (324-1~bpo22.04.1) ... 正在选中未选择的软件包 finalrd。 准备解压 .../12-finalrd_9build1_all.deb ... 正在解压 finalrd (9build1) ... 正在设置 libpwquality-tools (1.4.4-1build2) ... 正在设置 finalrd (9build1) ... Created symlink /etc/systemd/system/sysinit.target.wants/finalrd.service → /lib/systemd/system/finalrd.service. 正在设置 libbytesize-common (2.6-1) ... 正在设置 cockpit-bridge (324-1~bpo22.04.1) ... 正在设置 libbytesize1:amd64 (2.6-1) ... 正在设置 cockpit-ws (324-1~bpo22.04.1) ... Creating group cockpit-wsinstance with gid 998. Creating user cockpit-wsinstance (User for cockpit-ws instances) with uid 998 and gid 998. Created symlink /etc/systemd/system/sockets.target.wants/cockpit.socket → /lib/systemd/system/cockpit.socket. 正在设置 mdadm (4.2-0ubuntu2) ... Generating mdadm.conf... done. update-initramfs: deferring update (trigger activated) Sourcing file `/etc/default/grub' Sourcing file `/etc/default/grub.d/init-select.cfg' Generating grub configuration file ... File descriptor 3 (pipe:[363435355]) leaked on vgs invocation. Parent PID 1007874: grub-probe File descriptor 3 (pipe:[363435355]) leaked on vgs invocation. Parent PID 1007874: grub-probe File descriptor 3 (pipe:[363435355]) leaked on vgs invocation. Parent PID 1007902: /usr/sbin/grub-probe File descriptor 3 (pipe:[363435355]) leaked on vgs invocation. Parent PID 1007902: /usr/sbin/grub-probe File descriptor 3 (pipe:[363435355]) leaked on vgs invocation. Parent PID 1007914: /usr/sbin/grub-probe File descriptor 3 (pipe:[363435355]) leaked on vgs invocation. Parent PID 1007914: /usr/sbin/grub-probe File descriptor 3 (pipe:[363435355]) leaked on vgs invocation. Parent PID 1007924: /usr/sbin/grub-probe File descriptor 3 (pipe:[363435355]) leaked on vgs invocation. Parent PID 1007924: /usr/sbin/grub-probe File descriptor 3 (pipe:[363435355]) leaked on vgs invocation. Parent PID 1007934: /usr/sbin/grub-probe File descriptor 3 (pipe:[363435355]) leaked on vgs invocation. Parent PID 1007934: /usr/sbin/grub-probe File descriptor 3 (pipe:[363435355]) leaked on vgs invocation. Parent PID 1007944: /usr/sbin/grub-probe File descriptor 3 (pipe:[363435355]) leaked on vgs invocation. Parent PID 1007944: /usr/sbin/grub-probe File descriptor 3 (pipe:[363435355]) leaked on vgs invocation. Parent PID 1008001: /usr/sbin/grub-probe File descriptor 3 (pipe:[363435355]) leaked on vgs invocation. Parent PID 1008001: /usr/sbin/grub-probe Found linux image: /boot/vmlinuz-6.8.0-49-generic Found initrd image: /boot/initrd.img-6.8.0-49-generic File descriptor 3 (pipe:[363435355]) leaked on vgs invocation. Parent PID 1008083: /usr/sbin/grub-probe File descriptor 3 (pipe:[363435355]) leaked on vgs invocation. Parent PID 1008083: /usr/sbin/grub-probe File descriptor 3 (pipe:[363435355]) leaked on vgs invocation. Parent PID 1008094: /usr/sbin/grub-probe File descriptor 3 (pipe:[363435355]) leaked on vgs invocation. Parent PID 1008094: /usr/sbin/grub-probe File descriptor 3 (pipe:[363435355]) leaked on vgs invocation. Parent PID 1008104: /usr/sbin/grub-probe File descriptor 3 (pipe:[363435355]) leaked on vgs invocation. Parent PID 1008104: /usr/sbin/grub-probe File descriptor 3 (pipe:[363435355]) leaked on vgs invocation. Parent PID 1008114: /usr/sbin/grub-probe File descriptor 3 (pipe:[363435355]) leaked on vgs invocation. Parent PID 1008114: /usr/sbin/grub-probe Found linux image: /boot/vmlinuz-6.8.0-40-generic Found initrd image: /boot/initrd.img-6.8.0-40-generic File descriptor 3 (pipe:[363435355]) leaked on vgs invocation. Parent PID 1008391: /usr/sbin/grub-probe File descriptor 3 (pipe:[363435355]) leaked on vgs invocation. Parent PID 1008391: /usr/sbin/grub-probe Memtest86+ needs a 16-bit boot, that is not available on EFI, exiting Warning: os-prober will not be executed to detect other bootable partitions. Systems on them will not be added to the GRUB boot configuration. Check GRUB_DISABLE_OS_PROBER documentation entry. Adding boot menu entry for UEFI Firmware Settings ... done Created symlink /etc/systemd/system/mdmonitor.service.wants/mdcheck_continue.timer → /lib/systemd/system/mdcheck_continue.timer. Created symlink /etc/systemd/system/mdmonitor.service.wants/mdcheck_start.timer → /lib/systemd/system/mdcheck_start.timer. Created symlink /etc/systemd/system/mdmonitor.service.wants/mdmonitor-oneshot.timer → /lib/systemd/system/mdmonitor-oneshot.timer. 正在设置 cockpit-system (324-1~bpo22.04.1) ... 正在设置 cockpit-networkmanager (324-1~bpo22.04.1) ... 正在设置 libblockdev-mdraid2:amd64 (2.26-1) ... 正在设置 cockpit-packagekit (324-1~bpo22.04.1) ... 正在设置 cockpit-storaged (324-1~bpo22.04.1) ... 正在设置 cockpit (324-1~bpo22.04.1) ... 正在处理用于 man-db (2.10.2-1) 的触发器 ... 正在处理用于 libc-bin (2.35-0ubuntu3.8) 的触发器 ... 正在处理用于 initramfs-tools (0.140ubuntu13.4) 的触发器 ... update-initramfs: Generating /boot/initrd.img-6.8.0-49-generic I: The initramfs will attempt to resume from /dev/dm-1 I: (/dev/mapper/vgubuntu-swap_1) I: Set the RESUME variable to override this.安装后通过端口检测服务是否正确:zhuzl@zhuzl-M9-PRO:~$ sudo lsof -i:9090 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root 164u IPv6 363430477 0t0 TCP *:9090 (LISTEN) zhuzl@zhuzl-M9-PRO:~$从上面的命令结果可知,Cockpit 已成功安装并监听 9090 端口。此时我们可以在服务器的防火墙放行 9090 端口后直接通过9090端口访问,由于是web服务,我们也可以使用Nginx 代理对外提供服务,根据个人喜好来就好。初体验登录页从登录页我们可以看到,登录窗都做到了自动国际化,还是不错的。使用 Linux 系统的账号登录,显示如下失败页面:根据界面的报错提示,执行sudo journalctl -u cockpit命令查看日志,内容如下:zhuzl@zhuzl-M9-PRO:~$ sudo journalctl -u cockpit [sudo] zhuzl 的密码: 11月 22 16:07:20 zhuzl-M9-PRO systemd[1]: Starting Cockpit Web Service... 11月 22 16:07:20 zhuzl-M9-PRO cockpit-certificate-ensure[1048208]: /usr/lib/cockpit/cockpit-certificate-helper: line 25: sscg: command not found 11月 22 16:07:20 zhuzl-M9-PRO cockpit-certificate-ensure[1048209]: .+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.......+......+....+++++++++++++++++++++++++++++> 11月 22 16:07:20 zhuzl-M9-PRO cockpit-certificate-ensure[1048209]: .....+............+.............+..+....+...+.....+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++> 11月 22 16:07:20 zhuzl-M9-PRO cockpit-certificate-ensure[1048209]: ----- 11月 22 16:07:20 zhuzl-M9-PRO systemd[1]: Started Cockpit Web Service. 11月 22 16:10:02 zhuzl-M9-PRO systemd[1]: cockpit.service: Deactivated successfully.根据提示是找不到sscg命令,我们安装一下sudo apt install sscg该命令执行情况如下:zhuzl@zhuzl-M9-PRO:/home/zhuzl# sudo apt install sscg 正在读取软件包列表... 完成 正在分析软件包的依赖关系树... 完成 正在读取状态信息... 完成 将会同时安装下列软件: libpath-utils1 powertop 建议安装: cpufrequtils laptop-mode-tools 下列【新】软件包将被安装: libpath-utils1 powertop sscg 升级了 0 个软件包,新安装了 3 个软件包,要卸载 0 个软件包,有 88 个软件包未被升级。 需要下载 225 kB 的归档。 解压缩后会消耗 705 kB 的额外空间。 您希望继续执行吗? [Y/n] y 获取:1 http://mirrors.tuna.tsinghua.edu.cn/ubuntu jammy/main amd64 libpath-utils1 amd64 0.6.2-1 [9,254 B] 获取:2 http://mirrors.tuna.tsinghua.edu.cn/ubuntu jammy/universe amd64 sscg amd64 3.0.2-1 [23.9 kB] 获取:3 http://mirrors.tuna.tsinghua.edu.cn/ubuntu jammy/main amd64 powertop amd64 2.14-1build1 [191 kB] 已下载 225 kB,耗时 57秒 (3,917 B/s) 正在选中未选择的软件包 libpath-utils1:amd64。 (正在读取数据库 ... 系统当前共安装有 263679 个文件和目录。) 准备解压 .../libpath-utils1_0.6.2-1_amd64.deb ... 正在解压 libpath-utils1:amd64 (0.6.2-1) ... 正在选中未选择的软件包 sscg。 准备解压 .../sscg_3.0.2-1_amd64.deb ... 正在解压 sscg (3.0.2-1) ... 正在选中未选择的软件包 powertop。 准备解压 .../powertop_2.14-1build1_amd64.deb ... 正在解压 powertop (2.14-1build1) ... 正在设置 libpath-utils1:amd64 (0.6.2-1) ... 正在设置 powertop (2.14-1build1) ... 正在设置 sscg (3.0.2-1) ... 正在处理用于 man-db (2.10.2-1) 的触发器 ... 正在处理用于 libc-bin (2.35-0ubuntu3.8) 的触发器 ... zhuzl@zhuzl-M9-PRO:/home/zhuzl#主界面版本信息概览-指标和历史数据概览-硬件详细信息日志存储网络用户账户服务终端
2024年11月22日
8 阅读
0 评论
0 点赞
2024-09-30
Docker搭建一款功能强大、易于使用的图床程序和图像处理工具
软件介绍EasyImages是一款功能强大的图床程序和图像处理工具,它在多个方面展现出其独特的优势和特点,无论是作为个人用户还是开发者来说都是一个不错的选择。基本特点自托管特性 :EasyImages提供自托管功能,这意味着用户可以完全控制自己的图片数据和隐私,无需依赖第三方图床服务,从而避免了数据隐私风险、服务限制和图片加载延迟等问题。批量上传与多种URL形式 :支持批量上传图片,并能返回多种形式的URL,包括图片直链、Markdown格式URL、BBCCode、Html、缩略图等,满足用户在不同场景下的需求。在线图片管理 :提供一个直观的在线图片管理界面,用户可以方便地查看、编辑、组织和管理上传的图片,支持创建文件夹、排序图片、批量删除或打包图片等功能。上传限制与格式转换 :支持设置上传图片的最低宽度和高度,确保图片质量;同时,能够自动将上传的图片转换为不同的格式,以满足网站或应用的需求。水印功能:支持自动为上传的图片添加文字或图片水印,有助于保护图片版权和防止滥用。资源占用少 :对于安装环境和服务器性能要求非常低,甚至不需要数据库支持,使得在较小的服务器上也能轻松运行且不会占用过多资源。安全性与控制 :提供黑白名单上传功能,允许用户设置哪些IP地址或用户可以上传图片;同时,支持上传日志IP定位和限制每日上传次数等功能,以增强图床的安全性。数据统计与网站统计 :提供数据统计功能,帮助用户跟踪图片的上传情况、资源占用情况和存储使用情况等;此外,还支持网站统计功能,以提供更全面的信息。API支持 :提供了全面的API支持,使开发者能够在其项目中方便地上传和管理图片。图像处理功能除了作为图床程序外,EasyImages还具备强大的图像处理功能。它是一款轻量级且高效的JavaScript库,专为简化和加速图像处理而设计。基于HTML5的Canvas API构建,充分利用了浏览器的硬件加速能力,使得在处理大量或高分辨率的图片时也能保持流畅的性能。EasyImages提供了多种常用的图像操作功能,如缩放、裁剪、旋转、添加水印等。通过简洁的API接口,开发者可以快速地在自己的项目中集成并实现复杂的图片处理需求。此外,它还具有良好的社区支持和丰富的示例代码可供参考学习。相关连接官方网站:https://icret.github.io/EasyImages2.0/#/GitHub地址:https://github.com/icret/EasyImages2.0Docker镜像:https://hub.docker.com/r/ddsderek/easyimage应用部署根据官网推荐的方式,使用 docker compose 部署,编排文件内容如下:services: easyimage: image: ddsderek/easyimage:latest container_name: easyimage networks: - net-zzl ports: - 8113:80 environment: - TZ=Asia/Shanghai - PUID=1000 - PGID=1000 - DEBUG=false volumes: - ./config:/app/web/config - ./data:/app/web/i restart: unless-stopped networks: net-zzl: name: bridge_zzl external: true使用 docker compose up -d 启动服务后,进入如下图所示的安装环境检测页面:单击「下一步」按钮,进入「网站基础配置」页面:填写信息后,单击「开始安装」按钮,安装完成后进入下图所示的管理员登录页面:输入账号、密码后,进入如下图所示的主界面:
2024年09月30日
36 阅读
0 评论
0 点赞
2024-09-29
一款开源、免费、简单 Linux 服务器管理面板:mdserver-web安装及使用初体验
背景使用宝塔面板已有一段时间,它确实极大地简化了 Linux 系统的日常维护工作,实现了傻瓜式操作。然而,宝塔面板在用户信息收集和资源占用方面存在一些争议。此外,我也尝试过 1Panel,虽然它的界面现代且美观,但遗憾的是,资源占用反而高于宝塔面板,且在易用性上跟宝塔面板比起来还略逊一筹。最近,我在公众号上了解到一款开源、仿宝塔界面的MDServer-Web,截止当前(2024-09-29)在 Github 已获得 4k+ 的 star,便心生一试的想法。简介一款开源、免费、简单 Linux 服务器管理面板,MDServer-Web 与著名的宝塔面板相似,但更安全且支持多种功能。它安装简单,作者承诺不卖数据、不监控用户、不注入病毒,可以放心使用。软件特性:✅ SSH 终端工具✅ 面板收藏功能✅ 网站子目录绑定✅ 网站备份功能✅ 插件方式管理✅ 自动更新优化✅ 支持 OpenResty、PHP 5.2-8.1、MySQL、MongoDB、Memcached、Redis 等✅ 更多...安装安装命令从官网拷贝如下地址进行安装curl --insecure -fsSL https://cdn.jsdelivr.net/gh/midoks/mdserver-web@latest/scripts/install.sh | bash安装完成后显示如下信息:starting mw-tasks... done .stopping mw-tasks... done stopping mw-panel... cli.sh: line 20: 31687 Killed python3 task.py >> ${DIR}/logs/task.log 2>&1 done starting mw-tasks... done starting mw-panel... .........done ================================================================== MW-Panel default info! ================================================================== MW-Panel-Url: http://43.134.39.206:54724/4tt3ow6j username: tmsvus16 password: koaumgpj Warning: If you cannot access the panel. release the following port (54724|80|443|22) in the security group. ================================================================== Time consumed: 6 Minute!修改端口提供跟宝塔类似的命令行查看及修改面板信息root@VM-12-13-ubuntu:/data/dockerRoot# mw ===============mdserver-web cli tools================= (1) 重启面板服务 (2) 停止面板服务 (3) 启动面板服务 (4) 重载面板服务 (5) 修改面板端口 (10) 查看面板默认信息 (11) 修改面板密码 (12) 修改面板用户名 (13) 显示面板错误日志 (20) 关闭BasicAuth认证 (21) 解除域名绑定 (22) 解除面板SSL绑定 (23) 开启IPV6支持 (24) 关闭IPV6支持 (25) 开启防火墙SSH端口 (26) 关闭二次验证 (27) 查看防火墙信息 (100) 开启PHP52显示 (101) 关闭PHP52显示 (200) 切换Linux系统软件源 (201) 简单速度测试 (0) 取消 ====================================================== 请输入命令编号:5 请输入新的面板端口:21181 stopping mw-panel... done starting mw-panel... ...done nw================================================================== MW-Panel default info! ================================================================== MW-Panel-Url: http://43.134.39.206:21181/4tt3ow6j username: tmsvus16 password: koaumgpj Warning: If you cannot access the panel. release the following port (21181|80|443|22) in the security group. ==================================================================初体验根据提供的端口及登录信息,使用浏览器访问打开如下所示的主界面:应用安装:链接Github 开源地址:https://github.com/midoks/mdserver-web官网地址:http://www.midoks.icu/ 广告有些多,且没什么内容(2024-09-29)论坛:https://bbs.midoks.icu/
2024年09月29日
218 阅读
0 评论
0 点赞
2024-09-11
记一次升级gitlab的记录(16.3.3~17.3.1)
开发服务器的 gitlab 使用 docker 搭建,docker-compose.yml 文件内容如下:services: gitlab: image: 'registry.gitlab.cn/omnibus/gitlab-jh:latest' restart: always container_name: gitlab hostname: 'git.work.zhuzhilong.com' environment: GITLAB_OMNIBUS_CONFIG: | external_url 'http://git.work.zhuzhilong.com' # Add any other gitlab.rb configuration here, each on its own line networks: - net-zzl ports: - '8007:80' - '2223:22' volumes: - './config:/etc/gitlab' - './logs:/var/log/gitlab' - './data:/var/opt/gitlab' - ../hosts:/etc/hosts shm_size: '256m' networks: net-zzl: name: bridge_zzl external: true由于该 gitlab 搭建后一直未更新过,今天尝试个升级,升级前,我们先看看系统环境信息:由于 gitlab 用的镜像是 registry.gitlab.cn/omnibus/gitlab-jh:latest,我先尝试直接拉取一下最新的镜像看是否可以直接升级,拉取命令:docker compose pull,拉取过程如下:zhuzl@zhuzl-M9-PRO:/data/dockerRoot/apps/gitlab$ docker compose pull [+] Pulling 10/10 ✔ gitlab 9 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 62.1s ✔ 857cc8cb19c0 Already exists 0.0s ✔ d388127601d7 Pull complete 1.0s ✔ c973ce60899e Pull complete 1.6s ✔ d47067d54097 Pull complete 1.2s ✔ b37f526cb6d4 Pull complete 1.4s ✔ e3e25c0883d4 Pull complete 6.6s ✔ 38326bc1340c Pull complete 7.6s ✔ dc916e282a43 Pull complete 6.6s ✔ 84388f622dc9 Pull complete 44.1s zhuzl@zhuzl-M9-PRO:/data/dockerRoot/apps/gitlab$ 然后,我们使用 docker compose up -d 启动服务,启动服务后,使用docker logs -f gitlab命令看看日志: zhuzl@zhuzl-M9-PRO:/data/dockerRoot/apps/gitlab$ docker logs -f gitlab Thank you for using GitLab Docker Image! Current version: gitlab-jh=17.3.1-jh.0 Configure GitLab for your system by editing /etc/gitlab/gitlab.rb file And restart this container to reload settings. To do it use docker exec: docker exec -it gitlab editor /etc/gitlab/gitlab.rb docker restart gitlab For a comprehensive list of configuration options please see the Omnibus GitLab readme https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md If this container fails to start due to permission problems try to fix it by executing: docker exec -it gitlab update-permissions docker restart gitlab Cleaning stale PIDs & sockets It seems you are upgrading from 16.3.3-jh to 17.3.1. It is required to upgrade to the latest 16.11.x version first before proceeding. Please follow the upgrade documentation at https://docs.gitlab.com/ee/update/index.html#upgrading-to-a-new-major-version Thank you for using GitLab Docker Image! Current version: gitlab-jh=17.3.1-jh.0 Configure GitLab for your system by editing /etc/gitlab/gitlab.rb file And restart this container to reload settings. To do it use docker exec: docker exec -it gitlab editor /etc/gitlab/gitlab.rb docker restart gitlab For a comprehensive list of configuration options please see the Omnibus GitLab readme https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md If this container fails to start due to permission problems try to fix it by executing: docker exec -it gitlab update-permissions docker restart gitlab Cleaning stale PIDs & sockets It seems you are upgrading from 16.3.3-jh to 17.3.1. It is required to upgrade to the latest 16.11.x version first before proceeding. Please follow the upgrade documentation at https://docs.gitlab.com/ee/update/index.html#upgrading-to-a-new-major-version Thank you for using GitLab Docker Image! Current version: gitlab-jh=17.3.1-jh.0 Configure GitLab for your system by editing /etc/gitlab/gitlab.rb file And restart this container to reload settings. To do it use docker exec: docker exec -it gitlab editor /etc/gitlab/gitlab.rb docker restart gitlab For a comprehensive list of configuration options please see the Omnibus GitLab readme https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md If this container fails to start due to permission problems try to fix it by executing: docker exec -it gitlab update-permissions docker restart gitlab Cleaning stale PIDs & sockets It seems you are upgrading from 16.3.3-jh to 17.3.1. It is required to upgrade to the latest 16.11.x version first before proceeding. Please follow the upgrade documentation at https://docs.gitlab.com/ee/update/index.html#upgrading-to-a-new-major-version zhuzl@zhuzl-M9-PRO:/data/dockerRoot/apps/gitlab$ 从日志中的提示可知,系统检测到了,我们是从16.3.3-jh 升级到 17.3.1.但是要升级到17.x 必须先升级到 16.11.x 。于是将 docker-compose.yaml 文件中的image值改为:registry.gitlab.cn/omnibus/gitlab-jh:16.11.3,重新拉取,然后运行,观察日志:zhuzl@zhuzl-M9-PRO:/data/dockerRoot/apps/gitlab$ docker logs -f gitlab Thank you for using GitLab Docker Image! Current version: gitlab-jh=16.11.3-jh.0 Configure GitLab for your system by editing /etc/gitlab/gitlab.rb file And restart this container to reload settings. To do it use docker exec: docker exec -it gitlab editor /etc/gitlab/gitlab.rb docker restart gitlab For a comprehensive list of configuration options please see the Omnibus GitLab readme https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md If this container fails to start due to permission problems try to fix it by executing: docker exec -it gitlab update-permissions docker restart gitlab Cleaning stale PIDs & sockets It seems you are upgrading from 16.3.3-jh to 16.11.3. It is required to upgrade to the latest 16.7.x version first before proceeding. Please follow the upgrade documentation at https://docs.gitlab.com/ee/update/#upgrade-paths Thank you for using GitLab Docker Image! Current version: gitlab-jh=16.11.3-jh.0 Configure GitLab for your system by editing /etc/gitlab/gitlab.rb file And restart this container to reload settings. To do it use docker exec: docker exec -it gitlab editor /etc/gitlab/gitlab.rb docker restart gitlab For a comprehensive list of configuration options please see the Omnibus GitLab readme https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md If this container fails to start due to permission problems try to fix it by executing: docker exec -it gitlab update-permissions docker restart gitlab Cleaning stale PIDs & sockets It seems you are upgrading from 16.3.3-jh to 16.11.3. It is required to upgrade to the latest 16.7.x version first before proceeding. Please follow the upgrade documentation at https://docs.gitlab.com/ee/update/#upgrade-paths zhuzl@zhuzl-M9-PRO:/data/dockerRoot/apps/gitlab$根据日志提示,要升级到16.11.3 的话,需要先升级到 16.7.x , 于是我们继续修改docker-compose.yaml 中的 image 为:registry.gitlab.cn/omnibus/gitlab-jh:16.11.3,继续拉取镜像并启动服务,经过漫长等待后,登录gitlab,查看版本发现第一步升级到16.7.x已完成:然后继续升级到16.11.x,修改docker 镜像后,重启服务,经过漫长的等待后,成功升级到16.11.3:然后我们将image 修改为:registry.gitlab.cn/omnibus/gitlab-jh:latest`,重新启动服务,登录后,已经升级到最新的 17.3.1 版本:升级完成后,查看容器日志,发现大量类似这样的错误日志输出:2024-09-11_04:05:55.21146 ts=2024-09-11T04:05:55.211Z caller=main.go:181 level=info msg="Starting Alertmanager" version="(version=0.27.0, branch=master, revision=0aa3c2aad14cff039931923ab16b26b7481783b5)" 2024-09-11_04:05:55.21148 ts=2024-09-11T04:05:55.211Z caller=main.go:182 level=info build_context="(go=go1.22.5, platform=linux/amd64, user=GitLab-Omnibus, date=, tags=unknown)" 2024-09-11_04:05:55.21183 ts=2024-09-11T04:05:55.211Z caller=cluster.go:179 level=warn component=cluster err="couldn't deduce an advertise address: no private IP found, explicit advertise addr not provided" 2024-09-11_04:05:55.21286 ts=2024-09-11T04:05:55.212Z caller=main.go:221 level=error msg="unable to initialize gossip mesh" err="create memberlist: Failed to get final advertise address: No private IP address found, and explicit IP not provided"简单搜了下,找到这个网址:https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/4556按照提示,配置信息添加如下信息即可:alertmanager['enable'] = false。由此,我进一步调整 docker-compose.yml,文件,最终的内容如下:services: gitlab: image: 'registry.gitlab.cn/omnibus/gitlab-jh:latest' # image: 'registry.gitlab.cn/omnibus/gitlab-jh:16.11.3' # image: 'registry.gitlab.cn/omnibus/gitlab-jh:16.7.7' restart: always container_name: gitlab hostname: 'git.work.zhuzhilong.com' environment: GITLAB_OMNIBUS_CONFIG: | external_url 'http://git.work.zhuzhilong.com' # Add any other gitlab.rb configuration here, each on its own line alertmanager['enable']=false networks: - net-zzl ports: - '8007:80' - '2223:22' volumes: - './config:/etc/gitlab' - './logs:/var/log/gitlab' - './data:/var/opt/gitlab' - ../hosts:/etc/hosts shm_size: '256m' networks: net-zzl: name: bridge_zzl external: true
2024年09月11日
103 阅读
2 评论
1 点赞
2024-09-10
一款超级好用的端口映射工具:rinetd
2014年的时候参与江西交通厅的项目,由于厅里只有一台跳板机可以访问省政府的在线办事内网服务,而内网机房也只有一台服务器能访问跳板机,而我们的项目又需要访问相关服务,然后就在内网的服务器上部署了个端口映射的软件,当时一直记得这款软件超级简单易用。近期一台开发服务器上的网络环境有同类的需求,但是时隔近10年,连名字都忘了,还好平常有记录工作日志的习惯,从10年前的工作日志里找到了当时的记录,就是它了: rinetd软件介绍rinetd 是一个简单易用的端口映射/转发/重定向工具。它通常用于将网络流量从一个端口转发到另一个端口,或者从一个IP地址转发到另一个IP地址。rinetd特别适用于那些需要将服务请求从一个网络地址或端口转发到另一个不同地址或端口的情况。rinetd的特点:简单性:配置简单,通过一个配置文件就可以完成设置。轻量级:rinetd自身占用的系统资源非常少。支持IPv4:它支持IPv4网络连接的重定向。安全性:可以设置允许哪些IP地址进行转发,从而提供一定程度的网络访问控制。软件使用安装rinetd:在大多数 Linux 发行版中,rinetd可以通过包管理器安装。例如,在基于Debian的系统(如Ubuntu)中,可以使用以下命令安装:sudo apt-get update sudo apt-get install rinetd以下是源码安装代码:windows: rinetd-win.ziplinux: rinetd.tar.gz配置rinetd:rinetd 的配置文件位于 /etc/rinetd.conf。以下是配置文件的一个基本示例:# # this is the configuration file for rinetd, the internet redirection server # # you may specify global allow and deny rules here # only ip addresses are matched, hostnames cannot be specified here # the wildcards you may use are * and ? # # allow 192.168.2.* # deny 192.168.2.1? # # forwarding rules come here # # you may specify allow and deny rules after a specific forwarding rule # to apply to only that forwarding rule # # bindadress bindport connectaddress connectport # for rocketMQ # 将所有发往本机18090端口的连接重定向到192.168.150.250的18080端口。 0.0.0.0 18090 192.168.150.250 18080 0.0.0.0 18091 192.168.150.250 18081 0.0.0.0 18092 192.168.150.250 18082 #0.0.0.0 18093 192.168.150.250 18083 0.0.0.0 18076 192.168.150.250 19876 # logging information logfile /var/log/rinetd.log # uncomment the following line if you want web-server style logfile format # logcommon日常运维命令# 启动服务 sudo systemctl restart rinetd # 重启服务 sudo systemctl restart rinetd # 查看运行状态 sudo systemctl status rinetd # 设为开机自启动 sudo systemctl enable rinetd特别说明:确保系统的防火墙规则允许 rinetd 进行必要的网络通信。
2024年09月10日
45 阅读
0 评论
0 点赞
2024-09-05
Java工程使用ulid初体验
背景从公众号推文看到不少博主推荐使用 ulid 替换 uuid,提及的 ulid 的优点如下:1、 全局唯一性 :通过结合时间戳和随机数,ULID能够确保生成的标识符在全球范围内是唯一的。2、 可排序性 :由于ULID中包含了时间戳信息,因此它们可以按照时间顺序进行排序,这在数据处理和分析中非常有用。3、 高性能 :ULID的生成速度远快于传统的UUID,且其编码方式更为高效。4、 易读性 :虽然ULID也是由一串字符组成,但其采用的编码方式使得它相对更易于人类阅读和记忆。ULID(Universally Unique Lexicographically Sortable Identifier)是一种用于生成全局唯一、可按字典序排序的标识符的格式。ULID结合了时间戳和随机数的特性,旨在提供高性能、低碰撞、可排序和易读的标识符。引入依赖<dependency> <groupId>com.github.f4b6a3</groupId> <artifactId>ulid-creator</artifactId> <version>5.2.3</version> </dependency>生成随机字符串 Ulid ulid = UlidCreator.getUlid(); String randomId = ulid.toString();测试代码package net.x2m.pms.collect; import com.github.f4b6a3.ulid.Ulid; import com.github.f4b6a3.ulid.UlidCreator; public class UlIdTest { public static void main(String[] args) { for (int i = 0; i < 10; i++) { Ulid ulid = UlidCreator.getUlid(); System.out.println(ulid.toString()); } } }运行以上代码后生成示例数据如下:01J70X9YDC7YSTJAPWPDFDH2CK 01J70X9YQS0NCCFCWEZ5RVXEXP 01J70X9YQS48ES2ETYT7FHQG2H 01J70X9YQTSGF792XY07W2TDZ2 01J70X9YQTEW2KTFX5VJRSAT9R 01J70X9YQTFBPZCMJWDQVNV0MA 01J70X9YQTSEX81YK0S7CB6X6W 01J70X9YQV4XAR9MHDN2RDJH8A 01J70X9YQV8HMMX2DYZ2Q5Y559 01J70X9YQV0R5PN0P0536NZM4Z
2024年09月05日
31 阅读
0 评论
0 点赞
2024-08-19
HTTPS代理访问DataGear登录失败的问题
背景说明在一些项目中我们有用到 DataGear 来做大屏展示,将 DataGear 部署到产线后,发现通过HTTPS协议访问应用正常,但是登录的时候,账号密码正确的情况下,提示Error,如下图所示:问题分析打开浏览器开发者工具,查看网络请求,我们发现登录的时候请求的 https://xxx.com/login/doLogin ,登录成功后 302 重定向到了 http://xxx.com/login/success 地址,由于HTTP协议不一致,存在跨域,导致Ajax无法正常获取到响应数据:部署说明DataGear 使用 Docker 部署,使用 Nginx 配置SSL代理对外提供服务。问题修复通过前面的分析,我想可能是 Nginx 到 DataGear 的过程中在登录的时候网络协议丢失了,通过查找SpringBoot 的官方文档,有找到如下章节:14.3. Enable HTTPS When Running behind a Proxy Server。从标题我们就可以看到,这就是我们碰到的使用场景:根据提示也是跟代理的一些HTTP头信息相关,我们根据提示,在datagear-web 工程的 application.properties 文件中,添加了如下配置信息:# 处理https重定向不正确的问题 server.tomcat.remoteip.protocol-header=X-Forwarded-Proto server.tomcat.remoteip.remote-ip-header=X-Forwarded-For重新构建Docker镜像并重新运行DataGear容器,然后在nginx 代理配置中添加如下设置代理头信息:proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme;如果使用 Nginx Proxy Manager ,可以在 ProxyHost 中,将上面的代理配置信息加入到自定义Nginx配置中,如下图所示:保存重启Nginx后,重新登录可以看到,能响应正确的重定向地址,至此HTTPS代理登录问题完美解决:
2024年08月19日
90 阅读
2 评论
1 点赞
2024-08-12
K8S简单使用记录——使用kubectl 查看应用日志及简单管理
背景说明近期公司的 devIstio 环境已整体迁移到火山引擎,该环境SRE主要采用K8S进行运维,迁移后相关的应用日志当前只能使用 kubectl 进行查看,所以就根据SRE提供的指导材料做了些了解,当前对K8S没有做深入了解,没有全局观,只能从一个开发者角度做到浅尝辄止。环境准备安装 kubectl开发机用的 Windows 11,可使用下面任意一个方法进行安装:通过 PowerShell 中安装:& $([scriptblock]::Create((New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/coreweave/kubernetes-cloud/master/getting-started/k8ctl_setup.ps1')))通过 Chocolatey 安装:choco install kubernetes-cli通过 Scoop 安装:scoop install kubectl本地配置访问 K8S 集群安装 kubectlho 后,将 SRE 提供的 kubeconfig 文件,复制到系统用户目录下的.kube/cotx/目录(缺省为:%USERPROFILE%.kubeconfig)。如果不是在缺省目录,请在系统的环境变量中添加 KUBECONFIG 变量,如下图所示:开始使用基本使用获取所有 podkubectl get pods -A示例效果:$ kubectl get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE console blsc-ui-594555ff77-z49ln 1/1 Running 0 32d console consent-forward-8499796656-qr9mc 1/1 Running 0 49d console consent-login-8678cdb6f4-2wjh8 1/1 Running 0 49d console console-api-entry-76d7d8bbc-v7kcm 1/1 Running 0 17d console console-batch-f88bf9dd6-62fwm 1/1 Running 0 49d console console-biz-84f458cfcd-v6pjj 1/1 Running 0 2d21h console console-blsc-kbs-7b66548df6-8lwh7 1/1 Running 0 49d console console-cluster-5ddb65ff54-2k4lf 1/1 Running 0 49d console console-config-server-5d6cf99b9b-wt7s9 1/1 Running 0 46h console console-data-sync-556dc4dc8-z2d9t 1/1 Running 0 18d console console-dev-guide-6bf4bcb79c-48crp 1/1 Running 0 6d5h console console-gateway-fbbf58dd-rcw8f 1/1 Running 0 32d console console-kbs-67cc85848f-7tg9h 1/1 Running 0 49d console console-mobile-blsc-ui-846f5f9795-jbhwc 1/1 Running 0 48d console console-mobile-server-8555b7b5cf-x9l26 1/1 Running 0 49d console console-mobile-ui-79df845ffc-445s9 1/1 Running 0 32d console console-notice-5b8dc5fd68-vmtf7 1/1 Running 0 39d console console-order-66b54dcf8-h4rv2 0/1 CrashLoopBackOff 536 (2m59s ago) 46h console console-prototypes-68c984cd88-mpzjb 1/1 Running 0 38d console console-singleton-64b7d87877-qp5x4 1/1 Running 0 28d console console-ui-56c8746566-8bbf5 1/1 Running 0 3d2h console dmc-api-doc-7cf59d7f5d-gjxbs 1/1 Running 0 49d console dmc-core-5dcb7dc65b-fb2gv 1/1 Running 0 49d console dmc-gateway-59fc6b767f-hzvgf 1/1 Running 0 49d console dmc-magic-boot-5d89987468-r5m7r 1/1 Running 0 49d console dmc-magic-boot-naive-8669fdc878-td7n8 1/1 Running 0 49d console dmc-screen-5f5cb57d89-cfskh 1/1 Running 0 49d console dmc-show-kbs-57b67545f5-4cc9k 1/1 Running 0 126m console dmc-ui-d8f5bd4b-fhmb7 1/1 Running 0 49d console dmc-worktime-backend-5dc69ccc6b-qf97p 1/1 Running 0 49d console dmc-worktime-ui-7db6df7469-d4fxt 1/1 Running 0 49d kube-system cello-7qv8s 2/2 Running 2 (49d ago) 111d kube-system cello-b8d6p 2/2 Running 3 (49d ago) 111d kube-system cello-mrch7 2/2 Running 2 (49d ago) 111d kube-system cello-pp5wz 2/2 Running 2 (49d ago) 111d kube-system coredns-58cd886448-clswr 1/1 Running 0 49d kube-system coredns-58cd886448-vlrwd 1/1 Running 0 49d kube-system metrics-server-7769c76b67-rfnvm 1/1 Running 0 49d sup sup-db-query-fd7675849-sjp8g 1/1 Running 0 49d sup sup-mq-5bc8ccf978-5x5mc 1/1 Running 0 49d sup sup-nginx-8575c78879-27gxs 1/1 Running 0 31d sup sup-oauth2-85ccd96db7-76rtw 1/1 Running 0 49d 查看日志kubectl logs [podname] -f示例效果$ kubectl logs dmc-ui-d8f5bd4b-fhmb7 -f /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh 10-listen-on-ipv6-by-default.sh: info: IPv6 listen already enabled /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh /docker-entrypoint.sh: Configuration complete; ready for start up 2024/06/24 03:06:27 [notice] 1#1: using the "epoll" event method 2024/06/24 03:06:27 [notice] 1#1: nginx/1.22.1 2024/06/24 03:06:27 [notice] 1#1: built by gcc 11.2.1 20220219 (Alpine 11.2.1_git20220219) 2024/06/24 03:06:27 [notice] 1#1: OS: Linux 5.10.135-6-velinux1u1-amd64 2024/06/24 03:06:27 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576 2024/06/24 03:06:27 [notice] 1#1: start worker processes 2024/06/24 03:06:27 [notice] 1#1: start worker process 22 2024/06/24 03:06:27 [notice] 1#1: start worker process 23 2024/06/24 03:06:27 [notice] 1#1: start worker process 24 2024/06/24 03:06:27 [notice] 1#1: start worker process 25 2024/06/24 03:06:27 [notice] 1#1: start worker process 26 2024/06/24 03:06:27 [notice] 1#1: start worker process 27 2024/06/24 03:06:27 [notice] 1#1: start worker process 28 2024/06/24 03:06:27 [notice] 1#1: start worker process 29 查看最近 10 行日志kubectl logs --tail 1000 -f [podname]示例效果$ kubectl logs --tail 10 dmc-ui-d8f5bd4b-fhmb7 172.17.16.38 - - [26/Jul/2024:00:50:52 +0000] "GET /favicon.ico HTTP/1.0" 200 16958 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36" "-" 172.17.16.38 - - [31/Jul/2024:17:09:02 +0000] "GET / HTTP/1.0" 200 625 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36" "-" 172.17.16.38 - - [31/Jul/2024:17:09:02 +0000] "GET / HTTP/1.0" 200 625 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" "-" 172.17.16.38 - - [31/Jul/2024:17:09:02 +0000] "GET /assets/vendor.9901ae39.js HTTP/1.0" 200 1395988 "https://dmc-ui.console.dev.paratera.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" "-" 172.17.16.38 - - [31/Jul/2024:17:09:02 +0000] "GET /assets/index.2058bab1.js HTTP/1.0" 200 100982 "https://dmc-ui.console.dev.paratera.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" "-" 172.17.16.38 - - [31/Jul/2024:17:09:07 +0000] "GET /favicon.ico HTTP/1.0" 200 16958 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36" "-" 172.17.16.38 - - [01/Aug/2024:11:08:22 +0000] "GET / HTTP/1.0" 200 625 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36" "-" 172.17.16.38 - - [01/Aug/2024:11:08:28 +0000] "GET /favicon.ico HTTP/1.0" 200 16958 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36" "-" 172.17.16.38 - - [01/Aug/2024:11:08:28 +0000] "GET /assets/index.2058bab1.js HTTP/1.0" 200 100982 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36" "-" 172.17.16.38 - - [02/Aug/2024:01:35:56 +0000] "GET / HTTP/1.0" 200 625 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36" "-"-n 指定命名空间$ kubectl get pods -n aps NAME READY STATUS RESTARTS AGE aps-api-entry-9c74586db-7djmp 1/1 Running 0 11d aps-config-server-544bb7677c-nwr6x 1/1 Running 0 5d22h aps-data-etl-649b79cb79-mbwr7 1/1 Running 0 46m重启应用$ kubectl rollout restart deployment aps-data-etl -n aps deployment.apps/aps-data-etl restarted
2024年08月12日
21 阅读
0 评论
0 点赞
2024-07-09
ChestnutCMS相关发布操作说明
本文档主要说明 ChestnutCMS 发布操作的相关逻辑,站点发布发布首页仅发布发布站点首页,生成站点首页静态文件发布全站发布全站需要选择发布指定状态的内容,此操作会发布站点下所有指定状态的内容,生成内容详情页静态文件;发布所有站点下栏目首页及列表页,生成栏目首页及列表页静态文件;发布站点首页,生成站点首页静态文件。发布栏目发布栏目在栏目编辑页面直接点击发布按钮,弹出栏目发布弹窗,可勾选是否发布栏目下所有子栏目,未勾选只发布当前栏目首页及列表页 + 站点首页,勾选则发布当前栏目及所有子栏目的首页及列表页 + 站点首页。单击后打开如下图所示的对话框:发布栏目及内容在栏目编辑页面鼠标移动到发布按钮,点击下拉框中发布指定状态内容选项,弹出栏目发布弹窗,可勾选是否发布栏目下所有子栏目,未勾选只发布当前栏目首页及列表页 + 当前栏目下的内容详情页 + 站点首页,勾选则发布当前栏目及所有子栏目的首页及列表页 + 当前栏目及所有子栏目下的内容详情页 + 站点首页。发布内容在内容列表或内容编辑页面点击发布按钮,发布指定内容详情页 + 内容所在栏目及所有祖级栏目的栏目首页和列表页 + 站点首页。发布页面部件设置页面部件模板根据页面部件模板生成静态文件,适用于在模板中使用<@cms_pagewidget>标签引用的页面部件。未设置页面部件模板需要根据模板中引用此页面部件的页面来发布,例如首页使用<@cms_pagewidget_data>或<@cms_advertisement>标签引用了页面部件数据,则需要发布首页。通过SSI方式包含的模板发布SSI包含模板主要应用于<@cms_include>标签,常见于公共页头和页尾,默认24小时缓存,因此如果SSI包含的模板有更新时,需要在后台模板管理菜单清理对应的模板缓存后再发布任意引用此模板的页面即可。
2024年07月09日
79 阅读
0 评论
0 点赞
2024-07-09
使用 linuxserver/firefox 实现外网网站加速访问
背景介绍之前建设网站过程中,有部分域名ICP备案麻烦,就买了台新加坡的服务器搭了几个网站,基本上也没什么访问量。早些年还用这种服务器搭个梯子之类的,但是近些年对自建梯子管控越来越严了,自建梯子的情况极有可能出现IP被封的风险。为了规避常规FQ软件的风险,在docker学习过程中发现有不少浏览器镜像,跑起来后可以直接通过浏览器访问docker容器内的浏览器服务,这样在规避风险的情况下,也能较方便的访问外网服务。理论上他是一个服务器上的浏览器,将它跑在内网环境上之后,它自然就能够访问内网资源。服务器能访问什么网站就可以访问什么网站,所以。。。搭建我们使用 docker compose 来管理 我们的镜像服务,docker-compose.yml 目录的内容如下:services: firefox: image: linuxserver/firefox:latest restart: unless-stopped container_name: firefox security_opt: - seccomp:unconfined #optional environment: - PUID=1000 - PGID=100 - TZ=Asia/Shanghai - LC_ALL=zh_CN.UTF-8 - CUSTOM_USER=zhuzl # 用户名 - PASSWORD=123456 # 密码 ports: - 8100:3000 volumes: - ./config:/config - /usr/share/fonts/chinese:/usr/share/fonts/chinese # 挂载中文字体目录,否则会出现中文乱码的问题 shm_size: "1gb"启动服务后,可在nginx配置代理,代理示例如下: location ^~ / { proxy_pass http://localhost:8100; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_http_version 1.1; # proxy_hide_header Upgrade; add_header X-Cache $upstream_cache_status; #Set Nginx Cache set $static_fileNpPoblu9 0; if ( $uri ~* "\.(gif|png|jpg|css|js|woff|woff2)$" ) { set $static_fileNpPoblu9 1; expires 1m; } if ( $static_fileNpPoblu9 = 0 ) { add_header Cache-Control no-cache; } }配置好后,可使用浏览器访问了,访问后初始界面如下:优化配置优化配置一:解决乱码问题如果未挂载中文字体的话,会出现下面这种乱码情况:所以我们需要将中文字体文件拷贝到宿主机的某个目录,如 /usr/share/fonts/chinese,然后挂载到容器的 /usr/share/fonts/chinese 目录,这样在启动容器的时候就可以自动价值中文字体了。优化配置二:安装翻译插件由于我们访问的外网多为英文内容,为便于快速消化内容,可给浏览器安装翻译插件,我这里安装了功能强大的「沉浸式翻译」,官网是:https://immersivetranslate.com/,进入官网后,可以直接点击「Firefox扩展」,进入Firefox 应用商店直接安装,安装后就可以很方便的使用了:使用体验整体访问速度上跟本地没什么蛮大区别,由于是基于KasmVNC的虚拟桌面技术,不能直接使用快捷键复制、粘贴内容,虽说设置中有「无缝剪切板」之类的开关,但是试了下也没效果,也有可能是我理解方面的问题吧:不过也可以使用 KasmVNC 自带的 剪贴板实现剪切板的读写:有一点需要特别注意的: 一定不要关闭最后一个浏览器标签 ,否则就直接黑屏了。黑屏后的话,需要重启docker服务才能继续使用。
2024年07月09日
151 阅读
0 评论
0 点赞
2024-07-05
写在入职并行3周年之际
一早收到公司人力系统自动推送的入职 3 周年提醒,让人不禁感叹时光飞逝。不知不觉中,我在并行已经度过了三年的时光。回顾这三年的工作历程,每一步都充满了挑战与成长。在这个具有纪念意义的时刻,我对自己在公司期间参与的主要工作做个回顾。前端规范的拟订在我刚加入公司之初,团队正处于组建初期阶段,我们面临的主要挑战之一是如何确保代码的统一性和可维护性。为此,我积极参与了公司前端开发规范的制定工作。我们对代码格式、命名规则以及组件的开发和使用规范等每一个细节都进行了深入的讨论和细致的推敲。这一规范制定过程不仅加深了我对前端开发最佳实践的理解,而且显著提升了团队的协作效率。搭建 dev-guide在前端规范制定完成后,我主导使用 webpack + vue + markdown-it 等技术栈搭建了团队日常开发用到的 dev-guide。这个 dev-guide 是一个纯静态工程,它不仅详尽记录了所有开发规范,还整合了日常使用的工具链接以及团队开发应用在不同环境下的链接。它已经成为新员工入职培训的关键资料,并且极大地便利了团队成员在开发过程中的信息检索。dev-guide 的设计兼顾了易用性和可维护性,使得新成员能够迅速适应,而经验丰富的成员也能轻松获取所需信息。此外,这种做法不仅提升了我们的开发效率,还确保了团队内部知识的共享和传承。参与超算云服务控制台前端开发作为团队中的一名专职前端开发工程师,参与公司控制台产品的前端开发是我工作中的一项重要内容。在这个过程中,我主要负责了如下工作:整体布局重构多主题改造(能分别打包成并行蓝和北龙红两个不同版本)国际化灰度发布(功能灰度上线)消息模块重构扫码登录功能快捷方式一键转区功能开发作业详情导出优化超算中心图表展示及交互全站搜索原型站点建设随动文档移动端站点建设年度用户计算报告(2023)整个前端开发过程中,通过与后端工程师的紧密合作,不经提升了我的团队协作能力,并积累了丰富的前端开发经验。使用CMS搭建控制台KBS在进行控制台项目的开发过程中,我们深刻地意识到构建一个详尽且易于访问的知识库的重要性。这个知识库的主要目的是记录和展示控制台的使用指南,以便用户能够随时随地在线访问和查阅这些信息。为了实现这一目标,我们进行了深入的调研和对比分析,以确保选择最合适的解决方案。经过一系列的评估和比较,我们最终决定采用基于 jspxCMS 来构建这个知识库系统。jspxCMS 是一个功能强大的内容管理系统,它提供了丰富的功能和灵活性,能够满足我们对知识库的各种需求。通过使用 jspxCMS,我们可以轻松地管理和发布控制台的使用指南,确保信息的准确性和及时更新。此外,jspxCMS 还具备用户友好的界面和强大的扩展性,这使得我们能够根据项目的具体需求进行定制和优化。这个过程中,我负责了如下工作:知识库站点模板制作知识库首页模板产品页模板内容页模板实现检索功能北龙超云版知识库模板后台改造改造左侧菜单导航样式应用资源文件分离改造。将上传文件目录、模板目录、索引文件目录从war包中分离后台界面支持并行蓝风格和北龙红风格详细项目情况见本博客之前分享的内容: 记一次KBS项目实施经验分享引入 Torna 管理项目接口文档在项目初期,我们采用了 smart-doc 工具来解析 Java 代码,自动生成 API 文档。最初,这些文档以单个 HTML 文件的形式呈现。然而,随着接口数量的不断增加,我们注意到文档的打开和加载速度变得异常缓慢。此外,随着项目的微服务化演进,我们在原有的 console-biz 基础上集成了更多工程,发现原有的文档生成方式无法有效整合所有接口文档。因此,我们开始探索其他解决方案。经过初步调研,我们发现 Torna 能够在最小的改动范围内满足我们的项目需求。基于此,我们在内部搭建了一套专门用于接口管理的系统。使用 Matomo 收集用户行为数据并做数据分析为了更深入地洞察用户的行为模式和需求,我们利用Matomo工具搜集了丰富的用户行为数据。经过对这些数据的细致分析,我们揭示了产品使用过程中存在的若干问题和潜在的改进领域,并据此实施了多次迭代优化。这一过程不仅让我掌握了数据分析的基础技巧,还提升了我对数据驱动开发理念的认识。从0 搭建开发维护中心(DMC)前端工程并实现完整功能在 DMC 项目中,我从零开始,基于 TDesign 构建了整个前端架构,并独立完成了所有功能的实现。该项目全面挑战了我的个人技能,涵盖了从需求分析、技术选择到具体功能实现的每一个环节,每一步都要求我展现出严谨和细致的工作态度。通过参与这个项目,我显著增强了自己在项目管理和问题解决方面的能力。基于 DataGear 搭建大屏展示系统并制作大屏随着项目推进至关键阶段,我们认识到有必要引入一个大屏幕展示系统,以便生动地展示各种统计数据。经过深入调研,我们选择了 DataGear 作为构建该系统的工具。在这一过程中,我承担了整个系统搭建以及两个主要大屏页面的制作任务。通过参与这个项目,我不仅掌握了 DataGear 的使用技巧,还学会了大屏幕展示的设计理念和实施技术。总结与展望三年的时光虽短暂,却在我的职业生涯中占据了至关重要的位置。在这段时间里,我在技术领域取得了显著的进步,并在团队协作与项目管理等多个方面积累了宝贵的经验。展望未来,我将持续保持对知识的渴望,不断磨练自己的技术能力,以期为公司和团队作出更大的贡献。这三年的工作经历让我深刻认识到,前端开发远不止于编写代码,它更是一个持续学习和创新的旅程。我衷心感谢公司为我提供的发展平台和机遇,同时对团队领导和同事们的支持与协助表示感激。
2024年07月05日
45 阅读
0 评论
0 点赞
2024-06-29
对接支付宝实现门户网站在线支付功能
前言近期,我所在团队负责的控制台项目计划新增在线充值功能。为实现此功能,我们首先需完成在线支付环节的对接。初期,我们将优先接入支付宝支付服务。值得一提的是,我上一次进行支付宝对接,还是在十多年前参与的笨鸟旅行项目,那时我们采用的是 jsp + mybatis 技术栈。与现在便捷的SDK调用相比,当时的开发条件相对简陋,整个项目甚至连 maven 包管理工具都未使用,前端工程化也仅处于起步阶段,CI/CD流程更是无从谈起。回顾过去,不禁让人感叹技术发展带来的日新月异。支付宝支付流程支付宝支付流程大致如下:1、 注册商家并绑定开发人员 :支付宝商家平台( https://b.alipay.com/ )注册商家,多说一嘴,注册成功后,可以在商家平台的账号中心 → 员工列表 添加员工为子账号,这样后续就不需要老是麻烦Boss帮忙扫码或提供验证码了:2、 申请开通支付产品: 商家平台的产品中心根据业务场景需要,申请开通相关支付产品。如我们申请开通了「电脑网站支付」、「手机网站支付」两款支付产品,申请后一般几分钟就开通了。3、 创建应用: 开通产品后就可以创建应用了,单击对应的产品可以进入关联应用页面创建应用并关联,这个界面需要超级管理员将开发人员添加为开放平台的管理员,这样开发人员就可以在开放平台进行应用相关配置了。4、 开发配置: 进入支付宝开放平台,进入应用详情,可在「开发设置」模块中根据流程配置加密证书等信息{gird column="2" gap="10"}{gird-item}{mtitle title="根据提示下载工具生成CSR文件"/}{/gird-item}{gird-item}{mtitle title="上传生成的CSR文件"/}{/gird-item}{gird-item}{mtitle title="手机验证"/}{/gird-item}{gird-item}{mtitle title="证书生成结果"/}{/gird-item}{/gird}5、发布上线:申请完的应用都是开发中状态,前期验证阶段踩了些小坑,以为配置好并生成证书就可以着手开发对接了,后面才发现状态为开发中的应用,是无法调用线上正式接口的,需要应用上线才行,所以我们在「开发设置」中配置好以后就直接提交审核就好,一般提交审核一天左右就可以审核通过,审核通过就可以正式开发对接了。6、开发对接:开发对接根据支付宝官网的文档来就好,现在对接支付宝可以直接使用高度封装的 SDK,开发速度上快了不少。电脑网站支付产品的文档链接为:https://opendocs.alipay.com/open/270/105898?pathHash=b3b2b667 。前期尝试了使用 v3 版本的对接方式(文档链接为: https://opendocs.alipay.com/open-v3/05w3qc ),但一直报证书方面的错误,后改用旧版本的 SDK 没发现问题。直接上代码码了那么多字,总算到最简单的环节了,我们的后端服务核心技术栈:JDK17 + SpringBoot 2.7.x + lombok + Mybatis-plus + MySQL + Hutool,使用 Maven 构建项目,所以我们这个示例工程也是基于上面的技术栈。以下是支付相关的核心代码:一、准备工作1、引入 Alipay SDK在项目 pom.xml 文件 的 dependencies 节点中加入 Alipay SDK 的依赖:<dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>4.39.104.ALL</version> </dependency>由于 V3 版本没有验证通过,这里我们没有根据文档站中的建议采用 V3 版本。2、定义配置类跟支付宝对接相关的信息我们统一写到 application.yml 配置文件中, 使用一个配置类来快速加载配置文件中的数据。package com.paratera.console.pay.config; import com.alipay.api.AlipayConfig; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; @Configuration @ConfigurationProperties(prefix = "alipay") @Data public class AlipayProperties extends AlipayConfig { /** * 支付成功通知URL */ private String notifyUrl; }然后,我们在application.yml 中添加如下配置信息:alipay: appId: 2021004153624250 serverUrl: https://openapi.alipay.com/gateway.do notifyUrl: https://paydemo.work.pojian.online/pay/ali/notify privateKey: MIIEvgIBADANBgkqhkiG9w0BAQEF....RMXJeS alipayPublicCertPath: /alipay/alipayCertPublicKey_RSA2.crt rootCertPath: /alipay/alipayRootCert.crt appCertPath: /alipay/appCertPublicKey_2021004153624250.crt encryptKey: EfaaDErfTRvO2islsjk3thAQ==3、定义签名校验方法为避免一些没必要的安全隐患,后端接收到支付宝推送的通知内容需要做验签操作,验签通过后再进行核心业务操作。/** * 验签 * @param paramMap * @return */ public boolean checkSign(Map<String, String> paramMap) { try { String alipayPublicKey = alipayProperties.getAlipayPublicKey(); if (ObjectUtil.isEmpty(alipayPublicKey)) { String alipayPublicCertPath = alipayProperties.getAlipayPublicCertPath(); alipayPublicKey = AlipaySignature.getAlipayPublicKey(alipayPublicCertPath); alipayProperties.setAlipayPublicKey(alipayPublicKey); } return AlipaySignature.rsaCheckV1(paramMap, alipayPublicKey, alipayProperties.getCharset(), "RSA2"); } catch (AlipayApiException e) { throw new RuntimeException(e); } }二、对接「统一收单下单并支付页面接口」1、controller 定义支付申请入口@PostMapping(path="/pay-prepare") @ResponseBody public String pay(PayForm payForm) throws AlipayApiException { String payHtml = alipayService.payPrepare(payForm); if (ObjectUtil.isEmpty(payHtml)) { return "支付失败"; } return payHtml; }PayForm 主要定义充值相关的字段,如充值金额、用户Id、邮箱、备注等,根据业务自己来就好,我这里采用最简的数据:package com.paratera.console.pay.model.form; import lombok.Data; import javax.validation.constraints.NotBlank; /** * 支付表单 */ @Data public class PayForm { /**0 * 用户Id */ @NotBlank(message = "用户Id不能为空") private String userId; /** * 支付金额 */ @NotBlank(message = "支付金额不能为空") private String money; }2、业务实现 AlipayService.payPrepare()public String payPrepare(PayForm payForm) throws AlipayApiException { Faker faker = new Faker(Locale.CHINA); CertAlipayRequest alipayConfig = new CertAlipayRequest(); alipayConfig.setServerUrl(alipayProperties.getServerUrl()); alipayConfig.setAppId(alipayProperties.getAppId()); alipayConfig.setPrivateKey(alipayProperties.getPrivateKey()); alipayConfig.setAlipayPublicCertPath(alipayProperties.getAlipayPublicCertPath()); alipayConfig.setCertPath(alipayProperties.getAppCertPath()); alipayConfig.setSignType("RSA2"); alipayConfig.setCharset("UTF-8"); alipayConfig.setFormat("json"); alipayConfig.setRootCertPath(alipayProperties.getRootCertPath()); alipayConfig.setEncryptor(alipayProperties.getEncryptKey()); AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig); // 实例化客户端 AlipayTradePagePayRequest payRequest = new AlipayTradePagePayRequest(); payRequest.setReturnUrl("https://paydemo.work.pojian.online/payResult.html"); payRequest.setNotifyUrl(alipayProperties.getNotifyUrl()); AlipayTradePagePayModel alipayTradePayModel = new AlipayTradePagePayModel(); // 调用 alipay.trade.pay LocalDateTime payTime = LocalDateTimeUtil.now(); String orderNo = "PAY" + DateUtil.format(payTime, DatePattern.PURE_DATE_PATTERN) + faker.number().digits(6); alipayTradePayModel.setOutTradeNo(orderNo); alipayTradePayModel.setTotalAmount(payForm.getMoney()); alipayTradePayModel.setSubject("控制台充值-" + DateUtil.format(payTime, DatePattern.PURE_DATE_PATTERN) + "-" + payForm.getMoney() + "元"); alipayTradePayModel.setProductCode("FAST_INSTANT_TRADE_PAY"); payRequest.setBizModel(alipayTradePayModel); AlipayTradePagePayResponse response = alipayClient.pageExecute(payRequest, "POST"); // 发起调用 String pageRedirectionData = response.getBody(); // log.info(pageRedirectionData); if (response.isSuccess()) { // log.info("调用成功"); // 保存充值记录 AddRechargePayForm addForm = new AddRechargePayForm(); addForm.setOrderNo(orderNo); addForm.setSubject(alipayTradePayModel.getSubject()); addForm.setPayMethod("ALIPAY"); addForm.setUserId(payForm.getUserId()); // 原单位是元,需要转换为分 BigDecimal money = new BigDecimal(payForm.getMoney()).multiply(BigDecimal.valueOf(100)); addForm.setPayMoney(money); rechargePayService.addRechargePay(addForm); return pageRedirectionData; } else { log.error("调用失败"); // sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接 String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response); log.error(diagnosisUrl); } return null; }上面的过程主要是生成如下所示的包含签名数据的html代码,在网页里通过自动提交表单的方式跳转到支付宝的付款页面:<form name="punchout_form" method="post" action="https://openapi.alipay.com/gateway.do?app_cert_sn=653da2afe61d430fcc9376b008245959&charset=UTF-8&alipay_root_cert_sn=687b59193f3f462dd5336e5abf83c5d8_02941eef3187dddf3d3b83462e1dfcf6&method=alipay.trade.page.pay&sign=gQOZ2g8xU9lyA2k55FJNSTbleinvaFA%2FjrfuUInElycpytnWweBVDECnC0q7d2tZ%2FOQvxQc5%2Fyxm2OBTc7ERa%2Fs5%2Fi4vTAD2QyukrlKLN1SleGZP5%2FihTpcB%2BM5WkpHyQjsRrnHeFHB3i8Nzfc%2B9ICdz5xJCx8dlu%2BVN9qb51hx9y4eyTvWd2XY4%2BfmW3RHsE8PYQ6VU9YtMP8wjFonaPMExY9WnpJn74fNVj8wLHmxYemxkW80qXhbOxGik2qHY9NWfkWZsYhzMbBu5%2BUBXWdprlbakThSPqXjNpagUMmdPNiGjvLWy3XYtFHfYsOQdbIIPrPlhuQIYmmUfJF9M3w%3D%3D&return_url=https%3A%2F%2Fpaydemo.work.pojian.online%2FpayResult.html¬ify_url=https%3A%2F%2Fpaydemo.work.pojian.online%2Fpay%2Fali%2Fnotify&version=1.0&app_id=2021004153624250&sign_type=RSA2×tamp=2024-06-26+18%3A15%3A01&alipay_sdk=alipay-sdk-java-4.39.104.ALL&format=json"> <input type="hidden" name="biz_content" value="{"out_trade_no":"PAY20240626445677","product_code":"FAST_INSTANT_TRADE_PAY","subject":"控制台充值-20240626-0.1元","total_amount":"0.1"}"> <input type="submit" value="立即支付" style="display:none" > </form> <script>document.forms[0].submit();</script>二、对接支付结果的异步通知发起支付操作的时候我们有指定两个URL:return_url:用于支付完成后跳转到我们的页面给用户展示支付结果notify_url:用于支付完成后通知后端更新支付结果,由于return_url给的支付结果一般不可信,所以我们一般采用这个地址告诉支付宝,用户支付完后异步通知我们哪个接口1、定义接收通知的接口/** * 支付宝付款通知 * * https://opendocs.alipay.com/open/270/105902?pathHash=d5cd617e&ref=api * @return */ @RequestMapping("/notify") public String payNotify(HttpServletRequest request) throws UnsupportedEncodingException { log.info("====== 开始接收支付宝支付回调通知 ======"); Map<String, String> paramMap = new HashMap<>(); Map<String, String[]> requestParams = request.getParameterMap(); log.info("获取支付宝POST过来反馈信息"); for (String name : requestParams.keySet()) { String[] values = requestParams.get(name); String valueStr = ""; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; } paramMap.put(name, valueStr); } log.info("通知请求数据:{}", JSONUtil.toJsonStr(paramMap)); if(ObjectUtil.isNotEmpty(paramMap)) { log.info("支付宝回调URL参数:{}", JSONUtil.toJsonStr(paramMap)); boolean signVerified = alipayService.checkSign(paramMap); if (signVerified) { if ("TRADE_SUCCESS".equals(paramMap.get("trade_status"))) { rechargePayService.paid(paramMap.get("out_trade_no"), JSONUtil.toJsonStr(paramMap)); } } // {"gmt_create":["2024-06-25 15:18:10"],"charset":["UTF-8"],"gmt_payment":["2024-06-25 15:18:22"],"notify_time":["2024-06-25 15:18:23"],"subject":["Jacob Have I Loved"],"sign":["CM2qWtZ4rCmvqFyRucgANQJAz2k0SsroaU3uDEK28kgxkcHC29a64jquy4/qRfEiX4VuJKdmxkHG3+hEAC/9/qOgl8mG/GGSPlq+B90fg25aymYlKoM6wYOzEqooOLj2LCtj8Nq1WKaw9pTwYK/GlDdVLsUB8bSpkpjZ6vrhhzjeXK38wDgZuNKle9JdFCQLO/f1vcyM+h4SQpkurg/jTYB7oQQWk/ZsQAqC/XM/laKrPMPrA4SYb8hcC0UIQD8BLlCZiXaEj/+Q6CTJQffGyW2q6trTEhySgb4I3OwTjqtbn1BlafFCTm1OYgMlVLZu5U+iwvhPW2Xmz8A2v3RWIQ=="],"merchant_app_id":["2021004153624250"],"buyer_open_id":["037QDGdQKn6R2z7On4z_OJrBOzaNN0z5Obtjr_T4aftVdU9"],"invoice_amount":["0.10"],"version":["1.0"],"notify_id":["2024062501222151823038371452266751"],"fund_bill_list":["[{\"amount\":\"0.10\",\"fundChannel\":\"ALIPAYACCOUNT\"}]"],"notify_type":["trade_status_sync"],"out_trade_no":["PAY20240625635868"],"total_amount":["0.10"],"trade_status":["TRADE_SUCCESS"],"trade_no":["2024062522001438371427121571"],"auth_app_id":["2021004153624250"],"receipt_amount":["0.10"],"point_amount":["0.00"],"buyer_pay_amount":["0.10"],"app_id":["2021004153624250"],"sign_type":["RSA2"],"seller_id":["2088641848623112"]} } return "success"; }2、核心逻辑说明alipayService.checkSign()这个验签方法在前面的章节已经定义过,这里就不着重介绍了。rechargePayService.paid()是内部业务逻辑,本示例中主要是存储支付宝推送的数据并改变订单状态,在这里就不做代码罗列了。示例工程的几个核心页面效果为更好的展示示例效果,在示例工程开发过程中做了些界面展示,可通过如下链接体验完整功能:https://paydemo.work.pojian.online/相关核心界面截图如下:{gird column="2" gap="10"}{gird-item}{mtitle title="发起支付"/}{/gird-item}{gird-item}{mtitle title="用户使用支付宝完成支付"/}{/gird-item}{gird-item}{mtitle title="支付成功截图"/}{/gird-item}{gird-item}{mtitle title="订单列表"/}{/gird-item}{/gird}
2024年06月29日
65 阅读
0 评论
0 点赞
2024-06-06
提词器工具合集
迅捷提词全能王官网:https://www.xunjiepdf.com/ticiqi点评:题词模式有拍摄、悬浮窗、提词板 3 种模式。除了提词功能外,软件的视频和图片功能也是非常实用的,工具非常齐全。芦笋提词器官网:https://tcq.lusun.com/点评:一款支持智能跟读、隐形提词的应用,支持Windows、Mac、Android、iOS。支持智能跟读、隐形提词、AI 辅助提词,广泛适用于网课、视频拍摄、直播、录口播、 vlog、视频面试、演讲、口才训练等领域。PromptSmart官网:https://www.promptsmart.com/点评:会根据语速自动调整提词速度,同时文本会自动滚动Teleprompter官网:https://cn.teleprompter-online.com/点评:在线工具,平时准备演讲或录视频的时候,可以用这个工具提示。除了支持在线录音、播放暂停外,还支持文本水平、垂直翻转以及镜像,方便录制。提客提词器官网:https://www.tttci.com/点评:有在线版也有客户端,有悬浮、隐形、多彩提词功能,支持 AI 跟随提词。QPrompt - 提词器开源地址:https://github.com/Cuperino/QPrompt-Teleprompter点评:适合所有视频创作者的提词器软件Speakflow — 在线提词器官网:https://www.speakflow.com/点评:同步远程滚动文本、文本调整、集成人工智能和语音识别等Promptr官网:https://promptr.co/点评:基于网络的提词器应用程序无需注册或下载,它有多种格式选项、文本调整、镜像视图和正常视图,让您轻松阅读Free online teleprompter software with voice activated scrolling.官网:https://telepromptermirror.com/telepromptersoftware.htm点评:免费提词器软件,支持语音激活,提供自动滚动、声控滚动、键盘快捷键、字体颜色管理等强大功能。PromptDog官网:https://promptdog.com/点评:一款适用于 Windows 和 macOS 设备的优秀提词器软件
2024年06月06日
87 阅读
0 评论
0 点赞
2024-05-29
使用 Docker + Syncthing 同步文件
背景介绍很久之前我就用Syncthing 搭建过文件同步服务(见 使用 Syncthing 同步文件 ),只是当初是直接下载的可执行文件,在宿主机启服务实现文件同步的,对宿主机有一定的侵入性,且当时只是记录了怎么把服务跑起来,没有说明清楚服务跑起来后怎么配置,最终实现文件同步的。最近帮朋友使用 ChestnutCMS 搭建了个公司产品网站,正好需要在两台服务器器之间实现文件同步服务,一共有两台服务器:Web 服务器内网IP: 10.0.12.12配置:CPU - 4核 | 内存 - 8GB | 系统盘 - SSD云硬盘 180GB | 流量包 - 2000GB/月(带宽:12Mbps)主要部署 Docker + NginxProxyManager + KKFilePreview应用服务器内网IP: 10.0.16.13配置:CPU - 8核 | 内存 - 16GB | 系统盘 - SSD云硬盘 270GB | 流量包 - 3500GB/月(带宽:18Mbps)主要部署公司的云上业务系统 + ChestnutCMS,由于预算有限,数据库、Redis 等服务也装在这台服务器两台服务器处于相同的内网环境,ChestnutCMS 主要用于内容管理及网站静态发布,然后使用 Syncthing 将静态化的文件同步到 Web 服务器,使用 NginxProxyManager 发布到外网访问。应用部署及配置部署发布端使用 Docker 启动应用我们在应用服务器上部署发布端,由于应用服务器上也提前部署了 Docker, 我们使用 docker来部署,docker-compose.yaml 文件示例如下:services: app: image: syncthing/syncthing container_name: syncthing privileged: true restart: always volumes: - /data:/data - ../po-cms/wwwroot_release:/var/syncthing - ../hosts:/etc/hosts networks: - net-zzl ports: - 8102:8384 - 22000:22000 networks: net-zzl: name: bridge_zzl external: true使用 docker compose up -d 启动服务开放端口从上面的配置文件中,我们开启了 8102 和 22000 两个端口,由于我们的应用服务器不直接对外提供服务,需要使用 Web服务器代理,所以 需要将这两个端口对Web服务器开放:如果你的应用服务器本身启用了防火墙之类的机制,记得也要放行。配置 Syncthing UI界面对外可访问在 NginxProxyManager 中添加对外访问,相关的 DNS 解析请自行提前处理。Syncthing 配置第一次访问的时候系统会通过警告提示来引导用户做一些安全性相关的配置:发送匿名报告数据提示引导配置提示我主要配置的信息如下:Syncthing 常规配置Syncthing 图形用户界面设置至此 应用服务器的配置基本OK了。web服务器配置部署 Syncting我们还是使用 Docker 来部署,基本信息差不多,我只是结合web服务器的环境改了下挂载目录及端口:services: app: image: syncthing/syncthing container_name: syncthing privileged: true restart: always volumes: - /data:/data - ../nginx-proxy-manager/wwwroot_release:/var/syncthing - ../hosts:/etc/hosts networks: - net-zzl ports: - 8013:8384 - 22000:22000 networks: net-zzl: name: bridge_zzl external: true对应用服务器开放端口Syncthing 配置基本配置跟应用服务器保持一致配置同步一、添加远程设备在应用服务器添加web服务器的syncthing在 Web 服务器同意添加:二、应用服务器配置同步文件夹单击主界面的「添加文件夹」按钮:三、WEB服务器同意添加共享web服务器接收到添加共享提示配置信息配置完成后会自动进行同步同步完成后可在指定目录下看到同步后的文件参考链接Syncthing 官网:https://syncthing.net/Syncthing 官网文档:https://docs.syncthing.net/Syncthing Github 开源地址:https://github.com/syncthing/syncthing
2024年05月29日
457 阅读
0 评论
0 点赞
2024-05-19
解决 nginxProxyManager 申请证书时的SSL失败问题
背景介绍使用 NginxProxyManager 搭建 Web服务器,添加SSL证书时出错,报错界面如下:异常提示信息如下提示:CommandError: The 'certbot_dns_dnspod.dns_dnspod' plugin errored while loading: No module named 'zope'. You may need to remove or update this plugin. The Certbot log will contain the full error details and this should be reported to the plugin developer. Ask for help or search for solutions at https://community.letsencrypt.org. See the logfile /tmp/certbot-log-pid4c1ie/log or re-run Certbot with -v for more details. at /app/lib/utils.js:16:13 at ChildProcess.exithandler (node:child_process:430:5) at ChildProcess.emit (node:events:519:28) at maybeClose (node:internal/child_process:1105:16) at ChildProcess._handle.onexit (node:internal/child_process:305:5)问题调研该问题在 NginxProxyManager 的github Issue 中有说明,连接为:https://github.com/NginxProxyManager/nginx-proxy-manager/issues/2440其中,该回复直击要害:https://github.com/NginxProxyManager/nginx-proxy-manager/issues/2440#issuecomment-1380036390我们就根据提示,到容器里安装一下缺失的依赖即可。解决步骤一、进入容器:sudo docker exec -it nginxProxyManager /bin/bash进入后显示如下提示信息:ubuntu@VM-12-12-ubuntu:/data/dockerRoot/apps/nginx-proxy-manager$ sudo docker exec -it nginxProxyManager /bin/bash _ _ _ ____ __ __ | \ | | __ _(_)_ __ __ _| _ \ _ __ _____ ___ _| \/ | __ _ _ __ __ _ __ _ ___ _ __ | \| |/ _` | | '_ \\ \/ / |_) | '__/ _ \ \/ / | | | |\/| |/ _` | '_ \ / _` |/ _` |/ _ \ '__| | |\ | (_| | | | | |> <| __/| | | (_) > <| |_| | | | | (_| | | | | (_| | (_| | __/ | |_| \_|\__, |_|_| |_/_/\_\_| |_| \___/_/\_\\__, |_| |_|\__,_|_| |_|\__,_|\__, |\___|_| |___/ |___/ |___/ The 'certbot_dns_dnspod.dns_dnspod' plugin errored while loading: No module named 'zope'. You may need to remove or update this plugin. The Certbot log will contain the full error details and this should be reported to the plugin developer. Ask for help or search for solutions at https://community.letsencrypt.org. See the logfile /tmp/certbot-log-fimx1ahi/log or re-run Certbot with -v for more details. Version 2.11.2 (12d77e3) 2024-05-10 14:36:51 UTC, OpenResty 1.21.4.3, debian 12 (bookworm), Certbot Base: debian:bookworm-slim, linux/amd64 Certbot: nginxproxymanager/nginx-full:latest, linux/amd64 Node: nginxproxymanager/nginx-full:certbot, linux/amd64 [root@docker-1f03724f8d16:/app]二、安装 zopepip install zope安装后由于多次没下载到自动重试了数次,见如下安装日志:[root@docker-1f03724f8d16:/app]# pip install zope Collecting zope Downloading Zope-5.10-py3-none-any.whl.metadata (32 kB) Collecting AccessControl>=5.2 (from zope) Downloading AccessControl-6.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (9.8 kB) Collecting Acquisition (from zope) Downloading Acquisition-5.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (24 kB) Collecting BTrees (from zope) Downloading BTrees-5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (20 kB) Collecting Chameleon>=3.7.0 (from zope) Downloading Chameleon-4.5.4-py3-none-any.whl.metadata (51 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 51.3/51.3 kB 7.4 kB/s eta 0:00:00 Collecting DateTime (from zope) Downloading DateTime-5.5-py3-none-any.whl.metadata (33 kB) Collecting DocumentTemplate>=4.0 (from zope) Downloading DocumentTemplate-4.6-py3-none-any.whl.metadata (7.6 kB) Collecting ExtensionClass (from zope) Downloading ExtensionClass-5.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (6.2 kB) Collecting MultiMapping (from zope) Downloading MultiMapping-5.0-py3-none-any.whl.metadata (1.8 kB) Collecting PasteDeploy (from zope) Downloading PasteDeploy-3.1.0-py3-none-any.whl.metadata (2.7 kB) Collecting Persistence (from zope) Downloading Persistence-4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.0 kB) Collecting RestrictedPython (from zope) Downloading RestrictedPython-7.1-py3-none-any.whl.metadata (12 kB) Collecting ZConfig>=2.9.2 (from zope) Downloading ZConfig-4.1-py3-none-any.whl.metadata (17 kB) Collecting ZODB (from zope) Downloading ZODB-6.0-py3-none-any.whl.metadata (24 kB) Requirement already satisfied: setuptools>=36.2 in /opt/certbot/lib/python3.11/site-packages (from zope) (66.1.1) Collecting transaction>=2.4 (from zope) Downloading transaction-4.0-py3-none-any.whl.metadata (14 kB) Collecting waitress (from zope) Downloading waitress-3.0.0-py3-none-any.whl.metadata (4.2 kB) Collecting zExceptions>=3.4 (from zope) Downloading zExceptions-5.0-py3-none-any.whl.metadata (3.4 kB) Collecting z3c.pt (from zope) Downloading z3c.pt-4.3-py3-none-any.whl.metadata (47 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 47.6/47.6 kB 42.6 kB/s eta 0:00:00 Collecting zope.browser (from zope) Downloading zope.browser-3.0-py3-none-any.whl.metadata (4.4 kB) Collecting zope.browsermenu (from zope) Downloading zope.browsermenu-5.0-py3-none-any.whl.metadata (4.1 kB) Collecting zope.browserpage>=4.4.0.dev0 (from zope) Downloading zope.browserpage-5.0-py3-none-any.whl.metadata (5.4 kB) Collecting zope.browserresource>=3.11 (from zope) Downloading zope.browserresource-5.1-py3-none-any.whl.metadata (9.3 kB) Collecting zope.component (from zope) Downloading zope.component-6.0-py3-none-any.whl.metadata (18 kB) Collecting zope.configuration (from zope) Downloading zope.configuration-5.0.1-py3-none-any.whl.metadata (11 kB) Collecting zope.container (from zope) Downloading zope.container-5.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (15 kB) Collecting zope.contentprovider (from zope) Downloading zope.contentprovider-5.0-py3-none-any.whl.metadata (5.9 kB) Collecting zope.contenttype (from zope) Downloading zope.contenttype-5.1-py3-none-any.whl.metadata (5.3 kB) Collecting zope.datetime (from zope) Downloading zope.datetime-5.0.0-py3-none-any.whl.metadata (4.3 kB) Collecting zope.deferredimport (from zope) Downloading zope.deferredimport-5.0-py3-none-any.whl.metadata (5.1 kB) Collecting zope.event (from zope) Downloading zope.event-5.0-py3-none-any.whl.metadata (4.4 kB) Collecting zope.exceptions (from zope) Downloading zope.exceptions-5.0.1-py3-none-any.whl.metadata (8.4 kB) Collecting zope.globalrequest (from zope) Downloading zope.globalrequest-2.0-py3-none-any.whl.metadata (3.3 kB) Collecting zope.i18n[zcml] (from zope) Downloading zope.i18n-5.1-py3-none-any.whl.metadata (13 kB) Collecting zope.i18nmessageid (from zope) Downloading zope.i18nmessageid-6.1.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (8.7 kB) Collecting zope.interface>=3.8 (from zope) Downloading zope.interface-6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (42 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 42.2/42.2 kB 25.4 kB/s eta 0:00:00 Collecting zope.lifecycleevent (from zope) Downloading zope.lifecycleevent-5.0-py3-none-any.whl.metadata (6.0 kB) Collecting zope.location (from zope) Downloading zope.location-5.0-py3-none-any.whl.metadata (9.7 kB) Collecting zope.pagetemplate>=4.0.2 (from zope) Downloading zope.pagetemplate-5.1-py3-none-any.whl.metadata (9.6 kB) Collecting zope.processlifetime (from zope) Downloading zope.processlifetime-3.0-py3-none-any.whl.metadata (3.9 kB) Collecting zope.proxy (from zope) Downloading zope.proxy-5.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (11 kB) Collecting zope.ptresource (from zope) Downloading zope.ptresource-5.0-py3-none-any.whl.metadata (4.4 kB) Collecting zope.publisher (from zope) Downloading zope.publisher-7.0-py3-none-any.whl.metadata (21 kB) Collecting zope.schema (from zope) Downloading zope.schema-7.0.1-py3-none-any.whl.metadata (24 kB) Collecting zope.security (from zope) Downloading zope.security-6.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (24 kB) Collecting zope.sequencesort (from zope) Downloading zope.sequencesort-5.0-py3-none-any.whl.metadata (3.9 kB) Collecting zope.site (from zope) Downloading zope.site-5.0-py3-none-any.whl.metadata (20 kB) Collecting zope.size (from zope) Downloading zope.size-5.0-py3-none-any.whl.metadata (4.6 kB) Collecting zope.tal (from zope) Downloading zope.tal-5.0.1-py3-none-any.whl.metadata (7.5 kB) Collecting zope.tales>=5.0.2 (from zope) Downloading zope.tales-6.0-py3-none-any.whl.metadata (6.6 kB) Collecting zope.testbrowser (from zope) Downloading zope.testbrowser-6.0-py3-none-any.whl.metadata (19 kB) Collecting zope.testing (from zope) Downloading zope.testing-5.0.1-py3-none-any.whl.metadata (19 kB) Collecting zope.traversing (from zope) Downloading zope.traversing-5.0-py3-none-any.whl.metadata (12 kB) Collecting zope.viewlet (from zope) Downloading zope.viewlet-5.0-py3-none-any.whl.metadata (5.9 kB) Collecting multipart (from zope) Downloading multipart-0.2.4-py3-none-any.whl.metadata (1.1 kB) Collecting AuthEncoding (from AccessControl>=5.2->zope) Downloading AuthEncoding-5.0-py3-none-any.whl.metadata (2.7 kB) Collecting RestrictedPython (from zope) Downloading RestrictedPython-7.2a1.dev0-py3-none-any.whl.metadata (12 kB) Collecting roman (from DocumentTemplate>=4.0->zope) Downloading roman-4.2-py3-none-any.whl.metadata (3.6 kB) Collecting zope.structuredtext (from DocumentTemplate>=4.0->zope) Downloading zope.structuredtext-5.0-py3-none-any.whl.metadata (4.3 kB) Collecting persistent>=4.1.1 (from Persistence->zope) Downloading persistent-5.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (21 kB) Collecting zope.hookable>=4.2.0 (from zope.component->zope) Downloading zope.hookable-6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (5.8 kB) Requirement already satisfied: pytz in /opt/certbot/lib/python3.11/site-packages (from DateTime->zope) (2024.1) Collecting zc.lockfile (from ZODB->zope) Downloading zc.lockfile-3.0.post1-py3-none-any.whl.metadata (6.2 kB) Collecting zodbpickle>=1.0.1 (from ZODB->zope) Downloading zodbpickle-3.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (13 kB) Collecting zope.cachedescriptors (from zope.container->zope) Downloading zope.cachedescriptors-5.0-py3-none-any.whl.metadata (17 kB) Collecting zope.dottedname (from zope.container->zope) Downloading zope.dottedname-6.0-py3-none-any.whl.metadata (3.4 kB) Collecting zope.filerepresentation (from zope.container->zope) Downloading zope.filerepresentation-6.0-py3-none-any.whl.metadata (4.6 kB) Collecting python-gettext (from zope.i18n[zcml]->zope) Downloading python_gettext-5.0-py3-none-any.whl.metadata (4.6 kB) Collecting zope.deprecation (from zope.i18n[zcml]->zope) Downloading zope.deprecation-5.0-py3-none-any.whl.metadata (5.1 kB) Collecting zope.annotation (from zope.site->zope) Downloading zope.annotation-5.0-py3-none-any.whl.metadata (6.6 kB) WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='pypi.org', port=443): Read timed out. (read timeout=15)")': /simple/webtest/ Collecting WebTest>=2.0.30 (from zope.testbrowser->zope) Downloading WebTest-3.0.0-py3-none-any.whl.metadata (1.8 kB) Collecting BeautifulSoup4 (from zope.testbrowser->zope) Downloading beautifulsoup4-4.12.3-py3-none-any.whl.metadata (3.8 kB) Collecting SoupSieve>=1.9.0 (from zope.testbrowser->zope) Downloading soupsieve-2.5-py3-none-any.whl.metadata (4.7 kB) Collecting WSGIProxy2 (from zope.testbrowser->zope) Downloading WSGIProxy2-0.5.1-py3-none-any.whl.metadata (2.7 kB) Requirement already satisfied: cffi in /opt/certbot/lib/python3.11/site-packages (from persistent>=4.1.1->Persistence->zope) (1.16.0) Collecting WebOb>=1.2 (from WebTest>=2.0.30->zope.testbrowser->zope) Downloading WebOb-1.8.7-py2.py3-none-any.whl.metadata (10 kB) Requirement already satisfied: pycparser in /opt/certbot/lib/python3.11/site-packages (from cffi->persistent>=4.1.1->Persistence->zope) (2.22) Downloading Zope-5.10-py3-none-any.whl (3.2 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.2/3.2 MB 99.6 kB/s eta 0:00:00 Downloading AccessControl-6.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (193 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 193.4/193.4 kB 1.7 MB/s eta 0:00:00 Downloading Chameleon-4.5.4-py3-none-any.whl (88 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 88.2/88.2 kB 1.8 MB/s eta 0:00:00 Downloading DocumentTemplate-4.6-py3-none-any.whl (87 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 87.0/87.0 kB 1.8 MB/s eta 0:00:00 Downloading ExtensionClass-5.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (92 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 92.6/92.6 kB 1.8 MB/s eta 0:00:00 Downloading Persistence-4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (24 kB) Downloading RestrictedPython-7.2a1.dev0-py3-none-any.whl (26 kB) Downloading transaction-4.0-py3-none-any.whl (46 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 46.6/46.6 kB 1.7 MB/s eta 0:00:00 Downloading ZConfig-4.1-py3-none-any.whl (131 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 131.5/131.5 kB 1.8 MB/s eta 0:00:00 Downloading zExceptions-5.0-py3-none-any.whl (17 kB) Downloading zope.browserpage-5.0-py3-none-any.whl (32 kB) Downloading zope.browserresource-5.1-py3-none-any.whl (40 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 40.6/40.6 kB 1.7 MB/s eta 0:00:00 Downloading zope.component-6.0-py3-none-any.whl (68 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 68.8/68.8 kB 1.8 MB/s eta 0:00:00 Downloading zope.contenttype-5.1-py3-none-any.whl (14 kB) Downloading zope.interface-6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (249 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 249.5/249.5 kB 1.5 MB/s eta 0:00:00 Downloading zope.pagetemplate-5.1-py3-none-any.whl (44 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 45.0/45.0 kB 2.0 MB/s eta 0:00:00 Downloading zope.publisher-7.0-py3-none-any.whl (119 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 119.3/119.3 kB 1.9 MB/s eta 0:00:00 Downloading zope.security-6.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (182 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 182.7/182.7 kB 2.1 MB/s eta 0:00:00 Downloading zope.proxy-5.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (71 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 71.9/71.9 kB 2.1 MB/s eta 0:00:00 Downloading zope.schema-7.0.1-py3-none-any.whl (85 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 85.9/85.9 kB 2.1 MB/s eta 0:00:00 Downloading zope.tal-5.0.1-py3-none-any.whl (135 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 135.9/135.9 kB 2.0 MB/s eta 0:00:00 Downloading zope.tales-6.0-py3-none-any.whl (30 kB) Downloading zope.traversing-5.0-py3-none-any.whl (47 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 47.6/47.6 kB 1.9 MB/s eta 0:00:00 Downloading zope.location-5.0-py3-none-any.whl (19 kB) Downloading Acquisition-5.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (122 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 122.8/122.8 kB 2.1 MB/s eta 0:00:00 Downloading BTrees-5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.8 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.8/3.8 MB 2.7 MB/s eta 0:00:00 Downloading DateTime-5.5-py3-none-any.whl (52 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 52.6/52.6 kB 3.3 MB/s eta 0:00:00 Downloading MultiMapping-5.0-py3-none-any.whl (4.3 kB) Downloading multipart-0.2.4-py3-none-any.whl (7.4 kB) Downloading PasteDeploy-3.1.0-py3-none-any.whl (16 kB) Downloading waitress-3.0.0-py3-none-any.whl (56 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 56.7/56.7 kB 3.1 MB/s eta 0:00:00 Downloading z3c.pt-4.3-py3-none-any.whl (40 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 40.2/40.2 kB 3.5 MB/s eta 0:00:00 Downloading ZODB-6.0-py3-none-any.whl (417 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 417.8/417.8 kB 4.0 MB/s eta 0:00:00 Downloading zope.browser-3.0-py3-none-any.whl (7.6 kB) Downloading zope.browsermenu-5.0-py3-none-any.whl (30 kB) Downloading zope.configuration-5.0.1-py3-none-any.whl (79 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 79.0/79.0 kB 3.7 MB/s eta 0:00:00 Downloading zope.container-5.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (114 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 114.9/114.9 kB 3.8 MB/s eta 0:00:00 Downloading zope.lifecycleevent-5.0-py3-none-any.whl (18 kB) Downloading zope.contentprovider-5.0-py3-none-any.whl (11 kB) Downloading zope.datetime-5.0.0-py3-none-any.whl (43 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 43.4/43.4 kB 3.0 MB/s eta 0:00:00 Downloading zope.deferredimport-5.0-py3-none-any.whl (10.0 kB) Downloading zope.event-5.0-py3-none-any.whl (6.8 kB) Downloading zope.exceptions-5.0.1-py3-none-any.whl (19 kB) Downloading zope.globalrequest-2.0-py3-none-any.whl (5.7 kB) Downloading zope.i18nmessageid-6.1.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (28 kB) Downloading zope.processlifetime-3.0-py3-none-any.whl (5.9 kB) Downloading zope.ptresource-5.0-py3-none-any.whl (7.6 kB) Downloading zope.sequencesort-5.0-py3-none-any.whl (11 kB) Downloading zope.site-5.0-py3-none-any.whl (30 kB) Downloading zope.size-5.0-py3-none-any.whl (7.9 kB) Downloading zope.testbrowser-6.0-py3-none-any.whl (63 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 63.7/63.7 kB 3.5 MB/s eta 0:00:00 Downloading zope.testing-5.0.1-py3-none-any.whl (37 kB) Downloading zope.viewlet-5.0-py3-none-any.whl (33 kB) Downloading persistent-5.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (234 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 234.4/234.4 kB 4.0 MB/s eta 0:00:00 Downloading soupsieve-2.5-py3-none-any.whl (36 kB) Downloading WebTest-3.0.0-py3-none-any.whl (31 kB) Downloading zodbpickle-3.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (299 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 299.3/299.3 kB 4.0 MB/s eta 0:00:00 Downloading zope.hookable-6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (23 kB) Downloading zope.i18n-5.1-py3-none-any.whl (798 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 798.8/798.8 kB 3.7 MB/s eta 0:00:00 Downloading AuthEncoding-5.0-py3-none-any.whl (8.7 kB) Downloading beautifulsoup4-4.12.3-py3-none-any.whl (147 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 147.9/147.9 kB 4.4 MB/s eta 0:00:00 Downloading python_gettext-5.0-py3-none-any.whl (13 kB) Downloading roman-4.2-py3-none-any.whl (5.5 kB) Downloading WSGIProxy2-0.5.1-py3-none-any.whl (9.2 kB) Downloading zc.lockfile-3.0.post1-py3-none-any.whl (9.8 kB) Downloading zope.annotation-5.0-py3-none-any.whl (14 kB) Downloading zope.cachedescriptors-5.0-py3-none-any.whl (13 kB) Downloading zope.deprecation-5.0-py3-none-any.whl (10 kB) Downloading zope.dottedname-6.0-py3-none-any.whl (6.4 kB) Downloading zope.filerepresentation-6.0-py3-none-any.whl (8.3 kB) Downloading zope.structuredtext-5.0-py3-none-any.whl (92 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 92.5/92.5 kB 4.0 MB/s eta 0:00:00 Downloading WebOb-1.8.7-py2.py3-none-any.whl (114 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 115.0/115.0 kB 4.2 MB/s eta 0:00:00 Installing collected packages: multipart, zope.testing, zope.structuredtext, zope.sequencesort, zope.interface, zope.i18nmessageid, zope.hookable, zope.event, zope.dottedname, zope.deprecation, zope.datetime, zope.contenttype, zope.cachedescriptors, zodbpickle, ZConfig, zc.lockfile, WebOb, waitress, SoupSieve, roman, RestrictedPython, python-gettext, PasteDeploy, ExtensionClass, Chameleon, AuthEncoding, zope.tales, zope.tal, zope.size, zope.schema, zope.proxy, zope.processlifetime, zope.lifecycleevent, zope.exceptions, zope.component, zope.browser, WSGIProxy2, transaction, persistent, MultiMapping, DateTime, BeautifulSoup4, Acquisition, zope.location, zope.i18n, zope.filerepresentation, zope.deferredimport, zope.configuration, WebTest, Persistence, BTrees, zope.testbrowser, zope.security, zope.annotation, ZODB, zope.publisher, zope.traversing, zope.contentprovider, zExceptions, zope.pagetemplate, zope.globalrequest, zope.container, zope.browserresource, z3c.pt, AccessControl, zope.site, zope.ptresource, zope.browserpage, zope.browsermenu, DocumentTemplate, zope.viewlet, zope Successfully installed AccessControl-6.3 Acquisition-5.2 AuthEncoding-5.0 BTrees-5.2 BeautifulSoup4-4.12.3 Chameleon-4.5.4 DateTime-5.5 DocumentTemplate-4.6 ExtensionClass-5.1 MultiMapping-5.0 PasteDeploy-3.1.0 Persistence-4.1 RestrictedPython-7.2a1.dev0 SoupSieve-2.5 WSGIProxy2-0.5.1 WebOb-1.8.7 WebTest-3.0.0 ZConfig-4.1 ZODB-6.0 multipart-0.2.4 persistent-5.2 python-gettext-5.0 roman-4.2 transaction-4.0 waitress-3.0.0 z3c.pt-4.3 zExceptions-5.0 zc.lockfile-3.0.post1 zodbpickle-3.3 zope-5.10 zope.annotation-5.0 zope.browser-3.0 zope.browsermenu-5.0 zope.browserpage-5.0 zope.browserresource-5.1 zope.cachedescriptors-5.0 zope.component-6.0 zope.configuration-5.0.1 zope.container-5.2 zope.contentprovider-5.0 zope.contenttype-5.1 zope.datetime-5.0.0 zope.deferredimport-5.0 zope.deprecation-5.0 zope.dottedname-6.0 zope.event-5.0 zope.exceptions-5.0.1 zope.filerepresentation-6.0 zope.globalrequest-2.0 zope.hookable-6.0 zope.i18n-5.1 zope.i18nmessageid-6.1.0 zope.interface-6.4 zope.lifecycleevent-5.0 zope.location-5.0 zope.pagetemplate-5.1 zope.processlifetime-3.0 zope.proxy-5.2 zope.ptresource-5.0 zope.publisher-7.0 zope.schema-7.0.1 zope.security-6.2 zope.sequencesort-5.0 zope.site-5.0 zope.size-5.0 zope.structuredtext-5.0 zope.tal-5.0.1 zope.tales-6.0 zope.testbrowser-6.0 zope.testing-5.0.1 zope.traversing-5.0 zope.viewlet-5.0 [root@docker-1f03724f8d16:/app]#由于要用到dnspod 申请SSL,我们多安装一下dnspod的依赖,避免这个包没安装成功导致其他问题:pip install certbot-dns-dnspod执行后,提示如下信息表面该依赖之前一安装成功:[root@docker-1f03724f8d16:/app]# pip install certbot-dns-dnspod Requirement already satisfied: certbot-dns-dnspod in /opt/certbot/lib/python3.11/site-packages (0.1.0) Requirement already satisfied: acme>=0.15.0 in /opt/certbot/lib/python3.11/site-packages (from certbot-dns-dnspod) (2.10.0) Requirement already satisfied: certbot>=0.15.0 in /opt/certbot/lib/python3.11/site-packages (from certbot-dns-dnspod) (2.10.0) Requirement already satisfied: cryptography>=3.2.1 in /opt/certbot/lib/python3.11/site-packages (from acme>=0.15.0->certbot-dns-dnspod) (42.0.7) Requirement already satisfied: josepy>=1.13.0 in /opt/certbot/lib/python3.11/site-packages (from acme>=0.15.0->certbot-dns-dnspod) (1.14.0) Requirement already satisfied: PyOpenSSL!=23.1.0,>=17.5.0 in /opt/certbot/lib/python3.11/site-packages (from acme>=0.15.0->certbot-dns-dnspod) (24.1.0) Requirement already satisfied: pyrfc3339 in /opt/certbot/lib/python3.11/site-packages (from acme>=0.15.0->certbot-dns-dnspod) (1.1) Requirement already satisfied: pytz>=2019.3 in /opt/certbot/lib/python3.11/site-packages (from acme>=0.15.0->certbot-dns-dnspod) (2024.1) Requirement already satisfied: requests>=2.20.0 in /opt/certbot/lib/python3.11/site-packages (from acme>=0.15.0->certbot-dns-dnspod) (2.31.0) Requirement already satisfied: setuptools>=41.6.0 in /opt/certbot/lib/python3.11/site-packages (from acme>=0.15.0->certbot-dns-dnspod) (66.1.1) Requirement already satisfied: ConfigArgParse>=1.5.3 in /opt/certbot/lib/python3.11/site-packages (from certbot>=0.15.0->certbot-dns-dnspod) (1.7) Requirement already satisfied: configobj>=5.0.6 in /opt/certbot/lib/python3.11/site-packages (from certbot>=0.15.0->certbot-dns-dnspod) (5.0.8) Requirement already satisfied: distro>=1.0.1 in /opt/certbot/lib/python3.11/site-packages (from certbot>=0.15.0->certbot-dns-dnspod) (1.9.0) Requirement already satisfied: parsedatetime>=2.4 in /opt/certbot/lib/python3.11/site-packages (from certbot>=0.15.0->certbot-dns-dnspod) (2.6) Requirement already satisfied: six in /opt/certbot/lib/python3.11/site-packages (from configobj>=5.0.6->certbot>=0.15.0->certbot-dns-dnspod) (1.16.0) Requirement already satisfied: cffi>=1.12 in /opt/certbot/lib/python3.11/site-packages (from cryptography>=3.2.1->acme>=0.15.0->certbot-dns-dnspod) (1.16.0) Requirement already satisfied: charset-normalizer<4,>=2 in /opt/certbot/lib/python3.11/site-packages (from requests>=2.20.0->acme>=0.15.0->certbot-dns-dnspod) (3.3.2) Requirement already satisfied: idna<4,>=2.5 in /opt/certbot/lib/python3.11/site-packages (from requests>=2.20.0->acme>=0.15.0->certbot-dns-dnspod) (3.7) Requirement already satisfied: urllib3<3,>=1.21.1 in /opt/certbot/lib/python3.11/site-packages (from requests>=2.20.0->acme>=0.15.0->certbot-dns-dnspod) (2.2.1) Requirement already satisfied: certifi>=2017.4.17 in /opt/certbot/lib/python3.11/site-packages (from requests>=2.20.0->acme>=0.15.0->certbot-dns-dnspod) (2024.2.2) Requirement already satisfied: pycparser in /opt/certbot/lib/python3.11/site-packages (from cffi>=1.12->cryptography>=3.2.1->acme>=0.15.0->certbot-dns-dnspod) (2.22) [root@docker-1f03724f8d16:/app]#三、功能验证安装依赖后,我们再次安装就没有异常错误提示信息了:loading完后申请成功:四、后记为保证后续能稳定的使用修复后的功能,避免出现容器删除后再次运行出现同样的问题,将修正后的容器另存为一个镜像并修改 docker-compose 的镜像:sudo docker commit nginxProxyManager zhuzl/nginx-proxy-manager:2.11.1-ssl
2024年05月19日
656 阅读
0 评论
1 点赞
2024-05-12
RabbitMQ学习:③基本使用
初始配置添加用户使用默认的 guest 账号登录后,可以在 Admin → Users中添加用户:添加 Virtual Host在Admin → Virtual Hosts 中添加虚拟机:给用户授权点击 Virtual Host 的名称,进入详情界面,可在Permissions中给新建的用户设置权限:建立连接1、新建Maven 项目2、导入依赖<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>net.x2m</groupId> <artifactId>rabbitmq</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.21.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> </dependencies> </project>3、创建工具类连接 RabbitMQpublic static Connection getConnection() { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); factory.setPort(5672); factory.setUsername("zhuzl"); factory.setPassword("123456"); factory.setVirtualHost("/test"); Connection conn = null; try { conn = factory.newConnection(); } catch (IOException e) { throw new RuntimeException(e); } catch (TimeoutException e) { throw new RuntimeException(e); } return conn; }4、代码层面获取连接后,在管理界面可以看到如下连接信息:5、点击Name 可查看连接详情如下:6、调试界面的连接信息:
2024年05月12日
21 阅读
0 评论
0 点赞
2024-05-12
RabbitMQ学习:②基本概念
本文核心内容参加官网链接:https://www.rabbitmq.com/tutorials/amqp-conceptsPublisher:生产者(发布消息到R啊波比跳MQ中的Exchange)Consumer:消费者(监听RabbitMQ中的Queue中的消息)Exchange:交换机(和生产者建立连接并接收生产者的消息)Queue:队列(Exchange会将消息分发到指定的Queue,Queue和消费者进行交互)Routes:路由(交换机以什么样的策略将消息发布到 Queue)RabbitMQ 的完整架构图:
2024年05月12日
50 阅读
0 评论
0 点赞
1
2
...
8