Docker部署热门实时新闻newsnow

Github 1 2 mkdir /opt/newsnow && cd /opt/newsnow nano docker-compose.yaml 1 2 3 4 5 6 7 8 9 10 11 12 13 services: newsnow: image: ghcr.io/ourongxing/newsnow:latest container_name: newsnow restart: always ports: - '4445:4444' environment: - G_CLIENT_ID= #Github ID - G_CLIENT_SECRET= #Github SECRET - JWT_SECRET= #可以同上,这三个都可以不填,除非你需要登录 - INIT_TABLE=true - ENABLE_CACHE=true 1 docker compose up -d

创建: 2025年09月03日 | 更新: 2025年12月04日 | 字数: 76字 | 阅读时长: 1分钟 | Beiyuan

Docker部署随机图片API

Github 1 2 mkdir /opt/api && cd /opt/api nano docker-compose.yaml 1 2 3 4 5 6 7 8 9 10 11 version: '3.9' services: random-api: image: 'neixin/random-pic-api' volumes: # 竖屏图片 - './portrait:/var/www/html/portrait' # 横屏图片 - './landscape:/var/www/html/landscape' ports: - '8080:80' 1 docker compose up -d 转换脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 from PIL import Image import os # 检查图片方向 def get_image_orientation(image_path): with Image.open(image_path) as img: width, height = img.size return "landscape" if width > height else "portrait" # 转换图片为 WebP 格式 def convert_to_webp(image_path, output_folder, max_pixels=178956970): try: with Image.open(image_path) as img: # Check image size width, height = img.size if width * height > max_pixels: print(f"Skipping {image_path} because it exceeds the size limit.") return # Save the image as WebP output_path = os.path.join(output_folder, os.path.splitext(os.path.basename(image_path))[0] + ".webp") img.save(output_path, "webp") except Exception as e: print(f"Failed to convert {image_path}: {e}") # 遍历文件夹中的图片 def process_images(input_folder, output_folder_landscape, output_folder_portrait): for filename in os.listdir(input_folder): if filename.endswith(('.jpg', '.jpeg', '.png')): image_path = os.path.join(input_folder, filename) orientation = get_image_orientation(image_path) try: if orientation == "landscape": convert_to_webp(image_path, output_folder_landscape) else: convert_to_webp(image_path, output_folder_portrait) except Exception as e: print(f"Error processing {image_path}: {e}. Skipping this image.") # 指定输入和输出文件夹 input_folder = "/root/input" output_folder_landscape = "/root/landscape" output_folder_portrait = "/root/portrait" # 执行转换 process_images(input_folder, output_folder_landscape, output_folder_portrait)

创建: 2025年09月03日 | 更新: 2025年12月04日 | 字数: 273字 | 阅读时长: 1分钟 | Beiyuan

Docker自部署AvHub

Github 1 cd /opt && git clone https://github.com/levywang/avhub.git && cd avhub 1 2 pip install -r requirements.txt python main.py 1 2 3 4 5 docker run -d \ -p 1001:80 \ -v /opt/avhub:/app \ --name avhub \ levywang/avhub:latest 1 2 3 4 5 6 7 默认运行的API地址:http://127.0.0.1:8000/ 可以配置反代和域名,替换 web/script.js 52行中的 BASE_URL 后端运行的配置文件在 data/config.yaml 中,请根据实际情况修改 注意:Python Version >= 3.7 数据源 番号磁力链和封面图:来源于 missav 里番资源:来源于 hacg 琉璃神社 随机视频推荐:来源于到的爬虫数据,存储在本地文件 /data/video_urls.txt 以上数据源均配置在 data/config.yaml 中,如果数据源变更或者无法访问,需要进行修改和维护

创建: 2025年09月03日 | 更新: 2025年12月04日 | 字数: 221字 | 阅读时长: 1分钟 | Beiyuan

Linux安装Docker及Docker-compose

