MoreRSS

site iconSogola | 王小嗨修改

一个马克思主义者。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Sogola | 王小嗨的 RSS 预览

網路受限下部署Fediverse實例GoToSocial

2024-01-16 07:52:00

帝國的旗幟隨風飄揚,新皇冉冉升起。盆地到雪山,稻田到工廠,白天到黑夜,祂的身影籠罩整片大地。城牆內外,禮樂崩壞,舊有秩序轟然倒塌,新人尚未現身。人們畏懼開口,每個人頭上都戴著枷鎖,自我放逐與驅逐他人成為日常生活。

言說,在何處言說,業已成為現代臣民的必修課。不消說封閉的社交網路的書報審查,長篇累牘的賣身契自不待言,有誰會甘願淪為賽博農奴,不知疲倦地為科技資本寡頭生產數據。那麼,我們何以為家?從馬一龍的肆意妄為,再到扎克伯格的生意經,互聯互通的聯邦社交網路似乎成為無奈之選。

在聯邦宇宙之中,一旦選擇加入一個實例,即意味著簽下契約,我們的帳戶隨時面臨管理者之鎚,與此同時,還要時刻擔心站點倒閉造成的數據丟失。相對應地,倘如對實例進行自託管,那只需追尋內心,同時承擔相應的風險。

於城牆之內,網路被阻擋是對臣民的恩澤。誠如口罩可以成為主權者的強制,但也讓人們有了戴口罩規避監視器的權利,網路受限使得臣民被迫武裝在賽博空間。有了武器,借助 Cloudflare Tunnel,我們能夠輕鬆地於受限地區的家庭網路中部署 GoToSocial,在聯邦宇宙中互通交流。

GoToSocial 是一個使用 Golang 編寫的 ActivityPub 社交網絡伺服器。至於為什麼選擇 GoToSocial?因為它需要的資源足夠少,單板機足以運行,且開發者較為活躍。我的實例使用 docker 部署在香橙派3B,那我們開始吧。

在網路受限的情況下,例如無法直接訪問 Mastodon 的官方實例 mastodon.social,我們需要依賴 Clash 作為跳板,以建立到聯邦宇宙的連接。同時,由於網路受限,無法獲得公網 IP,因此我們必須借助 Cloudflare Tunnel,將 GoToSocial 實例暴露在公共網絡上,以供訪問。

由此可知,部署 clash 是首要步驟。要部署 clash 容器,首先要在系統上安裝 docker。

1
2
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh --mirror Aliyun

使用以上命令,安裝 docker,並指定鏡像源為 Aliyun。

1
2
3
4
5
docker network create -d macvlan \
  --subnet=your_subnet/24 \
  --gateway=your_router_ip \
  -o parent=your_eth_name \
  macvlan

使用以上命令,在docker中創建一個 macvlan 网络,clash 容器連結到這個網路後,使用與主路由相同的網段。其中,parent 為設備的以太網網卡名稱。設置路由器 ip 為 192.168.1.1,以上的 subnet 為 192.168.1.0/24, gateway 為 192.168.1.1。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
docker run -d \
  --name clash \
  -e USER_ID=1000 \
  -e GROUP_ID=1000 \
  -v ~/docker/clash/config/proxy.yaml:/root/.config/clash/config.yaml \
  -v ~/docker/clash/ui:/ui \
  --restart=always \
  --network=macvlan \
  --ip=your_clash_ip \
  --privileged \
  --device=/dev/net/tun \
  dreamacro/clash-premium:latest

使用以上命令,部署 clash 容器。其中詳細配置,請參照文章「Docker Clash 旁路由网关模式透明代理」,這裡不再贅述。

完成 clash 的部署後,下載 GoToSocial 的配置文件 config.yaml,修改以下內容。

1
2
3
# Both allow-ips and block-ips default to an empty array.
  allow-ips: ["your_device_ip/32"]
  block-ips: []

完成修改後,將 config.yaml 拷貝至 ~/docker/gotosocial/。其中 your_device_ip 為妳的伺服器在內網的IP地址。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
docker run -d \
  --name gotosocial \
  -p your_gotosocial_port:8080 \
  -e GTS_HOST=your_gts_domain_name \
  -e GTS_DB_TYPE=sqlite \
  -e GTS_DB_ADDRESS=/gotosocial/storage/sqlite.db \
  -e GTS_LETSENCRYPT_ENABLED=false \
  -e TZ=Asia/Taipei \
  -e USER_ID=1000 \
  -e GROUP_ID=1000 \
  -e HTTP_PROXY=socks5://your_clash_ip:your_clash_port \
  -e HTTPS_PROXY=socks5://your_clash_ip:your_clash_port \
  -v ~/docker/gotosocial/data:/gotosocial/storage \
  -v ~/docker/gotosocial/config.yaml:/gotosocial/config.yaml \
  --restart=always \
  superseriousbusiness/gotosocial:latest \
  /gotosocial --config-path ./config.yaml server start

運行以上命令,部署 GoToSocial。其中 GTS_HOST 為 GoToSocial 的域名,這裡需要將域名添加至 Cloudflare,並域名服務商處將 DNS 修改為 Cloudflare 的 DNS。接下來,我們只需要將 GoToSocial 的本地端口連結至 Cloudflare Tunnel,就萬事大吉了。

要使用 Cloudflare Tunnel 服務,首先要登錄 Cloudflare,註冊 Zero Trust,選擇免費套餐即可。

