2026年1月11日

PostmarketOS 中 的 docker 無法外連的問題

PostmarketOS 是衍生自 alpine
不過我沒有在實機安裝過 alpine ,也不知道這是 PostmarketOS 還是 alpine 的問題

問題在於 Docker 原生是為 iptables 設計的,它會自動生成大量的 iptables 規則。雖然現代核心有提供相容層(iptables-nft),但當 Alpine 同時運行原生 nftables 服務時,兩者的規則鏈(Chains)會像兩道獨立的關卡。

即使你的 iptables 顯示為 ACCEPT,封包到了 nftables 那一關可能就被預設的規則丟棄(DROP)了。

1. 檢查 nftables 是否攔截了流量
nft list ruleset

如果看到類似 chain input { type filter hook input priority 0; policy drop; } 或 chain forward { ... policy drop; },Docker 封包就出不去。
因為 Docker 只會去改 iptables,不會去幫改 nftables。

2. 解決方案
方案 A:關閉 nftables
如果不需要 Alpine 本身作為複雜的防火牆,直接關閉它,讓 Docker 完全接管 iptables:
sudo systemctl disable --now nftables

方案 B:在 nftables 中允許轉送
如果一定要用 nftables,你必須手動允許 Docker 網橋的流量通過 forward 鏈。 在 /etc/nftables.nft 中,確保 forward 鏈的政策是 accept,或者加入以下規則:

table inet filter {
    chain forward {
        type filter hook forward priority 0; policy accept;
    }
}


3.
重啟 Docker:
sudo systemctl restart docker

2024年7月14日

在Podman中,從Container內連線到Host的Port

在Podman中,大部份的情況是將Container的Port暴露給Host,由Host連線進Container中的服務,可以簡單用 --port 8080:80 的參數來將Container的 80 port 服務開在Host的 8080 port上。

但如果要從Container中連線到Host就沒有這麼容易了,目前找到有兩種方法

1.  

--network host

如果使用這個方法,在Container裡可以直接使用localhost來連線Host的所有Port,Host也會將來自Container的連線看成是localhost發出的。

如果Host上有服務會因為來源IP不同而有不同行為的話就要注意安全性問題,像是PostgreSQL預設如果從localhost連線就不需要密碼


2.

--network slirp4netns:allow_host_loopback=true

使用這個方法,Podman會在Container的/etc/hosts中加入類似以下內容

192.168.0.2     host.containers.internal host.docker.internal

在Container中就可以使用 host.containers.internal 或 host.docker.internal 來連線到Host,而Host則會把這些連線當作是外部來的連線處理
 

在Podman中,記憶體還很多卻OOM

之前使用container去build android時,發生明明記憶體還剩很多的情況下,卻直接報出OOM編譯失敗的情況,查了許久才發現是pids滿了。

在預設的情況下Podman會限制一個容器只能執行2048個process,而build android在-j 32的時候,有可能會突然跑到四千多個process,這時就會直接失敗

可以在run container時加上--pids-limit -1 來解除限制,例如:

$ podman run -it --rm --pids-limit -1 ubuntu:16.04


也可以修改 /etc/containers/containers.conf 中的 pids_limit 讓所有Container都套用相同設定

2024年3月16日

不用手動介入,在Linux下建立新User並設定密碼

export USERNAME="newuser"
export PASSWD="password"
useradd -m $USERNAME -s /bin/bash -g users
echo -e "$PASSWD\n$PASSWD" | passwd $USERNAME


2024年3月9日

最近在用的Archlinux桌面環境

留個套件名字
下次換新電腦還可以裝

顯示管理 greetd + regreet
視窗管理 hyprland
啟動器 rofi
輸入法 fcitx5
終端機 qterminal + bash
檔案管理 dolphin

2023年3月18日

Stable diffusion prompt收集

 

最近Stable diffusion、AI繪圖很紅,所以我也稍微玩了一下 

以下收集了一些prompt詞,以後需要的時候回來查比較快 




2022年12月24日