Github Docker及Docker Compose官方安装脚本 1 2 curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh Docker compose手动安装 1 2 3 4 5 6 sudo curl -sSL "https://api.github.com/repos/docker/compose/releases/latest" | \ jq -r '.tag_name' | \ xargs -I {} sudo curl -L "https://github.com/docker/compose/releases/download/{}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \ sudo chmod +x /usr/local/bin/docker-compose && \ sudo ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose && \ docker-compose --version

创建: 2025年09月03日 | 更新: 2025年12月04日 | 字数: 94字 | 阅读时长: 1分钟 | Beiyuan

Linux安装qBittorrent-Enhanced-Edition

Github 下载可执行文件 1 2 3 4 5 6 7 8 9 10 11 12 #x86_64 download_url=$(curl -s https://api.github.com/repos/c0re100/qBittorrent-Enhanced-Edition/releases/latest | jq -r '.assets[] | select(.name | test("qbittorrent-enhanced-nox_x86_64-linux-musl_static.zip")) | .browser_download_url') && \ curl -L $download_url -o /usr/bin/qbittorrent-nox.zip && \ unzip /usr/bin/qbittorrent-nox.zip -d /usr/bin/ && \ chmod +x /usr/bin/qbittorrent-nox && \ rm /usr/bin/qbittorrent-nox.zip #arm64 download_url=$(curl -s https://api.github.com/repos/c0re100/qBittorrent-Enhanced-Edition/releases/latest | jq -r '.assets[] | select(.name | test("qbittorrent-enhanced-nox_aarch64-linux-musl_static.zip")) | .browser_download_url') && \ curl -L "$download_url" -o /usr/bin/qbittorrent-nox.zip && \ unzip /usr/bin/qbittorrent-nox.zip -d /usr/bin/ && \ chmod +x /usr/bin/qbittorrent-nox && \ rm /usr/bin/qbittorrent-nox.zip 创建system服务 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 cat > /etc/systemd/system/qbittorrent.service <<EOF [Unit] Description=qBittorrent Daemon Service After=network-online.target [Service] Type=simple User=root Group=root UMask=007 ExecStart=/usr/bin/qbittorrent-nox ExecStop=/bin/kill -s SIGTERM $MAINPID Restart=on-failure [Install] WantedBy=multi-user.target EOF 启动 1 2 3 systemctl enable qbittorrent systemctl start qbittorrent systemctl status qbittorrent # 查看登录密码,默认登录端口8080 下载完后上传网盘 1 2 3 4 #创建日志文件夹 mkdir -p /root/rclone_logs #下载完成后执行命令,bt:/bt自行修改为你设置rclone remote名和上传到网盘的路径 rclone move "%F" "bt:/bt/%N" --create-empty-src-dirs --transfers=4 --checkers=4 Nginx反代 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #安装所需程序 sudo apt install certbot python3-certbot-nginx python3-certbot-dns-cloudflare nginx #手动编辑 sudo nano /etc/nginx/sites-available/bt #这里是nginx配置路径为conf.d的配置,下面启用配置命令不用 sudo nano /etc/nginx/conf.d/bt.conf #启用配置 sudo ln -s /etc/nginx/sites-available/bt /etc/nginx/sites-enabled/ #从Cloudflare获取区域DNS API sudo nano /etc/letsencrypt/cloudflare.ini dns_cloudflare_api_token = 你的API #赋予权限 sudo chmod 600 /etc/letsencrypt/cloudflare.ini #使用CF-DNS申请证书,你不想关小黄云用这个,全程y就行 sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini -d example.com #直接申请证书,上面的申请完后可以用这个命令自动配置HTTPS,选1 sudo certbot --nginx -d example.com 配置示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 server { listen 80; # 端口可以随意修改 listen [::]:80; # IPv6 监听,同样可修改 #server_name _; server_name example.com; # 也可以写多个域名,用空格分隔 location / { proxy_pass http://127.0.0.1:8080; # 代理到本地 8080 端口 proxy_set_header Host $host; # 保留原始 Host 头 proxy_set_header X-Real-IP $remote_addr; # 真实客户端 IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 协议(http/https) } } 内存占用解决办法 在设置高级中将磁盘 IO 类型设置为遵循 POSIX

