+35
-6
Dockerfile
+35
-6
Dockerfile
···
1
1
from golang:1.24-alpine as builder
2
-
env KNOT_REPO_SCAN_PATH=/home/git/repositories
3
2
env CGO_ENABLED=1
4
3
5
-
arg TAG='v1.10.0-alpha'
4
+
arg TAG='v1.11.0-alpha'
6
5
7
6
workdir /app
8
7
run apk add git gcc musl-dev
9
8
run git clone -b ${TAG} https://tangled.org/@tangled.org/core .
10
-
run go build -o /usr/bin/knot -ldflags '-s -w -extldflags "-static"' ./cmd/knot
9
+
10
+
FROM builder AS build-knot
11
+
RUN go build -o /usr/bin/knot -ldflags '-s -w -extldflags "-static"' ./cmd/knot
12
+
13
+
FROM builder AS build-spindle
14
+
RUN go build -o /usr/bin/spindle ./cmd/spindle
11
15
12
-
from alpine:edge
16
+
from alpine:edge AS knot
17
+
ENV KNOT_REPO_SCAN_PATH=/home/git/repositories
13
18
expose 5555
14
19
expose 22
15
20
···
31
36
run useradd -u $UID -g $GID -d /home/git git
32
37
run openssl rand -hex 16 | passwd --stdin git
33
38
run mkdir -p /home/git/repositories && chown -R git:git /home/git
34
-
copy --from=builder /usr/bin/knot /usr/bin
39
+
copy --from=build-knot /usr/bin/knot /usr/bin
35
40
run mkdir /app && chown -R git:git /app
36
41
37
42
healthcheck --interval=60s --timeout=30s --start-period=5s --retries=3 \
38
43
cmd curl -f http://localhost:5555 || exit 1
44
+
entrypoint ["/init"]
39
45
40
-
entrypoint ["/init"]
46
+
FROM alpine:edge AS spindle
47
+
EXPOSE 6555
48
+
49
+
LABEL org.opencontainers.image.title="spindle"
50
+
LABEL org.opencontainers.image.description="ci server for tangled"
51
+
LABEL org.opencontainers.image.source="https://tangled.org/@tangled.org/knot-docker"
52
+
LABEL org.opencontainers.image.url="https://tangled.org"
53
+
LABEL org.opencontainers.image.vendor="tangled.org"
54
+
LABEL org.opencontainers.image.licenses="MIT"
55
+
56
+
ARG UID=1000
57
+
ARG GID=1000
58
+
59
+
RUN adduser --system --uid $UID spindle
60
+
RUN addgroup --system --gid $UID spindle
61
+
RUN mkdir -p /app && chown -R spindle:spindle /app
62
+
63
+
COPY --from=build-spindle /usr/bin/spindle /usr/bin
64
+
65
+
WORKDIR /app
66
+
CMD ["spindle"]
67
+
VOLUME ["/app"]
68
+
HEALTHCHECK --interval=60s --timeout=30s --start-period=5s --retries=3 \
69
+
CMD curl -f http://localhost:6555 || exit 1
+46
docker-bake.hcl
+46
docker-bake.hcl
···
1
+
variable "UID" {
2
+
default = "1000"
3
+
description = "User ID for the git and spindle users"
4
+
}
5
+
6
+
variable "GID" {
7
+
default = "1000"
8
+
description = "Group ID for the git and spindle users"
9
+
}
10
+
11
+
#
12
+
# Build the latest commit from the master branch
13
+
#
14
+
target "edge" {
15
+
name = "${APP}-edge"
16
+
context = "."
17
+
target = "${APP}"
18
+
matrix = {
19
+
APP = ["knot", "spindle"]
20
+
}
21
+
args = {
22
+
TAG = "master"
23
+
UID = UID
24
+
GID = GID
25
+
}
26
+
tags = ["tngl/${APP}:edge"]
27
+
}
28
+
29
+
#
30
+
# Build supported legacy releases
31
+
#
32
+
target "all" {
33
+
name = "${APP}-${replace(TAG, ".", "-")}"
34
+
context = "."
35
+
matrix = {
36
+
APP = ["knot", "spindle"]
37
+
TAG = ["v1.11.0-alpha", "v1.10.0-alpha", "v1.9.0-alpha", "v1.8.0-alpha"]
38
+
}
39
+
target = "${APP}"
40
+
args = {
41
+
TAG = "${TAG}"
42
+
UID = UID
43
+
GID = GID
44
+
}
45
+
tags = ["tngl/${APP}:${TAG}"]
46
+
}
+38
-10
docker-compose.yml
+38
-10
docker-compose.yml
···
1
+
name: tangled
1
2
services:
2
3
knot:
4
+
image: tngl/knot:latest
3
5
build:
4
-
context: .
5
-
args:
6
-
UID: 1000
7
-
GID: 1000
6
+
target: knot
7
+
args: &args
8
+
UID: ${UID:-1000}
9
+
GID: ${GID:-1000}
10
+
TAG: ${TAG:-v1.11.0-alpha}
11
+
tags:
12
+
- tngl/spindle:latest
13
+
- tngl/spindle:${TAG:-v1.11.0-alpha}
8
14
environment:
9
15
KNOT_SERVER_HOSTNAME: ${KNOT_SERVER_HOSTNAME}
10
16
KNOT_SERVER_OWNER: ${KNOT_SERVER_OWNER}
···
19
25
- "5555:5555"
20
26
- "2222:22"
21
27
restart: always
28
+
spindle:
29
+
image: tngl/spindle:latest
30
+
build:
31
+
target: spindle
32
+
args: *args
33
+
tags:
34
+
- tngl/spindle:latest
35
+
- tngl/spindle:${TAG:-v1.11.0-alpha}
36
+
environment:
37
+
SPINDLE_SERVER_HOSTNAME: ${SPINDLE_SERVER_HOSTNAME}
38
+
SPINDLE_SERVER_OWNER: ${KNOT_SERVER_OWNER}
39
+
volumes:
40
+
- ./logs:/var/log/spindle
41
+
- ./spindle:/app
42
+
ports:
43
+
- "6555:6555"
22
44
frontend:
23
45
image: caddy:alpine
24
-
command: >
25
-
caddy
26
-
reverse-proxy
27
-
--from ${KNOT_SERVER_HOSTNAME}
28
-
--to knot:5555
29
46
depends_on:
30
-
- knot
47
+
knot:
48
+
condition: service_healthy
49
+
spindle:
50
+
condition: service_healthy
51
+
configs:
52
+
- source: caddyfile
53
+
target: /etc/caddy/Caddyfile
31
54
ports:
32
55
- ${KNOT_SERVER_PORT:-443}:443
33
56
- ${KNOT_SERVER_PORT:-443}:443/udp
···
35
58
- ./caddy_data:/data
36
59
restart: always
37
60
profiles: ["caddy"]
61
+
configs:
62
+
caddyfile:
63
+
content: |
64
+
${KNOT_SERVER_HOSTNAME} { reverse_proxy knot:5555 }
65
+
${SPINDLE_SERVER_HOSTNAME} { reverse_proxy spindle:6555 }
+56
-17
readme.md
+56
-17
readme.md
···
4
4
> This is a community maintained repository, support is not guaranteed.
5
5
6
6
Docker container and compose setup to run a [Tangled](https://tangled.org) knot
7
-
and host your own repository data.
7
+
and spindle, hosting your own repository data and CI.
8
8
9
9
## Pre-built Images
10
10
11
-
There is a [repository](https://hub.docker.com/r/tngl/knot) of pre-built images
11
+
There is a [repository](https://hub.docker.com/r/tngl) of pre-built images
12
12
for tags starting at `v1.8.0-alpha` if you prefer.
13
13
14
-
```
14
+
```sh
15
15
docker pull tngl/knot:v1.10.0-alpha
16
+
docker pull tngl/spindle:v1.10.0-alpha
16
17
```
17
18
18
19
Note that these are *not* official images, you use them at your own risk.
19
20
20
-
## Building The Image
21
+
## Building The Images
22
+
23
+
Both the knot and spindle images are built using the same `Dockerfile`, since
24
+
they're sourced from the same codebase and can therefore share a lot of the
25
+
build steps (such as `go mod download`), caching results between them. You
26
+
can build the images locally by running `docker bake`:
27
+
28
+
```sh
29
+
docker bake
30
+
```
31
+
32
+
Optionally, choose a target image to build:
21
33
22
-
By default the `Dockerfile` will build the latest tag, but you can change it
23
-
with the `TAG` build argument.
34
+
```sh
35
+
docker bake knot
36
+
docker bake spindle
37
+
```
38
+
39
+
By default this will build the latest tag, but you can target a specific tag
40
+
like so:
24
41
25
42
```sh
26
-
docker build -t knot:latest --build-arg TAG=master .
43
+
docker bake knot-v1-10-0-alpha spindle-v1-10-0-alpha
27
44
```
28
45
29
-
The command above for example will build the latest commit on the `master`
30
-
branch.
46
+
The command above for example will build the `v1.10.0-alpha` tag for both the
47
+
`knot` and `spindle`. They're expressed as individual bake targets, so you can
48
+
also optionally specify just one to build at a specific version.
49
+
50
+
You can also build all tagged releases:
51
+
52
+
```sh
53
+
docker bake all
54
+
```
31
55
32
-
By default it will also create a `git` user with user and group ID 1000:1000,
56
+
By default it will also create a `git` / `spindle` user with user and group ID 1000:1000,
33
57
but you can change it with the `UID` and `GID` build arguments.
34
58
35
59
```sh
36
-
docker build -t knot:latest --build-arg UID=$(id -u) GID=$(id -g)
60
+
docker bake UID=$(id -u) GID=$(id -g)
37
61
```
38
62
39
63
The command above for example will create a user with the host user's UID and GID.
40
64
This is useful if you are bind mounting the repositories and app folder on the host,
41
65
as in the provided `docker-compose.yml` file.
42
66
67
+
You can also build the latest commit on `master` for both services by using
68
+
the `-edge` targets. These will build to a tag named `:edge` to distinguish
69
+
it from the `:latest` release:
70
+
71
+
```sh
72
+
docker bake edge
73
+
#
74
+
# or, with a specific target image...
75
+
#
76
+
docker bake edge-knot
77
+
docker bake edge-spindle
78
+
```
79
+
43
80
<hr style="margin-bottom: 20px; margin-top: 10px" />
44
81
45
82
When using compose, these can be specified as build arguments which will be
···
59
96
60
97
## Setting Up The Image
61
98
62
-
The simplest way to set up your own knot is to use the provided compose file
63
-
and run the following:
99
+
The simplest way to set up your own knot and spindle is to use the provided
100
+
compose file and run the following:
64
101
65
102
```sh
66
-
export KNOT_SERVER_HOSTNAME=example.com
67
-
export KNOT_SERVER_OWNER=did:plc:yourdidgoeshere
68
-
export KNOT_SERVER_PORT=443
69
-
docker compose up -d
103
+
export KNOT_SERVER_HOSTNAME="knot.example.com"
104
+
export SPINDLE_SERVER_HOSTNAME="spindle.example.com"
105
+
export KNOT_SERVER_OWNER="did:plc:yourdidgoeshere"
106
+
export KNOT_SERVER_PORT="443"
107
+
108
+
docker compose up --detach
70
109
```
71
110
72
111
This will setup everything for you including a reverse proxy.