bGZo / blog

Syncing Issues with GA, auto creating posts. Showing with Jekyll. Deploying with Vercel.
https://blog.bgzo.cc/
MIT License
2 stars 0 forks source link

TTRSS on WSL2 #3

Open bGZo opened 2 years ago

bGZo commented 2 years ago

Keywords: docker / wsl2 / port forward

Some Points Noticed.

WSL2 Start Mothod

# Error Way:
$systemctl start docker.service
# System has not been booted with systemd as init system (PID 1). Can't operate.
# Failed to connect to bus: Host is down

# Right Way: (via: https://stackoverflow.com/questions/52197246/wsl-redis-encountered-system-has-not-been-booted-with-systemd-as-init-system-pi
$sudo dockerd
$sudo service docker start
$sudo /etc/init.d/docker start

Deploy TTRSS with Proxy 🤯

部署 TTRSS 的部分可以参考这些博客, 他们写的都比我耐心和详细, 这里我就不讲废话了.

部署的命令可能稍有不同:

docker-compose up -d --env .env
# docker-compose stop
# docker-compose down
# --env         environment setting using .env file
# -d            detached mode
$cat .env
HTTP_PROXY=172.29.160.1
URL_PATH=192.168.2.2
# HTTP_PROXY    proxy ip(windows' ip in wsl2)
# URL_PATH      lan ip

Communication IP

docker-compose.yml 配置文件需要注意这几行, HTTP_PROXY 只有写在配置文件中才会生效, 然而命令行传参也不可行, 所以只能用另一个文件 .env 传值.

    ports:
      - 4040:80
    environment:
!     - SELF_URL_PATH=http://${URL_PATH}:4040 # please change to your own domain
!     - HTTP_PROXY=http://${HTTP_PROXY}:7890

部署的时候因为用到了两个不确定的 IP, 而 WSL2 IP 无法固定, 当然后者可以通过路由器的静态IP分配解决, 而针对 WSL2 解决静态IP的场景有很多解决方案, 如:

Lan Device Access

因为 WSL2 的特殊原因, 局域网访问设备需要主机 (Windows) 将 WSL2 的特定端口暴露出去, 映射到 windows 上.

sudo netsh interface portproxy add v4tov4 listenport=4040 listenaddress=* connectport=4040 connectaddress=xxx.xxx.xxx.xxx protocol=tcp
netsh interface portproxy show all

至此所有的坑就踩完了, 都是些简单的命令堆砌, 大多是解决使用 WSL2 这个特性所需要付出的代价罢了

Windows Docker Comparison

另外, 博主还对比了 windows docker 利用 WSL2 虚拟化托管 TTRSS, 发现系统占用不如直接用 WSL2 来的轻便, 具体体验是

当然, 除了内存占用更多之外, 配置代理更是无从下手, 上文的配置文件失效 + GUI 界面配置也失败了, 总是找不准代理的地址, 猜测是叠上 WSL2 的 Buff, 无法简单的通过 127.0.0.1:7890 来解决... 这个问题可能真的无解, via: Stackoverflow, 报错如下, 希望知道的大佬可以指点一二.

docker Failed to connect to 127.0.0.1 port 7890 after 0 ms: Connection refused

也许还要做一次端口转发, 复杂度两者都快一样了, 所以最后放弃了😁...

Backup Your Data

当然中途换到 windows 做过一次数据迁移. 尝试挂载备份了数据, 移植到 windows, 其实最重要的就是一个 .sql 文件, 其他都可以丢弃.

$ docker run --rm --volumes-from a5b8c5847c8d -v /home/bgzocg/ttrss/backup:/backup ubuntu tar cvfP /backup/backup.tar /var/lib/postgresql/data/

via: 🎯 备份和迁移数据 - Docker 快速入门 - 易文档

Finally

使用如下, 仅供参考 (脚本因机器环境而异, windows 用户名 15517 和 wsl2 用户名 bgzocg, proxy 端口 7890, ttrss 端口 4040).

image

C:\Users\15517\Documents\PowerShell\Microsoft.PowerShell_profile.ps1

function Output-Lan-Ip-Bin {
    $Lan_Ip = netsh interface ip show address "WLAN" | findstr "IP Address" | Select-String -Pattern '([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*)' | %{ $_.matches.Value }
    #ipconfig | findstr /i "ipv4" | select-object -Skip 1 | select-object -First 1 | Select-String -Pattern '([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*)' | % { $($_.matches.groups[1]).Value}
    # NOTES: get the second line IP. I have three IPs, you could modify
    # select-object -Skip 1 | select-object -First 1
    # to fit your machine. :)

    echo "URL_PATH=$Lan_Ip" > C:\Users\15517\bin\lan_ip
    # output sharing Lan IP path

    echo "Your Server: http://${Lan_Ip}:4040"
    echo "Output PC Lan IP Successfully."
}

function Netsh-Lan {
    $tmp=cat C:\Users\15517\bin\wsl_ip
    # get sharing IP

    sudo netsh interface portproxy add v4tov4 listenport=4040 listenaddress=* connectport=4040 connectaddress=$tmp protocol=tcp
    echo "Port Forward Set Successfully."
    # port forward

    netsh interface portproxy show all
}

function Start-TTRSS { # main
    Output-Lan-Ip-Bin
    wsl /mnt/c/Users/15517/bin/wsl-ip.sh

    wsl sudo service docker start

    #via https://docs.docker.com/compose/compose-file/compose-file-v2/
    wsl docker-compose -f /home/bgzocg/ttrss/docker-compose.yml --env /home/bgzocg/ttrss/.env up -d

    Netsh-Lan
}

C:\Users\15517\bin\wsl-ip.sh

#!/bin/sh
# author: bGZo
# update: 220316
# set env
host_ip=$(cat /etc/resolv.conf |grep "nameserver" |cut -f 2 -d " ")
echo "HTTP_PROXY=$host_ip" > /home/bgzocg/ttrss/.env
cat /mnt/c/Users/15517/bin/lan_ip >> /home/bgzocg/ttrss/.env

# output shring IP
ip addr show eth0 | grep 'inet ' | cut -f 6 -d ' ' | cut -f 1 -d '/' > /mnt/c/Users/15517/bin/wsl_ip

echo "Output WSL2 IP And Set Proxy Successfully."
bGZo commented 2 years ago

Correct time: 220316

bGZo commented 1 year ago

使用过程中, 发现有时可以启动, 但是有时无法启动, 之前多次都是通过重启电脑解决的😉今天抽时间 debug 了一下, 发现一个奇怪的现象:

正常我在 WSL2 里建一个 http-server 是可以通过 wsl2_ip:8080 访问到的, 但是启用docker后 wsl2_ip:4040 就访问不到了