Experimental browser for the Atmosphere
{
"$type": "sh.tangled.repo.pull",
"patch": "diff --git a/docker/Dockerfile b/docker/Dockerfile\nnew file mode 100644\nindex 0000000..f7c7604\n--- /dev/null\n+++ b/docker/Dockerfile\n@@ -0,0 +1,52 @@\n+FROM docker.io/golang:1.24-alpine3.21 AS build\n+\n+ENV CGO_ENABLED=1\n+\n+RUN apk add --no-cache gcc musl-dev\n+\n+WORKDIR /usr/src/app\n+\n+COPY go.mod go.sum ./\n+RUN go mod download\n+\n+COPY . .\n+RUN go build -v \\\n+ -o /usr/local/bin/knotserver \\\n+ -ldflags='-s -w -extldflags \"-static\"' \\\n+ ./cmd/knotserver && \\\n+ go build -v \\\n+ -o /usr/local/bin/keyfetch \\\n+ ./cmd/keyfetch && \\\n+ go build -v \\\n+ -o /usr/local/bin/repoguard \\\n+ ./cmd/repoguard\n+\n+FROM docker.io/alpine:3.21\n+\n+LABEL org.opencontainers.image.title=Tangled\n+LABEL org.opencontainers.image.description=\"Tangled is a decentralized and open code collaboration platform, built on atproto.\"\n+LABEL org.opencontainers.image.vendor=Tangled.sh\n+LABEL org.opencontainers.image.licenses=MIT\n+LABEL org.opencontainers.image.url=https://tangled.sh\n+LABEL org.opencontainers.image.source=https://tangled.sh/@tangled.sh/core\n+\n+RUN apk add --no-cache shadow s6-overlay execline openssh git && \\\n+ adduser --disabled-password git && \\\n+ # We need to set password anyway since otherwise ssh won't work\n+ head -c 32 /dev/random | base64 | tr -dc 'a-zA-Z0-9' | passwd git --stdin && \\\n+ mkdir /app && mkdir /home/git/repositories\n+\n+COPY --from=build /usr/local/bin/knotserver /usr/local/bin\n+COPY --from=build /usr/local/bin/keyfetch /usr/local/libexec/tangled-keyfetch\n+COPY --from=build /usr/local/bin/repoguard /home/git/repoguard\n+COPY docker/rootfs/ .\n+\n+RUN chown root:root /usr/local/libexec/tangled-keyfetch && \\\n+ chmod 755 /usr/local/libexec/tangled-keyfetch && \\\n+ chown git:git /home/git/repoguard && \\\n+ chown git:git /app && chown git:git /home/git/repositories\n+\n+EXPOSE 22\n+EXPOSE 5555\n+\n+ENTRYPOINT [\"/init\"]\ndiff --git a/docker/docker-compose.yml b/docker/docker-compose.yml\nnew file mode 100644\nindex 0000000..83670ab\n--- /dev/null\n+++ b/docker/docker-compose.yml\n@@ -0,0 +1,16 @@\n+services:\n+ knot:\n+ build:\n+ context: ..\n+ dockerfile: docker/Dockerfile\n+ environment:\n+ KNOT_SERVER_HOSTNAME: \"knot.example.org\"\n+ KNOT_SERVER_SECRET: \"secret\"\n+ KNOT_SERVER_DB_PATH: \"/app/knotserver.db\"\n+ volumes:\n+ - \"./keys:/etc/ssh/keys\"\n+ - \"./repositories:/home/git/repositories\"\n+ - \"./server:/app\"\n+ ports:\n+ - \"5555:5555\"\n+ - \"2222:22\"\ndiff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/create-sshd-host-keys/type b/docker/rootfs/etc/s6-overlay/s6-rc.d/create-sshd-host-keys/type\nnew file mode 100644\nindex 0000000..bdd22a1\n--- /dev/null\n+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/create-sshd-host-keys/type\n@@ -0,0 +1 @@\n+oneshot\ndiff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/create-sshd-host-keys/up b/docker/rootfs/etc/s6-overlay/s6-rc.d/create-sshd-host-keys/up\nnew file mode 100644\nindex 0000000..d25eb18\n--- /dev/null\n+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/create-sshd-host-keys/up\n@@ -0,0 +1 @@\n+/etc/s6-overlay/scripts/create-sshd-host-keys\ndiff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/knotserver/dependencies.d/base b/docker/rootfs/etc/s6-overlay/s6-rc.d/knotserver/dependencies.d/base\nnew file mode 100644\nindex 0000000..e69de29\ndiff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/knotserver/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/knotserver/run\nnew file mode 100755\nindex 0000000..d1e492e\n--- /dev/null\n+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/knotserver/run\n@@ -0,0 +1,3 @@\n+#!/command/with-contenv ash\n+\n+exec s6-setuidgid git /usr/local/bin/knotserver\ndiff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/knotserver/type b/docker/rootfs/etc/s6-overlay/s6-rc.d/knotserver/type\nnew file mode 100644\nindex 0000000..5883cff\n--- /dev/null\n+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/knotserver/type\n@@ -0,0 +1 @@\n+longrun\ndiff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/sshd/dependencies.d/base b/docker/rootfs/etc/s6-overlay/s6-rc.d/sshd/dependencies.d/base\nnew file mode 100644\nindex 0000000..e69de29\ndiff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/sshd/dependencies.d/create-sshd-host-keys b/docker/rootfs/etc/s6-overlay/s6-rc.d/sshd/dependencies.d/create-sshd-host-keys\nnew file mode 100644\nindex 0000000..e69de29\ndiff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/sshd/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/sshd/run\nnew file mode 100755\nindex 0000000..a7efea4\n--- /dev/null\n+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/sshd/run\n@@ -0,0 +1,3 @@\n+#!/usr/bin/execlineb -P\n+\n+/usr/sbin/sshd -e -D\ndiff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/sshd/type b/docker/rootfs/etc/s6-overlay/s6-rc.d/sshd/type\nnew file mode 100644\nindex 0000000..5883cff\n--- /dev/null\n+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/sshd/type\n@@ -0,0 +1 @@\n+longrun\ndiff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/knotserver b/docker/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/knotserver\nnew file mode 100644\nindex 0000000..e69de29\ndiff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/sshd b/docker/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/sshd\nnew file mode 100644\nindex 0000000..e69de29\ndiff --git a/docker/rootfs/etc/s6-overlay/scripts/create-sshd-host-keys b/docker/rootfs/etc/s6-overlay/scripts/create-sshd-host-keys\nnew file mode 100755\nindex 0000000..e435536\n--- /dev/null\n+++ b/docker/rootfs/etc/s6-overlay/scripts/create-sshd-host-keys\n@@ -0,0 +1,21 @@\n+#!/usr/bin/execlineb -P\n+\n+foreground {\n+ if -n { test -d /etc/ssh/keys }\n+ mkdir /etc/ssh/keys\n+}\n+\n+foreground {\n+ if -n { test -f /etc/ssh/keys/ssh_host_rsa_key }\n+ ssh-keygen -t rsa -f /etc/ssh/keys/ssh_host_rsa_key -q -N \"\"\n+}\n+\n+foreground {\n+ if -n { test -f /etc/ssh/keys/ssh_host_ecdsa_key }\n+ ssh-keygen -t rsa -f /etc/ssh/keys/ssh_host_ecdsa_key -q -N \"\"\n+}\n+\n+foreground {\n+ if -n { test -f /etc/ssh/keys/ssh_host_ed25519_key }\n+ ssh-keygen -t rsa -f /etc/ssh/keys/ssh_host_ed25519_key -q -N \"\"\n+}\ndiff --git a/docker/rootfs/etc/ssh/sshd_config.d/tangled_sshd.conf b/docker/rootfs/etc/ssh/sshd_config.d/tangled_sshd.conf\nnew file mode 100644\nindex 0000000..d41844a\n--- /dev/null\n+++ b/docker/rootfs/etc/ssh/sshd_config.d/tangled_sshd.conf\n@@ -0,0 +1,9 @@\n+HostKey /etc/ssh/keys/ssh_host_rsa_key\n+HostKey /etc/ssh/keys/ssh_host_ecdsa_key\n+HostKey /etc/ssh/keys/ssh_host_ed25519_key\n+\n+PasswordAuthentication no\n+\n+Match User git\n+ AuthorizedKeysCommand /usr/local/libexec/tangled-keyfetch -git-dir /home/git/repositories\n+ AuthorizedKeysCommandUser nobody\n",
"title": "Docker support",
"pullId": 14,
"targetRepo": "at://did:plc:wshs7t2adsemcrrd4snkeqli/sh.tangled.repo/3liuighjy2h22",
"targetBranch": "master"
}