创建: 2025年09月03日 | 更新: 2025年12月04日 | 字数: 606字 | 阅读时长: 2分钟 | Beiyuan

Linux创建python虚拟环境解决依赖问题

1 sudo apt update && sudo apt install python3 -y #安装python 1 2 3 4 5 sudo apt install python3-venv -y #安装虚拟环境 mkdir /opt/env && cd /opt/env #创建文件夹单独存放相关文件和配置,也可以不创建 python3 -m venv komga #创建虚拟环境,env是你虚拟环境的名称,可以自定义,这里创建虚拟环境同时会创建一个文件夹 source komga/bin/activate #激活虚拟环境,这里的env同理,需要和上面一致 deactivate #关闭虚拟环境

创建: 2025年09月03日 | 更新: 2025年12月04日 | 字数: 148字 | 阅读时长: 1分钟 | Beiyuan

Linux修改DNS

DNS列表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 # Cloudflare DNS # IPv4 1.1.1.1 1.0.0.1 # IPv6 2606:4700:4700::1111 2606:4700:4700::1001 # Google DNS # IPv4 8.8.8.8 8.8.4.4 # IPv6 2001:4860:4860::8888 2001:4860:4860::8844 # 阿里云公共DNS # IPv4 223.5.5.5 223.6.6.6 # IPv6 2400:3200::1 2400:3200:baba::1 # 腾讯DNSPod公共DNS # IPv4 119.29.29.29 # IPv6 2402:4e00:: 方法一:Systemd-resolved 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #查看是否安装 sudo systemctl status systemd-resolved #没有安装执行命令安装并启动 sudo apt update sudo apt install systemd-resolved -y sudo systemctl enable systemd-resolved && sudo systemctl start systemd-resolved #修改DNS sudo nano /etc/systemd/resolved.conf #示例 [Resolve] DNS=8.8.8.8 1.1.1.1 FallbackDNS=8.8.4.4 #修改完后退出,重新启动 sudo systemctl restart systemd-resolved 报错masked解决方法 1 2 3 4 5 6 7 8 9 10 11 12 13 #输入下面的命令 sudo systemctl unmask systemd-resolved #再次重启 sudo systemctl restart systemd-resolved #查看是否修改成功 resolvectl status #查看是否软链接成功 ls -l /etc/resolv.conf #上面命令示例 lrwxrwxrwx 1 root root 32 Feb 11 2024 /etc/resolv.conf -> /run/systemd/resolve/resolv.conf #不一样执行下面的命令后再次查看 sudo rm /etc/resolv.conf sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf 方法二:Resolved 1 2 3 4 5 sudo apt update sudo apt install resolvconf sudo nano /etc/resolv.conf #防止被修改 sudo chattr +i /etc/resolv.conf

创建: 2025年09月03日 | 更新: 2025年12月04日 | 字数: 350字 | 阅读时长: 1分钟 | Beiyuan

Nginx搭配php部署随机图片API

