Compare commits
3
Commits
7415beda73
...
04a3a4c5d4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
04a3a4c5d4 | ||
|
|
276f84b6ff | ||
|
|
a176ac0663 |
@@ -2,9 +2,9 @@ live/templ:
|
||||
templ generate --watch --proxy="http://localhost:8080" --cmd="go run ./web" --open-browser=false -v
|
||||
|
||||
live/sync_assets:
|
||||
go run github.com/air-verse/air@v1.61.7 \
|
||||
go run github.com/air-verse/air@latest \
|
||||
--build.cmd "templ generate --notify-proxy" \
|
||||
--build.bin "true" \
|
||||
--build.full_bin "true" \
|
||||
--build.delay "100" \
|
||||
--build.exclude_dir "" \
|
||||
--build.include_dir "web/static" \
|
||||
@@ -17,21 +17,8 @@ db/seed:
|
||||
sqlite3 ./internal/database/comfychan.db < ./internal/database/seed.sql
|
||||
|
||||
db/seed/f:
|
||||
rm ./internal/database/comfychan.db && sqlite3 ./internal/database/comfychan.db < ./internal/database/seed.sql
|
||||
rm ./internal/database/comfychan.db && make db/seed
|
||||
|
||||
|
||||
build:
|
||||
build:
|
||||
templ generate
|
||||
go build -o ./out/comfychan ./web
|
||||
|
||||
deploy:
|
||||
sudo mkdir -p /var/lib/comfychan/web/static
|
||||
sudo mkdir -p /var/lib/comfychan/internal/database
|
||||
sudo cp ./out/comfychan /srv/comfychan/
|
||||
sudo cp -r web/static/* /var/lib/comfychan/web/static/
|
||||
|
||||
db/deploy:
|
||||
sudo mkdir -p /var/lib/comfychan/internal/database
|
||||
sudo sqlite3 /var/lib/comfychan/internal/database/comfychan.db < ./internal/database/seed.sql
|
||||
sudo chown comfychan:comfychan /var/lib/private/comfychan/internal/database/comfychan.db
|
||||
|
||||
|
||||
@@ -1 +1,40 @@
|
||||
# comfychan
|
||||
|
||||
A small imageboard server written in Go, using [chi](https://github.com/go-chi/chi) for routing, [templ](https://templ.guide) for HTML templating, [htmx](https://htmx.org) for interactivity, and SQLite for storage.
|
||||
|
||||
## Requirements
|
||||
|
||||
- Go 1.25+
|
||||
- [templ CLI](https://templ.guide/quick-start/installation) (`go install github.com/a-h/templ/cmd/templ@latest`), matching the version in `go.mod`
|
||||
- `sqlite3` (for seeding the database)
|
||||
|
||||
## Development
|
||||
|
||||
```
|
||||
make live
|
||||
```
|
||||
|
||||
Starts the app with live reload: `templ` watches and regenerates `.templ` files, and static assets (`web/static`) trigger a browser refresh via proxy on `http://localhost:8080`.
|
||||
|
||||
Seed the database:
|
||||
|
||||
```
|
||||
make db/seed # seed
|
||||
make db/seed/f # wipe and reseed
|
||||
```
|
||||
|
||||
## Building
|
||||
|
||||
```
|
||||
make build
|
||||
```
|
||||
|
||||
Generates templates and builds a binary at `./out/comfychan`.
|
||||
|
||||
## Configuration
|
||||
|
||||
- `COMFYCHAN_DATA_DIR` — base directory for runtime data (SQLite database, uploaded media, static assets). Defaults to the current directory if unset.
|
||||
|
||||
## Deployment
|
||||
|
||||
`./deploy.sh` builds the binary and ships it to a self-hosted server running comfychan as a systemd service (see script for target host/paths).
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
HOST="root@mediaserver"
|
||||
BIN_DST="/srv/comfychan/comfychan"
|
||||
DATA_DIR="/var/lib/comfychan"
|
||||
SERVICE="comfychan"
|
||||
|
||||
echo "==> Building"
|
||||
templ generate
|
||||
CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -o ./out/comfychan ./web
|
||||
|
||||
echo "==> Ensuring remote directories exist"
|
||||
ssh "$HOST" "mkdir -p $DATA_DIR/web/static $DATA_DIR/internal/database"
|
||||
|
||||
echo "==> Uploading binary"
|
||||
# Upload beside the live binary, then atomically rename over it.
|
||||
scp ./out/comfychan "$HOST:${BIN_DST}.new"
|
||||
ssh "$HOST" "mv ${BIN_DST}.new $BIN_DST"
|
||||
|
||||
echo "==> Uploading static assets"
|
||||
scp -r web/static/. "$HOST:$DATA_DIR/web/static/"
|
||||
|
||||
echo "==> Restarting $SERVICE"
|
||||
ssh "$HOST" "systemctl restart $SERVICE && systemctl --no-pager status $SERVICE"
|
||||
|
||||
echo "==> Done"
|
||||
@@ -1,26 +1,16 @@
|
||||
github.com/a-h/templ v0.3.1001 h1:yHDTgexACdJttyiyamcTHXr2QkIeVF1MukLy44EAhMY=
|
||||
github.com/a-h/templ v0.3.1001/go.mod h1:oCZcnKRf5jjsGpf2yELzQfodLphd2mwecwG4Crk5HBo=
|
||||
github.com/a-h/templ v0.3.1020 h1:ypAT/L5ySWEnZ6Zft/5yfoWXYYkhFNvEFOeeqecg4tw=
|
||||
github.com/a-h/templ v0.3.1020/go.mod h1:A2DlK61v+K+NRoGnhmYbNYVmtYHcFO5/AisMvBdDxTM=
|
||||
github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c=
|
||||
github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4=
|
||||
github.com/go-chi/chi/v5 v5.2.5 h1:Eg4myHZBjyvJmAFjFvWgrqDTXFyOzjj7YIm3L3mu6Ug=
|
||||
github.com/go-chi/chi/v5 v5.2.5/go.mod h1:X7Gx4mteadT3eDOMTsXzmI4/rwUpOwBHLpAfupzFJP0=
|
||||
github.com/go-chi/chi/v5 v5.3.2 h1:5YQkICvTCSZ25hoRsyJazN0scjzKGiu4VAUc7H1o1nY=
|
||||
github.com/go-chi/chi/v5 v5.3.2/go.mod h1:R+tYY2hNuVUUjxoPtqUdgBqevM9s9njzkTLutVsOCto=
|
||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/mattn/go-sqlite3 v1.14.34 h1:3NtcvcUnFBPsuRcno8pUtupspG/GM+9nZ88zgJcp6Zk=
|
||||
github.com/mattn/go-sqlite3 v1.14.34/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
||||
github.com/mattn/go-sqlite3 v1.14.50 h1:dmdFvo1XG4MPzA4IkAmE9upVz/Nj31uRoM5+jC8hYbY=
|
||||
github.com/mattn/go-sqlite3 v1.14.50/go.mod h1:6JTjA44L93a0QCyJef5YvlPoKXntQPjzWv5gtm9sB6w=
|
||||
golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts=
|
||||
golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos=
|
||||
golang.org/x/crypto v0.55.0 h1:+KWHjbgOaAQ66dh/YlkZKHlz9ZUlq61AFirAR9ntP8M=
|
||||
golang.org/x/crypto v0.55.0/go.mod h1:uq0V9dE/fzQuJtbnL+2EhWOE63vo164FY8xqEnV9xis=
|
||||
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.36.0 h1:Iknbfm1afbgtwPTmHnS2gTM/6PPZfH+z2EFuOkSbqwc=
|
||||
golang.org/x/image v0.36.0/go.mod h1:YsWD2TyyGKiIX1kZlu9QfKIsQ4nAAK9bdgdrIsE7xy4=
|
||||
golang.org/x/image v0.45.0 h1:FMb1nTbH5H9vF55SriQHgFw5GnNL9Jg6L25BwXKzhB0=
|
||||
golang.org/x/image v0.45.0/go.mod h1:n62x/7RqlwXDvGsSU4u6IUTUf6KghUZ9Bt7cG/T9Fx4=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
|
||||
Reference in New Issue
Block a user