面向TiddlyWiki简单易用的ruby webrick服务

TiddlyWiki页面不能在浏览器中直接保存:

  • 虽然用浏览器插件能够解决文件本地存储,但是大多数插件都长时间没有更新,导致功能异常 - jimfoltz/tw5-server.rb 通过一个简单的 Ruby Atlas webrick 实现了服务端保存TiddlyWiki,特别适合个人简单使用

tw5-server.rb

  • 在安装了 Ruby Atlas 的主机上,例如 docs 目录下存放从 TiddlyWiki官网 下载一个空白文档 empty.html 。为了方便标识,将这个 empty.html 改名为 tiddlywiki.html

  • 在同一个目录下存放 jimfoltz/tw5-server.rb 提供的 tw5-server.rb :

提供 TiddlyWiki 读写访问的 tw5-server.rb
require 'webrick'
require 'fileutils'

if ARGV.length != 0
   root = ARGV.first.gsub('\\', '/')
else
   root = '.'
end
BACKUP_DIR = 'bak'

module WEBrick
   module HTTPServlet

      class FileHandler
         alias do_PUT do_GET
      end

      class DefaultFileHandler
         def do_PUT(req, res)
            file = "#{@config[:DocumentRoot]}#{req.path}"
            res.body = ''
            unless Dir.exist? BACKUP_DIR
               Dir.mkdir BACKUP_DIR
            end
            FileUtils.cp(file, "#{BACKUP_DIR}/#{File.basename(file, '.html')}.#{Time.now.to_i.to_s}.html")
            File.open(file, "w+") {|f| f.puts(req.body)}
         end

         def do_OPTIONS(req, res)
            res['Allow'] = "GET,HEAD,OPTIONS,PUT"
            res['dav'] = 'anything' # TW looks for a 'dav' header, and ignores any value
         end

      end
   end
end

server = WEBrick::HTTPServer.new({:Port => 8000, :DocumentRoot => root, :BindAddress => "127.0.0.1"})

trap "INT" do
   puts "Shutting down..."
   server.shutdown
end

server.start

备注

jimfoltz/tw5-server.rb 代码中 Dir.exists? 我修订成 Dir.exist? 以适应Ruby 3.2之后版本( PSA (and a little rant): File.exists? Dir.exists? removed in Ruby 3.2.0 (deprecated in 2.2) )

修改方法参考了 Replace deprecated File.exists? with File.exist? #2740

  • 在目录下运行命令:

运行
ruby tw5-server.rb

输出显示

运行的输出信息
[2024-01-08 20:20:48] INFO  WEBrick 1.7.0
[2024-01-08 20:20:48] INFO  ruby 3.0.2 (2021-07-07) [x86_64-linux-gnu]
[2024-01-08 20:20:48] INFO  WEBrick::HTTPServer#start: pid=1828686 port=8000

可以看到web服务是绑定在 127.0.0.1:8000 上,这样可以防止外部不安全的访问

  • 对于在服务器上运行的时候,由于对外网卡接口不提供服务,所以我们需要通过 SSH隧道 将ssh登陆后端本地端口转发到服务器上回环地址上:

配置 ~/.ssh/config 设置:

~/.ssh/config 设置本地端口转发
Host bcloud
    HostName 192.168.7.159
    User admin
    # 访问本机回环地址8000,转发到服务器bcloud的回环地址8000
    LocalForward 8000 127.0.0.1:8000

这样就可以在 ssh服务 登陆 bzcloud 之后在自己本地浏览器 http://127.0.0.1:8000 访问到服务器对应的 127.0.0.1:8000

运行环境(补充)

我在 Termux - Andorid终端 ( 移动开发:Pixel手机(Android)开发环境构建 )环境中,通过 apt install ruby 安装了 ruby 3.2.2 版本。需要注意,如果没有同时安装 Ruby on Rails ,则需要通过 Ruby Gem 来安装上述执行脚本的依赖模块:

通过 Ruby Gem 安装依赖
gem install webrick
gem install fileutils