Firefox 108 滑鼠游標消失的問題

最近Firefox 升級到 108 之後發現

自訂的游標圖示會顯示錯誤,甚至有時後會直接消失

檢查Log發現是Firefox無法讀取到我的自訂游標

firefox-bin[2959]: Unable to load hand2 from the cursor theme firefox-bin[2959]: Unable to load left_ptr from the cursor theme firefox-bin[2959]: Unable to load xterm from the cursor theme

而且是放在~/.icons下的游標才會有這個問題

所以目前有一個Workaround方式就是將目前使用的游標放到

mv ~/.icons/* /usr/share/icons/

目前已經有人發了 Issue 給 Mozilla: https://bugzilla.mozilla.org/show_bug.cgi?id=1802877

su + systemctl = Failed to connect to bus: No medium found

最近想用 su - user 對修改 user 的 systemd Unit 的時候發現 systemctl --user 的所有操作都會回報 Failed to connect to bus: No medium found

 後來找到了這篇文章 只要將 su - user改為使用machinectl shell user@.host就可以正常使用 systemctl --user 了

 

從 Caddy2 對 Syncthing 以子路徑進行反向代理

有些服務 的 web UI 需要執行在網頁的根路徑或特定路徑上

例如 transmission 就需要路徑 /transmission/web/

而 Syncthing 就必須是 / 才能正確打開Web UI

如果直接反向代理的話就會發現有許多圖片或restful api會找不到

我們需要在代理時將多餘的子路徑去除才會正確找到檔案

在Caddy2下可以這麼做

http://myhost.org { handle_path /syncthing/* { reverse_proxy http://localhost:8384 { header_up Host {http.reverse_proxy.upstream.hostport} } } }

其中handle_path就會在轉送要求時將 syncthing/ 這個前綴移除

這樣有需要的話還可以在同一個host上代理多個syncthing

例如
http://myhost.org { handle_path /syncthing/* { reverse_proxy http://localhost:8384 { header_up Host {http.reverse_proxy.upstream.hostport} } } handle_path /syncthing2/* { reverse_proxy http://localhost:8385 { header_up Host {http.reverse_proxy.upstream.hostport} } } }

2016年3月5日

Android WebView 的 JavaScript 與 Java 交互

要讓 WebView 內可以執行JavaScript,要先開啟WebView的設定
webView.getSettings().setJavaScriptEnabled(true);

要讓其中可以存取 Java 中的功能,就要建立一個可以讓 JavaScript 存取的 Interface
class JsObject {
    @JavascriptInterface
    public void alert(String ss) {
        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        builder.setTitle("TestAlert");
        builder.setMessage(ss);
        builder.show();
    }
}

@JavascriptInterface 標記的 Method 才會在JavaScript中被允許使用
然後將這個 class 加入WebView,其中 "myjs" 可以自訂為任意文字
webView.addJavascriptInterface(new JsObject(), "myjs");

最後在網頁中這樣呼叫就可以了
<script>
    window.myjs.alert("GG");
</script>

2015年1月20日

用 openssl產生金鑰

產生私鑰 長度2048 檔名ca.key
openssl genrsa -out ca.key 2048
產生配對的公鑰 檔名 ca.crt
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
 Country Name (2 letter code) [AU]:TW                                                   //國碼臺灣是 TW
 State or Province Name (full name) [Some-State]:Taiwan R.O.C                           //國名臺灣填 Taiwan
 Locality Name (eg, city) []:Taipei                                                     //地名
 Organization Name (eg, company) [Internet Widgits Pty Ltd]:FreeBSD Personal Reserach   //組織單位名稱
 Organizational Unit Name (eg, section) []:FreeBSD Personal Reserach                    //部門名稱
 Common Name (eg, YOUR name) []:www.weithenn.org                                        //憑證的名稱 (通常為伺服器 FQDN)
 Email Address []:weithenn@weithenn.org                                                 //申請單位的聯絡信箱
 Please enter the following 'extra' attributes
 to be sent with your certificate request
 A challenge password []: 按 Enter 直接跳過                                             //申請書的密碼
 An optional company name []: 按 Enter 直接跳過                                         //憑證代辦公司的名稱 


2014年5月3日

PHP 在 Ubuntu 的過量 fuser 造成 cannot fork: Cannot allocate memory

最近使用 Ubuntu 11.10的時候常常在 bash 出現
cannot fork: Cannot allocate memory

看ps又發現兩萬多個 fuser 佔領了主機
查了一下發現有許多人有相同的問題,而且似乎只會在這個Ubuntu版本才會發生

這個問題的原因是php清理無用session的時候發生了些什麼,結果fuser就停在那邊佔著解法是將清理的指令改掉

/etc/cron.d/php5改成
09,39 * * * *     root   [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) -delete

很棒的,最近都沒再出現 cannot fork 了

2014年2月11日

arg, arg min, arg max

剛開始讀Paper 看到式子中出現了這幾個關鍵字
查了一下怕忘記紀錄一下

  • y = f(t) 是一般常見的函式,代表給定一個t值,丟到f函式中會回傳一個值給y。
  • y = max f(t) 代表:y 是f(t)函式所有的值中最大的output。
  • y = arg max f(t) 代表:y 是f(t)函式中,會產生最大output的那個參數t

原文:http://kevingo75.blogspot.tw/2009/04/arg-arg-max.html

2014年1月15日

大天狗 降臨!

紀錄一下過關,免得以後想打忘記,
難度超級
隊長:
隊員:
隊友:

第一關先殺荒武者・紅色哥布林木之中忍,留著树之武士食人魔儲技,務必讓火焰追擊者有技可用。
第二關必先殺河童彌彌子,沒把握的話就開火焰追擊者
第三關用全體攻擊〈五顆〉,沒五顆的話就開火焰追擊者
第五關在打到剩39%之前要儲好火焰追擊者的技,當靈峰的破戒神・大天狗提高精神感官 後開火焰追擊者技、炎之冰食人魔技和超・下仁田葱技〈防沒殺成功的情況〉

Done!

2014年1月11日

BitVisitor Tool

最近 BitCoin 正夯,1 BTC 竟能換 1000 USD
真是不可思議!

為此我趕緊去找了取得 Btc的方法,找到了 BitVisitor,這是目前評價不錯的免費比特幣網站

可是身為一個弱小的 Programmer,覺得這站可以更好使用
所以就刻了一個小工具,讓大家可以更簡單取得免費BitCoin
BitVisitor Tool:http://userscripts.org/scripts/show/231799

2013年3月17日

Upgrade HTC One SV 4.1.2

2013年3月14號HTC發佈了 One SV 的 4.1.2 + Sense 4+ 的更新

已經Root過的要如何更新呢?

2013年1月27日

讓Windows使用UTC時間

一般Windows預設紀錄在硬體的時間都是用當地時間來紀錄
但其他有許多系統如Linux紀錄時間時是使用UTC,世界統一時間

2013年1月17日

Root HTC One SV

關於Root是什麼意思就不解釋了
總之終於在今天把他給弄成
注意:刷機一定有風險,使用前請詳閱公開說明書
注意:刷機將造成保固失效,發生問題一概不負責

2012年10月31日

JSTL錯誤


在部屬JSP網頁執行時產生錯誤訊息 org.apache.jasper.JasperException:絕對URI:http://java.sun.com/jsp/jstl/core不能在web.xml或使用該應用程序的jar文件部署解決 org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:56) org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:410) org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:117)

2012年8月16日

用USB Flash碟上的iso開機


把iso燒成光碟,每次有新版時又要重新燒錄一次,很浪費光碟片,而且現在電腦很多都已經沒有光碟機了,用USB Flash碟可以省掉這些麻煩。

完成一次之後,以後只要更換ISO就可以使用最新的系統。

本文需要一個已經可用的Archlinux系統
本文需要已經裝好的Grub2