Compare commits
137 Commits
Author | SHA1 | Date | |
---|---|---|---|
800c951385 | |||
eccdbd8d21 | |||
8439f4519b | |||
26eb63d3a2 | |||
3a33275185 | |||
238860053d | |||
21debac8ad | |||
632648ca8c | |||
c86eb849f3 | |||
3412be9484 | |||
5bb6311fea | |||
8cc54fb466 | |||
6f87b1f4da | |||
99379efa15 | |||
534a6e2bf9 | |||
c01fc59271 | |||
1030363896 | |||
633629ca91 | |||
26eb08d37c | |||
156c804d1a | |||
78ece703ef | |||
185649671f | |||
25da3aea19 | |||
a0206c3287 | |||
bd0a8e223e | |||
eeca47790b | |||
1db7805031 | |||
66630d84fb | |||
44b495a282 | |||
dfe30ecade | |||
f95156febb | |||
8896100e3d | |||
1ed8493bb7 | |||
3e61e45655 | |||
e10c14b3e0 | |||
77ef734baa | |||
b3584332c5 | |||
6fa6704f1c | |||
26c678a3e5 | |||
3a142ad595 | |||
1c317b3154 | |||
ade88cf810 | |||
f4ae33c00d | |||
13c1eaf77f | |||
f475f6e64d | |||
a93ad92ab9 | |||
23c807d508 | |||
3d01527e92 | |||
b19fdce370 | |||
a69e2ffa40 | |||
35df911072 | |||
bd24a3c84b | |||
0cdbfeaca9 | |||
afa88b6274 | |||
89651cdbf6 | |||
dabb473e0f | |||
5a3c4e7369 | |||
f7070590b8 | |||
e6b378c170 | |||
fe05a64eb0 | |||
7b3d66886d | |||
bc74994ac4 | |||
e20a67f7a4 | |||
01e2f3eca3 | |||
95a2a00cec | |||
b6058aa434 | |||
0adbbc3f06 | |||
46058ae5d6 | |||
94b367c2fb | |||
548efa254c | |||
68166c8d3a | |||
3a5fa69bf6 | |||
23be247cdb | |||
9a204d3808 | |||
00e36b6c77 | |||
3b34d50120 | |||
13b652d425 | |||
3bdef16173 | |||
968378e8bb | |||
6767df7f91 | |||
f9245c4145 | |||
e20156a2de | |||
4f9dee1e27 | |||
fe8a1376fa | |||
7619be6d11 | |||
1062595d7f | |||
d829c1efb2 | |||
a1f22433a0 | |||
43fc67ded6 | |||
8e7781a346 | |||
68dd90048f | |||
7bf54bbd8c | |||
9fa5818860 | |||
77859b3d94 | |||
9e26479f67 | |||
000797f930 | |||
1e8e06738b | |||
28dbf76789 | |||
93aa1ebd3b | |||
bf13344cbe | |||
62358e100c | |||
7ee1cd94dc | |||
893aa4db51 | |||
6b9da9dc15 | |||
44e08b62fd | |||
3feb35ea7b | |||
849fec6f01 | |||
d27ee1202b | |||
32ac21afd2 | |||
39959f041d | |||
124d702ec4 | |||
2587483733 | |||
575ec574dd | |||
815cf96374 | |||
2b6c24bc86 | |||
632774d051 | |||
1d6b419a15 | |||
2da7526265 | |||
92877b669e | |||
10168843e1 | |||
0889f9c7b1 | |||
084010e38c | |||
8158c195f5 | |||
174d15de5b | |||
56523795d5 | |||
32bdb3d709 | |||
b30d14af9a | |||
1220a37b60 | |||
a3e008c317 | |||
58498c87af | |||
fd9abb948a | |||
2b07f74cc1 | |||
ee4d2984dd | |||
dd80776bb1 | |||
d0e7ae9284 | |||
63433be0bb | |||
1a856e575e |
@ -1,14 +0,0 @@
|
|||||||
.env
|
|
||||||
/docker-compose.*
|
|
||||||
/result*
|
|
||||||
/.direnv/
|
|
||||||
/build/
|
|
||||||
|
|
||||||
# Client
|
|
||||||
/client/node_modules/
|
|
||||||
/client/.svelte-kit/
|
|
||||||
|
|
||||||
# Server
|
|
||||||
/server/client/
|
|
||||||
/server/tmp/
|
|
||||||
/server/build/
|
|
@ -5,7 +5,7 @@ on:
|
|||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
pull_request:
|
pull_request:
|
||||||
types: [opened, reopened, edited, auto_merge_enabled]
|
types: [opened, reopened, edited, auto_merge_enabled, synchronize]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
check:
|
check:
|
||||||
@ -15,19 +15,52 @@ jobs:
|
|||||||
contains(github.event.head_commit.message, 'bump:') == false &&
|
contains(github.event.head_commit.message, 'bump:') == false &&
|
||||||
contains(github.event.head_commit.message, 'Merge pull request') == false
|
contains(github.event.head_commit.message, 'Merge pull request') == false
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- uses: actions/checkout@v4
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Install Nix
|
- name: Install nix
|
||||||
uses: cachix/install-nix-action@v31
|
uses: cachix/install-nix-action@v31
|
||||||
with:
|
with:
|
||||||
nix_path: nixpkgs=channel:nixos-unstable
|
nix_path: nixpkgs=channel:nixos-unstable
|
||||||
|
|
||||||
- name: Use Cachix
|
- name: Use cachix
|
||||||
uses: cachix/cachix-action@v16
|
uses: cachix/cachix-action@v16
|
||||||
with:
|
with:
|
||||||
name: trevstack
|
name: trevstack
|
||||||
authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
|
authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
|
||||||
|
|
||||||
- name: Check
|
- run: nix flake check --accept-flake-config
|
||||||
run: nix flake check
|
|
||||||
|
push:
|
||||||
|
name: push
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: check
|
||||||
|
if: ${{ github.event_name != 'pull_request' }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: "0"
|
||||||
|
|
||||||
|
# https://github.com/actions/checkout/issues/13
|
||||||
|
- name: Push to Production
|
||||||
|
run: |
|
||||||
|
git config user.name "github-actions[bot]"
|
||||||
|
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
||||||
|
git push origin main:production
|
||||||
|
|
||||||
|
update:
|
||||||
|
name: update
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: ${{ contains(github.event.head_commit.message, 'Merge pull request') }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: "0"
|
||||||
|
|
||||||
|
# https://github.com/actions/checkout/issues/13
|
||||||
|
- name: Push to Production
|
||||||
|
run: |
|
||||||
|
git config user.name "github-actions[bot]"
|
||||||
|
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
||||||
|
git push origin main:production
|
||||||
|
@ -9,43 +9,31 @@ jobs:
|
|||||||
check:
|
check:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- uses: actions/checkout@v4
|
||||||
uses: actions/checkout@v4
|
- uses: ./.actions/init
|
||||||
|
|
||||||
- name: Install Nix
|
|
||||||
uses: cachix/install-nix-action@v31
|
|
||||||
with:
|
with:
|
||||||
nix_path: nixpkgs=channel:nixos-unstable
|
token: "${{ secrets.CACHIX_AUTH_TOKEN }}"
|
||||||
|
|
||||||
- name: Use Cachix
|
- run: nix flake check
|
||||||
uses: cachix/cachix-action@v16
|
|
||||||
with:
|
|
||||||
name: trevstack
|
|
||||||
authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
|
|
||||||
|
|
||||||
- name: Check
|
|
||||||
run: nix flake check
|
|
||||||
|
|
||||||
release:
|
release:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: check
|
needs: check
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- uses: actions/checkout@v4
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Install Nix
|
- name: Install nix
|
||||||
uses: cachix/install-nix-action@v31
|
uses: cachix/install-nix-action@v31
|
||||||
with:
|
with:
|
||||||
nix_path: nixpkgs=channel:nixos-unstable
|
nix_path: nixpkgs=channel:nixos-unstable
|
||||||
|
|
||||||
- name: Use Cachix
|
- name: Use cachix
|
||||||
uses: cachix/cachix-action@v16
|
uses: cachix/cachix-action@v16
|
||||||
with:
|
with:
|
||||||
name: trevstack
|
name: trevstack
|
||||||
authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
|
authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
|
||||||
|
|
||||||
- name: Build
|
- run: >
|
||||||
run: >
|
|
||||||
nix build
|
nix build
|
||||||
.#trevstack-linux-amd64
|
.#trevstack-linux-amd64
|
||||||
.#trevstack-linux-arm64
|
.#trevstack-linux-arm64
|
||||||
@ -54,46 +42,85 @@ jobs:
|
|||||||
.#trevstack-darwin-amd64
|
.#trevstack-darwin-amd64
|
||||||
.#trevstack-darwin-arm64
|
.#trevstack-darwin-arm64
|
||||||
|
|
||||||
- name: Release
|
- uses: akkuman/gitea-release-action@v1
|
||||||
uses: akkuman/gitea-release-action@v1
|
|
||||||
with:
|
with:
|
||||||
files: |-
|
files: |-
|
||||||
result*/bin/*
|
result*/bin/*
|
||||||
|
|
||||||
# https://docs.docker.com/build/ci/github-actions/manage-tags-labels/
|
|
||||||
package:
|
package:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: release # Wait for binary cache to propagate
|
needs: release
|
||||||
steps:
|
steps:
|
||||||
- name: Docker meta
|
- uses: actions/checkout@v4
|
||||||
id: meta
|
|
||||||
uses: docker/metadata-action@v5
|
- name: Install nix
|
||||||
|
uses: cachix/install-nix-action@v31
|
||||||
with:
|
with:
|
||||||
# list of Docker images to use as base name for tags
|
nix_path: nixpkgs=channel:nixos-unstable
|
||||||
images: |
|
|
||||||
${{ github.repository }}
|
|
||||||
ghcr.io/${{ github.repository }}
|
|
||||||
# generate Docker tags based on the following events/attributes
|
|
||||||
tags: |
|
|
||||||
type=ref,event=branch
|
|
||||||
type=semver,pattern={{version}}
|
|
||||||
|
|
||||||
- name: Login to Gitea Container Registry
|
- name: Use cachix
|
||||||
uses: docker/login-action@v3
|
uses: cachix/cachix-action@v16
|
||||||
with:
|
with:
|
||||||
registry: ${{ vars.URL }}
|
name: trevstack
|
||||||
username: ${{ vars.USERNAME }}
|
authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
|
||||||
password: ${{ secrets.PASSWORD }}
|
|
||||||
|
|
||||||
- name: Set up QEMU
|
- uses: docker/login-action@v3
|
||||||
uses: docker/setup-qemu-action@v3
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Build and push
|
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
with:
|
||||||
push: true
|
registry: ${{ github.server_url }}
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
username: ${{ github.actor }}
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
password: ${{ secrets.PAT }}
|
||||||
|
|
||||||
|
- name: Build & load images
|
||||||
|
run: |
|
||||||
|
nix build .#trevstack-linux-amd64-image && ./result | docker load
|
||||||
|
nix build .#trevstack-linux-arm64-image && ./result | docker load
|
||||||
|
nix build .#trevstack-linux-arm-image && ./result | docker load
|
||||||
|
|
||||||
|
- name: Set env
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
REGISTRY=$(basename ${{ github.server_url }})
|
||||||
|
|
||||||
|
NR=${{ github.repository }}
|
||||||
|
NAMESPACE="${NR%%/*}"
|
||||||
|
REPOSITORY="${NR##*/}"
|
||||||
|
|
||||||
|
TAG=${{ github.ref_name }}
|
||||||
|
VERSION=${TAG#v}
|
||||||
|
|
||||||
|
echo "REGISTRY=${REGISTRY}" >> $GITHUB_ENV
|
||||||
|
echo "NAMESPACE=${NAMESPACE}" >> $GITHUB_ENV
|
||||||
|
echo "REPOSITORY=${REPOSITORY}" >> $GITHUB_ENV
|
||||||
|
echo "VERSION=${VERSION}" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Push images
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
docker image tag $REPOSITORY:$VERSION-amd64 $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-amd64
|
||||||
|
docker push $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-amd64
|
||||||
|
|
||||||
|
docker image tag $REPOSITORY:$VERSION-arm64 $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-arm64
|
||||||
|
docker push $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-arm64
|
||||||
|
|
||||||
|
docker image tag $REPOSITORY:$VERSION-arm $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-arm
|
||||||
|
docker push $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-arm
|
||||||
|
|
||||||
|
- name: Push manifest
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
docker manifest create $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION \
|
||||||
|
$REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-amd64 \
|
||||||
|
$REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-arm64 \
|
||||||
|
$REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-arm
|
||||||
|
docker manifest annotate $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-amd64 --arch amd64
|
||||||
|
docker manifest annotate $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-arm64 --arch arm64
|
||||||
|
docker manifest annotate $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-arm --arch arm
|
||||||
|
docker manifest push $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION
|
||||||
|
|
||||||
|
docker manifest create $REGISTRY/$NAMESPACE/$REPOSITORY:latest \
|
||||||
|
$REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-amd64 \
|
||||||
|
$REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-arm64 \
|
||||||
|
$REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-arm
|
||||||
|
docker manifest annotate $REGISTRY/$NAMESPACE/$REPOSITORY:latest $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-amd64 --arch amd64
|
||||||
|
docker manifest annotate $REGISTRY/$NAMESPACE/$REPOSITORY:latest $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-arm64 --arch arm64
|
||||||
|
docker manifest annotate $REGISTRY/$NAMESPACE/$REPOSITORY:latest $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-arm --arch arm
|
||||||
|
@ -9,31 +9,53 @@ jobs:
|
|||||||
update:
|
update:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- uses: actions/checkout@v4
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Install Nix
|
- name: Install nix
|
||||||
uses: cachix/install-nix-action@v31
|
uses: cachix/install-nix-action@v31
|
||||||
with:
|
with:
|
||||||
nix_path: nixpkgs=channel:nixos-unstable
|
nix_path: nixpkgs=channel:nixos-unstable
|
||||||
|
|
||||||
- name: Use Cachix
|
- name: Use cachix
|
||||||
uses: cachix/cachix-action@v16
|
uses: cachix/cachix-action@v16
|
||||||
with:
|
with:
|
||||||
name: trevstack
|
name: trevstack
|
||||||
authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
|
authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
|
||||||
|
|
||||||
# https://github.com/actions/checkout/issues/13
|
# https://github.com/actions/checkout/issues/13
|
||||||
- name: Set Git Config
|
- name: Set git config
|
||||||
run: |
|
run: |
|
||||||
git config user.name "github-actions[bot]"
|
git config user.name "github-actions[bot]"
|
||||||
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
||||||
|
git checkout -B update
|
||||||
|
|
||||||
- name: Update
|
- run: nix run .#update
|
||||||
run: nix run .#update
|
|
||||||
|
|
||||||
- name: Create Pull Request
|
- name: Create pull request
|
||||||
uses: peter-evans/create-pull-request@v7
|
env:
|
||||||
with:
|
PAT: ${{ secrets.PAT }}
|
||||||
title: update
|
run: |
|
||||||
body: automatic update
|
git push origin update --force
|
||||||
|
|
||||||
|
URL="${{ gitea.server_url }}"
|
||||||
|
REPO_OWNER_SLASH_NAME="${{ gitea.repository }}"
|
||||||
|
|
||||||
|
PRS=$(curl -s -X GET -H "Authorization: token $PAT" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
"$URL/api/v1/repos/$REPO_OWNER_SLASH_NAME/pulls?state=open")
|
||||||
|
PR_UPDATE=$(echo "$PRS" | jq -cr '.[] | select( .title | contains("update") )')
|
||||||
|
|
||||||
|
if [ -z "$PR_UPDATE" ]; then
|
||||||
|
echo "Creating pull request"
|
||||||
|
|
||||||
|
PR_CREATE=$(curl -s -X POST -H "Authorization: token $PAT" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"title":"update","body":"automatic update","head":"update","base":"main"}' \
|
||||||
|
"$URL/api/v1/repos/$REPO_OWNER_SLASH_NAME/pulls")
|
||||||
|
PR_NUMBER=$(echo "$PR_CREATE" | jq -r '.number')
|
||||||
|
|
||||||
|
curl -s -X POST -H "Authorization: token $PAT" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"Do":"merge","merge_when_checks_succeed":true,"delete_branch_after_merge":true}' \
|
||||||
|
"$URL/api/v1/repos/$REPO_OWNER_SLASH_NAME/pulls/$PR_NUMBER/merge"
|
||||||
|
fi
|
||||||
|
47
.github/workflows/check.yaml
vendored
47
.github/workflows/check.yaml
vendored
@ -5,7 +5,7 @@ on:
|
|||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
pull_request:
|
pull_request:
|
||||||
types: [opened, reopened, edited, auto_merge_enabled]
|
types: [opened, reopened, edited, auto_merge_enabled, synchronize]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
check:
|
check:
|
||||||
@ -15,19 +15,52 @@ jobs:
|
|||||||
contains(github.event.head_commit.message, 'bump:') == false &&
|
contains(github.event.head_commit.message, 'bump:') == false &&
|
||||||
contains(github.event.head_commit.message, 'Merge pull request') == false
|
contains(github.event.head_commit.message, 'Merge pull request') == false
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- uses: actions/checkout@v4
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Install Nix
|
- name: Install nix
|
||||||
uses: cachix/install-nix-action@v31
|
uses: cachix/install-nix-action@v31
|
||||||
with:
|
with:
|
||||||
nix_path: nixpkgs=channel:nixos-unstable
|
nix_path: nixpkgs=channel:nixos-unstable
|
||||||
|
|
||||||
- name: Use Cachix
|
- name: Use cachix
|
||||||
uses: cachix/cachix-action@v16
|
uses: cachix/cachix-action@v16
|
||||||
with:
|
with:
|
||||||
name: trevstack
|
name: trevstack
|
||||||
authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
|
authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
|
||||||
|
|
||||||
- name: Check
|
- run: nix flake check --accept-flake-config
|
||||||
run: nix flake check
|
|
||||||
|
push:
|
||||||
|
name: push
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: check
|
||||||
|
if: ${{ github.event_name != 'pull_request' }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: "0"
|
||||||
|
|
||||||
|
# https://github.com/actions/checkout/issues/13
|
||||||
|
- name: Push to Production
|
||||||
|
run: |
|
||||||
|
git config user.name "github-actions[bot]"
|
||||||
|
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
||||||
|
git push origin main:production
|
||||||
|
|
||||||
|
update:
|
||||||
|
name: update
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: ${{ contains(github.event.head_commit.message, 'Merge pull request') }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: "0"
|
||||||
|
|
||||||
|
# https://github.com/actions/checkout/issues/13
|
||||||
|
- name: Push to Production
|
||||||
|
run: |
|
||||||
|
git config user.name "github-actions[bot]"
|
||||||
|
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
||||||
|
git push origin main:production
|
||||||
|
125
.github/workflows/release.yaml
vendored
125
.github/workflows/release.yaml
vendored
@ -13,43 +13,31 @@ jobs:
|
|||||||
check:
|
check:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- uses: actions/checkout@v4
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Install Nix
|
- name: Install nix
|
||||||
uses: cachix/install-nix-action@v31
|
uses: cachix/install-nix-action@v31
|
||||||
with:
|
with:
|
||||||
nix_path: nixpkgs=channel:nixos-unstable
|
nix_path: nixpkgs=channel:nixos-unstable
|
||||||
|
|
||||||
- name: Use Cachix
|
- name: Use cachix
|
||||||
uses: cachix/cachix-action@v16
|
uses: cachix/cachix-action@v16
|
||||||
with:
|
with:
|
||||||
name: trevstack
|
name: trevstack
|
||||||
authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
|
authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
|
||||||
|
|
||||||
- name: Check
|
- run: nix flake check
|
||||||
run: nix flake check
|
|
||||||
|
|
||||||
release:
|
release:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: check
|
needs: check
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- uses: actions/checkout@v4
|
||||||
uses: actions/checkout@v4
|
- uses: ./.actions/init
|
||||||
|
|
||||||
- name: Install Nix
|
|
||||||
uses: cachix/install-nix-action@v31
|
|
||||||
with:
|
with:
|
||||||
nix_path: nixpkgs=channel:nixos-unstable
|
token: "${{ secrets.CACHIX_AUTH_TOKEN }}"
|
||||||
|
|
||||||
- name: Use Cachix
|
- run: >
|
||||||
uses: cachix/cachix-action@v16
|
|
||||||
with:
|
|
||||||
name: trevstack
|
|
||||||
authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
run: >
|
|
||||||
nix build
|
nix build
|
||||||
.#trevstack-linux-amd64
|
.#trevstack-linux-amd64
|
||||||
.#trevstack-linux-arm64
|
.#trevstack-linux-arm64
|
||||||
@ -58,53 +46,86 @@ jobs:
|
|||||||
.#trevstack-darwin-amd64
|
.#trevstack-darwin-amd64
|
||||||
.#trevstack-darwin-arm64
|
.#trevstack-darwin-arm64
|
||||||
|
|
||||||
- name: Release
|
- uses: softprops/action-gh-release@v2
|
||||||
uses: softprops/action-gh-release@v2
|
|
||||||
with:
|
with:
|
||||||
generate_release_notes: true
|
generate_release_notes: true
|
||||||
files: |-
|
files: |-
|
||||||
result*/bin/*
|
result*/bin/*
|
||||||
|
|
||||||
# https://docs.docker.com/build/ci/github-actions/manage-tags-labels/
|
|
||||||
package:
|
package:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: release # Wait for binary cache to propagate
|
needs: release
|
||||||
steps:
|
steps:
|
||||||
- name: Docker meta
|
- uses: actions/checkout@v4
|
||||||
id: meta
|
|
||||||
uses: docker/metadata-action@v5
|
|
||||||
with:
|
|
||||||
# list of Docker images to use as base name for tags
|
|
||||||
images: |
|
|
||||||
${{ github.repository }}
|
|
||||||
ghcr.io/${{ github.repository }}
|
|
||||||
# generate Docker tags based on the following events/attributes
|
|
||||||
tags: |
|
|
||||||
type=ref,event=branch
|
|
||||||
type=semver,pattern={{version}}
|
|
||||||
|
|
||||||
- name: Login to Docker Hub
|
- name: Install nix
|
||||||
uses: docker/login-action@v3
|
uses: cachix/install-nix-action@v31
|
||||||
with:
|
with:
|
||||||
username: ${{ vars.DOCKERHUB_USERNAME }}
|
nix_path: nixpkgs=channel:nixos-unstable
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Login to GitHub Container Registry
|
- name: Use cachix
|
||||||
uses: docker/login-action@v3
|
uses: cachix/cachix-action@v16
|
||||||
|
with:
|
||||||
|
name: trevstack
|
||||||
|
authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
|
||||||
|
|
||||||
|
- uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.actor }}
|
username: ${{ github.actor }}
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Set up QEMU
|
- name: Build & load images
|
||||||
uses: docker/setup-qemu-action@v3
|
run: |
|
||||||
|
nix build .#trevstack-linux-amd64-image && ./result | docker load
|
||||||
|
nix build .#trevstack-linux-arm64-image && ./result | docker load
|
||||||
|
nix build .#trevstack-linux-arm-image && ./result | docker load
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set env
|
||||||
uses: docker/setup-buildx-action@v3
|
shell: bash
|
||||||
|
run: |
|
||||||
|
REGISTRY=$(basename ${{ github.server_url }})
|
||||||
|
|
||||||
- name: Build and push
|
NR=${{ github.repository }}
|
||||||
uses: docker/build-push-action@v6
|
NAMESPACE="${NR%%/*}"
|
||||||
with:
|
REPOSITORY="${NR##*/}"
|
||||||
push: true
|
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
TAG=${{ github.ref_name }}
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
VERSION=${TAG#v}
|
||||||
|
|
||||||
|
echo "REGISTRY=${REGISTRY}" >> $GITHUB_ENV
|
||||||
|
echo "NAMESPACE=${NAMESPACE}" >> $GITHUB_ENV
|
||||||
|
echo "REPOSITORY=${REPOSITORY}" >> $GITHUB_ENV
|
||||||
|
echo "VERSION=${VERSION}" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Push images
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
docker image tag $REPOSITORY:$VERSION-amd64 $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-amd64
|
||||||
|
docker push $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-amd64
|
||||||
|
|
||||||
|
docker image tag $REPOSITORY:$VERSION-arm64 $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-arm64
|
||||||
|
docker push $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-arm64
|
||||||
|
|
||||||
|
docker image tag $REPOSITORY:$VERSION-arm $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-arm
|
||||||
|
docker push $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-arm
|
||||||
|
|
||||||
|
- name: Push manifest
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
docker manifest create $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION \
|
||||||
|
$REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-amd64 \
|
||||||
|
$REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-arm64 \
|
||||||
|
$REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-arm
|
||||||
|
docker manifest annotate $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-amd64 --arch amd64
|
||||||
|
docker manifest annotate $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-arm64 --arch arm64
|
||||||
|
docker manifest annotate $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-arm --arch arm
|
||||||
|
docker manifest push $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION
|
||||||
|
|
||||||
|
docker manifest create $REGISTRY/$NAMESPACE/$REPOSITORY:latest \
|
||||||
|
$REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-amd64 \
|
||||||
|
$REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-arm64 \
|
||||||
|
$REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-arm
|
||||||
|
docker manifest annotate $REGISTRY/$NAMESPACE/$REPOSITORY:latest $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-amd64 --arch amd64
|
||||||
|
docker manifest annotate $REGISTRY/$NAMESPACE/$REPOSITORY:latest $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-arm64 --arch arm64
|
||||||
|
docker manifest annotate $REGISTRY/$NAMESPACE/$REPOSITORY:latest $REGISTRY/$NAMESPACE/$REPOSITORY:$VERSION-arm --arch arm
|
||||||
|
20
.github/workflows/update.yaml
vendored
20
.github/workflows/update.yaml
vendored
@ -13,36 +13,36 @@ jobs:
|
|||||||
update:
|
update:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- uses: actions/checkout@v4
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Install Nix
|
- name: Install nix
|
||||||
uses: cachix/install-nix-action@v31
|
uses: cachix/install-nix-action@v31
|
||||||
with:
|
with:
|
||||||
nix_path: nixpkgs=channel:nixos-unstable
|
nix_path: nixpkgs=channel:nixos-unstable
|
||||||
|
|
||||||
- name: Use Cachix
|
- name: Use cachix
|
||||||
uses: cachix/cachix-action@v16
|
uses: cachix/cachix-action@v16
|
||||||
with:
|
with:
|
||||||
name: trevstack
|
name: trevstack
|
||||||
authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
|
authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
|
||||||
|
|
||||||
# https://github.com/actions/checkout/issues/13
|
# https://github.com/actions/checkout/issues/13
|
||||||
- name: Set Git Config
|
- name: Set git config
|
||||||
run: |
|
run: |
|
||||||
git config user.name "github-actions[bot]"
|
git config user.name "github-actions[bot]"
|
||||||
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
||||||
|
|
||||||
- name: Update
|
- run: nix run .#update
|
||||||
run: nix run .#update
|
|
||||||
|
|
||||||
- name: Create Pull Request
|
- name: Create pull request
|
||||||
|
id: cpr
|
||||||
uses: peter-evans/create-pull-request@v7
|
uses: peter-evans/create-pull-request@v7
|
||||||
with:
|
with:
|
||||||
|
branch: update
|
||||||
title: update
|
title: update
|
||||||
body: automatic update
|
body: automatic update
|
||||||
|
|
||||||
- name: Enable Automerge
|
- name: Enable automerge
|
||||||
run: gh pr merge --merge --auto "1"
|
run: gh pr merge --merge --auto "${{ steps.cpr.outputs.pull-request-number }}"
|
||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ secrets.PAT }}
|
GH_TOKEN: ${{ secrets.PAT }}
|
||||||
|
@ -19,7 +19,9 @@ echo "${version} -> ${next_version}"
|
|||||||
echo "bumping openapi"
|
echo "bumping openapi"
|
||||||
cd "${git_root}"
|
cd "${git_root}"
|
||||||
sed -i -e "s/${version}/${next_version}/g" openapi.yaml
|
sed -i -e "s/${version}/${next_version}/g" openapi.yaml
|
||||||
|
sed -i -e "s/${version}/${next_version}/g" client/static/openapi/openapi.yaml
|
||||||
git add openapi.yaml
|
git add openapi.yaml
|
||||||
|
git add client/static/openapi/openapi.yaml
|
||||||
|
|
||||||
echo "bumping client"
|
echo "bumping client"
|
||||||
cd "${git_root}/client"
|
cd "${git_root}/client"
|
||||||
|
@ -5,13 +5,14 @@ updated=false
|
|||||||
|
|
||||||
echo "updating nix flake"
|
echo "updating nix flake"
|
||||||
cd "${git_root}"
|
cd "${git_root}"
|
||||||
nix flake update
|
nix flake update --accept-flake-config
|
||||||
if ! git diff --exit-code flake.lock; then
|
if ! git diff --exit-code flake.lock; then
|
||||||
git add flake.lock
|
git add flake.lock
|
||||||
git commit -m "build(nix): updated nix dependencies"
|
git commit -m "build(nix): updated nix dependencies"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "updating protobuf deps"
|
echo "updating protobuf deps"
|
||||||
|
cd "${git_root}/proto"
|
||||||
buf dep update
|
buf dep update
|
||||||
if ! git diff --exit-code buf.lock; then
|
if ! git diff --exit-code buf.lock; then
|
||||||
git add buf.lock
|
git add buf.lock
|
||||||
|
2
.vscode/extensions.json
vendored
2
.vscode/extensions.json
vendored
@ -2,7 +2,7 @@
|
|||||||
"recommendations": [
|
"recommendations": [
|
||||||
"golang.go",
|
"golang.go",
|
||||||
"dorzey.vscode-sqlfluff",
|
"dorzey.vscode-sqlfluff",
|
||||||
"zxh404.vscode-proto3",
|
"bufbuild.vscode-buf",
|
||||||
"dbaeumer.vscode-eslint",
|
"dbaeumer.vscode-eslint",
|
||||||
"svelte.svelte-vscode",
|
"svelte.svelte-vscode",
|
||||||
"esbenp.prettier-vscode"
|
"esbenp.prettier-vscode"
|
||||||
|
4
.vscode/settings.json
vendored
4
.vscode/settings.json
vendored
@ -18,8 +18,8 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
// Proto
|
// Proto
|
||||||
"[proto3]": {
|
"[proto]": {
|
||||||
"editor.defaultFormatter": "zxh404.vscode-proto3"
|
"editor.defaultFormatter": "bufbuild.vscode-buf"
|
||||||
},
|
},
|
||||||
|
|
||||||
// ESLint
|
// ESLint
|
||||||
|
29
Dockerfile
29
Dockerfile
@ -1,29 +0,0 @@
|
|||||||
# Nix builder
|
|
||||||
FROM nixos/nix:latest AS builder
|
|
||||||
|
|
||||||
# Copy our source and setup our working dir.
|
|
||||||
COPY . /tmp/build
|
|
||||||
WORKDIR /tmp/build
|
|
||||||
|
|
||||||
# Build our Nix environment
|
|
||||||
RUN nix \
|
|
||||||
--extra-experimental-features "nix-command flakes" \
|
|
||||||
--option filter-syscalls false \
|
|
||||||
--accept-flake-config \
|
|
||||||
build
|
|
||||||
|
|
||||||
# Copy the Nix store closure into a directory. The Nix store closure is the
|
|
||||||
# entire set of Nix store values that we need for our build.
|
|
||||||
RUN mkdir /tmp/nix-store-closure
|
|
||||||
RUN cp -R $(nix-store -qR result/) /tmp/nix-store-closure
|
|
||||||
|
|
||||||
# Final image is based on scratch. We copy a bunch of Nix dependencies
|
|
||||||
# but they're fully self-contained so we don't need Nix anymore.
|
|
||||||
FROM scratch
|
|
||||||
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
# Copy /nix/store
|
|
||||||
COPY --from=builder /tmp/nix-store-closure /nix/store
|
|
||||||
COPY --from=builder /tmp/build/result /app
|
|
||||||
CMD ["/app/bin/trevstack"]
|
|
50
README.md
50
README.md
@ -7,6 +7,7 @@ This is a CRUD app to use as a template for starting projects
|
|||||||
- **Communicate anywhere**. Define a [protocol buffer](https://protobuf.dev/), and [Connect](https://connectrpc.com/) generates type-safe code to facilitate communication between the server and any client (web, mobile, embedded, etc). The protocol buffers can contain annotations to validate fields on the client and server. For clients that cannot use Connect, an OpenAPI spec is also generated
|
- **Communicate anywhere**. Define a [protocol buffer](https://protobuf.dev/), and [Connect](https://connectrpc.com/) generates type-safe code to facilitate communication between the server and any client (web, mobile, embedded, etc). The protocol buffers can contain annotations to validate fields on the client and server. For clients that cannot use Connect, an OpenAPI spec is also generated
|
||||||
- **Build anywhere**. The dev environment, testing and building is all declared in a single [Nix](https://nixos.org/) flake. Every developer and server can use the same environment
|
- **Build anywhere**. The dev environment, testing and building is all declared in a single [Nix](https://nixos.org/) flake. Every developer and server can use the same environment
|
||||||
- **Deploy anywhere**. CI/CD is already set up using github actions. New versions are automatically released for every major platform, along with a docker image. The binaries created require zero run-time dependencies and are relatively small (this app is 26 MiB)
|
- **Deploy anywhere**. CI/CD is already set up using github actions. New versions are automatically released for every major platform, along with a docker image. The binaries created require zero run-time dependencies and are relatively small (this app is 26 MiB)
|
||||||
|
- Can be entirely self-hosted
|
||||||
- Authentication is rolled in, including API key, fingerprint & passkey
|
- Authentication is rolled in, including API key, fingerprint & passkey
|
||||||
- Automatic database migration on startup
|
- Automatic database migration on startup
|
||||||
- Light & dark modes with the [catppuccin](https://catppuccin.com/palette/) color palette
|
- Light & dark modes with the [catppuccin](https://catppuccin.com/palette/) color palette
|
||||||
@ -27,7 +28,7 @@ URL=http://localhost:5173
|
|||||||
DATABASE_URL=sqlite:/home/trev/.config/trevstack/sqlite.db
|
DATABASE_URL=sqlite:/home/trev/.config/trevstack/sqlite.db
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Run `treli`
|
4. Run `treli` to start the server & client
|
||||||
|
|
||||||
It's that simple. If you're feeling fancy, install [direnv](https://direnv.net/) and the dev environment will load automatically.
|
It's that simple. If you're feeling fancy, install [direnv](https://direnv.net/) and the dev environment will load automatically.
|
||||||
|
|
||||||
@ -37,11 +38,52 @@ It's that simple. If you're feeling fancy, install [direnv](https://direnv.net/)
|
|||||||
|
|
||||||
- `nix run #bump [major | minor]`: bumps the current version up one. Defaults to "patch" (0.0.1 -> 0.0.2)
|
- `nix run #bump [major | minor]`: bumps the current version up one. Defaults to "patch" (0.0.1 -> 0.0.2)
|
||||||
|
|
||||||
- `buf lint` & `buf generate`: Lints and generates code from protocol buffers
|
- `nix build [#trevstack-(GOOS)-(GOARCH)]`: builds the application. Defaults to building for your current platform, but can be built to many by specifying the GOOS and GOARCH values
|
||||||
|
|
||||||
- `sqlc vet` & `sqlc generate`: Verifies and generates code from SQL files
|
- `nix flake check`: runs all validations
|
||||||
|
|
||||||
- `dbmate new` & `dbmate up`: Creates a new migration file and runs pending migrations
|
- `buf lint proto` & `buf generate`: lints and generates code from protocol buffers
|
||||||
|
|
||||||
|
- `sqlc vet` & `sqlc generate`: verifies and generates code from SQL files
|
||||||
|
|
||||||
|
- `dbmate new` & `dbmate up`: creates a new migration file and runs pending migrations
|
||||||
|
|
||||||
|
### Github Actions
|
||||||
|
|
||||||
|
To use github actions for CI/CD, you'll need to create a fine-grained personal access token for the repository with the permissions:
|
||||||
|
|
||||||
|
- Contents (read and write)
|
||||||
|
- Pull requests (read and write)
|
||||||
|
|
||||||
|
And change some settings for the repository:
|
||||||
|
|
||||||
|
- General -> Allow auto-merge: true
|
||||||
|
- Rules -> Rulesets -> New ruleset
|
||||||
|
- Branch targeting criteria: Default
|
||||||
|
- Branch rules
|
||||||
|
- Require status checks to pass -> Add checks -> "check"
|
||||||
|
- Actions -> General -> Workflow permissions
|
||||||
|
- Read and write permissions: true
|
||||||
|
- Allow GitHub Actions to create and approve pull requests: true
|
||||||
|
- Secrets and variables -> Actions -> Repository secrets
|
||||||
|
- PAT: (personal access token)
|
||||||
|
|
||||||
|
### Gitea Actions
|
||||||
|
|
||||||
|
To use gitea actions for CI/CD, you'll need to create an [API token](https://docs.gitea.com/development/api-usage) with the scopes:
|
||||||
|
|
||||||
|
- write:repository
|
||||||
|
- write:package
|
||||||
|
|
||||||
|
And change some settings for the repository:
|
||||||
|
|
||||||
|
- Repository -> Delete pull request branch after merge by default: true
|
||||||
|
- Branches -> Add New Rule
|
||||||
|
- Protected Branch Name Pattern: main
|
||||||
|
- Enable Status Check: true
|
||||||
|
- Status check patterns: Check / check\*
|
||||||
|
- Actions -> Secrets
|
||||||
|
- PAT: (API token)
|
||||||
|
|
||||||
## Components
|
## Components
|
||||||
|
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
version: v2
|
version: v2
|
||||||
clean: true
|
clean: true
|
||||||
|
inputs:
|
||||||
|
- directory: proto
|
||||||
|
|
||||||
managed:
|
managed:
|
||||||
enabled: true
|
enabled: true
|
||||||
override:
|
override:
|
||||||
|
6
buf.lock
6
buf.lock
@ -1,6 +0,0 @@
|
|||||||
# Generated by buf. DO NOT EDIT.
|
|
||||||
version: v2
|
|
||||||
deps:
|
|
||||||
- name: buf.build/bufbuild/protovalidate
|
|
||||||
commit: 8976f5be98c146529b1cc15cd2012b60
|
|
||||||
digest: b5:5d513af91a439d9e78cacac0c9455c7cb885a8737d30405d0b91974fe05276d19c07a876a51a107213a3d01b83ecc912996cdad4cddf7231f91379079cf7488d
|
|
2669
client/package-lock.json
generated
2669
client/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "trevstack",
|
"name": "trevstack",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "0.0.26",
|
"version": "0.0.47",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite dev",
|
"dev": "vite dev",
|
||||||
@ -17,35 +17,35 @@
|
|||||||
"@bufbuild/protovalidate": "^0.1.1",
|
"@bufbuild/protovalidate": "^0.1.1",
|
||||||
"@connectrpc/connect": "^2.0.2",
|
"@connectrpc/connect": "^2.0.2",
|
||||||
"@connectrpc/connect-web": "^2.0.2",
|
"@connectrpc/connect-web": "^2.0.2",
|
||||||
"@eslint/compat": "^1.2.9",
|
"@eslint/compat": "^1.3.1",
|
||||||
"@eslint/js": "^9.18.0",
|
"@eslint/js": "^9.18.0",
|
||||||
"@ianvs/prettier-plugin-sort-imports": "^4.4.1",
|
"@ianvs/prettier-plugin-sort-imports": "^4.4.2",
|
||||||
"@lucide/svelte": "^0.479.0",
|
"@lucide/svelte": "^0.479.0",
|
||||||
"@scalar/api-reference": "^1.28.33",
|
"@scalar/api-reference": "^1.32.1",
|
||||||
"@simplewebauthn/browser": "^13.1.0",
|
"@simplewebauthn/browser": "^13.1.0",
|
||||||
"@sveltejs/adapter-static": "^3.0.8",
|
"@sveltejs/adapter-static": "^3.0.8",
|
||||||
"@sveltejs/kit": "^2.21.0",
|
"@sveltejs/kit": "^2.22.2",
|
||||||
"@sveltejs/vite-plugin-svelte": "^5.0.3",
|
"@sveltejs/vite-plugin-svelte": "^5.1.0",
|
||||||
"@tailwindcss/vite": "^4.1.6",
|
"@tailwindcss/vite": "^4.1.11",
|
||||||
"bits-ui": "^1.4.8",
|
"bits-ui": "^1.8.0",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
"eslint": "^9.26.0",
|
"eslint": "^9.30.0",
|
||||||
"eslint-config-prettier": "^10.1.5",
|
"eslint-config-prettier": "^10.1.5",
|
||||||
"eslint-plugin-svelte": "^3.6.0",
|
"eslint-plugin-svelte": "^3.10.1",
|
||||||
"globals": "^16.1.0",
|
"globals": "^16.2.0",
|
||||||
"mode-watcher": "^1.0.7",
|
"mode-watcher": "^1.0.8",
|
||||||
"prettier": "^3.5.3",
|
"prettier": "^3.6.2",
|
||||||
"prettier-plugin-svelte": "^3.3.3",
|
"prettier-plugin-svelte": "^3.4.0",
|
||||||
"prettier-plugin-tailwindcss": "^0.6.11",
|
"prettier-plugin-tailwindcss": "^0.6.13",
|
||||||
"svelte": "^5.28.6",
|
"svelte": "^5.34.8",
|
||||||
"svelte-check": "^4.1.7",
|
"svelte-check": "^4.2.2",
|
||||||
"svelte-sonner": "^0.3.28",
|
"svelte-sonner": "^0.3.28",
|
||||||
"tailwind-merge": "^3.3.0",
|
"tailwind-merge": "^3.3.1",
|
||||||
"tailwind-variants": "^1.0.0",
|
"tailwind-variants": "^1.0.0",
|
||||||
"tailwindcss": "^4.0.13",
|
"tailwindcss": "^4.0.13",
|
||||||
"tw-animate-css": "^1.2.9",
|
"tw-animate-css": "^1.3.4",
|
||||||
"typescript": "^5.8.3",
|
"typescript": "^5.8.3",
|
||||||
"typescript-eslint": "^8.32.1",
|
"typescript-eslint": "^8.35.0",
|
||||||
"vite": "^6.3.5"
|
"vite": "^6.3.5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,8 @@ servers:
|
|||||||
- url: /grpc
|
- url: /grpc
|
||||||
info:
|
info:
|
||||||
title: Trevstack API
|
title: Trevstack API
|
||||||
version: 1.0.0
|
version: 0.0.33
|
||||||
description: API for trevstack
|
description: API for Trevstack
|
||||||
contact:
|
contact:
|
||||||
name: Trev
|
name: Trev
|
||||||
email: spam@trev.xyz
|
email: spam@trev.xyz
|
||||||
|
6
flake.lock
generated
6
flake.lock
generated
@ -2,11 +2,11 @@
|
|||||||
"nodes": {
|
"nodes": {
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1746904237,
|
"lastModified": 1750776420,
|
||||||
"narHash": "sha256-3e+AVBczosP5dCLQmMoMEogM57gmZ2qrVSrmq9aResQ=",
|
"narHash": "sha256-/CG+w0o0oJ5itVklOoLbdn2dGB0wbZVOoDm4np6w09A=",
|
||||||
"owner": "nixos",
|
"owner": "nixos",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "d89fc19e405cb2d55ce7cc114356846a0ee5e956",
|
"rev": "30a61f056ac492e3b7cdcb69c1e6abdcf00e39cf",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
41
flake.nix
41
flake.nix
@ -21,7 +21,7 @@
|
|||||||
...
|
...
|
||||||
}: let
|
}: let
|
||||||
pname = "trevstack";
|
pname = "trevstack";
|
||||||
version = "0.0.26";
|
version = "0.0.47";
|
||||||
|
|
||||||
build-systems = [
|
build-systems = [
|
||||||
"x86_64-linux"
|
"x86_64-linux"
|
||||||
@ -83,7 +83,10 @@
|
|||||||
packages = with pkgs; [
|
packages = with pkgs; [
|
||||||
treli.packages."${system}".default
|
treli.packages."${system}".default
|
||||||
git
|
git
|
||||||
|
|
||||||
|
# Nix
|
||||||
nix-update
|
nix-update
|
||||||
|
alejandra
|
||||||
|
|
||||||
# Server
|
# Server
|
||||||
go
|
go
|
||||||
@ -127,7 +130,7 @@
|
|||||||
pname = "check-client";
|
pname = "check-client";
|
||||||
inherit version;
|
inherit version;
|
||||||
src = ./client;
|
src = ./client;
|
||||||
npmDepsHash = "sha256-D95Q+FyfuF9GI2ALaAvmrP45g74aK5vg/bN0xyNyRZU=";
|
npmDepsHash = "sha256-dPuZ9uNqiWMxdCZbmLU8Al8GxF5jK5fjMWIm+O8jjEY=";
|
||||||
dontNpmInstall = true;
|
dontNpmInstall = true;
|
||||||
|
|
||||||
buildPhase = ''
|
buildPhase = ''
|
||||||
@ -145,6 +148,7 @@
|
|||||||
sqlfluff
|
sqlfluff
|
||||||
];
|
];
|
||||||
} ''
|
} ''
|
||||||
|
HOME=$PWD
|
||||||
cd ${./server}
|
cd ${./server}
|
||||||
revive -config revive.toml -set_exit_status ./...
|
revive -config revive.toml -set_exit_status ./...
|
||||||
sqlfluff lint
|
sqlfluff lint
|
||||||
@ -190,7 +194,7 @@
|
|||||||
client = pkgs.buildNpmPackage {
|
client = pkgs.buildNpmPackage {
|
||||||
inherit pname version;
|
inherit pname version;
|
||||||
src = ./client;
|
src = ./client;
|
||||||
npmDepsHash = "sha256-D95Q+FyfuF9GI2ALaAvmrP45g74aK5vg/bN0xyNyRZU=";
|
npmDepsHash = "sha256-dPuZ9uNqiWMxdCZbmLU8Al8GxF5jK5fjMWIm+O8jjEY=";
|
||||||
|
|
||||||
installPhase = ''
|
installPhase = ''
|
||||||
cp -r build "$out"
|
cp -r build "$out"
|
||||||
@ -205,13 +209,11 @@
|
|||||||
|
|
||||||
preBuild = ''
|
preBuild = ''
|
||||||
cp -r ${client} client
|
cp -r ${client} client
|
||||||
|
HOME=$PWD
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
in
|
|
||||||
{
|
binaries = builtins.listToAttrs (builtins.map (x: {
|
||||||
default = server;
|
|
||||||
}
|
|
||||||
// builtins.listToAttrs (builtins.map (x: {
|
|
||||||
name = "${pname}-${x.GOOS}-${x.GOARCH}";
|
name = "${pname}-${x.GOOS}-${x.GOARCH}";
|
||||||
value = server.overrideAttrs {
|
value = server.overrideAttrs {
|
||||||
nativeBuildInputs =
|
nativeBuildInputs =
|
||||||
@ -234,7 +236,28 @@
|
|||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
host-systems)
|
host-systems);
|
||||||
|
|
||||||
|
images = builtins.listToAttrs (builtins.map (x: {
|
||||||
|
name = "${pname}-${x.GOOS}-${x.GOARCH}-image";
|
||||||
|
value = pkgs.dockerTools.streamLayeredImage {
|
||||||
|
name = "${pname}";
|
||||||
|
tag = "${version}-${x.GOARCH}";
|
||||||
|
created = "now";
|
||||||
|
architecture = "${x.GOARCH}";
|
||||||
|
contents = [binaries."${pname}-${x.GOOS}-${x.GOARCH}"];
|
||||||
|
config = {
|
||||||
|
Cmd = ["${binaries."${pname}-${x.GOOS}-${x.GOARCH}"}/bin/${pname}-${x.GOOS}-${x.GOARCH}-${version}"];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
})
|
||||||
|
(builtins.filter (x: x.GOOS == "linux") host-systems));
|
||||||
|
in
|
||||||
|
{
|
||||||
|
default = server;
|
||||||
|
}
|
||||||
|
// binaries
|
||||||
|
// images
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ servers:
|
|||||||
- url: /grpc
|
- url: /grpc
|
||||||
info:
|
info:
|
||||||
title: Trevstack API
|
title: Trevstack API
|
||||||
version: 0.0.26
|
version: 0.0.47
|
||||||
description: API for Trevstack
|
description: API for Trevstack
|
||||||
contact:
|
contact:
|
||||||
name: Trev
|
name: Trev
|
||||||
|
6
proto/buf.lock
Normal file
6
proto/buf.lock
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
# Generated by buf. DO NOT EDIT.
|
||||||
|
version: v2
|
||||||
|
deps:
|
||||||
|
- name: buf.build/bufbuild/protovalidate
|
||||||
|
commit: c923a0c2a1324d8b9db81effea973b9c
|
||||||
|
digest: b5:ba54835683c74e87e751bdc482b7d1c157926024587f453ca3640d3348b846aba3244da145042226842e10876a856e19b6dffc96609167199a450455aef9acf3
|
@ -1,6 +1,6 @@
|
|||||||
# For details on buf.yaml configuration, visit https://buf.build/docs/configuration/v2/buf-yaml
|
# For details on buf.yaml configuration, visit https://buf.build/docs/configuration/v2/buf-yaml
|
||||||
version: v2
|
version: v2
|
||||||
modules:
|
modules:
|
||||||
- path: proto
|
- path: .
|
||||||
deps:
|
deps:
|
||||||
- buf.build/bufbuild/protovalidate
|
- buf.build/bufbuild/protovalidate
|
@ -68,7 +68,7 @@ func main() {
|
|||||||
// Serve gRPC Handlers
|
// Serve gRPC Handlers
|
||||||
api := http.NewServeMux()
|
api := http.NewServeMux()
|
||||||
api.Handle(interceptors.WithCORS(user.NewAuthHandler(vi, sqlc, webAuthn, name, env.Key)))
|
api.Handle(interceptors.WithCORS(user.NewAuthHandler(vi, sqlc, webAuthn, name, env.Key)))
|
||||||
api.Handle(interceptors.WithCORS(user.NewHandler(vi, sqlc, webAuthn, env.Key)))
|
api.Handle(interceptors.WithCORS(user.NewHandler(vi, sqlc, webAuthn, name, env.Key)))
|
||||||
api.Handle(interceptors.WithCORS(item.NewHandler(vi, sqlc, env.Key)))
|
api.Handle(interceptors.WithCORS(item.NewHandler(vi, sqlc, env.Key)))
|
||||||
|
|
||||||
// Serve web interface
|
// Serve web interface
|
||||||
|
@ -12,8 +12,8 @@ import (
|
|||||||
itemv1 "github.com/spotdemo4/trevstack/server/internal/connect/item/v1"
|
itemv1 "github.com/spotdemo4/trevstack/server/internal/connect/item/v1"
|
||||||
"github.com/spotdemo4/trevstack/server/internal/connect/item/v1/itemv1connect"
|
"github.com/spotdemo4/trevstack/server/internal/connect/item/v1/itemv1connect"
|
||||||
"github.com/spotdemo4/trevstack/server/internal/interceptors"
|
"github.com/spotdemo4/trevstack/server/internal/interceptors"
|
||||||
|
"github.com/spotdemo4/trevstack/server/internal/putil"
|
||||||
"github.com/spotdemo4/trevstack/server/internal/sqlc"
|
"github.com/spotdemo4/trevstack/server/internal/sqlc"
|
||||||
"github.com/spotdemo4/trevstack/server/internal/util"
|
|
||||||
"google.golang.org/protobuf/types/known/timestamppb"
|
"google.golang.org/protobuf/types/known/timestamppb"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -80,9 +80,9 @@ func (h *Handler) GetItems(ctx context.Context, req *connect.Request[itemv1.GetI
|
|||||||
// Get items
|
// Get items
|
||||||
items, err := h.db.GetItems(ctx, sqlc.GetItemsParams{
|
items, err := h.db.GetItems(ctx, sqlc.GetItemsParams{
|
||||||
UserID: userid,
|
UserID: userid,
|
||||||
Name: util.NullLike(req.Msg.Filter),
|
Name: putil.NullLike(req.Msg.Filter),
|
||||||
Start: util.NullTimestamp(req.Msg.Start),
|
Start: putil.NullTimestamp(req.Msg.Start),
|
||||||
End: util.NullTimestamp(req.Msg.End),
|
End: putil.NullTimestamp(req.Msg.End),
|
||||||
Offset: int64(offset),
|
Offset: int64(offset),
|
||||||
Limit: int64(limit),
|
Limit: int64(limit),
|
||||||
})
|
})
|
||||||
@ -97,9 +97,9 @@ func (h *Handler) GetItems(ctx context.Context, req *connect.Request[itemv1.GetI
|
|||||||
// Get items count
|
// Get items count
|
||||||
count, err := h.db.GetItemsCount(ctx, sqlc.GetItemsCountParams{
|
count, err := h.db.GetItemsCount(ctx, sqlc.GetItemsCountParams{
|
||||||
UserID: userid,
|
UserID: userid,
|
||||||
Name: util.NullLike(req.Msg.Filter),
|
Name: putil.NullLike(req.Msg.Filter),
|
||||||
Start: util.NullTimestamp(req.Msg.Start),
|
Start: putil.NullTimestamp(req.Msg.Start),
|
||||||
End: util.NullTimestamp(req.Msg.End),
|
End: putil.NullTimestamp(req.Msg.End),
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, connect.NewError(connect.CodeInternal, err)
|
return nil, connect.NewError(connect.CodeInternal, err)
|
||||||
@ -157,8 +157,8 @@ func (h *Handler) UpdateItem(ctx context.Context, req *connect.Request[itemv1.Up
|
|||||||
// set
|
// set
|
||||||
Name: req.Msg.Name,
|
Name: req.Msg.Name,
|
||||||
Description: req.Msg.Description,
|
Description: req.Msg.Description,
|
||||||
Price: util.NullFloat64(req.Msg.Price),
|
Price: putil.NullFloat64(req.Msg.Price),
|
||||||
Quantity: util.NullInt64(req.Msg.Quantity),
|
Quantity: putil.NullInt64(req.Msg.Quantity),
|
||||||
|
|
||||||
// where
|
// where
|
||||||
ID: req.Msg.Id,
|
ID: req.Msg.Id,
|
||||||
|
@ -19,8 +19,8 @@ import (
|
|||||||
userv1 "github.com/spotdemo4/trevstack/server/internal/connect/user/v1"
|
userv1 "github.com/spotdemo4/trevstack/server/internal/connect/user/v1"
|
||||||
"github.com/spotdemo4/trevstack/server/internal/connect/user/v1/userv1connect"
|
"github.com/spotdemo4/trevstack/server/internal/connect/user/v1/userv1connect"
|
||||||
"github.com/spotdemo4/trevstack/server/internal/interceptors"
|
"github.com/spotdemo4/trevstack/server/internal/interceptors"
|
||||||
|
"github.com/spotdemo4/trevstack/server/internal/putil"
|
||||||
"github.com/spotdemo4/trevstack/server/internal/sqlc"
|
"github.com/spotdemo4/trevstack/server/internal/sqlc"
|
||||||
"github.com/spotdemo4/trevstack/server/internal/util"
|
|
||||||
"golang.org/x/crypto/bcrypt"
|
"golang.org/x/crypto/bcrypt"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -36,6 +36,7 @@ type Handler struct {
|
|||||||
db *sqlc.Queries
|
db *sqlc.Queries
|
||||||
webAuthn *webauthn.WebAuthn
|
webAuthn *webauthn.WebAuthn
|
||||||
key []byte
|
key []byte
|
||||||
|
name string
|
||||||
|
|
||||||
sessions *map[int64]*webauthn.SessionData
|
sessions *map[int64]*webauthn.SessionData
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
@ -95,7 +96,7 @@ func (h *Handler) UpdatePassword(ctx context.Context, req *connect.Request[userv
|
|||||||
|
|
||||||
// Update password
|
// Update password
|
||||||
err = h.db.UpdateUser(ctx, sqlc.UpdateUserParams{
|
err = h.db.UpdateUser(ctx, sqlc.UpdateUserParams{
|
||||||
Password: util.ToPointer(string(hash)),
|
Password: putil.ToPointer(string(hash)),
|
||||||
ID: userid,
|
ID: userid,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -132,7 +133,7 @@ func (h *Handler) GetAPIKey(ctx context.Context, req *connect.Request[userv1.Get
|
|||||||
|
|
||||||
// Generate JWT
|
// Generate JWT
|
||||||
t := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.RegisteredClaims{
|
t := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.RegisteredClaims{
|
||||||
Issuer: "trevstack",
|
Issuer: h.name,
|
||||||
Subject: strconv.FormatInt(user.ID, 10),
|
Subject: strconv.FormatInt(user.ID, 10),
|
||||||
IssuedAt: &jwt.NumericDate{
|
IssuedAt: &jwt.NumericDate{
|
||||||
Time: time.Now(),
|
Time: time.Now(),
|
||||||
@ -341,8 +342,8 @@ func transportsToString(transports []protocol.AuthenticatorTransport) string {
|
|||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewHandler(vi *validate.Interceptor, db *sqlc.Queries, webauth *webauthn.WebAuthn, key string) (string, http.Handler) {
|
func NewHandler(vi *validate.Interceptor, db *sqlc.Queries, webauth *webauthn.WebAuthn, name string, key string) (string, http.Handler) {
|
||||||
interceptors := connect.WithInterceptors(interceptors.NewAuthInterceptor(key), vi)
|
interceptors := connect.WithInterceptors(vi, interceptors.NewAuthInterceptor(key))
|
||||||
|
|
||||||
sd := map[int64]*webauthn.SessionData{}
|
sd := map[int64]*webauthn.SessionData{}
|
||||||
return userv1connect.NewUserServiceHandler(
|
return userv1connect.NewUserServiceHandler(
|
||||||
@ -350,6 +351,7 @@ func NewHandler(vi *validate.Interceptor, db *sqlc.Queries, webauth *webauthn.We
|
|||||||
db: db,
|
db: db,
|
||||||
webAuthn: webauth,
|
webAuthn: webauth,
|
||||||
key: []byte(key),
|
key: []byte(key),
|
||||||
|
name: name,
|
||||||
|
|
||||||
sessions: &sd,
|
sessions: &sd,
|
||||||
mu: sync.Mutex{},
|
mu: sync.Mutex{},
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package util
|
package putil
|
||||||
|
|
||||||
func DerefOrEmpty[T any](val *T) T {
|
func DerefOrEmpty[T any](val *T) T {
|
||||||
if val == nil {
|
if val == nil {
|
@ -1,4 +1,4 @@
|
|||||||
package util
|
package putil
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
Reference in New Issue
Block a user