19 Commits
Author SHA1 Message Date
azykov@mail.ru 6347e4b211 removed type: module from package.json 2026-07-01 13:18:27 +03:00
azykov@mail.ru 83dea1f728 TS2589 fixes
TS2589 fixes

TS2589
2026-07-01 13:15:10 +03:00
azykov@mail.ru 060ac0820a switch from ESNext to CommonJS 2026-07-01 12:12:07 +03:00
azykov@mail.ru 0d2b6f6067 fix for docker-compose image and container_name 2026-07-01 11:57:40 +03:00
azykov@mail.ru a5a1de354a docker login for deploy 2026-07-01 11:53:08 +03:00
azykov@mail.ru 6deb1c2462 fix main branch lock in deploy 2026-07-01 11:51:43 +03:00
azykov@mail.ru f8039e5007 test 2026-07-01 11:43:05 +03:00
azykov@mail.ru f3772c45cd IMAGE_PREFIX 2026-07-01 11:41:24 +03:00
azykov@mail.ru 68229414a3 IMAGE_PREFIX 2026-07-01 11:36:51 +03:00
azykov@mail.ru fc60f7f268 IMAGE_PREFIX 2026-07-01 11:35:48 +03:00
azykov@mail.ru 7c3f3c5acc IMAGE_PREFIX 2026-07-01 11:34:29 +03:00
azykov@mail.ru c068487103 docker compose in gitea_runner container fix 2026-07-01 11:26:58 +03:00
azykov@mail.ru 21bde6f57d test 1 2026-07-01 11:21:02 +03:00
azykov@mail.ru 1eb921f277 pnpm version lock to 11 2026-07-01 11:06:44 +03:00
azykov@mail.ru 02eaf3606b deploy: git checkout by git ref, not branch name 2026-07-01 11:01:21 +03:00
azykov@mail.ru 4a936b03d6 docker build fix 2026-07-01 10:55:42 +03:00
azykov@mail.ru 604c7cc0d5 fix docker image casing error 2026-07-01 10:52:01 +03:00
azykov@mail.ru aa867e2949 workflow_dispatch trigger for gitea actions 2026-07-01 10:46:48 +03:00
azykov@mail.ru 820ea95f26 deploy scripts 2026-07-01 10:42:49 +03:00
8 changed files with 172 additions and 20 deletions
+100
View File
@@ -0,0 +1,100 @@
name: Build & Deploy
on:
[workflow_dispatch, push]
env:
REGISTRY: git.aggtaa.com
# IMAGE_PREFIX: ${{ gitea.repository }} # set by a step
jobs:
# ── BUILD SERVER ──────────────────────────────────────────────────────────────
build-app:
runs-on: docker1
outputs:
IMAGE_PREFIX: ${{ steps.prefix.outputs.IMAGE_PREFIX }}
defaults:
run:
shell: sh
working-directory: /workspace
steps:
- name: Checkout
working-directory: /
run: |
mkdir -p /workspace
cd /workspace
if [ -d .git ]; then
git remote set-url origin ${{ gitea.server_url }}/${{ gitea.repository }}.git
else
git init
git remote add origin ${{ gitea.server_url }}/${{ gitea.repository }}.git
fi
git fetch --prune origin ${{ gitea.ref_name }}
git checkout -f FETCH_HEAD
git reset --hard FETCH_HEAD
git clean -fdx
- name: Set lowercase image prefix
id: prefix
run: echo "IMAGE_PREFIX=$(echo '${{ gitea.repository }}' | tr '[:upper:]' '[:lower:]')" >> $GITHUB_OUTPUT
- name: Build & push app
run: |
cd /workspace
echo "${{ secrets.REGISTRY_PASSWORD }}" | \
docker login ${{ env.REGISTRY }} -u ${{ secrets.REGISTRY_USER }} --password-stdin
/data/tools/docker-buildx build \
--cache-from type=registry,ref=${{ env.REGISTRY }}/${{ steps.prefix.outputs.IMAGE_PREFIX }}/app:cache \
--cache-to type=registry,ref=${{ env.REGISTRY }}/${{ steps.prefix.outputs.IMAGE_PREFIX }}/app:cache,mode=max \
--tag ${{ env.REGISTRY }}/${{ steps.prefix.outputs.IMAGE_PREFIX }}/app:latest \
--tag ${{ env.REGISTRY }}/${{ steps.prefix.outputs.IMAGE_PREFIX }}/app:${{ gitea.sha }} \
--file Dockerfile \
--push \
.
# ── DEPLOY ────────────────────────────────────────────────────────────────────
deploy:
runs-on: docker1
needs: [build-app]
if: always() && !failure() && !cancelled()
defaults:
run:
shell: sh
steps:
- name: Debug environment
run: |
hostname
cat /etc/hostname
docker --version
docker compose version || echo "compose plugin missing here"
ls /usr/libexec/docker/cli-plugins/ 2>/dev/null || echo "no plugins dir"
mount | grep docker || true
- name: Debug repo contents
run: |
cd "/app-cache/${{ gitea.repository }}"
ls -la
- name: Deploy
run: |
echo "${{ secrets.REGISTRY_PASSWORD }}" | \
docker login ${{ env.REGISTRY }} -u ${{ secrets.REGISTRY_USER }} --password-stdin
mkdir -p "/app-cache/${{ gitea.repository }}"
cd "/app-cache/${{ gitea.repository }}"
if [ ! -d .git ]; then
git clone ${{ gitea.server_url }}/${{ gitea.repository }}.git .
fi
git fetch --prune origin ${{ gitea.ref_name }}
git checkout -f FETCH_HEAD
git reset --hard FETCH_HEAD
git clean -fdx
printf 'REGISTRY=%s\nIMAGE_PREFIX=%s\nIMAGE_TAG=%s\nSERVICE_NAME=%s\n' \
'${{ env.REGISTRY }}' \
'${{ needs.build-app.outputs.IMAGE_PREFIX }}' \
'${{ gitea.sha }}' \
"$(basename '${{ needs.build-app.outputs.IMAGE_PREFIX }}')" > .env
/data/tools/docker-compose pull
/data/tools/docker-compose up -d --remove-orphans
docker image prune -f
+2
View File
@@ -1 +1,3 @@
node_modules
dist
.env
+33
View File
@@ -0,0 +1,33 @@
# syntax=docker/dockerfile:1
FROM node:22.22.3-alpine AS base
RUN corepack enable && corepack prepare pnpm@11 --activate
# ── deps ──────────────────────────────────────────────────────────────────────
FROM base AS deps
WORKDIR /app
COPY package.json pnpm-workspace.yaml pnpm-lock.yaml ./
RUN pnpm install --frozen-lockfile
# ── build ─────────────────────────────────────────────────────────────────────
FROM deps AS builder
WORKDIR /app
COPY tsconfig.json ./
COPY src ./src
RUN pnpm build
# ── runtime ───────────────────────────────────────────────────────────────────
FROM node:22.22.3-alpine AS runner
RUN corepack enable && corepack prepare pnpm@latest --activate
WORKDIR /app
COPY package.json pnpm-workspace.yaml pnpm-lock.yaml ./
RUN pnpm install --frozen-lockfile --prod
COPY --from=builder /app/dist ./dist
EXPOSE 3000
CMD ["node", "dist/index.js"]
+13
View File
@@ -0,0 +1,13 @@
services:
server:
image: ${REGISTRY}/${IMAGE_PREFIX}/app:latest
container_name: ${SERVICE_NAME}
restart: unless-stopped
ports:
- "${APP_PORT:-3000}:3000"
networks:
- local
networks:
local:
driver: bridge
+2 -7
View File
@@ -14,14 +14,9 @@
"keywords": [],
"author": "",
"license": "ISC",
"devEngines": {
"packageManager": {
"name": "pnpm",
"version": "^11.4.0",
"onFail": "download"
}
"engines": {
"pnpm": ">=11.4.0 <12"
},
"type": "module",
"dependencies": {
"@modelcontextprotocol/sdk": "^1.13.1",
"fastify": "^5.2.1",
+9 -5
View File
@@ -51,11 +51,15 @@ export default class McpSession {
this.registeredTools.push(
...toolsToRegister
.map((tool) => this.mcp.registerTool(
tool.title,
tool.config,
tool.handler,
))
.map(
(tool) => this.mcp.registerTool(
tool.title,
// ugly workaround for TS2589 error
// eslint-disable-next-line @typescript-eslint/no-explicit-any
tool.config as any,
tool.handler,
)
)
);
}
+12 -6
View File
@@ -15,13 +15,19 @@ export const listToolsTool: ToolDef = {
type: "text",
text: JSON.stringify(
Object.values(server.tools)
.map((tool) => ({
...tool,
config: {
...tool.config,
inputSchema: zodToJsonSchema(z.object(tool.config.inputSchema), { target: "jsonSchema7" }),
.map((tool) => {
// ugly workaround for TS2589 error
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const zodObject = (z.object as any)(tool.config.inputSchema);
const inputSchema = zodToJsonSchema(zodObject, { target: "jsonSchema7" });
return {
...tool,
config: {
...tool.config,
inputSchema,
}
}
})),
}),
null,
2,
)
+1 -2
View File
@@ -1,8 +1,7 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "Bundler",
"module": "CommonJS",
"lib": ["ES2022"],
"outDir": "dist",
"rootDir": "src",