完成註冊,進入 Zero Trust 後台,選擇 Tunnels 菜單,Create a tunnel (新建一個隧道)。

完成創建後,進入以上頁面,選擇 Docker,其中 --token 之後的字串為 your_token,請勿將該字串洩漏給任何第三方,以免相關服務被劫持。

1
2
3
4
5
6
7
8
9
docker run -d \
  --name cloudflare_tunnel \
  -e USER_ID=1000 \
  -e GROUP_ID=1000 \
  -e HTTP_PROXY=socks5://your_clash_ip:your_clash_port \
  -e HTTPS_PROXY=socks5://your_clash_ip:your_clash_port \
  --restart=always \
  cloudflare/cloudflared:latest-arm64 tunnel --no-autoupdate \
  run --token your_token

獲得 your_token 之後,使用以上命令部署 Cloudflare Tunnel。

回到 Cloudflare Tunnel 的後台,返回至隧道列表,進入至指定隧道的配置頁面。選擇公開服務,點擊增加一個新的公網域名。

於 Subdomain 初寫入想要的二級域名,亦可不寫;於 Domain 初選擇之前添加的域名;於 Type 初選擇 HTTP;於 URL 寫入 your_device_ip:your_gotosocial_port

至此,我們部署已完成,若如無意外,我們的 GoToSocial 已進入聯邦宇宙。

日前,GoToSocial 並無完善的用戶管理頁面,需要使用命令行來管理用戶。

1
2
3
4
5
docker exec -it gotosocial \
  /gotosocial/gotosocial admin account create \
  --username your_username \
  --email your_email \
  --password 'your_password'

使用以上命令,創建一個用戶。完成用戶創建後,可以登錄 your_domain_name/admin,進行一些必要之用戶設置,比如暱稱、頭像等。

1
2
3
docker exec -it your_container_name \
  /gotosocial/gotosocial admin account promote \
  --username your_username

使用以上命令,將一個用戶提升至管理員。使用管理員帳戶登錄 your_domain_name/admin,可以進行一些全站設置。

1
2
3
docker exec -it your_container_name \
  /gotosocial/gotosocial admin account demote \
  --username your_username

使用以上命令,將一個管理員降級至普通用戶。

1
2
3
4
5
6
docker exec -it your_container_name \
  /gotosocial/gotosocial admin account password \
  --username your_username \
  --password your_new_password

使用以上命令,修改某個用戶的密碼。

日前,GoToSocial 亦無一個網頁來進行內容發布與瀏覽,但它可以兼容 Mastodon 的一些客戶端,可訪問 Mastodon App 列表查看更多。

我的聯邦宇宙帳戶為 @yeahwong@hi.sogo.la,歡迎關注。

香橙派3B:丐版HomeLab之良品

2023-12-31 19:35:00

互聯網資本寡頭所提供的各類雲服務,從社交媒體再到同步服務,人們愈發不再信任。「從來就沒有什麼救世主,也不靠神仙皇帝」,那些沒有受虐傾向的人們,那些沒有露體癖的人們,那些不甘被資本與權力宰制的人們,紛紛拿起開源武器,開始了數據的自我賦權,啟動了本地優先之策略。

歲月催人老,泰西2023年已然離去。9月底,本呆採購了一台香橙派作為HomeLab,它在我的出租屋已成功運行了兩個月。現給大家做一個報告,亦作為學習的記錄。

相較各類昂貴和功耗高的x86服務器, 功耗降低的arm架構的單板機是HomeLab之廉價選擇。樹莓派,大名鼎鼎,但它已成為理財產品,為大家所詬病,當然不在我的選擇範圍。思來想去,左等右等,我選購了國產廠商推出的香橙派3B的最高配8G版,它採用RK3566,性能足夠使用。後面,我又採購了電源適配器、SSD硬碟、U盤、散熱片、外殼等。

物件 採購平台 價格
Orange Pi 3B 8G版 淘寶OrangePi官方店 305.72元
電源與電源線 淘寶某店鋪 16.32元
金屬外殼 淘寶某店鋪 62元
128G 2230 SSD硬碟 (二手) 拼多多某店鋪 36元
硬碟散熱銅片 淘寶某店鋪 11.64元
128G 金屬外殼U盤 京東京造自營店 45.9元
U盤散熱銅柱 淘寶某店鋪 33.16元

以上,列舉了HomeLab實際運行的配件,並沒有包括螺絲刀、鉗子、串口線、採集卡、HDMI線、美工刀等,還有一個被折騰壞的壓克力外殼,好在很多器物都是可以重複再利用的。顯然,與各類二手礦難盒子相比,這並不便宜,但好在接口豐富,我看中了它可以直接插2230SSD硬碟,而且在拼多多購買的SSD硬碟好像也沒有通電多少次,感覺超值。

於此HomeLab之中,本地安裝armbian系統,部署了docker,運行了gotosocialIPFS、clash、Cloudflare Tunnel青龍面板等容器,還在持續探索之中。

組裝完畢,我們開始吧。

根據的OrangePI官方用戶手冊的指引,要將系統燒錄到NVMeSSD硬碟,首先需將bootloader燒錄至SPIFlash,才能確保系統從NVMeSSD硬碟啟動。那麼整個流程就簡單明確了,先將系統燒錄至SD卡,通電開機後;再將bootloader和系統分別燒錄至SPIFlash和NVMeSSD硬碟;最後,關機拔掉SD卡,再通電開機即可。

