Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
41e0501e6b | ||
|
|
f675b86dc8 | ||
|
|
8ed1b57f1d | ||
|
|
bf1725a4b8 | ||
|
|
8954535e08 | ||
|
|
b93be6c6cb |
@@ -64,7 +64,9 @@ jobs:
|
|||||||
- name: Setup Android SDK
|
- name: Setup Android SDK
|
||||||
uses: android-actions/setup-android@v3
|
uses: android-actions/setup-android@v3
|
||||||
with:
|
with:
|
||||||
packages: 'platforms;android-36 build-tools;36.0.0 ndk;28.0.13004108'
|
packages: 'platforms;android-36 build-tools;36.0.0'
|
||||||
|
- name: Pin NDK version
|
||||||
|
run: echo "ANDROID_NDK_HOME=${ANDROID_SDK_ROOT}/ndk/$(ls ${ANDROID_SDK_ROOT}/ndk | sort -V | head -1)" >> $GITHUB_ENV
|
||||||
|
|
||||||
- name: Setup Rust with Android targets
|
- name: Setup Rust with Android targets
|
||||||
uses: dtolnay/rust-toolchain@stable
|
uses: dtolnay/rust-toolchain@stable
|
||||||
@@ -92,7 +94,6 @@ jobs:
|
|||||||
path: |
|
path: |
|
||||||
~/.gradle/caches
|
~/.gradle/caches
|
||||||
~/.gradle/wrapper
|
~/.gradle/wrapper
|
||||||
apps/tauri/gen/android/.gradle
|
|
||||||
key: ${{ runner.os }}-gradle-android-${{ hashFiles('apps/tauri/Cargo.lock') }}
|
key: ${{ runner.os }}-gradle-android-${{ hashFiles('apps/tauri/Cargo.lock') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-gradle-android-
|
${{ runner.os }}-gradle-android-
|
||||||
@@ -131,7 +132,9 @@ jobs:
|
|||||||
JAVA_HOME: ${{ env.JAVA_HOME_21_X64 }}
|
JAVA_HOME: ${{ env.JAVA_HOME_21_X64 }}
|
||||||
ANDROID_HOME: ${{ env.ANDROID_SDK_ROOT }}
|
ANDROID_HOME: ${{ env.ANDROID_SDK_ROOT }}
|
||||||
NDK_HOME: ${{ env.ANDROID_NDK_HOME }}
|
NDK_HOME: ${{ env.ANDROID_NDK_HOME }}
|
||||||
run: bun tauri android init
|
run: |
|
||||||
|
rm -rf gen/android
|
||||||
|
bun tauri android init
|
||||||
|
|
||||||
- name: Build Tauri Android APK
|
- name: Build Tauri Android APK
|
||||||
working-directory: apps/tauri
|
working-directory: apps/tauri
|
||||||
@@ -139,7 +142,7 @@ jobs:
|
|||||||
JAVA_HOME: ${{ env.JAVA_HOME_21_X64 }}
|
JAVA_HOME: ${{ env.JAVA_HOME_21_X64 }}
|
||||||
ANDROID_HOME: ${{ env.ANDROID_SDK_ROOT }}
|
ANDROID_HOME: ${{ env.ANDROID_SDK_ROOT }}
|
||||||
NDK_HOME: ${{ env.ANDROID_NDK_HOME }}
|
NDK_HOME: ${{ env.ANDROID_NDK_HOME }}
|
||||||
run: bun tauri android build
|
run: bun tauri android build --apk
|
||||||
|
|
||||||
- name: Decode keystore
|
- name: Decode keystore
|
||||||
if: github.event_name != 'pull_request'
|
if: github.event_name != 'pull_request'
|
||||||
|
|||||||
@@ -189,8 +189,17 @@ jobs:
|
|||||||
docker rm -f zeavis-web zeavis-api zeavis-ml zeavis-node-exporter 2>/dev/null || true
|
docker rm -f zeavis-web zeavis-api zeavis-ml zeavis-node-exporter 2>/dev/null || true
|
||||||
docker compose pull
|
docker compose pull
|
||||||
docker compose up -d
|
docker compose up -d
|
||||||
|
# Wait for containers to be healthy (up to 60s)
|
||||||
|
wait_container() {
|
||||||
|
local name=$1
|
||||||
|
for i in $(seq 1 30); do
|
||||||
|
docker compose ps | grep -q "${name}.*Up" && return 0
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
wait_container zeavis-web || exit 1
|
||||||
|
wait_container zeavis-api || exit 1
|
||||||
|
wait_container zeavis-ml || exit 1
|
||||||
|
wait_container zeavis-node-exporter || echo "⚠️ node_exporter not running (non-fatal)"
|
||||||
docker compose ps
|
docker compose ps
|
||||||
docker compose ps | grep -q "zeavis-web.*Up" || exit 1
|
|
||||||
docker compose ps | grep -q "zeavis-api.*Up" || exit 1
|
|
||||||
docker compose ps | grep -q "zeavis-ml.*Up" || exit 1
|
|
||||||
docker compose ps | grep -q "zeavis-node-exporter.*Up" || echo "⚠️ node_exporter not running (non-fatal)"
|
|
||||||
|
|||||||
+4
-1
@@ -1,9 +1,10 @@
|
|||||||
FROM oven/bun:1.3.14 AS deps
|
FROM oven/bun:1.3.14 AS deps
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
COPY package.json bunfig.toml tsconfig.base.json ./
|
COPY package.json bun.lock bunfig.toml tsconfig.base.json ./
|
||||||
COPY apps/api/package.json apps/api/package.json
|
COPY apps/api/package.json apps/api/package.json
|
||||||
COPY apps/web/package.json apps/web/package.json
|
COPY apps/web/package.json apps/web/package.json
|
||||||
|
COPY apps/tauri/package.json apps/tauri/package.json
|
||||||
COPY packages/shared/package.json packages/shared/package.json
|
COPY packages/shared/package.json packages/shared/package.json
|
||||||
RUN bun install --production
|
RUN bun install --production
|
||||||
|
|
||||||
@@ -13,6 +14,8 @@ ENV NODE_ENV=production
|
|||||||
ENV API_PORT=3000
|
ENV API_PORT=3000
|
||||||
|
|
||||||
COPY --from=deps /app/node_modules ./node_modules
|
COPY --from=deps /app/node_modules ./node_modules
|
||||||
|
COPY --from=deps /app/apps/api/node_modules apps/api/node_modules
|
||||||
|
COPY --from=deps /app/bun.lock ./bun.lock
|
||||||
COPY package.json bunfig.toml tsconfig.base.json ./
|
COPY package.json bunfig.toml tsconfig.base.json ./
|
||||||
COPY apps/api apps/api
|
COPY apps/api apps/api
|
||||||
COPY packages/shared packages/shared
|
COPY packages/shared packages/shared
|
||||||
|
|||||||
@@ -8,6 +8,12 @@ const googleOAuthEnabled = Boolean(
|
|||||||
);
|
);
|
||||||
|
|
||||||
const webAppUrl = Bun.env.WEB_APP_URL ?? 'http://localhost:5173';
|
const webAppUrl = Bun.env.WEB_APP_URL ?? 'http://localhost:5173';
|
||||||
|
const allowedOrigins = [
|
||||||
|
webAppUrl,
|
||||||
|
'https://tauri.localhost',
|
||||||
|
'tauri://localhost',
|
||||||
|
'http://localhost:5173',
|
||||||
|
];
|
||||||
const secureCookies = Bun.env.SECURE_COOKIES === 'true' || webAppUrl.startsWith('https://');
|
const secureCookies = Bun.env.SECURE_COOKIES === 'true' || webAppUrl.startsWith('https://');
|
||||||
|
|
||||||
export const env = {
|
export const env = {
|
||||||
@@ -24,6 +30,7 @@ export const env = {
|
|||||||
googleClientSecret: Bun.env.GOOGLE_CLIENT_SECRET,
|
googleClientSecret: Bun.env.GOOGLE_CLIENT_SECRET,
|
||||||
googleRedirectUri: Bun.env.GOOGLE_REDIRECT_URI,
|
googleRedirectUri: Bun.env.GOOGLE_REDIRECT_URI,
|
||||||
webAppUrl,
|
webAppUrl,
|
||||||
|
allowedOrigins,
|
||||||
secureCookies,
|
secureCookies,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ assertRequiredEnv();
|
|||||||
|
|
||||||
const app = new Elysia()
|
const app = new Elysia()
|
||||||
.use(cors({
|
.use(cors({
|
||||||
origin: env.webAppUrl,
|
origin: env.allowedOrigins,
|
||||||
credentials: true,
|
credentials: true,
|
||||||
}))
|
}))
|
||||||
.use(metricsRoutes)
|
.use(metricsRoutes)
|
||||||
|
|||||||
+2
-1
@@ -1,10 +1,11 @@
|
|||||||
FROM oven/bun:1.3.14 AS builder
|
FROM oven/bun:1.3.14 AS builder
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
COPY package.json bunfig.toml tsconfig.base.json ./
|
COPY package.json bun.lock bunfig.toml tsconfig.base.json ./
|
||||||
COPY packages/shared/package.json packages/shared/package.json
|
COPY packages/shared/package.json packages/shared/package.json
|
||||||
COPY apps/web/package.json apps/web/package.json
|
COPY apps/web/package.json apps/web/package.json
|
||||||
COPY apps/api/package.json apps/api/package.json
|
COPY apps/api/package.json apps/api/package.json
|
||||||
|
COPY apps/tauri/package.json apps/tauri/package.json
|
||||||
RUN bun install
|
RUN bun install
|
||||||
|
|
||||||
COPY packages/shared packages/shared
|
COPY packages/shared packages/shared
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import type {
|
|||||||
} from '@zeavis/shared';
|
} from '@zeavis/shared';
|
||||||
import { recordApiCall } from './telemetry';
|
import { recordApiCall } from './telemetry';
|
||||||
|
|
||||||
const apiBaseUrl = import.meta.env.VITE_API_BASE_URL ?? '';
|
const apiBaseUrl = import.meta.env.VITE_API_BASE_URL ?? 'https://zeavisedu.asepharyana.my.id';
|
||||||
|
|
||||||
export interface ApiError extends Error {
|
export interface ApiError extends Error {
|
||||||
status: number;
|
status: number;
|
||||||
|
|||||||
@@ -38,8 +38,6 @@ services:
|
|||||||
API_PORT: "3000"
|
API_PORT: "3000"
|
||||||
WEB_APP_URL: https://zeavisedu.asepharyana.my.id
|
WEB_APP_URL: https://zeavisedu.asepharyana.my.id
|
||||||
ML_SERVICE_URL: ${ML_SERVICE_URL:-http://zeavis-ml:8000}
|
ML_SERVICE_URL: ${ML_SERVICE_URL:-http://zeavis-ml:8000}
|
||||||
ports:
|
|
||||||
- "3000:3000"
|
|
||||||
labels:
|
labels:
|
||||||
traefik.enable: "true"
|
traefik.enable: "true"
|
||||||
traefik.http.routers.zeavis-api.rule: Host(`api-zeavisedu.asepharyana.my.id`)
|
traefik.http.routers.zeavis-api.rule: Host(`api-zeavisedu.asepharyana.my.id`)
|
||||||
@@ -53,8 +51,6 @@ services:
|
|||||||
image: prom/node-exporter:v1.8.2
|
image: prom/node-exporter:v1.8.2
|
||||||
container_name: zeavis-node-exporter
|
container_name: zeavis-node-exporter
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
ports:
|
|
||||||
- "9100:9100"
|
|
||||||
command:
|
command:
|
||||||
- "--path.rootfs=/host"
|
- "--path.rootfs=/host"
|
||||||
- "--web.listen-address=:9100"
|
- "--web.listen-address=:9100"
|
||||||
@@ -77,8 +73,6 @@ services:
|
|||||||
environment:
|
environment:
|
||||||
MODEL_PATH: /app/model/model.onnx
|
MODEL_PATH: /app/model/model.onnx
|
||||||
MODEL_INPUT_SIZE: "224"
|
MODEL_INPUT_SIZE: "224"
|
||||||
ports:
|
|
||||||
- "8000:8000"
|
|
||||||
labels:
|
labels:
|
||||||
traefik.enable: "true"
|
traefik.enable: "true"
|
||||||
traefik.http.routers.zeavis-ml.rule: Host(`ml-zeavisedu.asepharyana.my.id`)
|
traefik.http.routers.zeavis-ml.rule: Host(`ml-zeavisedu.asepharyana.my.id`)
|
||||||
|
|||||||
Reference in New Issue
Block a user