diff options
| author | Claude <noreply@anthropic.com> | 2026-08-05 23:14:29 -0500 |
|---|---|---|
| committer | Claude <noreply@anthropic.com> | 2026-08-05 23:14:29 -0500 |
| commit | 9f7c9f2f31acd7bc544dd988af1c8c2fe63ec504 (patch) | |
| tree | 6d7ab2a965c3e138a56c625197658ef2b324b045 /internal/tmpl | |
Initial commit of skiff scaffolding
Diffstat (limited to 'internal/tmpl')
| -rw-r--r-- | internal/tmpl/jail.conf.tmpl | 10 | ||||
| -rw-r--r-- | internal/tmpl/nginx-app.conf.tmpl | 15 | ||||
| -rw-r--r-- | internal/tmpl/post-receive.tmpl | 6 | ||||
| -rw-r--r-- | internal/tmpl/rc.d.tmpl | 17 | ||||
| -rw-r--r-- | internal/tmpl/tmpl.go | 59 |
5 files changed, 107 insertions, 0 deletions
diff --git a/internal/tmpl/jail.conf.tmpl b/internal/tmpl/jail.conf.tmpl new file mode 100644 index 0000000..446c8c8 --- /dev/null +++ b/internal/tmpl/jail.conf.tmpl @@ -0,0 +1,10 @@ +{{.Name}} { + path = "{{.JailRoot}}"; + host.hostname = "{{.Name}}.skiff.local"; + ip4.addr = "{{.IP}}"; + exec.start = "/bin/sh /etc/rc"; + exec.stop = "/bin/sh /etc/rc.shutdown"; + exec.clean; + mount.devfs; + persist; +} diff --git a/internal/tmpl/nginx-app.conf.tmpl b/internal/tmpl/nginx-app.conf.tmpl new file mode 100644 index 0000000..b55a332 --- /dev/null +++ b/internal/tmpl/nginx-app.conf.tmpl @@ -0,0 +1,15 @@ +upstream {{.Name}}_upstream { + server {{.IP}}:{{.Port}}; +} + +server { + listen 80; + server_name {{.ServerName}}; + + location / { + proxy_pass http://{{.Name}}_upstream; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} diff --git a/internal/tmpl/post-receive.tmpl b/internal/tmpl/post-receive.tmpl new file mode 100644 index 0000000..b06d46e --- /dev/null +++ b/internal/tmpl/post-receive.tmpl @@ -0,0 +1,6 @@ +#!/bin/sh +# Installed by `skiff new-app {{.Name}}`. Do not edit by hand - re-run +# new-app (or hand-edit the app name below) if this repo is ever renamed. +while read old new ref; do + skiff deploy --app "{{.Name}}" --old "$old" --new "$new" --ref "$ref" || exit 1 +done diff --git a/internal/tmpl/rc.d.tmpl b/internal/tmpl/rc.d.tmpl new file mode 100644 index 0000000..db940fd --- /dev/null +++ b/internal/tmpl/rc.d.tmpl @@ -0,0 +1,17 @@ +#!/bin/sh +# +# PROVIDE: {{.Name}} +# REQUIRE: LOGIN +# KEYWORD: shutdown + +. /etc/rc.subr + +name="{{.Name}}" +rcvar="{{.Name}}_enable" + +pidfile="/var/run/${name}.pid" +command="/usr/sbin/daemon" +command_args="-P ${pidfile} -r -t {{.Name}} /app/current/app" + +load_rc_config $name +run_rc_command "$1" diff --git a/internal/tmpl/tmpl.go b/internal/tmpl/tmpl.go new file mode 100644 index 0000000..68e917d --- /dev/null +++ b/internal/tmpl/tmpl.go @@ -0,0 +1,59 @@ +// Package tmpl embeds every file Skiff writes out to the host - jail +// config, rc.d script, nginx vhost, git hook - so the whole tool ships as +// one binary with nothing extra to install alongside it. +package tmpl + +import ( + "bytes" + _ "embed" + "text/template" +) + +//go:embed jail.conf.tmpl +var jailConf string + +//go:embed rc.d.tmpl +var rcScript string + +//go:embed nginx-app.conf.tmpl +var nginxApp string + +//go:embed post-receive.tmpl +var postReceive string + +func Render(text string, data any) (string, error) { + t, err := template.New("t").Parse(text) + if err != nil { + return "", err + } + var buf bytes.Buffer + if err := t.Execute(&buf, data); err != nil { + return "", err + } + return buf.String(), nil +} + +type JailConfData struct { + Name string + JailRoot string + IP string +} + +func JailConf(d JailConfData) (string, error) { return Render(jailConf, d) } + +type RCData struct{ Name string } + +func RCScript(d RCData) (string, error) { return Render(rcScript, d) } + +type NginxAppData struct { + Name string + IP string + Port int + ServerName string +} + +func NginxApp(d NginxAppData) (string, error) { return Render(nginxApp, d) } + +type PostReceiveData struct{ Name string } + +func PostReceive(d PostReceiveData) (string, error) { return Render(postReceive, d) } |
