Skip to content

Commit 3ad96fc

Browse files
committed
chromium headless unikernel
1 parent 71ba7a7 commit 3ad96fc

File tree

16 files changed

+1034
-0
lines changed

16 files changed

+1034
-0
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Chromium CDP x Unikernel
2+
3+
Set UKC_TOKEN and UKC_METRO and `./deploy.sh`.
4+
5+
## Test it
6+
7+
```
8+
uv run python cdp-screenshot.py https://<url returned after deploy.sh> https://news.ycombinator.com screenshot.png
9+
```
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#!/bin/sh
2+
3+
# Function to check if mkfs.erofs is available
4+
check_mkfs_erofs() {
5+
if command -v mkfs.erofs &>/dev/null; then
6+
echo "mkfs.erofs is already installed."
7+
return 0
8+
else
9+
echo "mkfs.erofs is not installed."
10+
return 1
11+
fi
12+
}
13+
14+
# Function to install erofs-utils package
15+
install_erofs_utils() {
16+
if command -v apt-get &>/dev/null; then
17+
echo "Detected Ubuntu/Debian-based system. Installing erofs-utils..."
18+
sudo apt update
19+
sudo apt install -y erofs-utils
20+
elif command -v dnf &>/dev/null; then
21+
echo "Detected Fedora-based system. Installing erofs-utils..."
22+
sudo dnf install -y erofs-utils
23+
elif command -v yum &>/dev/null; then
24+
echo "Detected CentOS/RHEL-based system. Installing erofs-utils..."
25+
sudo yum install -y erofs-utils
26+
elif [[ "$OSTYPE" == "darwin"* ]]; then
27+
if command -v brew &>/dev/null; then
28+
echo "Detected macOS. Installing erofs-utils..."
29+
brew install erofs-utils
30+
else
31+
echo "Homebrew (brew) not found. Please install Homebrew first."
32+
exit 1
33+
fi
34+
else
35+
echo "Unsupported operating system or package manager. Please install erofs-utils manually."
36+
exit 1
37+
fi
38+
}
39+
40+
# Stop execution on errors
41+
set -e
42+
43+
check_mkfs_erofs
44+
if [ $? -ne 0 ]; then
45+
install_erofs_utils
46+
fi
47+
48+
cd image/
49+
50+
# Build the root file system
51+
rm -rf ./.rootfs || true
52+
53+
# Load configuration
54+
img_name="chromium-headless"
55+
app_name=$1
56+
57+
docker build --platform linux/amd64 -t "$img_name" .
58+
docker rm cnt-"$app_name" || true
59+
docker create --platform linux/amd64 --name cnt-"$app_name" "$img_name" /bin/sh
60+
docker cp cnt-"$app_name":/ ./.rootfs
61+
rm -f initrd || true
62+
mkfs.erofs --all-root -d2 -E noinline_data -b 4096 initrd ./.rootfs
63+
64+
# Deploy an instance
65+
kraft cloud deploy \
66+
--image "$img_name" \
67+
--name "$app_name" \
68+
--subdomain "$app_name" \
69+
--vcpus 1 \
70+
-M 1.5Gi \
71+
-p 443:8080/http+tls \
72+
.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
/node_modules/
2+
/.unikraft/
3+
/.rootfs/
4+
/*.png
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
/node_modules/
2+
/.unikraft/
3+
/.rootfs/
4+
/*.png
5+
/initrd
Lines changed: 243 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,243 @@
1+
FROM debian:bookworm AS build
2+
3+
ARG NODE_VERSION=22.8.0
4+
5+
RUN set -xe; \
6+
apt-get -yqq update; \
7+
apt-get -yqq install \
8+
libcups2 \
9+
libnss3 \
10+
libatk1.0-0 \
11+
libnspr4 \
12+
libpango1.0-0 \
13+
libasound2 \
14+
libatspi2.0-0 \
15+
libxdamage1 \
16+
libatk-bridge2.0-0 \
17+
libxkbcommon0 \
18+
libdrm2 \
19+
libxcomposite1 \
20+
libxfixes3 \
21+
libxrandr2 \
22+
libgbm1 \
23+
libnss3; \
24+
apt-get -yqq install \
25+
ca-certificates \
26+
curl \
27+
build-essential \
28+
libssl-dev \
29+
git \
30+
;
31+
32+
RUN set -xe; \
33+
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash; \
34+
. ~/.bashrc; \
35+
nvm install ${NODE_VERSION} \
36+
;
37+
38+
WORKDIR /app
39+
COPY package* .
40+
41+
RUN set -xe; \
42+
. ~/.bashrc; \
43+
npm install \
44+
;
45+
46+
# Strip some binaries
47+
RUN cd /root/.cache/ms-playwright/chromium-*/chrome-linux; \
48+
strip chrome \
49+
chrome_crashpad_handler \
50+
chrome_sandbox \
51+
chrome-wrapper \
52+
libEGL.so \
53+
libGLESv2.so \
54+
libvk_swiftshader.so \
55+
libvulkan.so.1 \
56+
xdg-mime \
57+
xdg-settings \
58+
; \
59+
cd /root/.cache/ms-playwright/chromium_headless_shell-*/chrome-linux; \
60+
strip chrome \
61+
headless_shell \
62+
libEGL.so \
63+
libGLESv2.so \
64+
libvk_swiftshader.so \
65+
libvulkan.so.1 \
66+
; \
67+
strip /root/.nvm/versions/node/v${NODE_VERSION}/bin/node \
68+
;
69+
70+
RUN mkdir /home/tmp
71+
72+
FROM scratch
73+
74+
ARG NODE_VERSION=22.8.0
75+
76+
# Create required directories.
77+
COPY --from=build /home/tmp /tmp
78+
79+
# Chrome binary
80+
COPY --from=build /root/.cache/ms-playwright /root/.cache/ms-playwright
81+
82+
# Chrome libraries
83+
COPY --from=build /lib/x86_64-linux-gnu/libdl.so.2 \
84+
/lib/x86_64-linux-gnu/libpthread.so.0 \
85+
/lib/x86_64-linux-gnu/libgobject-2.0.so.0 \
86+
/lib/x86_64-linux-gnu/libglib-2.0.so.0 \
87+
/lib/x86_64-linux-gnu/libnss3.so \
88+
/lib/x86_64-linux-gnu/libnssutil3.so \
89+
/lib/x86_64-linux-gnu/libsmime3.so \
90+
/lib/x86_64-linux-gnu/libnspr4.so \
91+
/lib/x86_64-linux-gnu/libatk-1.0.so.0 \
92+
/lib/x86_64-linux-gnu/libatk-bridge-2.0.so.0 \
93+
/lib/x86_64-linux-gnu/libcups.so.2 \
94+
/lib/x86_64-linux-gnu/libgio-2.0.so.0 \
95+
/lib/x86_64-linux-gnu/libdrm.so.2 \
96+
/lib/x86_64-linux-gnu/libdbus-1.so.3 \
97+
/lib/x86_64-linux-gnu/libexpat.so.1 \
98+
/lib/x86_64-linux-gnu/libxcb.so.1 \
99+
/lib/x86_64-linux-gnu/libxkbcommon.so.0 \
100+
/lib/x86_64-linux-gnu/libatspi.so.0 \
101+
/lib/x86_64-linux-gnu/libm.so.6 \
102+
/lib/x86_64-linux-gnu/libX11.so.6 \
103+
/lib/x86_64-linux-gnu/libXcomposite.so.1 \
104+
/lib/x86_64-linux-gnu/libXdamage.so.1 \
105+
/lib/x86_64-linux-gnu/libXext.so.6 \
106+
/lib/x86_64-linux-gnu/libXfixes.so.3 \
107+
/lib/x86_64-linux-gnu/libXrandr.so.2 \
108+
/lib/x86_64-linux-gnu/libgbm.so.1 \
109+
/lib/x86_64-linux-gnu/libpango-1.0.so.0 \
110+
/lib/x86_64-linux-gnu/libcairo.so.2 \
111+
/lib/x86_64-linux-gnu/libasound.so.2 \
112+
/lib/x86_64-linux-gnu/libgcc_s.so.1 \
113+
/lib/x86_64-linux-gnu/libc.so.6 \
114+
/lib/x86_64-linux-gnu/libffi.so.8 \
115+
/lib/x86_64-linux-gnu/libpcre2-8.so.0 \
116+
/lib/x86_64-linux-gnu/libplc4.so \
117+
/lib/x86_64-linux-gnu/libplds4.so \
118+
/lib/x86_64-linux-gnu/libgssapi_krb5.so.2 \
119+
/lib/x86_64-linux-gnu/libavahi-common.so.3 \
120+
/lib/x86_64-linux-gnu/libavahi-client.so.3 \
121+
/lib/x86_64-linux-gnu/libgnutls.so.30 \
122+
/lib/x86_64-linux-gnu/libz.so.1 \
123+
/lib/x86_64-linux-gnu/libgmodule-2.0.so.0 \
124+
/lib/x86_64-linux-gnu/libmount.so.1 \
125+
/lib/x86_64-linux-gnu/libselinux.so.1 \
126+
/lib/x86_64-linux-gnu/libsystemd.so.0 \
127+
/lib/x86_64-linux-gnu/libXau.so.6 \
128+
/lib/x86_64-linux-gnu/libXdmcp.so.6 \
129+
/lib/x86_64-linux-gnu/libXi.so.6 \
130+
/lib/x86_64-linux-gnu/libXrender.so.1 \
131+
/lib/x86_64-linux-gnu/libwayland-server.so.0 \
132+
/lib/x86_64-linux-gnu/libfribidi.so.0 \
133+
/lib/x86_64-linux-gnu/libthai.so.0 \
134+
/lib/x86_64-linux-gnu/libharfbuzz.so.0 \
135+
/lib/x86_64-linux-gnu/libpixman-1.so.0 \
136+
/lib/x86_64-linux-gnu/libfontconfig.so.1 \
137+
/lib/x86_64-linux-gnu/libfreetype.so.6 \
138+
/lib/x86_64-linux-gnu/libpng16.so.16 \
139+
/lib/x86_64-linux-gnu/libxcb-shm.so.0 \
140+
/lib/x86_64-linux-gnu/libxcb-render.so.0 \
141+
/lib/x86_64-linux-gnu/libkrb5.so.3 \
142+
/lib/x86_64-linux-gnu/libk5crypto.so.3 \
143+
/lib/x86_64-linux-gnu/libcom_err.so.2 \
144+
/lib/x86_64-linux-gnu/libkrb5support.so.0 \
145+
/lib/x86_64-linux-gnu/libp11-kit.so.0 \
146+
/lib/x86_64-linux-gnu/libidn2.so.0 \
147+
/lib/x86_64-linux-gnu/libunistring.so.2 \
148+
/lib/x86_64-linux-gnu/libtasn1.so.6 \
149+
/lib/x86_64-linux-gnu/libnettle.so.8 \
150+
/lib/x86_64-linux-gnu/libhogweed.so.6 \
151+
/lib/x86_64-linux-gnu/libgmp.so.10 \
152+
/lib/x86_64-linux-gnu/libblkid.so.1 \
153+
/lib/x86_64-linux-gnu/libcap.so.2 \
154+
/lib/x86_64-linux-gnu/libgcrypt.so.20 \
155+
/lib/x86_64-linux-gnu/liblzma.so.5 \
156+
/lib/x86_64-linux-gnu/libzstd.so.1 \
157+
/lib/x86_64-linux-gnu/liblz4.so.1 \
158+
/lib/x86_64-linux-gnu/libbsd.so.0 \
159+
/lib/x86_64-linux-gnu/libdatrie.so.1 \
160+
/lib/x86_64-linux-gnu/libgraphite2.so.3 \
161+
/lib/x86_64-linux-gnu/libbrotlidec.so.1 \
162+
/lib/x86_64-linux-gnu/libkeyutils.so.1 \
163+
/lib/x86_64-linux-gnu/libresolv.so.2 \
164+
/lib/x86_64-linux-gnu/libgpg-error.so.0 \
165+
/lib/x86_64-linux-gnu/libmd.so.0 \
166+
/lib/x86_64-linux-gnu/libbrotlicommon.so.1 \
167+
/lib/x86_64-linux-gnu/libXcomposite.so.1 \
168+
/lib/x86_64-linux-gnu/libXfixes.so.3 \
169+
/lib/x86_64-linux-gnu/libXrandr.so.2 \
170+
/lib/x86_64-linux-gnu/libgbm.so.1 \
171+
/lib/x86_64-linux-gnu/
172+
173+
# Other Chrome-related libraries
174+
COPY --from=build /usr/lib/x86_64-linux-gnu/libsoftokn3.so \
175+
/usr/lib/x86_64-linux-gnu/libsqlite3.so.0 \
176+
/usr/lib/x86_64-linux-gnu/libudev.so.1 \
177+
/usr/lib/x86_64-linux-gnu/libfreebl3.so \
178+
/usr/lib/x86_64-linux-gnu/libfreeblpriv3.so \
179+
/usr/lib/x86_64-linux-gnu/libudev.so.1.7.5 \
180+
/usr/lib/x86_64-linux-gnu/libnssckbi.so \
181+
/usr/lib/x86_64-linux-gnu/
182+
183+
# Node binary
184+
COPY --from=build /root/.nvm/versions/node/v${NODE_VERSION}/bin/node /usr/bin/node
185+
186+
# System libraries
187+
COPY --from=build /lib/x86_64-linux-gnu/libc.so.6 \
188+
/lib/x86_64-linux-gnu/libz.so.1 \
189+
/lib/x86_64-linux-gnu/libbrotlidec.so.1 \
190+
/lib/x86_64-linux-gnu/libbrotlienc.so.1 \
191+
/lib/x86_64-linux-gnu/libnghttp2.so.14 \
192+
/lib/x86_64-linux-gnu/libcrypto.so.3 \
193+
/lib/x86_64-linux-gnu/libssl.so.3 \
194+
/lib/x86_64-linux-gnu/libicui18n.so.72 \
195+
/lib/x86_64-linux-gnu/libicuuc.so.72 \
196+
/lib/x86_64-linux-gnu/libstdc++.so.6 \
197+
/lib/x86_64-linux-gnu/libm.so.6 \
198+
/lib/x86_64-linux-gnu/libgcc_s.so.1 \
199+
/lib/x86_64-linux-gnu/libpthread.so.0 \
200+
/lib/x86_64-linux-gnu/libdl.so.2 \
201+
/lib/x86_64-linux-gnu/libbrotlicommon.so.1 \
202+
/lib/x86_64-linux-gnu/libicudata.so.72 \
203+
/lib/x86_64-linux-gnu/librt.so.1 \
204+
/lib/x86_64-linux-gnu/libtinfo.so.6 \
205+
/lib/x86_64-linux-gnu/libproc2.so.0 \
206+
/lib/x86_64-linux-gnu/
207+
208+
COPY --from=build /lib64/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2
209+
COPY --from=build /etc/ld.so.cache /etc/ld.so.cache
210+
211+
# Dbus and system files
212+
COPY --from=build /usr/lib/dbus-1.0 /usr/lib/dbus-1.0
213+
COPY --from=build /usr/lib/systemd /usr/lib/systemd
214+
COPY --from=build /usr/lib/tmpfiles.d /usr/lib/tmpfiles.d
215+
COPY --from=build /usr/lib/sysusers.d /usr/lib/sysusers.d
216+
COPY --from=build /usr/lib/sysctl.d /usr/lib/sysctl.d
217+
218+
# Data files
219+
COPY --from=build /usr/share/fonts /usr/share/fonts
220+
221+
COPY --from=build /run /run
222+
223+
# Distro definition
224+
COPY --from=build /etc/os-release /etc/os-release
225+
COPY --from=build /usr/lib/os-release /usr/lib/os-release
226+
227+
# Configuration files
228+
COPY --from=build /etc /etc
229+
230+
# Required by wrapper script
231+
COPY --from=build /bin/sh /bin/sh
232+
233+
# Required by Playwright / Chrome
234+
COPY --from=build /usr/bin/ps /usr/bin/ps
235+
236+
# Node application, including Playwright.
237+
COPY --from=build /app /app
238+
239+
# Actual server implementation
240+
COPY ./proxy.js /app/proxy.js
241+
242+
# Wrapper script set environment
243+
COPY ./wrapper.sh /usr/bin/wrapper.sh
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
spec: v0.6
2+
3+
runtime: base-compat:latest
4+
5+
labels:
6+
cloud.unikraft.v1.instances/scale_to_zero.policy: "idle"
7+
cloud.unikraft.v1.instances/scale_to_zero.stateful: "true"
8+
cloud.unikraft.v1.instances/scale_to_zero.cooldown_time_ms: 1000
9+
10+
#rootfs: ./Dockerfile
11+
rootfs: ./initrd
12+
13+
cmd: ["/usr/bin/wrapper.sh", "/usr/bin/node", "/app/proxy.js"]

0 commit comments

Comments
 (0)