Github 准备 1 2 #安装所需程序 sudo apt install nginx php7.4-fpm php7.4-mysql php7.4-fpm php7.4-mysql php7.4-cli php7.4-opcache certbot python3-certbot-nginx python3-certbot-dns-cloudflare 创建Index.php文件 这里只需要修改路径 主路径 1 2 cd /var/www/html nano index.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 <?php $pcPath = '/landscape';#这里的路径自行修改 $mobilePath = '/portrait';#这里的路径自行修改 // 函数:从目录中获取图片列表 function getImagesFromDir($path) { $images = array(); if ($img_dir = @opendir($path)) { while (false !== ($img_file = readdir($img_dir))) { // 匹配 webp、jpg、jpeg、png、gif 格式的图片 if (preg_match("/\.(webp|jpg|jpeg|png|gif)$/i", $img_file)) { $images[] = $img_file; } } closedir($img_dir); } return $images; } // 函数:生成完整的图片路径 function generateImagePath($path, $img) { return $path . '/' . $img; } // 检测用户代理以区分手机和电脑访问 $userAgent = $_SERVER['HTTP_USER_AGENT']; $isMobile = preg_match('/(android|iphone|ipad|ipod|blackberry|windows phone)/i', $userAgent); // 根据访问设备设置图片路径 if ($isMobile) { $path = $mobilePath; } else { $path = $pcPath; } // 缓存图片列表 $imgList = getImagesFromDir($path); // 从列表中随机选择一张图片 shuffle($imgList); $img = reset($imgList); // 获取图片的格式 $img_extension = pathinfo($img, PATHINFO_EXTENSION); // 根据图片的格式设置 Content-Type switch ($img_extension) { case 'webp': header('Content-Type: image/webp'); break; case 'jpg': case 'jpeg': header('Content-Type: image/jpeg'); break; case 'png': header('Content-Type: image/png'); break; case 'gif': header('Content-Type: image/gif'); break; // 添加其他格式的处理方式 // case 'bmp': // header('Content-Type: image/bmp'); // break; } // 生成完整的图片路径 $img_path = generateImagePath($path, $img); // 直接输出所选的随机图片 readfile($img_path); ?> PC路径 1 2 mkdir /var/www/html/pc && cd /var/www/html/pc nano index.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 <?php $pcPath = '../landscape';#这里的路径自行修改 // 函数:从目录中获取图片列表 function getImagesFromDir($path) { $images = array(); if ($img_dir = @opendir($path)) { while (false !== ($img_file = readdir($img_dir))) { // 匹配 webp、jpg、jpeg、png、gif 格式的图片 if (preg_match("/\.(webp|jpg|jpeg|png|gif)$/i", $img_file)) { $images[] = $img_file; } } closedir($img_dir); } return $images; } // 函数:生成完整的图片路径 function generateImagePath($path, $img) { return $path . '/' . $img; } // 设置图片路径为 landscape $path = $pcPath; // 缓存图片列表 $imgList = getImagesFromDir($path); // 从列表中随机选择一张图片 shuffle($imgList); $img = reset($imgList); // 获取图片的格式 $img_extension = pathinfo($img, PATHINFO_EXTENSION); // 根据图片的格式设置 Content-Type switch ($img_extension) { case 'webp': header('Content-Type: image/webp'); break; case 'jpg': case 'jpeg': header('Content-Type: image/jpeg'); break; case 'png': header('Content-Type: image/png'); break; case 'gif': header('Content-Type: image/gif'); break; // 添加其他格式的处理方式 // case 'bmp': // header('Content-Type: image/bmp'); // break; } // 生成完整的图片路径 $img_path = generateImagePath($path, $img); // 直接输出所选的随机图片 readfile($img_path); ?> Mobile路径 1 2 mkdir /var/www/html/mobile && cd /var/www/html/mobile nano index.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 <?php $pcPath = '../portrait';#这里的路径自行修改 // 函数:从目录中获取图片列表 function getImagesFromDir($path) { $images = array(); if ($img_dir = @opendir($path)) { while (false !== ($img_file = readdir($img_dir))) { // 匹配 webp、jpg、jpeg、png、gif 格式的图片 if (preg_match("/\.(webp|jpg|jpeg|png|gif)$/i", $img_file)) { $images[] = $img_file; } } closedir($img_dir); } return $images; } // 函数:生成完整的图片路径 function generateImagePath($path, $img) { return $path . '/' . $img; } // 设置图片路径为 portrait $path = $pcPath; // 缓存图片列表 $imgList = getImagesFromDir($path); // 从列表中随机选择一张图片 shuffle($imgList); $img = reset($imgList); // 获取图片的格式 $img_extension = pathinfo($img, PATHINFO_EXTENSION); // 根据图片的格式设置 Content-Type switch ($img_extension) { case 'webp': header('Content-Type: image/webp'); break; case 'jpg': case 'jpeg': header('Content-Type: image/jpeg'); break; case 'png': header('Content-Type: image/png'); break; case 'gif': header('Content-Type: image/gif'); break; // 添加其他格式的处理方式 // case 'bmp': // header('Content-Type: image/bmp'); // break; } // 生成完整的图片路径 $img_path = generateImagePath($path, $img); // 直接输出所选的随机图片 readfile($img_path); ?> 反代开启HTTPS 1 2 3 4 #清空默认配置 > /etc/nginx/sites-available/default #手动编辑默认配置 sudo nano /etc/nginx/sites-available/default 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 server { listen [::]:8080; listen 8080; server_name example.com; # 替换为你的域名以便下面申请域名 root /var/www/html; # 设置网站根目录 # 默认首页是 index.php 或其他文件(根据你的需求) index index.php index.html index.htm; # 处理根目录请求,直接返回根目录下的文件(如果存在) location / { try_files $uri $uri/ /index.php?$query_string; } # 处理 PHP 文件 location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # 防止访问 .ht 文件(如果有) location ~ /\.ht { deny all; } } 1 2 3 4 #测试Nginx配置 sudo nginx -t #重新加载Nginx配置 sudo systemctl reload nginx 现在可以访问ip:8080查看效果 ...