這裡,我採用armbian提供3B的社區維護版系統,SD卡的燒錄工具為balenaEtcher。下載好系統,安裝好燒錄工具即可開始作業。

SD卡連接至電腦後,打開balenaEtcher,在交互介面中選擇下載好鏡像文件和SD卡。

點擊Flash按鈕,等待燒錄完成。將SD從電腦彈出後,插入香橙派的SD卡卡槽,通電啟動。在路由器的後台,找到香橙派的本地IP。有了IP後,打開終端。

1
ssh root@your_ip_address

armbian的root默認密碼為1234,根據提示選擇終端類型與語言、地區等,修改默認root密碼以及創建新用戶。完成初始化設置之後,在終端鍵入命令,進入armbian的設置介面。

1
sudo armbian-config

選擇System選項。

選擇Install選項。

選擇4選項。

因為我們沒有插入U盤或者其它設置,故選擇選擇1選項。

選擇Yes選項,將NVMeSSD硬碟清除數據格式化。

待進度格式化進度跑完後,選擇1選項。注意:香橙派的bootloader不支援btrfs格式的系統從NVMeSSD硬碟啟動,只能選擇ext4格式。

耐心等待進度跑完,期間香橙派的藍色信號燈會快速閃爍。

NVMeSSD硬碟的寫出完成後,選擇7選項,將bootloader燒錄至SPIFlash。

選擇Yes選項,開始燒錄。

選擇Power off選項,關機。等到電源指示燈熄滅後,拔出SD卡,再次通電。這次,armbian將會從NVMeSSD硬碟啟動,啟動期間藍色指示燈會快速閃爍。待啟動完成,進入路由器後台,找到新的IP。

1
ssh root@your_new_ip_address

受限於國朝網路,需要將軟件源切換至北平清華大學的鏡像,才能獲得良好的速度。

1
sudo nano /etc/apt/sources.list.d/armbian.list

http://apt.armbian.com替換為https://mirrors.tuna.tsinghua.edu.cn/armbian

編輯sources.list。

1
nano /etc/apt/sources.list

先講原有內容註釋掉,然後至北平清華大學的Debian軟件源,選擇相應的版本,粘貼至sources.list後,保存退出。

1
sudo apt update && sudo apt upgrade

運行以上命令,更新軟體列表,根據提示鍵入y,更新軟體。

為安全起見,這裡我們修改SSH的默認端口,取消root登錄,並取消密碼登錄,改為密鑰登錄。

1
mkdir -p ~/.ssh

運行以上命令,創建文件夾.ssh

1
2
touch ~/.ssh/authorized_keys
nano ~/.ssh/authorized_keys

運行以上命令,創建authorized_keys文件,並將公鑰粘貼至此。

1
2
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

運行以上命令,修改文件夾及文件的權限。

1
sudo nano /etc/ssh/sshd_config

運行以上命令,編輯SSH的配置文件。

1
2
3
4
port your_ssh_port_number #SSH端口號
PermitRootLogin no #拒絕root登錄
PubkeyAuthentication yes #允許密鑰登錄
PasswordAuthentication no #拒絕密鑰登錄

修改以上內容,保存並退出。

1
sudo systemctl restart ssh

運行以上命令,重啟SSH服務後,就可以使用密鑰登錄了。

為方便在電腦中管理香橙派的文件,我們需部署smaba服務,以獲得遠端管理香橙派的文件有管理本地文件的同等體驗。

1
sudo apt install samba

運行以上命令,安裝samba軟體。

1
sudo smbpasswd -a $USER

運行以上命令,為當前用戶創建samba登錄密碼。

1
sudo nano /etc/samba/smb.conf

運行以上命令,編輯samba的配置文件。

 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
[global]
   workgroup = WORKGROUP
   server string = orange pi 3b
   security = user
   map to guest = Bad User
   encrypt passwords = yes
   passdb backend = tdbsam

   min protocol = SMB2
   client min protocol = SMB2
   client max protocol = SMB3

   # local master = no
   # preferred master = no

   log file = /var/log/samba/log.%m
   max log size = 50


[orangepi]
   comment = User Files
   path = /home/your_username
   browseable = yes
   writeable = yes
   guest ok = no
   create mask = 0664
   directory mask = 0775

