找到
5
篇与
null
相关的结果
-
Linux服务器如何彻底删除宝塔面板?2023最新完整卸载教程(附残留清理指南) 为什么要彻底卸载宝塔面板? 当您遇到以下情况时,可能需要完全移除宝塔面板: 服务器环境出现不可修复的配置冲突 需要切换其他管理面板(如cPanel、CyberPanel) 服务器将转交第三方运维团队 系统安全加固需求 测试环境需要纯净的Linux系统 一、前置准备(重要!) 在开始卸载前务必完成: 网站数据备份 tar -czvf wwwroot_backup.tar.gz /www/wwwroot 数据库备份 mysqldump -u root -p --all-databases > full_database.sql SSL证书备份 cp -r /www/server/panel/vhost/cert /root/cert_backup 二、分步卸载指南(适用于CentOS/Ubuntu) 2.1 停止所有关联服务 for service in bt nginx mysqld httpd pure-ftpd; do systemctl stop $service 2>/dev/null /etc/init.d/$service stop 2>/dev/null done2.2 核心文件清理 # 主程序及组件 rm -rf /www/server/{panel,nginx,apache,mysql,php,data} # 启动脚本 find /etc/init.d/ -name "*bt*" -exec rm -f {} \;2.3 深度残留清理 # 配置文件 rm -rf /root/.btpanel /etc/profile.d/bt.sh # 日志文件 find /var/log/ -name "*bt*" -exec rm -f {} \; # 定时任务 sed -i '/bt\|certbot/d' /var/spool/cron/root三、进阶清理(可选) 3.1 依赖包移除 CentOS: yum remove -y nginx* mysql-* httpd php-fpmUbuntu: apt-get purge -y apache2* nginx* mysql* php*3.2 用户账户清理 userdel -r www && groupdel www四、验证卸载结果 4.1 端口检查 netstat -tunlp | grep -E '8888|80|443' # 应无宝塔相关进程4.2 文件残留检查 ls -lh /www/server # 应显示空目录或非宝塔文件4.3 服务状态确认 systemctl list-unit-files | grep -i 'bt\|nginx'常见问题解答 Q:删除后网站还能访问吗? A:如果未删除Nginx/Apache和网站文件,服务仍可运行;若执行了深度清理,需重新配置环境 Q:如何避免误删重要数据? A:建议先执行 find / -name "*bt*" 查看所有相关文件 Q:卸载后端口8888仍被占用? A:执行 lsof -i:8888 查找占用进程并终止 本文由「6v6-博客网」技术团队原创撰写 -
从零开始搭建私有云服务器 从零开始搭建私有云服务器 1. 准备工作 硬件要求: 一台性能足够的服务器(可以是物理机或虚拟机)。 建议配置:至少 4 核 CPU、8GB 内存、100GB 硬盘。 操作系统:推荐使用 Ubuntu Server 20.04 LTS。 网络环境:确保服务器有稳定的公网 IP 或内网穿透能力。 2. 安装操作系统 下载 Ubuntu Server 20.04 LTS 镜像:https://ubuntu.com/download/server。 使用工具(如 Rufus)将镜像写入 U 盘,制作启动盘。 将 U 盘插入服务器,启动并安装 Ubuntu Server。 按照提示完成系统安装,设置用户名和密码。 3. 配置网络 登录服务器,编辑网络配置文件: sudo nano /etc/netplan/01-netcfg.yaml 配置静态 IP 或 DHCP,示例如下: network: version: 2 ethernets: eth0: dhcp4: no addresses: [192.168.1.100/24] gateway4: 192.168.1.1 nameservers: addresses: [8.8.8.8, 8.8.4.4] 保存并应用配置: sudo netplan apply 4. 安装 Docker 更新系统包: sudo apt update && sudo apt upgrade -y 安装 Docker: sudo apt install apt-transport-https ca-certificates curl software-properties-common -y curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io -y 启动 Docker 并设置开机自启: sudo systemctl start docker && sudo systemctl enable docker 5. 部署私有云服务 安装 Docker Compose: sudo curl -L "https://github.com/docker/compose/releases/download/$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep -Po '"tag_name": "\K.*\d')" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose 创建私有云服务配置文件(如 Nextcloud): mkdir nextcloud && cd nextcloud nano docker-compose.yml 在 docker-compose.yml 中添加以下内容: version: '3' services: nextcloud: image: nextcloud container_name: nextcloud restart: always ports: - 8080:80 volumes: - nextcloud_data:/var/www/html environment: - MYSQL_HOST=db - MYSQL_DATABASE=nextcloud - MYSQL_USER=nextcloud - MYSQL_PASSWORD=yourpassword db: image: mariadb container_name: nextcloud_db restart: always volumes: - db_data:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=yourpassword - MYSQL_DATABASE=nextcloud - MYSQL_USER=nextcloud - MYSQL_PASSWORD=yourpassword volumes: nextcloud_data: db_data: 启动服务: sudo docker-compose up -d 6. 访问私有云 在浏览器中输入 http://服务器IP:8080,访问 Nextcloud。 按照提示完成初始化设置,创建管理员账户。 7. 安全加固 配置防火墙: sudo ufw allow ssh sudo ufw allow 8080 sudo ufw enable 启用 HTTPS:使用 Let's Encrypt 免费 SSL 证书。 更多关于私有云搭建的技术分享和实用教程,欢迎访问我的博客:6v6 博客,一起探索技术的无限可能! -
Typecho 插件开发指南:从零开始实现文章同步功能 1. 插件目录结构 Typecho 插件需要放置在 usr/plugins/ 目录下。每个插件是一个独立的文件夹,文件夹名称就是插件的唯一标识。 例如,创建一个名为 SyncToPlatform 的插件: usr/plugins/SyncToPlatform/ ├── Plugin.php // 插件主文件 ├── LICENSE // 插件许可证 └── README.md // 插件说明文档 2. 插件主文件 (Plugin.php) 插件的核心逻辑写在 Plugin.php 文件中。以下是一个简单的插件示例,用于在文章发布时触发同步操作。 <?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; class SyncToPlatform_Plugin implements Typecho_Plugin_Interface { /** * 激活插件 */ public static function activate() { // 挂载文章发布事件 Typecho_Plugin::factory('Widget_Contents_Post_Edit')->finishPublish = array('SyncToPlatform_Plugin', 'syncPost'); return _t('插件已激活'); } /** * 禁用插件 */ public static function deactivate() { return _t('插件已禁用'); } /** * 插件配置面板 */ public static function config(Typecho_Widget_Helper_Form $form) { // 添加 Medium API Token 输入框 $apiToken = new Typecho_Widget_Helper_Form_Element_Text('apiToken', NULL, '', _t('Medium API Token'), _t('请输入你的 Medium API Token')); $form->addInput($apiToken); // 添加用户 ID 输入框 $userId = new Typecho_Widget_Helper_Form_Element_Text('userId', NULL, '', _t('Medium 用户 ID'), _t('请输入你的 Medium 用户 ID')); $form->addInput($userId); } /** * 个人用户的配置面板 */ public static function personalConfig(Typecho_Widget_Helper_Form $form) { // 不需要个人配置 } /** * 文章发布时同步到 Medium */ public static function syncPost($contents, $class) { // 获取插件配置 $options = Typecho_Widget::widget('Widget_Options'); $pluginConfig = $options->plugin('SyncToPlatform'); $apiToken = $pluginConfig->apiToken; $userId = $pluginConfig->userId; if (empty($apiToken) || empty($userId)) { return; } // 准备文章数据 $title = $contents['title']; $content = $contents['text']; $tags = isset($contents['tags']) ? explode(',', $contents['tags']) : []; // 调用 Medium API 发布文章 $url = "https://api.medium.com/v1/users/{$userId}/posts"; $data = [ 'title' => $title, 'contentFormat' => 'markdown', 'content' => $content, 'tags' => $tags, 'publishStatus' => 'public' // 或 'draft' ]; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Authorization: Bearer ' . $apiToken, 'Content-Type: application/json' ]); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); $response = curl_exec($ch); curl_close($ch); // 记录日志(可选) file_put_contents(__TYPECHO_ROOT_DIR__ . '/usr/plugins/SyncToPlatform/log.txt', $response . PHP_EOL, FILE_APPEND); } } 3. 插件配置 在 Typecho 后台的“插件”页面,找到 SyncToPlatform 插件并激活。 进入插件设置页面,输入你的 Medium API Token 和用户 ID。 4. 测试插件 在 Typecho 中发布一篇文章,插件会自动调用 Medium API 将文章同步到 Medium。 检查 Medium 账号,确认文章是否成功发布。 扩展功能 支持更多平台:可以在 syncPost 方法中添加其他平台的 API 调用逻辑(如 CSDN、知乎等)。 错误处理:增加对 API 调用失败的处理,例如重试或记录错误日志。 自定义发布状态:允许用户选择文章发布状态(公开或草稿)。 注意事项 API 限制:不同平台的 API 可能有调用频率限制,注意不要频繁调用。 安全性:确保 API Token 等敏感信息的安全,不要泄露。 格式兼容性:不同平台对内容的格式要求不同,可能需要调整文章内容。 更多技术分享和实用教程,欢迎访问我的博客:6v6 博客,一起探索技术的无限可能! -
如何在 Typecho 中编辑器输入#标签实现自动填充标签 在 Typecho 的文章编辑过程中,如果你使用 Joe 编辑器,可能会希望输入#标签后能自动提取并填充到文章的标签输入框中,以提高工作效率。接下来,我们将详细介绍如何通过开发一个 Typecho 插件来实现这一功能。 一、功能实现原理 这个功能的实现依赖于 JavaScript 来监听 Joe 编辑器中的输入事件,通过正则表达式提取出#开头的标签,然后将这些标签填充到 Typecho 文章编辑页面的标签输入框中。同时,我们使用 Typecho 的插件机制,将相关的 JavaScript 代码注入到文章编辑页面中。 二、准备工作 了解 HTML 结构 通过浏览器的开发者工具(如 Chrome 的 F12),确定 Joe 编辑器的文本输入框和 Typecho 标签输入框的 HTML 元素。例如,Joe 编辑器文本输入框的 class 为 cm - editor cm - focused ͼ1 ͼ2 ͼ4,Typecho 标签输入框的 id 为 token - input - tags。 熟悉 JavaScript 和 Typecho 插件开发基础 需要了解基本的 JavaScript DOM 操作和事件监听知识,以及 Typecho 插件开发的基本规范和流程。 三、插件代码编写 (一)创建插件文件 在 Typecho 的 usr/plugins 目录下创建一个新目录,例如 AutoTagExtractor。 在 AutoTagExtractor 目录下创建一个 PHP 文件,命名为 AutoTagExtractor.php。 (二)编写插件代码 footer = array('AutoTagExtractorPlugin', 'addScript'); return _t('插件已激活,可从Joe编辑器提取#标签并自动填充到文章标签输入框'); } /** * 禁用插件方法 * * @return string */ public static function deactivate() { return _t('插件已停用'); } /** * 配置插件方法 * * @param Typecho_Widget_Helper_Form $form * @return void */ public static function config(Typecho_Widget_Helper_Form $form) { // 这里可添加插件配置项,目前暂不需要 } /** * 个人用户的配置方法 * * @param Typecho_Widget_Helper_Form $form * @return void */ public static function personalConfig(Typecho_Widget_Helper_Form $form) { // 这里可添加个人用户的配置项,目前暂不需要 } /** * 在文章编辑页面底部添加JavaScript脚本 * * @return void */ public static function addScript() { echo ''; // 当页面的DOM加载完成后执行以下代码 echo 'document.addEventListener(\'DOMContentLoaded\', function () {'; // 获取Joe编辑器的文本输入框元素,通过类名选择器 echo 'const joeEditorTextareaElements = document.getElementsByClassName(\'cm - editor cm - focused ͼ1 ͼ2 ͼ4\');'; // 取第一个匹配到的元素作为Joe编辑器的文本输入框 echo 'const joeEditorTextarea = joeEditorTextareaElements.length > 0? joeEditorTextareaElements[0] : null;'; // 获取Typecho标签输入框元素,通过id选择器 echo 'const tagInput = document.getElementById(\'token - input - tags\');'; // 检查是否成功获取到这两个元素 echo 'if (joeEditorTextarea && tagInput) {'; // 为Joe编辑器的文本输入框添加keyup事件监听器 echo 'joeEditorTextarea.addEventListener(\'keyup\', function () {'; // 获取当前输入框中的文本内容 echo 'const inputText = joeEditorTextarea.value;'; // 用于存储提取出的标签 echo 'const tags = [];'; // 使用正则表达式匹配所有以#开头,且后面跟着非#字符的内容 echo 'const tagMatches = inputText.match(/#([^#]+)/g);'; // 如果匹配到了标签 echo 'if (tagMatches) {'; // 遍历所有匹配到的标签 echo 'tagMatches.forEach(function (tagMatch) {'; // 去除标签前面的#符号,并去除前后空格 echo 'let tag = tagMatch.substring(1).trim();'; // 检查标签是否已经存在于tags数组中,如果不存在则添加 echo 'if (tags.indexOf(tag) === -1) {'; echo 'tags.push(tag);'; echo '}'; echo '});'; // 将tags数组中的标签用逗号连接成字符串 echo 'const tagString = tags.join(\',\');'; // 将处理后的标签字符串填充到Typecho标签输入框中 echo 'tagInput.value = tagString;'; echo '} else {'; // 如果没有匹配到标签,清空Typecho标签输入框 echo 'tagInput.value = \'\';'; echo '}'; echo '});'; echo '}'; echo '});'; echo ''; } } (三)代码解释 激活插件方法(activate):通过 Typecho_Plugin::factory 注册一个钩子,当加载 admin/write - post.php(文章编辑页面)的页脚时,调用 addScript 方法,在页面中注入 JavaScript 代码。 禁用插件方法(deactivate):简单返回一个提示信息,表示插件已停用。 配置插件方法(config)和个人用户配置方法(personalConfig):目前这两个方法为空,后续如果需要添加插件的全局配置或个人用户配置项,可以在这里进行扩展。 添加脚本方法(addScript): 使用 document.addEventListener('DOMContentLoaded', function () {... }) 确保页面 DOM 加载完成后再执行后续代码。 通过 document.getElementsByClassName 获取 Joe 编辑器的文本输入框元素,由于该方法返回一个类数组对象,所以取第一个元素作为实际的输入框。 通过 document.getElementById 获取 Typecho 标签输入框元素。 为 Joe 编辑器的文本输入框添加 keyup 事件监听器,当用户松开按键时触发。 在事件处理函数中,获取输入框的文本内容,使用正则表达式 /#([^#]+)/g 匹配所有以#开头的标签。 遍历匹配到的标签,去除#符号和前后空格,检查是否重复,将不重复的标签添加到 tags 数组中。 将 tags 数组中的标签用逗号连接成字符串,填充到 Typecho 标签输入框中。如果没有匹配到标签,则清空标签输入框。 四、插件安装与启用 上传插件文件 如果你在本地开发环境创建了插件文件,可以使用 FTP 工具将整个 AutoTagExtractor 文件夹上传到 Typecho 网站的 usr/plugins 目录下。 启用插件 登录 Typecho 后台管理界面。 点击左侧菜单中的 “插件” 选项。 在插件列表中找到 “自动标签提取插件”(即 AutoTagExtractorPlugin),点击 “启用” 按钮。启用成功后,会显示提示信息 “插件已激活,可从 Joe 编辑器提取 #标签并自动填充到文章标签输入框”。 五、插件使用与测试 打开文章编辑页面 点击左侧菜单中的 “撰写文章”,进入文章编辑页面。 测试标签提取功能 在 Joe 编辑器中输入带有#开头的标签,例如 #软件 #工具 #免费。当你输入完成或松开按键时,Typecho 文章编辑页面的 token - input - tags 标签输入框会自动填充处理后的标签,显示为 软件,工具,免费,并且会自动去除重复标签和前后空格。 六、注意事项 元素选择器准确性:确保 Joe 编辑器的文本输入框的类名和 Typecho 标签输入框的 id 是准确的。如果这些元素的选择器发生变化,需要相应地修改插件中的 JavaScript 代码。 兼容性:该插件在大多数现代浏览器中应该可以正常工作,但在一些旧版本的浏览器中可能需要进行兼容性处理。 插件更新与维护:如果后续需要对插件进行功能扩展或修复问题,可以直接修改 AutoTagExtractor.php 文件中的代码,修改完成后保存并刷新 Typecho 后台页面即可生效。 通过以上步骤,你就成功地在 Typecho 中实现了 Joe 编辑器标签自动填充的功能,这将大大提高你撰写文章时添加标签的效率。