21 Commits
Author SHA1 Message Date
azykov@mail.ru 110594483c test 9 2026-06-27 20:43:37 +03:00
azykov@mail.ru 619f54c49c test 8 2026-06-27 20:41:03 +03:00
azykov@mail.ru bc9c275776 test 7 2026-06-27 20:38:30 +03:00
azykov@mail.ru 36dcdffff2 test 6 2026-06-27 20:37:15 +03:00
azykov@mail.ru f6680161d7 test 5 2026-06-27 19:21:14 +03:00
azykov@mail.ru 2e28c9c3d5 test 4 2026-06-27 19:20:22 +03:00
azykov@mail.ru b0503669b0 test 3 2026-06-27 19:16:55 +03:00
azykov@mail.ru 224ae60cc8 test 2 2026-06-27 19:13:50 +03:00
azykov@mail.ru beaa656026 test 2026-06-27 13:37:27 +03:00
azykov@mail.ru 793a7c9da3 deploy directly to docker, not ssh 2026-06-27 12:04:58 +03:00
azykov@mail.ru bc98e23f6a Merge branch 'deploy' of ssh://10.0.64.33:49022/anton/blockly3d into deploy 2026-06-27 11:51:56 +03:00
azykov@mail.ru de292361a2 docker-cli is now baked into runner's job base image 2026-06-27 11:51:40 +03:00
azykov@mail.ru f071bbe9f7 docker-cli is now baked in runner's job base image 2026-06-27 11:48:24 +03:00
azykov@mail.ru ff5d1d52ef old buildx in alpine fix 2026-06-27 10:58:44 +03:00
azykov@mail.ru cad617000d fixe for docker cli installation 2026-06-27 10:56:15 +03:00
azykov@mail.ru e7897e8bb1 docker cli installation in container 2026-06-27 10:52:43 +03:00
azykov@mail.ru fcb8c2a78b no base actions 2026-06-26 23:12:13 +03:00
azykov@mail.ru 1ba60a5dc3 no ifs, deploy without appleboy/ssh-action 2026-06-26 22:46:12 +03:00
azykov@mail.ru e2e9a357de runs on: docker1 2026-06-26 21:57:34 +03:00
azykov@mail.ru d224c033ca any branch deploy 2026-06-26 21:29:05 +03:00
azykov@mail.ru 5f2d86368b deploy barebones 2026-06-26 20:49:23 +03:00
5 changed files with 212 additions and 0 deletions
+7
View File
@@ -0,0 +1,7 @@
# Скопируй в .env и заполни
SERVER_PORT=3000
CLIENT_PORT=5000
# Добавь свои переменные ниже
# DATABASE_URL=
# JWT_SECRET=
+102
View File
@@ -0,0 +1,102 @@
name: Build & Deploy
on:
push
env:
REGISTRY: git.aggtaa.com
IMAGE_PREFIX: ${{ gitea.repository }}
jobs:
# ── BUILD SERVER ──────────────────────────────────────────────────────────────
build-server:
runs-on: docker1
defaults:
run:
shell: sh
working-directory: /workspace
steps:
- name: Check paths
run: |
ls -la /data/tools/ || echo "no /data/tools"
mount | grep overlay || echo "no overlay"
ls /bin/
ls /usr/bin/ | grep -E "bash|sh"
- name: Check docker
run: |
find /usr -name "docker-buildx" 2>/dev/null || echo "not found in /usr"
find /root -name "docker-buildx" 2>/dev/null || echo "not found in /root"
ls /usr/libexec/ 2>/dev/null || echo "no /usr/libexec"
- name: Checkout
working-directory: /
run: |
mkdir -p /workspace
if [ -d /workspace/.git ]; then
cd /workspace && git fetch origin && git reset --hard origin/${{ gitea.ref_name }}
else
git clone ${{ gitea.server_url }}/${{ gitea.repository }}.git /workspace
fi
- name: Build & push server
run: |
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 }}/${{ env.IMAGE_PREFIX }}/server:cache \
--cache-to type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/server:cache,mode=max \
--tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/server:latest \
--tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/server:${{ gitea.sha }} \
--file server.Dockerfile \
--push \
.
# ── BUILD WEBCLIENT ───────────────────────────────────────────────────────────
build-webclient:
runs-on: docker1
defaults:
run:
working-directory: /workspace
steps:
- name: Checkout
working-directory: /
run: |
mkdir -p /workspace
if [ -d /workspace/.git ]; then
cd /workspace && git fetch origin && git reset --hard origin/${{ gitea.ref_name }}
else
git clone ${{ gitea.server_url }}/${{ gitea.repository }}.git /workspace
fi
- name: Build & push webclient
run: |
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 }}/${{ env.IMAGE_PREFIX }}/webclient:cache \
--cache-to type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/webclient:cache,mode=max \
--tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/webclient:latest \
--tag ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/webclient:${{ gitea.sha }} \
--file webclient.Dockerfile \
--push \
.
# ── DEPLOY ────────────────────────────────────────────────────────────────────
deploy:
runs-on: docker1
needs: [build-server, build-webclient]
if: always() && !failure() && !cancelled()
steps:
- name: Deploy
run: |
mkdir -p "/app-cache/${{ gitea.repository }}"
cd "/app-cache/${{ gitea.repository }}"
if [ ! -d .git ]; then
git clone ${{ gitea.server_url }}/${{ gitea.repository }}.git .
else
git pull origin main
fi
docker compose pull
docker compose up -d --remove-orphans
docker image prune -f
+34
View File
@@ -0,0 +1,34 @@
services:
server:
build:
context: .
dockerfile: server.Dockerfile
cache_from:
- ${CI_REGISTRY_IMAGE:-blockly3d}/server:cache
image: ${CI_REGISTRY_IMAGE:-blockly3d}/server:${CI_COMMIT_SHA:-latest}
restart: unless-stopped
ports:
- "${SERVER_PORT:-3000}:3000"
environment:
- NODE_ENV=production
env_file:
- .env
networks:
- blockly3d
webclient:
build:
context: .
dockerfile: webclient.Dockerfile
cache_from:
- ${CI_REGISTRY_IMAGE:-blockly3d}/webclient:cache
image: ${CI_REGISTRY_IMAGE:-blockly3d}/webclient:${CI_COMMIT_SHA:-latest}
restart: unless-stopped
ports:
- "${CLIENT_PORT:-5000}:5000"
networks:
- blockly3d
networks:
blockly3d:
driver: bridge
+37
View File
@@ -0,0 +1,37 @@
# syntax=docker/dockerfile:1
FROM node:22.22.3-alpine AS base
RUN corepack enable && corepack prepare pnpm@latest --activate
# ── deps ──────────────────────────────────────────────────────────────────────
FROM base AS deps
WORKDIR /app
# Копируем только манифесты — слой кешируется пока lock не менялся
COPY package.json pnpm-workspace.yaml pnpm-lock.yaml ./
COPY server/package.json ./server/
RUN pnpm install --frozen-lockfile --filter server...
# ── build ─────────────────────────────────────────────────────────────────────
FROM deps AS builder
WORKDIR /app
COPY server ./server
RUN pnpm --filter server 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 ./
COPY server/package.json ./server/
RUN pnpm install --frozen-lockfile --filter server... --prod
COPY --from=builder /app/server/dist ./server/dist
EXPOSE 3000
CMD ["node", "server/dist/index.js"]
+32
View File
@@ -0,0 +1,32 @@
# syntax=docker/dockerfile:1
FROM node:22.22.3-alpine AS base
RUN corepack enable && corepack prepare pnpm@latest --activate
# ── deps ──────────────────────────────────────────────────────────────────────
FROM base AS deps
WORKDIR /app
COPY package.json pnpm-workspace.yaml pnpm-lock.yaml ./
COPY webclient/package.json ./webclient/
RUN pnpm install --frozen-lockfile --filter webclient...
# ── build ─────────────────────────────────────────────────────────────────────
FROM deps AS builder
WORKDIR /app
COPY webclient ./webclient
RUN pnpm --filter webclient build
# ── runtime ───────────────────────────────────────────────────────────────────
FROM node:22.22.3-alpine AS runner
WORKDIR /app
RUN npm install -g serve
COPY --from=builder /app/webclient/dist ./dist
EXPOSE 5000
CMD ["serve", "-s", "dist", "-l", "5000"]