创建: 2025年09月03日 | 更新: 2025年12月04日 | 字数: 2278字 | 阅读时长: 5分钟 | Beiyuan

Rclone挂载Onedrive

获取 client_id 首先访问 Microsoft Azure应用注册,登录账号后点击应用注册 点击注册后可以看到你的应用的相关信息,复制好 应用程序 (客户端) ID,这个就是 client_id 获取 client_secret 依次点击证书和密码,新客户端密码,在截止期限中将时间选择为最长(即两年)然后就可以看见值和机密 ID,我们只需要记录下 值 就可以,这个就是 client_secret 。 ...

创建: 2025年09月03日 | 更新: 2025年12月04日 | 字数: 228字 | 阅读时长: 1分钟 | Beiyuan

Realm端口转发

获取执行文件 1 2 3 4 5 6 7 sudo mkdir -p /root/realm && \ curl -s https://api.github.com/repos/zhboner/realm/releases/latest | \ jq -r '.assets[] | select(.name | test("realm-x86_64-unknown-linux-gnu.tar.gz")) | .browser_download_url' | \ wget -O /root/realm/realm.tar.gz && \ sudo tar -xvf /root/realm/realm.tar.gz -C /root/realm && \ sudo chmod +x /root/realm/realm && \ sudo rm /root/realm/realm.tar.gz #可执行文件位于/root/realm 新建 config.toml 文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 cat > /root/realm/config.toml <<EOF [network] no_tcp = false use_udp = true [[endpoints]] listen = "[::]:443" #监听v6,你的中转机,端口自行修改,以下类似 remote = "0.0.0.0:443 #监听v4,你的落地机 [[endpoints]] listen = "0.0.0.0:80" #监听v4,你的中转机 remote = "[::]:80#监听v6,你的落地机 EOF 写入Service 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 cat > /etc/systemd/system/realm.service <<EOF [Unit] Description=realm After=network-online.target Wants=network-online.target systemd-networkd-wait-online.service [Service] Type=simple User=root Restart=on-failure RestartSec=5s DynamicUser=true WorkingDirectory=/root ExecStart=/root/realm/realm -c /root/realm/config.toml [Install] WantedBy=multi-user.target EOF 启动服务 1 2 3 4 5 systemctl daemon-reload systemctl enable realm systemctl start realm systemctl restart realm systemctl status realm

创建: 2025年09月03日 | 更新: 2025年12月04日 | 字数: 261字 | 阅读时长: 1分钟 | Beiyuan