feat: enhance README and website configuration with new MinIO setup and error handling for GitHub stars fetch

This commit is contained in:
Rotimi Best
2026-03-13 11:21:05 +01:00
parent fe75771d25
commit 6e6f825e89
17 changed files with 75 additions and 22 deletions
+26 -5
View File
@@ -124,13 +124,34 @@ The repository also contains shared packages under `packages/` (for example `pac
- `apps/dashboard/.env`: `PUBLIC_SERVER_URL`, `PRIVATE_SERVER_KEY`, `PUBLIC_IS_SELFHOSTED`
- Optional for self-hosted Enterprise-only features (SSO, token-auth, no-tracking): set `LICENSE_KEY` in `apps/api/.env`
6. Start local infrastructure for API (Postgres + Redis + db-init):
6. Start local infrastructure for API (Postgres + Redis) and seed the DB:
```bash
docker compose -f docker/docker-compose.yaml up -d postgres redis db-init
```
7. Run the local app services in separate terminals:
- Connect with `DATABASE_URL=postgresql://postgres:postgres@localhost:5432/classroomio`
- Connect with `REDIS_URL=redis://localhost:6379`
- The `db-init` container runs migrations/seed once Postgres is healthy.
7. (Optional) Start MinIO locally for object storage (media/documents):
```bash
docker compose -f docker/docker-compose.yaml --profile minio up -d minio minio-init
```
- Console: http://localhost:9001 (user/pass default `minioadmin` / `minioadmin`)
- S3 endpoint: http://localhost:9000
- Buckets created by `minio-init`: `videos`, `documents`, `media`
- Add to `apps/api/.env` when using MinIO locally:
- `OBJECT_STORAGE_ENDPOINT=http://localhost:9000`
- `OBJECT_STORAGE_PUBLIC_ENDPOINT=http://localhost:9000`
- `OBJECT_STORAGE_ACCESS_KEY_ID=minioadmin`
- `OBJECT_STORAGE_SECRET_ACCESS_KEY=minioadmin`
- `OBJECT_STORAGE_FORCE_PATH_STYLE=true`
- `OBJECT_STORAGE_MEDIA_PUBLIC_BASE_URL=http://localhost:9000/media`
8. Run the local app services in separate terminals:
```bash
pnpm api:dev
@@ -140,17 +161,17 @@ The repository also contains shared packages under `packages/` (for example `pac
pnpm dashboard:dev
```
8. Default local URLs:
9. Default local URLs:
- `api`: [http://localhost:3002](http://localhost:3002)
- `dashboard`: [http://localhost:5173](http://localhost:5173)
9. Optional: run other apps:
10. Optional: run other apps:
- **website**: `pnpm website:dev`
- **docs**: `pnpm dev --filter=@cio/docs`
10. Login into `dashboard`:
11. Login into `dashboard`:
- Visit [http://localhost:5173/login](http://localhost:5173/login)
- Enter email: `admin@test.com`
+2 -1
View File
@@ -6,6 +6,7 @@
"dev": "vite dev --port 5174",
"build": "vite build",
"preview": "vite preview",
"start": "node build",
"check": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --watch",
"format": "prettier --write .",
@@ -13,7 +14,7 @@
},
"devDependencies": {
"@cio/tsconfig": "workspace:*",
"@sveltejs/adapter-auto": "^3.0.0",
"@sveltejs/adapter-node": "^2.0.0",
"@sveltejs/adapter-vercel": "^4.0.0",
"@sveltejs/kit": "^2.5.27",
"@sveltejs/vite-plugin-svelte": "^4.0.0",
@@ -1,6 +1,8 @@
import { redirect } from '@sveltejs/kit';
import { client } from '$lib/utils/posthog';
export const prerender = false;
export const load = ({ request }) => {
client.capture({
distinctId: request.headers.get('x-forwarded-for') || new Date().getTime().toString(),
@@ -1,5 +1,7 @@
import { redirect } from '@sveltejs/kit';
export const prerender = false;
export const load = async () => {
redirect(307, 'https://docs.google.com/presentation/d/1eqvNPNk167ZcP21gZGVAatdDpWAFL9lfmWJHHrzsVFc');
};
@@ -1,6 +1,8 @@
import { redirect } from '@sveltejs/kit';
import { client } from '$lib/utils/posthog';
export const prerender = false;
export const load = ({ request }) => {
client.capture({
distinctId: request.headers.get('x-forwarded-for') || new Date().getTime().toString(),
@@ -1,6 +1,8 @@
import { redirect } from '@sveltejs/kit';
import { client } from '$lib/utils/posthog';
export const prerender = false;
export const load = async ({ request }) => {
client.capture({
distinctId: request.headers.get('x-forwarded-for') || new Date().getTime().toString(),
@@ -1,5 +1,7 @@
import { redirect } from '@sveltejs/kit';
export const prerender = false;
export const load = async () => {
redirect(307, 'https://t.me/thebestafricans');
};
@@ -1,6 +1,8 @@
import { dev } from '$app/environment';
import { redirect } from '@sveltejs/kit';
export const prerender = false;
export const load = async () => {
const url = dev ? 'http://localhost:5173' : 'https://app.classroomio.com';
@@ -1,5 +1,7 @@
import { redirect } from '@sveltejs/kit';
export const prerender = false;
export const load = async () => {
redirect(307, 'https://www.producthunt.com/posts/classroomio-2');
};
@@ -1,6 +1,8 @@
import { redirect } from '@sveltejs/kit';
import { client } from '$lib/utils/posthog';
export const prerender = false;
export const load = async ({ request }) => {
client.capture({
distinctId: request.headers.get('x-forwarded-for') || new Date().getTime().toString(),
@@ -1,6 +1,8 @@
import { client } from '$lib/utils/posthog';
import { redirect } from '@sveltejs/kit';
export const prerender = false;
export const load = ({ request, url }) => {
client.capture({
distinctId: request.headers.get('x-forwarded-for') || new Date().getTime().toString(),
@@ -1,6 +1,8 @@
import { redirect } from '@sveltejs/kit';
import { client } from '$lib/utils/posthog';
export const prerender = false;
export const load = async ({ request }) => {
client.capture({
distinctId: request.headers.get('x-forwarded-for') || new Date().getTime().toString(),
@@ -1,5 +1,7 @@
import { redirect } from '@sveltejs/kit';
export const prerender = false;
export const load = async () => {
redirect(307, 'https://form.classroomio.com/f/1v25DtmN');
};
+7 -1
View File
@@ -27,9 +27,15 @@ async function getStars() {
console.log('Fetching stars from GitHub');
let stars = 0;
try {
const response = await fetch('https://api.github.com/repos/classroomio/classroomio');
const data = await response.json();
const stars = data?.stargazers_count || 0;
stars = data?.stargazers_count || 0;
} catch (error) {
console.log('error fetching stars', error);
}
starsCache.set(CACHE_KEY, { stars, lastUpdated: now });
@@ -1,5 +1,7 @@
import { redirect } from '@sveltejs/kit';
export const prerender = false;
export const load = ({ request }) => {
redirect(307, 'https://heyform.net/f/1qkguGkN');
};
+13 -12
View File
@@ -1,16 +1,17 @@
import adapterNode from '@sveltejs/adapter-auto';
import adapterVercel from '@sveltejs/adapter-vercel';
import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
import { fileURLToPath } from 'node:url';
import { dirname } from 'node:path';
import { mdsvex, escapeSvelte } from 'mdsvex';
import path from 'path';
import shiki from 'shiki';
import remarkUnwrapImages from 'remark-unwrap-images';
import remarkToc from 'remark-toc';
import rehypeSlug from 'rehype-slug';
import { escapeSvelte, mdsvex } from 'mdsvex';
const useNodeAdapter = process.env.PUBLIC_IS_SELFHOSTED === 'true';
import adapterNode from '@sveltejs/adapter-node';
import adapterVercel from '@sveltejs/adapter-vercel';
import { dirname } from 'node:path';
import { fileURLToPath } from 'node:url';
import path from 'path';
import rehypeSlug from 'rehype-slug';
import remarkToc from 'remark-toc';
import remarkUnwrapImages from 'remark-unwrap-images';
import shiki from 'shiki';
import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
const useNodeAdapter = process.env.VERCEL !== '1' && process.env.VERCEL !== 'true';
/** @type {import('@sveltejs/kit').Config}*/
File diff suppressed because one or more lines are too long