修改`your_username"為正確的用戶名,以上內容替換至配置文件中。

1
2
sudo systemctl start smbd
sudo systemctl enable smbd

運行以上命令,啟動samba,並設置為開機啟動。

1
sudo apt install ufw

運行以上命令,安裝防火牆軟體ufw。

1
2
3
4
5
sudo ufw allow 139/tcp
sudo ufw allow 445/tcp
#以上,允許samba服務通過防火牆
sudo ufw allow your_ssh_port_number/tcp
#以上,允許SSH服務通過防火牆

運行以上命令,將SSH和samba允許通過防火牆。

1
2
sudo ufw enable
sudo systemctl enable ufw

運行以上命令,啟動ufw防火牆,並設置為開機啟動。

1
2
net.core.rmem_max=2500000
net.core.wmem_max=2500000

運行以上命令,修改網路吞吐參數,以便IPFS更好地運行。

1
sudo nano /etc/sysctl.conf

運行以上命令,講前述修改網路參數的命令添加至sysctl.conf,以便重啟後繼續生效。

運行ip link,找到設備的乙太網接口名稱。

1
sudo ip link set your_eth_name promisc on

運行以上命令,開啟網卡混合模式。

1
sudo nano /etc/rc.local

運行以上命令,編輯rc.local文件。

1
sudo ip link set your_eth_name promisc on

exit 0行之前,添加以上內容,保存並關閉文件。

1
sudo systemctl disable wpa_supplicant

運行以上命令,禁用WiFi,節約用電和資源佔用。

數據容災是必修課,良好的數據備份體驗是許多人使用各類雲服務的理由,那打造一個好的HomeLab,就需確保數據有容災能力。這裡,我們使用rsync軟體,採用阮一峰的提供的增量備份腳本,將數據備份至U盤。

考慮U盤的發熱問題,這裡建議選購金屬外殼的U盤,並加裝散熱銅柱,可較好地散熱,以增加U盤的使用時間。

首先,將U盤插入香橙派的USB3.0接口,該接口顏色為藍色。

運行lsblk

找到U盤的名字。

1
sudo mkfs.btrfs /dev/sda1

運行以上命令,將U盤格式化btrfs文件系統。

1
sudo mkdir /mnt/backup

運行以上命令,創建一個目錄,以便掛載U盤。

1
sudo mount /dev/sda1 /mnt/backups

運行以上命令,挂载U盤至新創建的目錄。

1
sudo blkid /dev/sdb1

運行以上命令,獲取sdb1的UUID。

1
sudo nano /etc/fstab

編輯/etc/fstab文件。

1
UUID=your_UUID /mnt/myusb btrfs defaults 0 0

/etc/fstab文件中添加以上內容為行。

1
sudo apt install rsync

運行以上命令,安裝rsync至armbian。

1
nano ~/script/backup_script_usb.sh

運行以上命令,創建腳本文件。

 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
#!/bin/bash

# A script to perform incremental backups using rsync and retain only the last 28 backups

set -o errexit
set -o nounset
set -o pipefail

readonly SOURCE_DIR="/home/your_username/"
readonly BACKUP_DIR="/mnt/backup"
readonly DATETIME="$(date '+%Y-%m-%d_%H:%M:%S')"
readonly BACKUP_PATH="${BACKUP_DIR}/${DATETIME}"
readonly LATEST_LINK="${BACKUP_DIR}/latest"

mkdir -p "${BACKUP_DIR}"

# Perform the backup
rsync -av --delete --exclude=".cache" "${SOURCE_DIR}/" --link-dest "${LATEST_LINK}" "${BACKUP_PATH}"

# Remove old backups, keeping only the last 28
find "${BACKUP_DIR}" -mindepth 1 -maxdepth 1 -type d | sort | head -n -28 | xargs rm -rf

# Remove the existing "latest" link and create a new one
rm -f "${LATEST_LINK}"
ln -s "${BACKUP_PATH}" "${LATEST_LINK}"

講以上內容粘貼至腳本文件。

1
chmod +x ~/script/backup_script_usb.sh

運行以上命令,為腳本賦予執行權限。

1
sudo crontab -e

運行以上命令,編輯crontab。

1
30 */6 * * * ~/script/backup_script_usb.sh  >> ~/script/log/backup_script_usb.log 2>&1

將以上內容寫入crontab文件為行。

通過掛載U盤,並通過自動備份腳本,我們可以實現每日備份4次的增量備份,並將備份數據保持一週的時間。之後,本呆會將數據也備份至Nas,以增加容災能力。

以上,我們通過初步設置將丐版HomeLab配置完成。要實現本地優先之策略,我們需要將諸多服務部署至HomeLab,以造抵抗之器。後續,本呆會發文介紹目前所使用一些docker容器。

丐版HomeLab,夠用就好。這顆28nm的RK3566性能足以覆蓋基本的需求,倘若追求更強更好的配置,恐怕會陷入至消費主義的陷阱。也許每一互聯網移民都應有一個屬於自己的HomeLab,這也是初民之要義。反動學人福山都在用單板機,妳還在等什麼?

我的博客方案:靜態網站與 IPFS

2023-04-23 13:10:00

隨著前幾年多個出名的博客服務商終止運營,或者不再提供更新與維護,國文博客開始文藝復興,重新歸復到獨立建站,個中滋味大概只有國朝網民知曉。縱然外國亦有不少博客服務商,但在互聯網開始被爭霸之中的主權國家裹挾之今日,又有哪個主權國家更高尚一些嗎?除了內容自託管,我們別無選擇。

內容的完全控制和方便遷移,這是我託管博客的兩大目標。考慮到國朝網路運營商對 web 端口的屏蔽,如不映射到海外服務器,那麼在自家主機上開放 HTTP/HTTPS 服務,在可預見的未來都是不可能的。為了達成這樣的目標,我選擇靜態網站託管服務與分布式儲存兩種方案。

選擇靜態網站的一個理由是不需要考慮數據庫的維護。相較於動態網站使用數據庫來存儲網站內容和用戶數據,靜態網站以靜態文件的形式存儲內容,進而減少了維護成本。個人使用 wordpress 的過程也有曾遭受過黑客攻擊的經歷,缺少安防經驗也促使我不再使用動態網站。除此之外,靜態網站也更易遷移,選擇靜態網站可方便地將數據從一個託管服務提供商遷移到另一個。

而選擇分布式儲存是由於國內網路環境的限制而不得已的選擇,同時也能有效增強自己對數據的控制權。分布式網站有很多方案,其中比較知名的有 ZeroNetIPFS,但 zeronet 目前已停止更新,我們的選擇可能只有 IPFS 了。

IPFS 全稱為 InterPlanetary File System (星際文件系統),是一個基於內容尋址的分布式存儲方案,目前有 Brave瀏覽器 支援使用 ENS域名 或者傳統域名進行訪問 IPFS 網站。

我的網誌已經歷十幾年,雖然文章不多,但也歷經折騰,然而卻不曾介紹過我的部署方案。是時候將我的部署方案公之於眾了,以下供大家參考與批判。

我的博客選擇是靜態網站生成器 hugo ,主題為 DoIt, DoIT 的基本配置可參考其官方網站

  • 網誌文章的 markdown 文件放入 $PWD/yoursite/content/posts
  • 簡單頁面的 markdown 文件放入 $PWD/yoursite/content/

md 文件的名稱就是改頁面的連結,示例如下:

對於使用 Hugo 創建博客文章,需要注意和普通 Markdown 文件的區別。在 Hugo 中,無法使用如同普通 markdown 文件般使用 # 來標記文章標題。相反,你需要在文件內使用前置參數進行標記。以下是一個示例前置參數:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
title: "三和大神的双十一怎么过?"
date: 2019-11-11T11:52:18+08:00
lastmod: 2020-06-16T15:58:26+08:00
draft: false
author: "王小嗨"
summary: "双十一,我去三和做了一晚快递日结。"
featuredImage: "/images/godsofsanhe1111/20191111.1.jpg"
images: ["/images/godsofsanhe1111/20191111.1.jpg"]
toc: false
keepStatic: false
auto: true
categories: ["Capitalism","Life"]
tags: ["三和大神","日结","零工","快递"]
license: '<a rel="license external nofollow noopener noreffer" href="https://creativecommons.org/licenses/by-nc/3.0/" target="_blank">CC BY-NC 3.0</a>'

在這個示例中,title 屬性標示了文章的標題,date 標示了文章的發布日期和時間,lastmod 標示文章最後修改的時間,draft 屬性表示文章是否是草稿狀態。另外,還有一些其他的屬性,比如前面列舉的 authorsummaryfeaturedImage 等等。在這個標題之後,可以使用正常的 Markdown 語法來編寫文章的內容。其中圖片文件在 $PWD/yoursite/static/images 目錄。

在安装 hugo 程式,下載好 DoIt 主題, 完善 config.toml 配置文件,寫好妳的文章之後,cd 至 $PWD/yoursite ,運行 hugo server -D 可對博客網站預覽,若滿意,則運行 hugo 命令。在 $PWD/yoursite/public 目錄中,妳將會得到博客的所有靜態文件。

有了整個網站的靜態文件,我們需將其上傳至託管服務商。目前,可供選擇服務商有好幾家,大部分服務商的免費方案都足夠個人博客使用。

以上服務商,都支持綁定 GitHub 倉庫,它會自動拉取最新倉庫更新並保持同步。其中 Fleek ,不僅支持生成 http 頁面,還會將文件上傳至 IPFS 網路,給出 CID。

先在 GitHub 新建一個 repository, 與本地的 $PWD/yoursite/public 目錄進行關聯,並將博客文件上載至倉庫。

1
2
3
4
5
6
7
cd $PWD/your_site/public
git init
git add .
git commit -m "deploy blog"
git branch -M main
git remote add origin git@github.com:your_github_name/your_blog_repository.git
git push -u origin main

之後,有新博文之後,再重新運行 hugo server -D 預覽博客,若滿意,則運行 hugo 命令更新博客的靜態文件,再將其更新至 GitHub 倉庫。

1
2
3
4
cd $PWD/yoursite/public
git add .
git commit -m "blog update"
git push -u origin main

git push 完成後,託管服務商會自動讀取倉庫更新,將其部署至服務器。

在託管服務商創建我們的博客項目並綁定 GitHub 倉庫後,通常服務商會提示我們綁定域名。如若沒有相關提示,也可以在其管理界面中方便地找到綁定域名的選項,按照其要求添加相關 DNS 記錄,比如 A 記錄 或者 CNAME 記錄。

為了更方便、更安全地管理域名的 DNS,建議使用 Cloudflare 服務。首先,在 Cloudflare 上添加域名,然後在域名服務商的管理界面中將 DNS 服務器變更為 Cloudflare 提供的 DNS 服務器,最後等待生效即可。

當然,如果不想購買域名的話,也可使用服務商提供的二級域名。但是,若使用自有域名,我們將更方便地將網站從一個服務商遷移至另一個,僅需更改 DNS 記錄即可。

將網誌託管給服務商固然很方便,這也增加了被審查與阻斷的風險。作為國朝臣民,我們天然地對任何服務商沒有信任。如果選擇 IPFS 方案託管網誌,這無疑將大大地治癒我們的書報檢查PTSD。但要特別注意:IPNS 並不匿蹤,書寫與言說就要承受利維坦之重,請審慎考量再使用鍵鼠。

IPFS 擁有一個域名系統 IPNS (InterPlanetary File System),可讓我們更方便地配合域名使用 IPFS , IPFS 託管網站的要義是用戶自己控制 IPNS 的 private key (私鑰)。儘管已有提供 IPNS 託管服務的選項,但這要付出信任成本。如若選擇自行生成與託管 IPNS Key ,這是一個 trustless 的抉擇,只要自己做好安全風險的管控。

要進行 IPFS 網站的自託管,首先要 安裝 IPFS 程式。因為需要 7*24 的不間斷服務,將 IPFS 安裝在功耗較低的小主機是一個好的選擇,所有選擇 docker 安裝 IPFS 是一個好的選項。

1
2
3
4
5
6
7
docker run -d --name ipfs \
  -v $PWD/docker/ipfs/ipfs:/data/ipfs \
  -v $PWD/docker/ipfs/export:/export \
  -u 1000:1000 \
  -p 4001:4001 \
  -p 8080:8080 \
  ipfs/go-ipfs:latest  

安裝完成後,進入 IPFS 容器的 Shell ,運行以下命令,將服務应用 lowpower 配置,這會優化 IPFS 資源的佔用情況。

1
ipfs config profile apply lowpower

接著在 Shell 中, cd 至 export 目錄,運行以下命令,生成一個 IPNS key pair。

1
ipfs key gen your_key_name

記錄給出的 IPNS 的 public key (公鑰),並使用以下命令將其導出。

1
ipfs key export your_key_name

在文件管理中,進入至 $PWD/docker/ipfs/export ,將目錄中的 Key 文件妥善保管,以下是 IPFS KEY 管理的命令。

1
2
3
4
5
6
7
ipfs key export <name>           - Export a keypair
ipfs key gen <name>              - Create a new keypair
ipfs key import <name> <key>     - Import a key and prints imported key id
ipfs key list                    - List all local keypairs.
ipfs key rename <name> <newName> - Rename a keypair.
ipfs key rm <name>...            - Remove a keypair.
ipfs key rotate                  - Rotates the IPFS identity.

有了 IPNS Key 之後,就可將內容的 CID 發布到 IPNS 。如果直接訪問 IPFS 公鑰,當然也可以,但也這讓訪問者望而卻步,一大串字符讓人望而卻步。為了方便記憶,我們需要將 IPNS 與域名綁定,綁定方法可參考我的文章Planet:一款IPFS静态站点生成器中的域名绑定綁定部分。

使用 IPFS 自託管靜態網站,主要是因為其分布式特性,它讓我們重拾萬維網之互聯真義。然而,由於個人博客的讀者不多,使用 IPFS 的用戶更是寥寥無幾,因此在 IPFS 自託管的同時,使用 remote pinning services 來提高網站的可用性是個不錯的選擇。

在介紹靜態網站託管服務商的時候,有提到 Fleek ,它就有提供 remote pinning services ,在生成動態網站的同時,可生成一個網站的 CID。

如果我們在每次更新網站後,從 Fleek 生成的域名讀取出它綁定的 CID,並在本地 pin 這個 CID,然後再將其發布至我們自己的 IPNS ,那麼我們就可以實現同時更新靜態網站服務商和 IPNS 託管。所以,我請 ChatGPT 寫了可自動這一系列操作的腳本,如下所示。

 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
#!/bin/bash
#
# Script: update-ipns.sh
# Description: Check if IPNS record needs to be updated and update it if necessary.

set -euo pipefail

# Function: get IPNS CID
get_ipns_cid() {
  local ipns_name=$1
  local ipfs_container=$2
  docker exec "${ipfs_container}" ipfs resolve -r "/ipns/${ipns_name}" \
    | tail -n1 \
    | awk '{ print $NF }'
}

# Variables: define container name, IPNS names and options
IPFS_CONTAINER="ipfs"
SOGOLA_IPNS="your_domain_name"
FLEEK_IPNS="your_fleek_site_name.on.fleek.co"
PIN_OPTS="--progress"
PUBLISH_OPTS="--key=your_ipns_public_key"

# Check if the IPFS container is running
if [ ! "$(docker ps -q -f name=${IPFS_CONTAINER})" ]; then
    echo "${IPFS_CONTAINER} container is not running. Please start the container and try again."
    exit 1
fi

# Get IPNS CID
SOGOLA_CID=$(get_ipns_cid "${SOGOLA_IPNS}" "${IPFS_CONTAINER}")
FLEEK_CID=$(get_ipns_cid "${FLEEK_IPNS}" "${IPFS_CONTAINER}")

# Check if IPNS record needs update
if [ "${SOGOLA_CID}" != "${FLEEK_CID}" ]; then
  # Publish new IPNS record
  docker exec "${IPFS_CONTAINER}" ipfs name publish "${PUBLISH_OPTS}" --lifetime=8766h -- "${FLEEK_CID}"
  # Unpin the previous IPNS record
  docker exec "${IPFS_CONTAINER}" ipfs pin rm "${SOGOLA_CID}"
  # Pin the updated IPNS record
  docker exec "${IPFS_CONTAINER}" ipfs pin add "${PIN_OPTS}" -- "${FLEEK_CID}"
  echo "IPNS record updated successfully."
else
  echo "IPNS record is already up-to-date, no need to update."
fi

# Add error handling
if [ $? -eq 0 ]; then
  echo "Update completed."
else
  echo "Error occurred while updating IPNS record. Please check."
  exit 1
fi

將上述腳本中的 SOGOLA_IPNS,FLEEK_IPNS,PUBLISH_OPTS 分別替換並保存為 update-ipns.sh ,使用自動化工具定時執行,即可使用 Git 更新博客後,實現靜態網站的 HTTP 與 IPFS 同時更新的功能。

如果覺得只有一個 remote pinning service 不保險的話,還可以使用 4EVERLAND ,這個服務商支持使用 IPNS 進行 PIN。

透過個間網站託管服務商,我們可以通過控制域名來遊走之間,輕鬆實現切換服務商。而通過自託管 IPFS ,拜分布式託管之幸,我們終可回歸到萬維網之本心,重新掌握我們自己的數據。

就撰寫這篇博文期間,我留意到一則新聞,ICANN 和 Verisign 提议允许任何政府扣押域名。是時候,我們該嘗試無許可與去信任的 crypto 了。

整治書報檢查制度的真正而根本的辦法,就是廢除書報檢查制度,因為這種制度本身是惡劣的,可是各種制度卻比人更有力量。我們的意見可能是正確的,也可能是不正確的,不過無論如何,新的檢查令終究會使普魯士的作者要么獲得更多的現實的自由,要么獲得更多的觀念的自由,也就是獲得更多的意識。

Rara temporum felicitas, ubi quae velis sentire et quae sentias dicere licet[當你能夠想你願意想的東西,並且能夠把你所想的東西說出來的時候,這是非常幸福的時候]。

————馬克思《評普魯士最近的書報檢查令》

「清風不識字」,主權國家宰制一切。當言說成為禁忌,開設一個部落格已然成為罪證,我只祝福妳們成為幸福的人。那些獨立博客的作者有福了,因為妳們必然承受大地之重。

《三體》與 iPhone 產線:國朝的工業與科幻的黃金時代

2023-04-11 20:05:00

人們在自己生活的社會生產中發生一定的、必然的、不以他們的意志為轉移的關係,即同他們的物質生產力的一定發展階段相適合的生產關係。這些生產關係的總和構成社會的經濟結構,即有法律的和政治的上層建築豎立其上並有一定的社會意識形式與之相適應的現實基礎。物質生活的生產方式制約着整個社會生活、政治生活和精神生活的過程。不是人們的意識決定人們的存在,相反,是人們的社會存在決定人們的意識。

卡爾·馬克思《政治經濟訓序言》(1859)

西元2006年至2007年,《三體》在《科幻世界》雜誌連載,期間 Apple 公司發佈第一代 iPhone;

2007年,《三體2》出版,2008年,Apple 公司發佈 iPhone 3g,並交由富士康代工,廣受關注;

2010年,Apple 公司發佈 iPhone 4,同年《三體3》出版,當年 iPhone 4大賣;

2010年期間,iPhone 的代工廠出現員工連續跳樓事件,引發社會廣泛關注。

《三體》的出版時間與世界工廠的巔峰時刻,如此接近。國朝科幻的黃金時代與國朝工業產業鏈的黃金時代,在移民工人的悲歌中交相呼應。真理在歷史中展開,正如至聖先師的教誨,人們的社會存在決定了人們的意識。

透過一則戴老師聊《三體》的短片,我驚訝地發現戴老師原來也追了《科幻世界》上《三體》的連載,而我很幸運能和戴老師一起追這個系列。那時候我還在念中學,起初,只有我和另一個同學看《科幻世界》,爾後風靡全班,這只不過是《三體》的連載從開始到高潮的過程。

各類社交媒體上充斥著對《三題》的情緒化表達,為了一部中學生讀本,《三體》的愛好者與鄙夷者吵得面紅耳赤,仿佛不表達一下自己的情緒,她們就會錯失自己的一部分。好的科幻文學作品大概可以算做工業黃金時代的神聖讚歌,讚歌是時代精神的低吟,它理應被更審慎地對待,而不是陷入到情緒對立。

至聖先師有言「手織機給我們帶來了封建領主,而蒸汽磨坊則帶來了產業資本家」。好的科幻作品,正如《三體》那樣,用連續的劇情將這個真理演繹出來了。

那些連手機電腦都玩不明白的人們,她們看不到這一真理在文學中的展開,眼中只有低劣的社會學理論(黑暗森林理論),她們像滿洲八旗治下的包衣一樣,總是否定科技進步帶來的變革,將偉大的發明視為奇技淫巧,而這些回響也不過是手織機、蒸汽磨坊的吵鬧雜音。

當然,盲目崇拜某一部作品,這與文化工業的粉絲經濟並無差別,對《三體》狂熱者的批判應該轉為批判文化工業的一般,因為這不過是消費主義在這些狂熱份子頭頂之上的顯靈。

前久,趁騰訊版《三體》電視劇的熱播,我又翻了翻三體,發現書裡面充斥著各種刻板印象,不過時光倒回西元2006年,誰又有多少進步思想呢?耶穌有言沒有罪的人,可以拿石頭砸死她了。騰訊劇版《三體》的精彩程度遠超我的想像,要知道,它一整季的預算只是網飛版一集的預算。中學時代,我看《科幻世界》雜誌連載的時候,萬萬沒想到,它會上國朝皇家電視台呀。

最後,讓我們冒充一下熱衷下大棋的「國師」:不知道非國語區觀眾喜不喜歡騰訊版《三體》,如果非國語觀眾也愛看的話,朝廷應該將孔子學院的經費撥給《三體》電視劇第二季。當然,我們對於小學生不要抱有任何幻想。這裡沒有大棋,只有臨時起意和形勢所迫。

「簡中互聯網」:長城內愛國者的鏡花水月

2023-04-04 22:11:00

自從類比英文互聯網的「簡中互聯網」這一說法開始流行,從 Twitter 到睡前消息,人們總是用「簡中互聯網」來指代不同於英文互聯網的國內互聯網,可我們真的可以這樣大而化之嗎?要知道,包括新加坡、大馬華人在內,不少東南亞國家的華族都在使用簡化儒字,況且新加坡還有幾個頗具影響的國文媒體。

相比「簡中互聯網」,我更願意用「國朝互聯網」來指代,因為主權國家規定了互聯網的今日現狀,而語言有著更有寬廣的範圍。從常識出發,我們可以推定簡化字的互聯網的範圍大於國朝本部互聯網的範圍,正如英語互聯網的範圍大於米帝互聯網一樣。以某種特定語言於互聯網進行內容分發,從來都不是特定國的壟斷。

既然如此,為什麼還有國朝諸網民都在使用「簡中互聯網」一詞呢?我想大抵有以下兩個原因。

首先,在朝廷網信辦的領導下,國朝互聯網圈地自萌,網民坐井觀天,她們不知曉《聯合晚報》影響廣泛,更不曾體驗過 TikTok 的片刻歡樂,仿佛在這顆藍色星球上只有自己在使用簡化儒字。

其次,這是某種大國沙文主義在作祟。我不想老調重提列寧主義的名言,「愛國主義是流氓最後的避難所」,我更傾向於她們將自己的國家與文化神聖化,而神聖則意味著不可侵犯。

還有一個案例:對於春節英譯的爭論,究竟采用 Chinese New Year,還是 Lunar New Year。這幾年來,每到國曆新年,關於春節英譯的爭論可謂妖風陣陣,這個爭論就是將儒教文化進行國族神聖化的一個典範。諸多愛國者都將國曆新年狹隘為「中國新年」(Chinese New Year),就算陰曆(Lunar)一詞有些不足概括國曆,但它的範圍總比「中國新年」寬廣更多。

眾所週知,國曆新年是儒教文化圈的共同文化圖騰,它不僅是華人社會的節日,更是南北朝鮮、越南等地的傳統。倘若愛國者將其僭越為自己的國族獨有的文化,那麼這無疑是對大國沙文主義毫不客氣的表白,而「簡中互聯網」的稱謂則是大國沙文主義在國朝悄然流行的症候。

回顧近幾年,去全球化加劇,產業分工轉向「去中國化」,互聯網開始被主權國家所分割。不肖說國朝的防火長城,只看各國對 TikTok 的圍堵,還有騰訊主動將海外用戶註冊 WeChat 變得異常繁瑣,我們不能看出主權國家已將互聯網肢解成碎肉,變成自己的美餐。於支離破碎的互聯網之中,國朝網民完成了對「簡中互聯網」一詞的挪用。

誠然,拜書報檢查員所賜,愛國者的話語占領了國朝互聯網的討論空間,所有不同意見都被壓抑。防火長城內外,井然已是兩個世界。400毫米降水線以內,愛國者們怡然自得,滿眼所見皆是自身的映像,殊不知那一片洞天不過是鏡花水月。

LH汽車站宛若疫情前的三和

2023-02-26 00:55:00

昨夜九點半去LH汽車站溜達了一圈,好多老哥,熙熙攘攘,空氣中又有一點點焦躁,我彷彿回到了西元2019年的三和。剛到汽車站,就有差人及鄉勇排排站,走進人群,我才知道原來是驅逐在台階上休憩的老哥,隱約間,聽到鄉勇說道:這影響了市容。差人及鄉勇掃過整個廣場,頗有氣勢。

可偏偏有老哥不信邪,「執法要有有法可依,睡這裡並不違法」,周遭圍觀的老哥一陣起哄叫好。在老哥們的注視下,差人及鄉勇無奈地走開了。我拿起手機想抓拍幾張相片,剛剛沒拍幾張,就有老哥提醒不要亂拍,小心有老哥揪住妳不放,跟妳要兩百塊。我想到前幾年在三和被打的經歷,還是將手機乖乖地收起來。

今晚的南方有點冷,我將雙手插進兜裏,兩手緊貼大腿。剛到十點鐘,一位環衛大爺開著噴水三輪車來到廣場。這時候,一陣騷動彷彿漣漪一般,在廣場搖曳開來,「真他媽壞」,「睡覺都不讓睡」。水槍掃過台階,濕冷的氣息撲面而來,「拍下來,爆光她們」。水槍掃了一小截,就遭遇了一位已經打地鋪睡下的老哥,水槍聲響了下來。老哥起身假意收拾被褥,鄉勇趕了過來,老哥們也聚攏過來了。

人越聚越多,人群跳出來一位老哥,他索性坐在了台階之上。鄉勇質問老哥,老哥反問我們有錢的話,誰會願意睡在這裡呢。「誰不知道旅館二十塊一晚,可我們沒錢呢。」他越講越激動,揮舞起拳頭,鄉勇知難而退,人群中時而爆出一陣掌聲,時而爆出一陣哄笑。

不知什麼時候,環衛大爺早已悄然躲在角落,只剩灑水三輪車寡寂地留在原地。「維權!」「我們要吃飯,我們要睡覺!」「LH區的領導們,我們想反饋意見。」一些老哥吵吵地開玩笑似地在叫喚,這些聲音最終消散在了濕冷的空氣之中。

今年的工作不好找,一位老哥說他想去隔壁的DG市,旁邊的老哥勸戒道,全國哪裡不是這樣,這邊算人少了,別的地方人更多。有人說電子廠都去了越南,這時有老哥接話說等3、4月份的時候,也許Apple會有訂單,語氣中充滿了期望。老哥們議論著為什麼今年電子廠都沒訂單呀,「是因為戰爭,外國打仗了,我們老百姓遭殃了。」

環衛大爺收拾了一下噴水三輪車,一位老哥說「別噴了」,環衛大爺道:「收工回家。」今夜風大天冷,家裡暖和,可我們還會有家嗎?