Merge remote-tracking branch 'origin/canary' into codex/add-paperless-ngx-template

# Conflicts:
#	meta.json
This commit is contained in:
Mauricio Siu
2026-07-08 00:05:15 -06:00
654 changed files with 13051 additions and 8128 deletions

View File

@@ -1,12 +1,18 @@
name: Validate and Process Meta.json
name: Validate Template Metadata
on:
push:
branches: [canary]
paths: ["meta.json"]
paths:
- "blueprints/**"
- "build-scripts/generate-meta.js"
- "meta.json"
pull_request:
branches: [canary]
paths: ["meta.json"]
paths:
- "blueprints/**"
- "build-scripts/generate-meta.js"
- "meta.json"
workflow_dispatch:
jobs:
@@ -17,64 +23,19 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v4
- name: Reject root meta.json
run: |
if [ -f "meta.json" ]; then
echo "❌ The root meta.json is generated at build time and must not be committed."
echo " Add your template's metadata to blueprints/<id>/meta.json instead."
exit 1
fi
echo "✅ No root meta.json present"
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "18"
node-version: "20"
- name: Validate meta.json structure
run: |
echo "🔍 Validating meta.json structure..."
node -e "
const fs = require('fs');
const data = JSON.parse(fs.readFileSync('meta.json', 'utf8'));
if (!Array.isArray(data)) throw new Error('meta.json must be an array');
console.log('✅ meta.json structure is valid');
console.log('📊 Found', data.length, 'entries');
"
- name: Check for duplicates and sort order
run: |
echo "🔍 Checking for duplicates and sort order..."
node build-scripts/process-meta.js --verbose --output /tmp/meta-test.json
- name: Compare with original
run: |
echo "🔍 Comparing processed file with original..."
if ! diff -q meta.json /tmp/meta-test.json > /dev/null; then
echo "⚠️ meta.json needs processing (duplicates found or not sorted)"
echo "Original entries:"
node -e "console.log(JSON.parse(require('fs').readFileSync('meta.json', 'utf8')).length)"
echo "Processed entries:"
node -e "console.log(JSON.parse(require('fs').readFileSync('/tmp/meta-test.json', 'utf8')).length)"
echo ""
echo "To fix this, run: npm run process-meta"
exit 1
else
echo "✅ meta.json is properly deduplicated and sorted"
fi
- name: Validate required fields
run: |
echo "🔍 Validating required fields..."
node -e "
const fs = require('fs');
const data = JSON.parse(fs.readFileSync('meta.json', 'utf8'));
const required = ['id', 'name', 'version', 'description', 'links', 'logo', 'tags'];
let issues = 0;
data.forEach((item, index) => {
const missing = required.filter(field => !item[field]);
if (missing.length > 0) {
console.log('❌ Entry', index, '(' + item.id + '):', 'Missing fields:', missing.join(', '));
issues++;
}
});
if (issues > 0) {
console.log('🚨 Found', issues, 'entries with missing required fields');
process.exit(1);
} else {
console.log('✅ All entries have required fields');
}
"
- name: Validate per-template metadata
run: node build-scripts/generate-meta.js --check

View File

@@ -49,133 +49,10 @@ jobs:
echo "✅ Blueprint folders validated successfully."
fi
- name: Validate meta.json structure and required fields
run: |
echo "🔍 Validating meta.json structure and required fields..."
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
# First check if meta.json exists and is valid JSON
if [ ! -f "meta.json" ]; then
echo "❌ meta.json file not found"
exit 1
fi
if ! jq empty meta.json 2>/dev/null; then
echo "❌ meta.json is not a valid JSON file"
exit 1
fi
ERROR=0
ERRORS_FOUND=""
# Debug: Show total number of entries
TOTAL_ENTRIES=$(jq '. | length' meta.json)
echo "📊 Total entries in meta.json: $TOTAL_ENTRIES"
# Get all entries at once and process them
TOTAL_INDEX=$(($TOTAL_ENTRIES - 1))
for i in $(seq 0 $TOTAL_INDEX); do
entry=$(jq -c ".[$i]" meta.json)
INDEX=$((i + 1))
echo "-------------------------------------------"
echo "🔍 Checking entry #$INDEX..."
# Get the ID for better error reporting
ID=$(echo "$entry" | jq -r '.id // "UNKNOWN"')
echo "📝 Processing entry with ID: $ID"
# Validate required top-level fields
for field in "id" "name" "version" "description" "logo" "links" "tags"; do
if [ "$(echo "$entry" | jq "has(\"$field\")")" != "true" ]; then
ERROR_MSG="❌ Entry #$INDEX (ID: $ID) is missing required field: $field"
echo "$ERROR_MSG"
ERRORS_FOUND="${ERRORS_FOUND}${ERROR_MSG}\n"
ERROR=1
fi
done
# Validate links object required fields
if [ "$(echo "$entry" | jq 'has("links")')" == "true" ]; then
for link_field in "github" "website" "docs"; do
if [ "$(echo "$entry" | jq ".links | has(\"$link_field\")")" != "true" ]; then
ERROR_MSG="❌ Entry #$INDEX (ID: $ID): links object is missing required field: $link_field"
echo "$ERROR_MSG"
ERRORS_FOUND="${ERRORS_FOUND}${ERROR_MSG}\n"
ERROR=1
fi
done
fi
# Validate tags array is not empty
if [ "$(echo "$entry" | jq '.tags | length')" -eq 0 ]; then
ERROR_MSG="❌ Entry #$INDEX (ID: $ID): tags array cannot be empty"
echo "$ERROR_MSG"
ERRORS_FOUND="${ERRORS_FOUND}${ERROR_MSG}\n"
ERROR=1
fi
done
echo "-------------------------------------------"
if [ $ERROR -eq 1 ]; then
echo "❌ meta.json structure validation failed."
echo -e "Summary of all errors found:${ERRORS_FOUND}"
exit 1
else
echo "✅ meta.json structure validated successfully."
fi
- name: Validate meta.json matches blueprint folders and logo files
run: |
echo "🔍 Validating meta.json against blueprint folders and logos..."
ERROR=0
# Read all blueprint folder names into an array
FOLDERS=($(ls -1 blueprints))
# Extract ids and logos from meta.json
IDS_AND_LOGOS=$(jq -c '.[] | {id, logo}' meta.json)
# Validate each id in meta.json exists as a folder
for item in $IDS_AND_LOGOS; do
ID=$(echo "$item" | jq -r '.id')
LOGO=$(echo "$item" | jq -r '.logo')
# Check if folder exists
if [ ! -d "blueprints/$ID" ]; then
echo "❌ meta.json id \"$ID\" does not have a matching folder in blueprints/"
ERROR=1
continue
fi
# Check if logo file exists inside its folder
if [ ! -f "blueprints/$ID/$LOGO" ]; then
echo "❌ Logo \"$LOGO\" defined for \"$ID\" does not exist in blueprints/$ID/"
ERROR=1
fi
done
# Validate each folder has a matching id in meta.json
META_IDS=$(jq -r '.[].id' meta.json)
for FOLDER in "${FOLDERS[@]}"; do
FOUND=0
for ID in $META_IDS; do
if [ "$FOLDER" == "$ID" ]; then
FOUND=1
break
fi
done
if [ "$FOUND" -eq 0 ]; then
echo "❌ Folder \"$FOLDER\" has no matching id in meta.json"
ERROR=1
fi
done
if [ $ERROR -eq 1 ]; then
echo "❌ meta.json validation failed."
exit 1
else
echo "✅ meta.json validated successfully."
fi
- name: Validate per-template metadata (blueprints/<id>/meta.json)
run: node build-scripts/generate-meta.js --check

2
.gitignore vendored
View File

@@ -1,3 +1,3 @@
node_modules
package-lock.json
meta.json.backup.*
meta.json.backup.*

View File

@@ -29,9 +29,9 @@ This document provides essential context for AI models interacting with this pro
- `/src/hooks`: Custom React hooks (e.g., `useFuseSearch.ts` for fuzzy search).
- `/src/store`: Zustand state management store.
- `/src/lib`: Utility functions and helpers.
- `/build-scripts`: Advanced meta.json processing tools with CLI options and JSON schema validation.
- `/build-scripts`: Metadata tooling — `generate-meta.js` (aggregates and validates every `blueprints/<id>/meta.json` into the served `meta.json` artifact) and `explode-meta.js` (one-shot migration reference).
- `/.github/workflows`: CI/CD workflows for validation, preview builds, and deployments.
- Root level: Core processing scripts (`dedupe-and-sort-meta.js`), metadata index (`meta.json`), build configuration (`Makefile`, `package.json`).
- Root level: There is NO root `meta.json` in the repo — each template's metadata lives in `blueprints/<id>/meta.json` and the global registry is generated at build time.
- **Module Organization:** Node.js scripts for metadata processing, React components for frontend UI, Docker Compose files for service definitions, TOML files for Dokploy configuration. Frontend uses component-based architecture with hooks for business logic and Zustand for global state.
## 4. Coding Conventions & Style Guide
@@ -42,7 +42,7 @@ This document provides essential context for AI models interacting with this pro
- React components: PascalCase (`TemplateGrid`, `SearchBar`)
- Constants: SCREAMING_SNAKE_CASE (`MAX_BUFFER_SIZE`)
- Template IDs: lowercase, kebab-case (`activepieces`, `ghost`) - **MUST** be unique across repository
- Files: snake_case for scripts (`dedupe-and-sort-meta.js`), PascalCase for React components (`TemplateGrid.tsx`), kebab-case for directories (`build-scripts`)
- Files: kebab-case for scripts (`generate-meta.js`), PascalCase for React components (`TemplateGrid.tsx`), kebab-case for directories (`build-scripts`)
- Docker services: **MUST** match blueprint folder name exactly (e.g., `ghost` service in `blueprints/ghost/`)
- **API Design:**
- **Backend:** Procedural scripting approach with CLI interfaces. Template system uses declarative configuration over imperative code.
@@ -65,17 +65,15 @@ This document provides essential context for AI models interacting with this pro
## 5. Key Files & Entrypoints
- **Main Entrypoints:**
- **Backend:** `dedupe-and-sort-meta.js` - Primary script for processing meta.json file.
- **Backend:** `build-scripts/generate-meta.js` - Aggregates and validates all `blueprints/<id>/meta.json` files into the served `meta.json` artifact (`app/public/meta.json`, gitignored).
- **Frontend:** `app/src/main.tsx` - React application entry point.
- **Configuration:**
- `package.json` - Root Node.js project configuration and npm scripts.
- `app/package.json` - Frontend dependencies and pnpm scripts.
- `meta.json` - Centralized template registry (200+ entries).
- `Makefile` - Build automation with targets for processing, validation, and cleanup.
- `app/package.json` - Frontend dependencies and pnpm scripts (`dev` and `build` run `generate-meta.js` first).
- `blueprints/<id>/meta.json` - Per-template metadata (one object per template; 400+ templates).
- `app/vite.config.ts` - Vite build configuration with static copy plugin.
- `app/tsconfig.json` - TypeScript compiler configuration.
- **CI/CD Pipeline:**
- `.github/workflows/validate-meta.yml` - Validates meta.json structure, duplicates, and sort order.
- `.github/workflows/validate-meta.yml` - Validates every `blueprints/<id>/meta.json` (via `generate-meta.js --check`) and rejects a committed root `meta.json`.
- `.github/workflows/build-preview.yml` - Builds preview deployments for PRs.
- `.github/workflows/deploy-preview.yml` - Deploys previews to Cloudflare Pages.
@@ -92,47 +90,26 @@ This document provides essential context for AI models interacting with this pro
cd app && pnpm install
```
- **Process meta.json** (CRITICAL: Run after ANY meta.json edits)
- **Validate template metadata** (CRITICAL: run after adding/editing any `blueprints/<id>/meta.json`)
```bash
npm run process-meta
# or
make process-meta
# or
node dedupe-and-sort-meta.js
node build-scripts/generate-meta.js --check
```
- **Validate without modifying**
- **Generate the served meta.json artifact** (done automatically by `pnpm dev` / `pnpm build` in `app/`)
```bash
npm run validate-meta
# or
make validate
```
- **Quick check for duplicates/sort status**
```bash
make check
```
- **Clean backup files**
```bash
make clean
node build-scripts/generate-meta.js # writes app/public/meta.json
```
- **Task Configuration:**
- **NPM Scripts:** Run `npm run` to list available scripts. Key scripts:
- `process-meta`: Remove duplicates and sort meta.json
- `process-meta-verbose`: Process with detailed output
- `validate-meta`: Validate structure without changes
- **Makefile Targets:** Run `make help` to list targets. Key targets:
- `process-meta`: Process meta.json
- `validate`: Validate without modifying
- `check`: Quick duplicate/sort check
- `build`: Full build process
- `clean`: Remove backup files
- **App scripts (`app/package.json`, pnpm):**
- `dev`: Generate meta artifact + start Vite dev server
- `build`: Generate meta artifact + typecheck + Vite build
- `generate-meta`: Generate the meta artifact only
- **Testing:** No formal unit testing framework. Validation occurs through:
- Script-based validation of meta.json structure and schema
- Script-based validation of every `blueprints/<id>/meta.json` (`build-scripts/generate-meta.js --check`)
- Manual testing via Dokploy preview deployments (import base64 from PR preview)
- JSON schema validation in `build-scripts/process-meta.js`
- TypeScript compilation errors caught during build
- ESLint for code quality in frontend
- **CI/CD Process:**
- **On meta.json changes:** Validates structure, checks for duplicates, verifies sort order, compares processed vs original.
- **On blueprint changes:** Validates each template's metadata (required fields, id/folder match, logo file exists) and rejects a committed root `meta.json`.
- **On PR creation:** Builds preview deployment, generates base64 import for testing in Dokploy.
- **Preview testing:** Use PR description link → Search template → Copy base64 → Import in Dokploy instance.
@@ -140,10 +117,10 @@ This document provides essential context for AI models interacting with this pro
- **Contribution Guidelines:**
- Follow existing Dokploy template structure strictly. Each blueprint must be independent with no shared state.
- **CRITICAL:** Always run `node dedupe-and-sort-meta.js` or `npm run process-meta` after ANY meta.json edits.
- **CRITICAL:** Template metadata lives in `blueprints/<id>/meta.json` (one object per template). Never create or edit a root-level `meta.json` — it is generated at build time. Run `node build-scripts/generate-meta.js --check` after any metadata edits.
- Test templates in Dokploy preview before submitting PRs (use base64 import from PR preview).
- Add logo file (SVG preferred, ~128x128px) to blueprint folder.
- Ensure template `id` in meta.json exactly matches blueprint folder name (lowercase kebab-case).
- Ensure the `id` in `blueprints/<id>/meta.json` exactly matches the blueprint folder name (lowercase kebab-case).
- **Docker Compose Conventions (CRITICAL):**
- **Version:** MUST be `3.8`

View File

@@ -73,16 +73,16 @@ To add a new template, follow these steps:
"""
```
4. **Update `meta.json`**: Add an entry for your template in the root `meta.json`. Include:
4. **Add `meta.json` in your template folder**: Create `blueprints/<id>/meta.json` with a single JSON object describing your template. Do NOT create or edit a root-level `meta.json` — the global registry is generated automatically at build time from every `blueprints/<id>/meta.json` (this is what makes template PRs conflict-free). Include:
- `id`: Folder name (e.g., "grafana").
- `id`: Folder name (e.g., "grafana") — must match the folder exactly.
- `name`: Display name.
- `version`: Image/tag version.
- `description`: Brief overview.
- `logo`: Filename of the logo (e.g., "grafana.svg").
- `links`: Object with `github`, `website`, `docs` (URLs).
- `links`: Object with `github`, `website`, `docs` (URLs; use `""` if not applicable).
- `tags`: Array of categories (e.g., ["monitoring"]).
- Example:
- Example (`blueprints/grafana/meta.json`):
```json
{
"id": "grafana",
@@ -101,7 +101,7 @@ To add a new template, follow these steps:
5. **Add a Logo**: Place an SVG or PNG logo (e.g., `grafana.svg`) in the template folder. Keep it simple and representative (ideally 512x512 or similar).
6. **Run Validation**: Before pushing, run `node dedupe-and-sort-meta.js` (if available) or manually check for syntax errors in YAML/TOML/JSON.
6. **Run Validation**: Before pushing, run `node build-scripts/generate-meta.js --check` to validate every template's metadata (same check CI runs), and manually check for syntax errors in YAML/TOML.
7. **Commit and PR**: Push your branch and open a PR. Include:
- A description of the template.
@@ -195,7 +195,7 @@ If issues arise, debug locally or in the preview. Fix and update your PR.
## Updating Existing Templates
- Follow the same structure as adding new ones.
- Bump `version` in `meta.json` and update `docker-compose.yml` image tags.
- Bump `version` in the template's `blueprints/<id>/meta.json` and update `docker-compose.yml` image tags.
- Test thoroughly, as changes may affect users.
## Reporting Bugs or Requesting Features

View File

@@ -225,4 +225,4 @@ services:
6. Now you can click on the Deploy Button and wait for the deployment to finish, and try to access to the service, if everything is correct you should access to the service and see the template working.
use the command `node dedupe-and-sort-meta.js` to deduplicate and sort the meta.json file.
Each template's metadata lives in `blueprints/<id>/meta.json`; the global `meta.json` is generated at build time. Use `node build-scripts/generate-meta.js --check` to validate all template metadata.

View File

@@ -4,10 +4,11 @@
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc -b && vite build",
"dev": "node ../build-scripts/generate-meta.js && vite",
"build": "node ../build-scripts/generate-meta.js && tsc -b && vite build",
"lint": "eslint .",
"preview": "vite preview"
"preview": "vite preview",
"generate-meta": "node ../build-scripts/generate-meta.js"
},
"dependencies": {
"@codemirror/autocomplete": "^6.19.1",

4
app/pnpm-workspace.yaml Normal file
View File

@@ -0,0 +1,4 @@
packages:
- .
allowBuilds:
esbuild: false

1
app/public/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
meta.json

View File

@@ -13,7 +13,9 @@ const Navigation = () => {
"https://api.github.com/repos/dokploy/dokploy"
);
const data = await response.json();
setGithubStars(data.stargazers_count);
setGithubStars(
Number.isFinite(data.stargazers_count) ? data.stargazers_count : 0
);
} catch (error) {
console.error("Error fetching GitHub stars:", error);
}

View File

@@ -11,11 +11,9 @@ export default defineConfig({
{
src: '../blueprints/*',
dest: 'blueprints' // raíz de dist (public root)
},
{
src: '../meta.json',
dest: '' // raíz de dist
}
// meta.json is no longer copied from the repo root: it is
// generated into app/public/meta.json by build-scripts/generate-meta.js
]
})

View File

@@ -0,0 +1,16 @@
{
"id": "ackee",
"name": "Ackee",
"version": "latest",
"description": "Ackee is a self-hosted analytics tool for your website.",
"logo": "logo.png",
"links": {
"github": "https://github.com/electerious/Ackee",
"website": "https://ackee.electerious.com/",
"docs": "https://docs.ackee.electerious.com/"
},
"tags": [
"analytics",
"self-hosted"
]
}

View File

@@ -0,0 +1,17 @@
{
"id": "activepieces",
"name": "Activepieces",
"version": "0.35.0",
"description": "Open-source no-code business automation tool. An alternative to Zapier, Make.com, and Tray.",
"logo": "activepieces.svg",
"links": {
"github": "https://github.com/activepieces/activepieces",
"website": "https://www.activepieces.com/",
"docs": "https://www.activepieces.com/docs"
},
"tags": [
"automation",
"workflow",
"no-code"
]
}

View File

@@ -0,0 +1,17 @@
{
"id": "actualbudget",
"name": "Actual Budget",
"version": "latest",
"description": "A super fast and privacy-focused app for managing your finances.",
"logo": "actualbudget.png",
"links": {
"github": "https://github.com/actualbudget/actual",
"website": "https://actualbudget.org",
"docs": "https://actualbudget.org/docs"
},
"tags": [
"budgeting",
"finance",
"money"
]
}

View File

@@ -0,0 +1,18 @@
{
"id": "adguardhome",
"name": "AdGuard Home",
"version": "latest",
"description": "AdGuard Home is a comprehensive solution designed to enhance your online browsing experience by eliminating all kinds of ads, from annoying banners and pop-ups to intrusive video ads. It provides privacy protection, browsing security, and parental control features while maintaining website functionality.",
"logo": "logo.svg",
"links": {
"github": "https://github.com/AdguardTeam/AdGuardHome",
"website": "https://adguard.com",
"docs": "https://github.com/AdguardTeam/AdGuardHome/wiki"
},
"tags": [
"privacy",
"security",
"dns",
"ad-blocking"
]
}

View File

@@ -0,0 +1,18 @@
{
"id": "adminer",
"name": "Adminer",
"version": "4.8.1",
"description": "Adminer is a comprehensive database management tool that supports MySQL, MariaDB, PostgreSQL, SQLite, MS SQL, Oracle, Elasticsearch, MongoDB and others. It provides a clean interface for efficient database operations, with strong security features and extensive customization options.",
"logo": "logo.svg",
"links": {
"github": "https://github.com/vrana/adminer",
"website": "https://www.adminer.org/",
"docs": "https://www.adminer.org/en/plugins/"
},
"tags": [
"databases",
"developer-tools",
"mysql",
"postgresql"
]
}

View File

@@ -0,0 +1,19 @@
{
"id": "adventurelog",
"name": "AdventureLog",
"version": "latest",
"description": "AdventureLog is an open-source activity tracker with maps, journaling, and Strava integration.",
"logo": "adventurelog.svg",
"links": {
"github": "https://github.com/seanmorley15/adventurelog",
"website": "https://adventurelog.app/",
"docs": "https://adventurelog.app/docs/"
},
"tags": [
"activity",
"maps",
"django",
"react",
"postgres"
]
}

View File

@@ -0,0 +1,18 @@
{
"id": "affinepro",
"name": "Affine Pro",
"version": "stable-780dd83",
"description": "Affine Pro is a modern, self-hosted platform designed for collaborative content creation and project management. It offers an intuitive interface, seamless real-time collaboration, and powerful tools for organizing tasks, notes, and ideas.",
"logo": "logo.png",
"links": {
"github": "https://github.com/toeverything/Affine",
"website": "https://affine.pro/",
"docs": "https://affine.pro/docs"
},
"tags": [
"collaboration",
"self-hosted",
"productivity",
"project-management"
]
}

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" id="a" viewBox="0 0 3271 1440"><defs><style>.st0{fill:#dedede}</style></defs><path d="M1009.95 1209.53c-125.1-214.98-250.74-430.9-378.92-651.16-126.82 219.73-251.81 436.28-376.62 652.51H60.69c190.42-329.11 570.87-981.75 570.87-981.75s382.11 651.12 572.49 980.41h-194.1Z" class="st0"/><path d="M875.46 1210.46H383.92c32.72-56.91 64.4-111.99 95.81-166.62H781.8c30.62 54.46 61.09 108.66 93.67 166.62zm1622.92-202.23c19.52 29.84 37.9 57.94 58.46 89.39h-63.61c-18.29-24.88-38.17-51.91-57.71-78.49h-72.24v78.17h-51.11V828.44c30.03 0 58.71-.22 87.38.06 23.48.24 47.32-1.26 70.37 2.21 37.67 5.66 66.94 25.71 74.9 64.9 8.22 40.54 1.62 78.35-35.52 104.62-3.14 2.22-6.21 4.54-10.93 7.99h.01Zm-135.01-40.37c34 0 66.71 1.87 99.08-.66 21.47-1.67 30.97-17.92 31.56-39.77.61-22.88-9.01-40.56-30.99-42.73-32.8-3.23-66.15-.84-99.65-.84zM1674.39 829.9v38.37c-52.36 58.82-104.25 117.13-160.14 179.91h158.93v49.49h-227.62v-51.9c46.98-52.11 95.02-105.41 147.93-164.09h-147.28V829.9zm906.29-489.95c64.48 63.91 125.11 123.99 189.35 187.65V373.68h47.4v271.19c-64.19-62.94-125.05-122.59-190.04-186.3v162.44h-46.72V339.94h.01Zm195.02 692.31c13.79-6.85 33.51-15.76 45.41-21.65 41.44 55.26 105.07 42.53 132.33 18s35.44-59.98 25.2-95.47c-13.36-34.33-42.97-61.14-86.36-59.62-43.38 1.52-81.55 32.41-85.2 84.34h-50.32c-.57-50.11 36.27-109.35 94.12-126.75 72.77-21.89 144.89 13.23 172.07 83.77 25.18 65.37-5.74 138.6-72.21 171-60.69 29.59-140.17 6.97-175.1-53.61h.04Zm-811.82-622.07c-11.07 8.4-24.55 17.68-34.13 24.95-55.99-46.33-119.62-30.88-142.33 27.28-13.63 38.17 6.27 88.2 48.2 103.62 36.45 13.4 76.82-.61 87.32-31.48-8.66-2.61-17.29-5.23-28.25-8.54-.93-12.84-1.85-25.67-2.96-40.9h96.82c7.25 56.02-37.39 118.12-94.41 132.17-63.06 15.54-129.35-19.2-152.31-79.83-22.64-59.76 4.81-131.25 61.88-161.16 55.93-29.3 126.75-15.37 160.17 33.88Zm-531.9-55.25c48.2 92.28 93.04 178.13 139.88 267.84h-53.47c-27.89-50.55-56.47-102.34-86.73-157.13-28.93 54.29-56.1 105.29-83.82 157.31h-54.54c45.87-88.68 90.79-175.5 138.65-268.02h.01Zm1642.09 60.65h-89.98v-46.22h226.22v46.24h-86.43v205.91h-49.82V415.59zM1947.89 878.34v65.77l63.09.91s-.03 30.03-.03 50.34c-25.69.89-53.1.45-78.35-5.53-21.38-5.05-36.73-22.63-37.67-46.05-1.5-36.98-.4-75.88-.4-115.24h216.51v49.81h-163.16Zm-52.88 218.57v-68.62c14.11-.65 27.22-1.25 40.97-1.87 3.47 7 3.06 19.81 9.96 20.09 6.88.29 107.67 0 164.04 0v50.41h-214.97Zm342.4-678.53v60.83l58.36.84s-.03 27.78-.03 46.57c-23.85.41-49.12.41-72.49-5.11-19.77-4.68-33.97-20.93-34.85-42.59-1.39-34.2-.37-70.19-.37-106.6h200.29v46.07H2237.4h.01Zm-48.91 202.2v-63.49c13.05-.6 25.18-1.15 37.9-1.73 3.2 6.48 2.83 18.32 9.2 18.59s99.6 0 151.75 0v46.63h-198.87.01Z" class="st0"/></svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -0,0 +1,14 @@
version: "3.8"
services:
agent-zero:
image: agent0ai/agent-zero:v1.9
restart: unless-stopped
expose:
- "80"
environment:
- AUTH_LOGIN=${AUTH_LOGIN}
- AUTH_PASSWORD=${AUTH_PASSWORD}
volumes:
- agent-zero-data:/a0/usr
volumes:
agent-zero-data:

View File

@@ -0,0 +1,17 @@
{
"id": "agent-zero",
"name": "Agent Zero",
"version": "v1.9",
"description": "Agent Zero is an open-source autonomous AI agent framework with memory and tool use capabilities.",
"logo": "agent-zero.svg",
"links": {
"github": "https://github.com/agent0ai/agent-zero",
"website": "https://www.agent-zero.ai",
"docs": "https://www.agent-zero.ai/p/docs/"
},
"tags": [
"ai",
"agent",
"automation"
]
}

View File

@@ -0,0 +1,16 @@
[variables]
main_domain = "${domain}"
auth_login = "${username}"
auth_password = "${password:32}"
[config]
env = [
"AUTH_LOGIN=${auth_login}",
"AUTH_PASSWORD=${auth_password}",
]
mounts = []
[[config.domains]]
serviceName = "agent-zero"
port = 80
host = "${main_domain}"

View File

@@ -0,0 +1,20 @@
{
"id": "agentdvr",
"name": "Agent DVR",
"version": "latest",
"description": "Agent DVR is a comprehensive video surveillance software with motion detection, alerts, and remote access capabilities.",
"logo": "agentdvr.png",
"links": {
"github": "https://github.com/ispysoftware/AgentDVR",
"website": "https://www.ispyconnect.com/",
"docs": "https://www.ispyconnect.com/userguide-agent-dvr.aspx"
},
"tags": [
"surveillance",
"security",
"video",
"monitoring",
"dvr",
"camera"
]
}

View File

@@ -0,0 +1,19 @@
{
"id": "akaunting",
"name": "Akaunting",
"version": "latest",
"description": "Akaunting is a self-hosted, open-source accounting app for small businesses.",
"logo": "image.png",
"links": {
"github": "https://github.com/akaunting/akaunting",
"website": "https://akaunting.com",
"docs": "https://akaunting.com/docs"
},
"tags": [
"finance",
"accounting",
"php",
"mariadb",
"self-hosted"
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

View File

@@ -0,0 +1,30 @@
services:
alarik:
image: ghcr.io/achtungsoftware/alarik:latest
restart: unless-stopped
volumes:
- alarik-storage:/app/Storage
environment:
- API_BASE_URL=${API_BASE_URL}
- CONSOLE_BASE_URL=${CONSOLE_BASE_URL}
- ADMIN_USERNAME=${ADMIN_USERNAME}
- ADMIN_PASSWORD=${ADMIN_PASSWORD}
- JWT=${JWT}
- ALLOW_ACCOUNT_CREATION=${ALLOW_ACCOUNT_CREATION}
expose:
- 8080
console:
image: ghcr.io/achtungsoftware/alarik-console:latest
restart: unless-stopped
environment:
- NUXT_PUBLIC_API_BASE_URL=${API_BASE_URL}
- NUXT_PUBLIC_CONSOLE_BASE_URL=${CONSOLE_BASE_URL}
- NUXT_PUBLIC_ALLOW_ACCOUNT_CREATION=${ALLOW_ACCOUNT_CREATION}
expose:
- 3000
depends_on:
- alarik
volumes:
alarik-storage:

View File

@@ -0,0 +1,17 @@
{
"id": "alarik",
"name": "Alarik",
"description": "Alarik is a high-performance, S3-compatible object storage.",
"logo": "alarik.png",
"version": "latest",
"links": {
"github": "https://github.com/achtungsoftware/alarik",
"website": "https://alarik.io/",
"docs": "https://alarik.io/docs"
},
"tags": [
"storage",
"s3",
"object-storage"
]
}

View File

@@ -0,0 +1,26 @@
[variables]
console_domain = "${domain}"
api_domain = "${domain}"
[config]
mounts = []
# S3-compatible API - point AWS CLI / SDKs / rclone / backup tools at this domain
[[config.domains]]
serviceName = "alarik"
port = 8_080
host = "${api_domain}"
# Web management console - log in with the generated admin credentials below
[[config.domains]]
serviceName = "console"
port = 3_000
host = "${console_domain}"
[config.env]
API_BASE_URL = "http://${api_domain}"
CONSOLE_BASE_URL = "http://${console_domain}"
ADMIN_USERNAME = "alarik"
ADMIN_PASSWORD = "${password:16}"
JWT = "${base64:64}"
ALLOW_ACCOUNT_CREATION = "false"

View File

@@ -0,0 +1,17 @@
{
"id": "alist",
"name": "AList",
"version": "v3.55.0",
"description": "ðŸ—️A file list/WebDAV program that supports multiple storages, powered by Gin and Solidjs.",
"logo": "alist.svg",
"links": {
"github": "https://github.com/AlistGo/alist",
"website": "https://alistgo.com/",
"docs": "https://alistgo.com/guide/install/docker.html"
},
"tags": [
"file",
"webdav",
"storage"
]
}

View File

@@ -0,0 +1,17 @@
{
"id": "alltube",
"name": "AllTube",
"version": "latest",
"description": "AllTube Download is an application designed to facilitate the downloading of videos from YouTube and other video sites. It provides an HTML GUI for youtube-dl with video conversion capabilities and JSON API support.",
"logo": "logo.png",
"links": {
"github": "https://github.com/Rudloff/alltube",
"website": "https://github.com/Rudloff/alltube",
"docs": "https://github.com/Rudloff/alltube/wiki"
},
"tags": [
"media",
"video",
"downloader"
]
}

View File

@@ -0,0 +1,17 @@
{
"id": "ampache",
"name": "Ampache",
"version": "latest",
"description": "Ampache is a web-based audio/video streaming application and file manager allowing you to access your music & videos from anywhere, using almost any internet enabled device.",
"logo": "logo.png",
"links": {
"github": "https://github.com/ampache/ampache",
"website": "http://ampache.org/",
"docs": "https://github.com/ampache/ampache/wiki"
},
"tags": [
"media",
"music",
"streaming"
]
}

View File

@@ -0,0 +1,16 @@
{
"id": "anonupload",
"name": "AnonUpload",
"version": "1",
"description": "AnonUpload is a secure, anonymous file sharing application that does not require a database. It is built with privacy as a priority, ensuring that the direct filename used is not displayed.",
"logo": "logo.png",
"links": {
"github": "https://github.com/supernova3339/anonupload",
"docs": "https://github.com/Supernova3339/anonupload/blob/main/env.md",
"website": "https://anonupload.com/"
},
"tags": [
"file-sharing",
"privacy"
]
}

18
blueprints/anse/meta.json Normal file
View File

@@ -0,0 +1,18 @@
{
"id": "anse",
"name": "Anse",
"version": "latest",
"description": "Anse is an open-source alternative to ChatGPT web UI, supporting OpenAI-compatible APIs.",
"logo": "image.png",
"links": {
"github": "https://github.com/ddiu8081/anse",
"website": "https://anse.app/",
"docs": "https://github.com/ddiu8081/anse#readme"
},
"tags": [
"ai",
"chatbot",
"openai",
"ui"
]
}

View File

@@ -0,0 +1,16 @@
{
"id": "answer",
"name": "Answer",
"version": "v1.4.1",
"description": "Answer is an open-source Q&A platform for building a self-hosted question-and-answer service.",
"logo": "answer.png",
"links": {
"github": "https://github.com/apache/answer",
"website": "https://answer.apache.org/",
"docs": "https://answer.apache.org/docs"
},
"tags": [
"q&a",
"self-hosted"
]
}

View File

@@ -0,0 +1,16 @@
{
"id": "anubis",
"name": "Anubis",
"version": "latest",
"description": "Anubis is a bot protector, It will block bots from accessing your website.",
"logo": "anubis.webp",
"links": {
"github": "https://github.com/TecharoHQ/anubis",
"website": "https://anubis.techaro.lol",
"docs": "https://anubis.techaro.lol/docs/"
},
"tags": [
"self-hosted",
"bot-protection"
]
}

View File

@@ -0,0 +1,17 @@
{
"id": "anythingllm",
"name": "AnythingLLM",
"version": "latest",
"description": "AnythingLLM is a private, self-hosted, and local document chatbot platform that allows you to chat with your documents using various LLM providers.",
"logo": "logo.png",
"links": {
"github": "https://github.com/Mintplex-Labs/anything-llm",
"website": "https://useanything.com",
"docs": "https://github.com/Mintplex-Labs/anything-llm/tree/master/docs"
},
"tags": [
"ai",
"llm",
"chatbot"
]
}

View File

@@ -0,0 +1,17 @@
{
"id": "anytype",
"name": "Anytype",
"version": "latest",
"description": "Anytype is a personal knowledge base—your digital brain—that lets you gather, connect and remix all kinds of information. Create pages, tasks, wikis, journals—even entire apps—and define your own data model while your data stays offline-first, private and encrypted across devices.\n\nAfter installation, you can view the Anytype client configuration by running `cat /data/client-config.yml` inside the service container.",
"logo": "logo.png",
"links": {
"github": "https://github.com/grishy/any-sync-bundle",
"docs": "https://doc.anytype.io/anytype-docs",
"website": "https://anytype.io/"
},
"tags": [
"note-taking",
"local-first",
"peer-to-peer"
]
}

View File

@@ -0,0 +1,19 @@
{
"id": "appflowy",
"name": "App Flowy",
"version": "0.9.3",
"description": "AppFlowy is an open-source alternative to Notion. You are in charge of your data and customizations.",
"links": {
"github": "https://github.com/AppFlowy-IO/AppFlowy",
"website": "https://appflowy.io/",
"docs": "https://docs.appflowy.io/docs"
},
"logo": "appflowy.png",
"tags": [
"productivity",
"self-hosted",
"notes",
"knowledge-base",
"notion-alternative"
]
}

View File

@@ -0,0 +1,16 @@
{
"id": "apprise-api",
"name": "Apprise API",
"version": "latest",
"description": "Apprise API provides a simple interface for sending notifications to almost all of the most popular notification services available to us today.",
"logo": "logo.png",
"links": {
"github": "https://github.com/caronc/apprise-api",
"website": "https://github.com/caronc/apprise-api",
"docs": "https://github.com/caronc/apprise-api/wiki"
},
"tags": [
"notifications",
"api"
]
}

View File

@@ -0,0 +1,15 @@
{
"id": "appsmith",
"name": "Appsmith",
"version": "v1.94",
"description": "Appsmith is a free and open source platform for building internal tools and applications.",
"logo": "appsmith.png",
"links": {
"github": "https://github.com/appsmithorg/appsmith",
"website": "https://appsmith.com/",
"docs": "https://docs.appsmith.com/"
},
"tags": [
"cms"
]
}

View File

@@ -8,12 +8,34 @@ x-logging: &x-logging
max-size: "10m"
services:
appwrite:
image: appwrite/appwrite:1.8.0
image: appwrite/appwrite:1.9.5
<<: *x-logging
restart: unless-stopped
labels:
- traefik.enable=true
- traefik.constraint-label-stack=appwrite
- 'traefik.http.routers.appwrite-sites-wildcard.rule=HostRegexp(`^.+\.${_APP_DOMAIN_SITES}$$`)'
- traefik.http.routers.appwrite-sites-wildcard.entrypoints=web
- traefik.http.routers.appwrite-sites-wildcard.service=appwrite-wildcard
- 'traefik.http.routers.appwrite-sites-wildcard-secure.rule=HostRegexp(`^.+\.${_APP_DOMAIN_SITES}$$`)'
- traefik.http.routers.appwrite-sites-wildcard-secure.entrypoints=websecure
- traefik.http.routers.appwrite-sites-wildcard-secure.tls=true
- traefik.http.routers.appwrite-sites-wildcard-secure.service=appwrite-wildcard
- 'traefik.http.routers.appwrite-functions-wildcard.rule=HostRegexp(`^.+\.${_APP_DOMAIN_FUNCTIONS}$$`)'
- traefik.http.routers.appwrite-functions-wildcard.entrypoints=web
- traefik.http.routers.appwrite-functions-wildcard.service=appwrite-wildcard
- 'traefik.http.routers.appwrite-functions-wildcard-secure.rule=HostRegexp(`^.+\.${_APP_DOMAIN_FUNCTIONS}$$`)'
- traefik.http.routers.appwrite-functions-wildcard-secure.entrypoints=websecure
- traefik.http.routers.appwrite-functions-wildcard-secure.tls=true
- traefik.http.routers.appwrite-functions-wildcard-secure.service=appwrite-wildcard
- traefik.http.services.appwrite-wildcard.loadbalancer.server.port=80
healthcheck:
test:
- CMD
- doctor
interval: 5s
timeout: 5s
retries: 12
volumes:
- appwrite-uploads:/storage/uploads:rw
- appwrite-imports:/storage/imports:rw
@@ -24,21 +46,25 @@ services:
- appwrite-sites:/storage/sites:rw
- appwrite-builds:/storage/builds:rw
depends_on:
- mariadb
- redis
# - clamav
- ${_APP_DB_HOST:-mongodb}
environment:
- _APP_ENV
- _APP_EDITION
- _APP_WORKER_PER_CORE
- _APP_POOL_ADAPTER
- _APP_LOCALE
- _APP_COMPRESSION_ENABLED
- _APP_COMPRESSION_MIN_SIZE_BYTES
- _APP_CONSOLE_WHITELIST_ROOT
- _APP_CONSOLE_WHITELIST_EMAILS
- _APP_CONSOLE_SESSION_ALERTS
- _APP_CONSOLE_WHITELIST_IPS
- _APP_CONSOLE_HOSTNAMES
- _APP_CONSOLE_SCHEMA
- _APP_SYSTEM_EMAIL_NAME
- _APP_SYSTEM_EMAIL_ADDRESS
- _APP_SYSTEM_TEAM_EMAIL
- _APP_EMAIL_SECURITY
- _APP_SYSTEM_RESPONSE_FORMAT
- _APP_OPTIONS_ABUSE
@@ -47,6 +73,8 @@ services:
- _APP_OPTIONS_ROUTER_FORCE_HTTPS
- _APP_OPENSSL_KEY_V1
- _APP_DOMAIN
- _APP_CONSOLE_DOMAIN
- _APP_CONSOLE_TRUSTED_PROJECTS
- _APP_DOMAIN_TARGET_CNAME
- _APP_DOMAIN_TARGET_AAAA
- _APP_DOMAIN_TARGET_A
@@ -57,11 +85,18 @@ services:
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
- _APP_DB_USER
- _APP_DB_PASS
- _APP_DB_ADAPTER_VECTORSDB
- _APP_DB_HOST_VECTORSDB
- _APP_DB_PORT_VECTORSDB
- _APP_DB_SCHEMA_VECTORSDB
- _APP_DB_USER_VECTORSDB
- _APP_DB_PASS_VECTORSDB
- _APP_SMTP_HOST
- _APP_SMTP_PORT
- _APP_SMTP_SECURE
@@ -108,8 +143,6 @@ services:
- _APP_EXECUTOR_HOST
- _APP_LOGGING_CONFIG
- _APP_MAINTENANCE_INTERVAL
- _APP_MAINTENANCE_DELAY
- _APP_MAINTENANCE_START_TIME
- _APP_MAINTENANCE_RETENTION_EXECUTION
- _APP_MAINTENANCE_RETENTION_CACHE
- _APP_MAINTENANCE_RETENTION_ABUSE
@@ -119,6 +152,7 @@ services:
- _APP_MAINTENANCE_RETENTION_SCHEDULES
- _APP_SMS_PROVIDER
- _APP_SMS_FROM
- _APP_GRAPHQL_INTROSPECTION
- _APP_GRAPHQL_MAX_BATCH_SIZE
- _APP_GRAPHQL_MAX_COMPLEXITY
- _APP_GRAPHQL_MAX_DEPTH
@@ -131,16 +165,26 @@ services:
- _APP_MIGRATIONS_FIREBASE_CLIENT_ID
- _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET
- _APP_ASSISTANT_OPENAI_API_KEY
- _APP_CONSOLE_COUNTRIES_DENYLIST
- _APP_EXPERIMENT_LOGGING_PROVIDER
- _APP_EXPERIMENT_LOGGING_CONFIG
- _APP_DATABASE_SHARED_TABLES
- _APP_DATABASE_SHARED_NAMESPACE
- _APP_FUNCTIONS_CREATION_ABUSE_LIMIT
- _APP_CUSTOM_DOMAIN_DENY_LIST
- _APP_TRUSTED_HEADERS
- _APP_MIGRATION_HOST
appwrite-console:
<<: *x-logging
image: appwrite/console:7.4.7
image: appwrite/console:8.7.5
restart: unless-stopped
labels:
- "traefik.enable=true"
- "traefik.constraint-label-stack=appwrite"
appwrite-realtime:
image: appwrite/appwrite:1.8.0
image: appwrite/appwrite:1.9.5
entrypoint: realtime
<<: *x-logging
restart: unless-stopped
@@ -148,7 +192,7 @@ services:
- "traefik.enable=true"
- "traefik.constraint-label-stack=appwrite"
depends_on:
- mariadb
- ${_APP_DB_HOST:-mongodb}
- redis
environment:
- _APP_ENV
@@ -160,51 +204,69 @@ services:
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
- _APP_DB_USER
- _APP_DB_PASS
- _APP_DB_ADAPTER_VECTORSDB
- _APP_DB_HOST_VECTORSDB
- _APP_DB_PORT_VECTORSDB
- _APP_DB_SCHEMA_VECTORSDB
- _APP_DB_USER_VECTORSDB
- _APP_DB_PASS_VECTORSDB
- _APP_USAGE_STATS
- _APP_LOGGING_CONFIG
- _APP_LOGGING_CONFIG_REALTIME
- _APP_DATABASE_SHARED_TABLES
- _APP_POOL_ADAPTER=swoole
appwrite-worker-audits:
image: appwrite/appwrite:1.8.0
image: appwrite/appwrite:1.9.5
entrypoint: worker-audits
<<: *x-logging
restart: unless-stopped
depends_on:
- redis
- mariadb
- ${_APP_DB_HOST:-mongodb}
environment:
- _APP_ENV
- _APP_WORKERS_NUM=1
- _APP_WORKER_MAX_COROUTINES=1
- _APP_WORKER_PER_CORE
- _APP_POOL_ADAPTER
- _APP_OPENSSL_KEY_V1
- _APP_REDIS_HOST
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
- _APP_DB_USER
- _APP_DB_PASS
- _APP_LOGGING_CONFIG
- _APP_DATABASE_SHARED_TABLES
appwrite-worker-webhooks:
image: appwrite/appwrite:1.8.0
image: appwrite/appwrite:1.9.5
entrypoint: worker-webhooks
<<: *x-logging
restart: unless-stopped
depends_on:
- redis
- mariadb
- ${_APP_DB_HOST:-mongodb}
environment:
- _APP_ENV
- _APP_WORKERS_NUM=1
- _APP_WORKER_MAX_COROUTINES=8
- _APP_WORKER_PER_CORE
- _APP_POOL_ADAPTER
- _APP_OPENSSL_KEY_V1
- _APP_EMAIL_SECURITY
- _APP_SYSTEM_SECURITY_EMAIL_ADDRESS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
@@ -215,15 +277,17 @@ services:
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_LOGGING_CONFIG
- _APP_WEBHOOK_MAX_FAILED_ATTEMPTS
- _APP_DATABASE_SHARED_TABLES
appwrite-worker-deletes:
image: appwrite/appwrite:1.8.0
image: appwrite/appwrite:1.9.5
entrypoint: worker-deletes
<<: *x-logging
restart: unless-stopped
depends_on:
- redis
- mariadb
- ${_APP_DB_HOST:-mongodb}
volumes:
- appwrite-uploads:/storage/uploads:rw
- appwrite-cache:/storage/cache:rw
@@ -233,12 +297,16 @@ services:
- appwrite-certificates:/storage/certificates:rw
environment:
- _APP_ENV
- _APP_WORKERS_NUM=1
- _APP_WORKER_MAX_COROUTINES=8
- _APP_WORKER_PER_CORE
- _APP_POOL_ADAPTER
- _APP_OPENSSL_KEY_V1
- _APP_REDIS_HOST
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
@@ -269,52 +337,64 @@ services:
- _APP_LOGGING_CONFIG
- _APP_EXECUTOR_SECRET
- _APP_EXECUTOR_HOST
- _APP_MAINTENANCE_RETENTION_ABUSE
- _APP_DATABASE_SHARED_TABLES
- _APP_EMAIL_CERTIFICATES
- _APP_MAINTENANCE_RETENTION_AUDIT
- _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE
- _APP_MAINTENANCE_RETENTION_EXECUTION
- _APP_SYSTEM_SECURITY_EMAIL_ADDRESS
- _APP_EMAIL_CERTIFICATES
appwrite-worker-databases:
image: appwrite/appwrite:1.8.0
image: appwrite/appwrite:1.9.5
entrypoint: worker-databases
<<: *x-logging
restart: unless-stopped
depends_on:
- redis
- mariadb
- ${_APP_DB_HOST:-mongodb}
environment:
- _APP_ENV
- _APP_WORKERS_NUM=1
- _APP_WORKER_MAX_COROUTINES=1
- _APP_WORKER_PER_CORE
- _APP_POOL_ADAPTER
- _APP_OPENSSL_KEY_V1
- _APP_REDIS_HOST
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
- _APP_DB_USER
- _APP_DB_PASS
- _APP_DB_ADAPTER_VECTORSDB
- _APP_DB_HOST_VECTORSDB
- _APP_DB_PORT_VECTORSDB
- _APP_DB_SCHEMA_VECTORSDB
- _APP_DB_USER_VECTORSDB
- _APP_DB_PASS_VECTORSDB
- _APP_LOGGING_CONFIG
- _APP_QUEUE_NAME
- _APP_DATABASE_SHARED_TABLES
appwrite-worker-builds:
image: appwrite/appwrite:1.8.0
image: appwrite/appwrite:1.9.5
entrypoint: worker-builds
<<: *x-logging
restart: unless-stopped
depends_on:
- redis
- mariadb
- ${_APP_DB_HOST:-mongodb}
volumes:
- appwrite-functions:/storage/functions:rw
- appwrite-sites:/storage/sites:rw
- appwrite-builds:/storage/builds:rw
- appwrite-uploads:/storage/uploads:rw
environment:
- _APP_ENV
- _APP_WORKERS_NUM=1
- _APP_WORKER_MAX_COROUTINES=8
- _APP_WORKER_PER_CORE
- _APP_POOL_ADAPTER
- _APP_OPENSSL_KEY_V1
- _APP_EXECUTOR_SECRET
- _APP_EXECUTOR_HOST
@@ -322,6 +402,7 @@ services:
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
@@ -336,10 +417,13 @@ services:
- _APP_COMPUTE_BUILD_TIMEOUT
- _APP_COMPUTE_CPUS
- _APP_COMPUTE_MEMORY
- _APP_OPEN_RUNTIMES_NFT
- _APP_COMPUTE_SIZE_LIMIT
- _APP_OPTIONS_FORCE_HTTPS
- _APP_OPTIONS_ROUTER_FORCE_HTTPS
- _APP_DOMAIN
- _APP_CONSOLE_DOMAIN
- _APP_CONSOLE_TRUSTED_PROJECTS
- _APP_STORAGE_DEVICE
- _APP_STORAGE_S3_ACCESS_KEY
- _APP_STORAGE_S3_SECRET
@@ -362,22 +446,85 @@ services:
- _APP_STORAGE_WASABI_SECRET
- _APP_STORAGE_WASABI_REGION
- _APP_STORAGE_WASABI_BUCKET
- _APP_DATABASE_SHARED_TABLES
- _APP_DOMAIN_SITES
extra_hosts:
- host.docker.internal:host-gateway
appwrite-worker-screenshots:
image: appwrite/appwrite:1.9.5
entrypoint: worker-screenshots
<<: *x-logging
restart: unless-stopped
depends_on:
- redis
- ${_APP_DB_HOST:-mongodb}
volumes:
- appwrite-uploads:/storage/uploads:rw
environment:
- _APP_BROWSER_HOST
- _APP_WORKER_SCREENSHOTS_ROUTER
- _APP_OPTIONS_FORCE_HTTPS
- _APP_ENV
- _APP_WORKERS_NUM=1
- _APP_WORKER_MAX_COROUTINES=8
- _APP_WORKER_PER_CORE
- _APP_POOL_ADAPTER
- _APP_LOGGING_CONFIG
- _APP_OPENSSL_KEY_V1
- _APP_REDIS_HOST
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
- _APP_DB_USER
- _APP_DB_PASS
- _APP_DATABASE_SHARED_TABLES
- _APP_STORAGE_DEVICE
- _APP_STORAGE_S3_ACCESS_KEY
- _APP_STORAGE_S3_SECRET
- _APP_STORAGE_S3_REGION
- _APP_STORAGE_S3_BUCKET
- _APP_STORAGE_S3_ENDPOINT
- _APP_STORAGE_DO_SPACES_ACCESS_KEY
- _APP_STORAGE_DO_SPACES_SECRET
- _APP_STORAGE_DO_SPACES_REGION
- _APP_STORAGE_DO_SPACES_BUCKET
- _APP_STORAGE_BACKBLAZE_ACCESS_KEY
- _APP_STORAGE_BACKBLAZE_SECRET
- _APP_STORAGE_BACKBLAZE_REGION
- _APP_STORAGE_BACKBLAZE_BUCKET
- _APP_STORAGE_LINODE_ACCESS_KEY
- _APP_STORAGE_LINODE_SECRET
- _APP_STORAGE_LINODE_REGION
- _APP_STORAGE_LINODE_BUCKET
- _APP_STORAGE_WASABI_ACCESS_KEY
- _APP_STORAGE_WASABI_SECRET
- _APP_STORAGE_WASABI_REGION
- _APP_STORAGE_WASABI_BUCKET
extra_hosts:
- host.docker.internal:host-gateway
appwrite-worker-certificates:
image: appwrite/appwrite:1.8.0
image: appwrite/appwrite:1.9.5
entrypoint: worker-certificates
<<: *x-logging
restart: unless-stopped
depends_on:
- redis
- mariadb
- ${_APP_DB_HOST:-mongodb}
volumes:
- appwrite-config:/storage/config:rw
- appwrite-certificates:/storage/certificates:rw
environment:
- _APP_ENV
- _APP_WORKERS_NUM=1
- _APP_WORKER_MAX_COROUTINES=8
- _APP_WORKER_PER_CORE
- _APP_POOL_ADAPTER
- _APP_OPENSSL_KEY_V1
- _APP_DOMAIN
- _APP_DOMAIN_TARGET_CNAME
@@ -386,30 +533,64 @@ services:
- _APP_DOMAIN_TARGET_CAA
- _APP_DNS
- _APP_DOMAIN_FUNCTIONS
- _APP_DOMAIN_SITES
- _APP_EMAIL_CERTIFICATES
- _APP_REDIS_HOST
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
- _APP_DB_USER
- _APP_DB_PASS
- _APP_LOGGING_CONFIG
- _APP_DATABASE_SHARED_TABLES
appwrite-worker-functions:
image: appwrite/appwrite:1.8.0
entrypoint: worker-functions
appwrite-worker-executions:
image: appwrite/appwrite:1.9.5
entrypoint: worker-executions
<<: *x-logging
restart: unless-stopped
depends_on:
- redis
- mariadb
- ${_APP_DB_HOST:-mongodb}
environment:
- _APP_ENV
- _APP_WORKERS_NUM=1
- _APP_WORKER_MAX_COROUTINES=8
- _APP_WORKER_PER_CORE
- _APP_POOL_ADAPTER
- _APP_OPENSSL_KEY_V1
- _APP_REDIS_HOST
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
- _APP_DB_USER
- _APP_DB_PASS
- _APP_LOGGING_CONFIG
- _APP_DATABASE_SHARED_TABLES
appwrite-worker-functions:
image: appwrite/appwrite:1.9.5
entrypoint: worker-functions
<<: *x-logging
restart: unless-stopped
depends_on:
- ${_APP_DB_HOST:-mongodb}
- redis
- openruntimes-executor
environment:
- _APP_ENV
- _APP_WORKERS_NUM=1
- _APP_WORKER_MAX_COROUTINES=8
- _APP_WORKER_PER_CORE
- _APP_POOL_ADAPTER
- _APP_OPENSSL_KEY_V1
- _APP_DOMAIN
- _APP_OPTIONS_FORCE_HTTPS
@@ -417,6 +598,7 @@ services:
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
@@ -433,9 +615,11 @@ services:
- _APP_DOCKER_HUB_USERNAME
- _APP_DOCKER_HUB_PASSWORD
- _APP_LOGGING_CONFIG
- _APP_LOGGING_PROVIDER
- _APP_DATABASE_SHARED_TABLES
appwrite-worker-mails:
image: appwrite/appwrite:1.8.0
image: appwrite/appwrite:1.9.5
entrypoint: worker-mails
<<: *x-logging
restart: unless-stopped
@@ -443,19 +627,23 @@ services:
- redis
environment:
- _APP_ENV
- _APP_WORKERS_NUM=1
- _APP_WORKER_MAX_COROUTINES=1
- _APP_WORKER_PER_CORE
- _APP_POOL_ADAPTER
- _APP_OPENSSL_KEY_V1
- _APP_SYSTEM_EMAIL_NAME
- _APP_SYSTEM_EMAIL_ADDRESS
- _APP_REDIS_HOST
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
- _APP_DB_USER
- _APP_DB_PASS
- _APP_REDIS_HOST
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_SMTP_HOST
- _APP_SMTP_PORT
- _APP_SMTP_SECURE
@@ -464,9 +652,10 @@ services:
- _APP_LOGGING_CONFIG
- _APP_DOMAIN
- _APP_OPTIONS_FORCE_HTTPS
- _APP_DATABASE_SHARED_TABLES
appwrite-worker-messaging:
image: appwrite/appwrite:1.8.0
image: appwrite/appwrite:1.9.5
entrypoint: worker-messaging
<<: *x-logging
restart: unless-stopped
@@ -476,12 +665,16 @@ services:
- redis
environment:
- _APP_ENV
- _APP_WORKERS_NUM=1
- _APP_WORKER_MAX_COROUTINES=1
- _APP_WORKER_PER_CORE
- _APP_POOL_ADAPTER
- _APP_OPENSSL_KEY_V1
- _APP_REDIS_HOST
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
@@ -490,6 +683,7 @@ services:
- _APP_LOGGING_CONFIG
- _APP_SMS_FROM
- _APP_SMS_PROVIDER
- _APP_SMS_PROJECTS_DENY_LIST
- _APP_STORAGE_DEVICE
- _APP_STORAGE_S3_ACCESS_KEY
- _APP_STORAGE_S3_SECRET
@@ -512,19 +706,24 @@ services:
- _APP_STORAGE_WASABI_SECRET
- _APP_STORAGE_WASABI_REGION
- _APP_STORAGE_WASABI_BUCKET
- _APP_DATABASE_SHARED_TABLES
appwrite-worker-migrations:
image: appwrite/appwrite:1.8.0
image: appwrite/appwrite:1.9.5
entrypoint: worker-migrations
<<: *x-logging
restart: unless-stopped
volumes:
- appwrite-imports:/storage/imports:rw
- appwrite-uploads:/storage/uploads:rw
depends_on:
- mariadb
- ${_APP_DB_HOST:-mongodb}
environment:
- _APP_ENV
- _APP_WORKERS_NUM=1
- _APP_WORKER_MAX_COROUTINES=1
- _APP_WORKER_PER_CORE
- _APP_POOL_ADAPTER
- _APP_OPENSSL_KEY_V1
- _APP_DOMAIN
- _APP_DOMAIN_TARGET_CNAME
@@ -537,6 +736,7 @@ services:
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
@@ -545,17 +745,22 @@ services:
- _APP_LOGGING_CONFIG
- _APP_MIGRATIONS_FIREBASE_CLIENT_ID
- _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET
- _APP_DATABASE_SHARED_TABLES
- _APP_OPTIONS_FORCE_HTTPS
- _APP_MIGRATION_HOST
appwrite-task-maintenance:
image: appwrite/appwrite:1.8.0
image: appwrite/appwrite:1.9.5
entrypoint: maintenance
<<: *x-logging
restart: unless-stopped
depends_on:
- ${_APP_DB_HOST:-mongodb}
- redis
environment:
- _APP_ENV
- _APP_WORKER_PER_CORE
- _APP_POOL_ADAPTER
- _APP_DOMAIN
- _APP_DOMAIN_TARGET_CNAME
- _APP_DOMAIN_TARGET_AAAA
@@ -568,6 +773,7 @@ services:
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
@@ -581,19 +787,58 @@ services:
- _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE
- _APP_MAINTENANCE_RETENTION_USAGE_HOURLY
- _APP_MAINTENANCE_RETENTION_SCHEDULES
- _APP_MAINTENANCE_START_TIME
- _APP_DATABASE_SHARED_TABLES
appwrite-task-interval:
image: appwrite/appwrite:1.9.5
entrypoint: interval
<<: *x-logging
restart: unless-stopped
depends_on:
- ${_APP_DB_HOST:-mongodb}
- redis
environment:
- _APP_ENV
- _APP_WORKER_PER_CORE
- _APP_POOL_ADAPTER
- _APP_DOMAIN
- _APP_DOMAIN_TARGET_CNAME
- _APP_DOMAIN_TARGET_AAAA
- _APP_DOMAIN_TARGET_A
- _APP_DOMAIN_TARGET_CAA
- _APP_DNS
- _APP_DOMAIN_FUNCTIONS
- _APP_DOMAIN_SITES
- _APP_OPENSSL_KEY_V1
- _APP_REDIS_HOST
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
- _APP_DB_USER
- _APP_DB_PASS
- _APP_DATABASE_SHARED_TABLES
- _APP_INTERVAL_DOMAIN_VERIFICATION
- _APP_INTERVAL_CLEANUP_STALE_EXECUTIONS
appwrite-task-stats-resources:
image: appwrite/appwrite:1.8.0
image: appwrite/appwrite:1.9.5
entrypoint: stats-resources
<<: *x-logging
restart: unless-stopped
depends_on:
- redis
- mariadb
- ${_APP_DB_HOST:-mongodb}
environment:
- _APP_ENV
- _APP_WORKER_PER_CORE
- _APP_POOL_ADAPTER
- _APP_OPENSSL_KEY_V1
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
@@ -609,42 +854,21 @@ services:
- _APP_STATS_RESOURCES_INTERVAL
appwrite-worker-stats-resources:
image: appwrite/appwrite:1.8.0
image: appwrite/appwrite:1.9.5
entrypoint: worker-stats-resources
<<: *x-logging
restart: unless-stopped
depends_on:
- redis
- mariadb
environment:
- _APP_ENV
- _APP_WORKER_PER_CORE
- _APP_OPENSSL_KEY_V1
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
- _APP_DB_USER
- _APP_DB_PASS
- _APP_REDIS_HOST
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_USAGE_STATS
- _APP_LOGGING_CONFIG
- _APP_STATS_RESOURCES_INTERVAL
appwrite-worker-stats-usage:
image: appwrite/appwrite:1.8.0
entrypoint: worker-stats-usage
<<: *x-logging
restart: unless-stopped
depends_on:
- redis
- mariadb
- ${_APP_DB_HOST:-mongodb}
environment:
- _APP_ENV
- _APP_WORKERS_NUM=1
- _APP_WORKER_MAX_COROUTINES=1
- _APP_WORKER_PER_CORE
- _APP_POOL_ADAPTER
- _APP_OPENSSL_KEY_V1
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
@@ -657,91 +881,145 @@ services:
- _APP_USAGE_STATS
- _APP_LOGGING_CONFIG
- _APP_USAGE_AGGREGATION_INTERVAL
- _APP_DATABASE_SHARED_TABLES
appwrite-worker-stats-usage:
image: appwrite/appwrite:1.9.5
entrypoint: worker-stats-usage
<<: *x-logging
restart: unless-stopped
depends_on:
- redis
- ${_APP_DB_HOST:-mongodb}
environment:
- _APP_ENV
- _APP_WORKERS_NUM=1
- _APP_WORKER_MAX_COROUTINES=1
- _APP_WORKER_PER_CORE
- _APP_POOL_ADAPTER
- _APP_OPENSSL_KEY_V1
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
- _APP_DB_USER
- _APP_DB_PASS
- _APP_REDIS_HOST
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_USAGE_STATS
- _APP_LOGGING_CONFIG
- _APP_USAGE_AGGREGATION_INTERVAL
- _APP_DATABASE_SHARED_TABLES
appwrite-task-scheduler-functions:
image: appwrite/appwrite:1.8.0
image: appwrite/appwrite:1.9.5
entrypoint: schedule-functions
<<: *x-logging
restart: unless-stopped
depends_on:
- mariadb
- ${_APP_DB_HOST:-mongodb}
- redis
environment:
- _APP_ENV
- _APP_WORKER_PER_CORE
- _APP_POOL_ADAPTER
- _APP_OPENSSL_KEY_V1
- _APP_OPTIONS_FORCE_HTTPS
- _APP_DOMAIN
- _APP_CONSOLE_DOMAIN
- _APP_DOMAIN_FUNCTIONS
- _APP_DOMAIN_SITES
- _APP_MIGRATION_HOST
- _APP_CONSOLE_SCHEMA
- _APP_REDIS_HOST
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
- _APP_DB_USER
- _APP_DB_PASS
- _APP_DATABASE_SHARED_TABLES
appwrite-task-scheduler-executions:
image: appwrite/appwrite:1.8.0
image: appwrite/appwrite:1.9.5
entrypoint: schedule-executions
<<: *x-logging
restart: unless-stopped
depends_on:
- mariadb
- ${_APP_DB_HOST:-mongodb}
- redis
environment:
- _APP_ENV
- _APP_WORKER_PER_CORE
- _APP_POOL_ADAPTER
- _APP_OPENSSL_KEY_V1
- _APP_OPTIONS_FORCE_HTTPS
- _APP_DOMAIN
- _APP_CONSOLE_DOMAIN
- _APP_DOMAIN_FUNCTIONS
- _APP_DOMAIN_SITES
- _APP_MIGRATION_HOST
- _APP_CONSOLE_SCHEMA
- _APP_REDIS_HOST
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
- _APP_DB_USER
- _APP_DB_PASS
- _APP_DATABASE_SHARED_TABLES
appwrite-task-scheduler-messages:
image: appwrite/appwrite:1.8.0
image: appwrite/appwrite:1.9.5
entrypoint: schedule-messages
<<: *x-logging
restart: unless-stopped
depends_on:
- mariadb
- ${_APP_DB_HOST:-mongodb}
- redis
environment:
- _APP_ENV
- _APP_WORKER_PER_CORE
- _APP_POOL_ADAPTER
- _APP_OPENSSL_KEY_V1
- _APP_REDIS_HOST
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
- _APP_DB_USER
- _APP_DB_PASS
- _APP_DATABASE_SHARED_TABLES
appwrite-assistant:
image: appwrite/assistant:0.8.3
image: appwrite/assistant:0.8.4
<<: *x-logging
restart: unless-stopped
environment:
- _APP_ASSISTANT_OPENAI_API_KEY
appwrite-browser:
image: appwrite/browser:0.2.4
image: appwrite/browser:0.3.2
<<: *x-logging
restart: unless-stopped
openruntimes-executor:
hostname: exc1
hostname: openruntimes-executor
<<: *x-logging
restart: unless-stopped
stop_signal: SIGINT
image: openruntimes/executor:0.7.22
image: openruntimes/executor:0.25.1
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- appwrite-builds:/storage/builds:rw
@@ -751,7 +1029,10 @@ services:
# It's not possible to share mount file between 2 containers without host mount (copying is too slow)
- /tmp:/tmp:rw
environment:
- OPR_EXECUTOR_INACTIVE_TRESHOLD=$_APP_COMPUTE_INACTIVE_THRESHOLD
- OPR_EXECUTOR_CONNECTION_STORAGE=local://localhost
- OPR_EXECUTOR_CONNECTION_BUILD_CACHE_STORAGE=
- OPR_EXECUTOR_IMAGES=$_APP_EXECUTOR_IMAGES
- OPR_EXECUTOR_INACTIVE_THRESHOLD=$_APP_COMPUTE_INACTIVE_THRESHOLD
- OPR_EXECUTOR_MAINTENANCE_INTERVAL=$_APP_COMPUTE_MAINTENANCE_INTERVAL
- OPR_EXECUTOR_NETWORK=$_APP_COMPUTE_RUNTIMES_NETWORK
- OPR_EXECUTOR_DOCKER_HUB_USERNAME=$_APP_DOCKER_HUB_USERNAME
@@ -760,6 +1041,7 @@ services:
- OPR_EXECUTOR_RUNTIMES=$_APP_FUNCTIONS_RUNTIMES,$_APP_SITES_RUNTIMES
- OPR_EXECUTOR_SECRET=$_APP_EXECUTOR_SECRET
- OPR_EXECUTOR_RUNTIME_VERSIONS=v5
- OPEN_RUNTIMES_NFT=$_APP_OPEN_RUNTIMES_NFT
- OPR_EXECUTOR_LOGGING_CONFIG=$_APP_LOGGING_CONFIG
- OPR_EXECUTOR_STORAGE_DEVICE=$_APP_STORAGE_DEVICE
- OPR_EXECUTOR_STORAGE_S3_ACCESS_KEY=$_APP_STORAGE_S3_ACCESS_KEY
@@ -783,6 +1065,55 @@ services:
- OPR_EXECUTOR_STORAGE_WASABI_SECRET=$_APP_STORAGE_WASABI_SECRET
- OPR_EXECUTOR_STORAGE_WASABI_REGION=$_APP_STORAGE_WASABI_REGION
- OPR_EXECUTOR_STORAGE_WASABI_BUCKET=$_APP_STORAGE_WASABI_BUCKET
healthcheck:
test:
- CMD-SHELL
- 'curl -fsS -H "Authorization: Bearer $$OPR_EXECUTOR_SECRET" http://localhost/v1/health >/dev/null'
interval: 5s
timeout: 3s
retries: 20
start_period: 5s
mongodb:
image: mongo:8.2.5
<<: *x-logging
restart: unless-stopped
volumes:
- appwrite-mongodb:/data/db
- appwrite-mongodb-keyfile:/data/keyfile
- ../files/mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
- ../files/mongo-entrypoint.sh:/mongo-entrypoint.sh:ro
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=${_APP_DB_ROOT_PASS}
- MONGO_INITDB_DATABASE=${_APP_DB_SCHEMA}
- MONGO_INITDB_USERNAME=${_APP_DB_USER}
- MONGO_INITDB_PASSWORD=${_APP_DB_PASS}
entrypoint:
- /bin/bash
- /mongo-entrypoint.sh
healthcheck:
test: |
bash -c "
mongosh -u root -p \"$$MONGO_INITDB_ROOT_PASSWORD\" --authenticationDatabase admin --quiet --eval \"
try {
const hello = db.adminCommand({hello: 1});
if (hello.isWritablePrimary) {
quit(0);
}
} catch (e) {}
try {
rs.initiate({_id: 'rs0', members: [{_id: 0, host: 'mongodb:27017'}]});
} catch (e) {}
quit(1);
\" 2>/dev/null
"
interval: 10s
timeout: 10s
retries: 10
start_period: 30s
mariadb:
image: mariadb:10.11 # fix issues when upgrading using: mysql_upgrade -u root -p
@@ -799,7 +1130,7 @@ services:
command: "mysqld --innodb-flush-method=fsync"
redis:
image: redis:7.2.4-alpine
image: redis:7.4.7-alpine
<<: *x-logging
restart: unless-stopped
command: >
@@ -818,6 +1149,8 @@ services:
volumes:
appwrite-mariadb:
appwrite-mongodb:
appwrite-mongodb-keyfile:
appwrite-redis:
appwrite-cache:
appwrite-uploads:

View File

@@ -0,0 +1,20 @@
{
"id": "appwrite",
"name": "Appwrite",
"version": "1.9.5",
"description": "Appwrite is an end-to-end platform for building Web, Mobile, Native, or Backend apps, packaged as a set of Docker microservices. It includes both a backend server and a fully integrated hosting solution for deploying static and server-side rendered frontends. Appwrite abstracts the complexity and repetitiveness required to build modern apps from scratch and allows you to build secure, full-stack applications faster.\nUsing Appwrite, you can easily integrate your app with user authentication and multiple sign-in methods, a database for storing and querying users and team data, storage and file management, image manipulation, Cloud Functions, messaging, and more services.",
"links": {
"github": "https://github.com/appwrite/appwrite",
"website": "https://appwrite.io/",
"docs": "https://appwrite.io/docs"
},
"logo": "appwrite.svg",
"tags": [
"database",
"firebase",
"mariadb",
"mongodb",
"hosting",
"self-hosted"
]
}

View File

@@ -10,58 +10,69 @@ executor_secret = "${password:32}"
[config]
env = [
"_APP_ENV=production",
"_APP_EDITION=self-hosted",
"_APP_LOCALE=en",
"_APP_POOL_ADAPTER=stack",
"_APP_WORKER_PER_CORE=6",
"_APP_OPTIONS_ABUSE=enabled",
"_APP_OPTIONS_FORCE_HTTPS=disabled",
"_APP_OPTIONS_FUNCTIONS_FORCE_HTTPS=disabled",
"_APP_OPTIONS_ROUTER_FORCE_HTTPS=disabled",
"_APP_OPTIONS_ROUTER_PROTECTION=disabled",
"_APP_OPENSSL_KEY_V1=${openssl_key}",
"_APP_DOMAIN=${main_domain}",
"_APP_CONSOLE_DOMAIN=${main_domain}",
"_APP_CONSOLE_TRUSTED_PROJECTS=",
"_APP_CUSTOM_DOMAIN_DENY_LIST=example.com,test.com,app.example.com",
"_APP_DOMAIN_FUNCTIONS=${functions_domain}",
"_APP_DOMAIN_SITES=${sites_domain}",
"_APP_DOMAIN_TARGET=localhost",
"_APP_DOMAIN_TARGET_CNAME=localhost",
"_APP_DOMAIN_TARGET_AAAA=::1",
"_APP_DOMAIN_TARGET_A=127.0.0.1",
"_APP_DOMAIN_TARGET_CAA=",
"_APP_DNS=8.8.8.8",
"_APP_TRUSTED_HEADERS=x-forwarded-for",
"_APP_CONSOLE_WHITELIST_ROOT=enabled",
"_APP_CONSOLE_WHITELIST_EMAILS=",
"_APP_CONSOLE_WHITELIST_IPS=",
"_APP_CONSOLE_HOSTNAMES=",
"_APP_CONSOLE_SCHEMA=appwriteio",
"_APP_CONSOLE_SESSION_ALERTS=disabled",
"_APP_CONSOLE_COUNTRIES_DENYLIST=",
"_APP_SYSTEM_EMAIL_NAME=Appwrite",
"_APP_SYSTEM_EMAIL_ADDRESS=noreply@appwrite.io",
"_APP_SYSTEM_TEAM_EMAIL=team@appwrite.io",
"_APP_SYSTEM_RESPONSE_FORMAT=",
"_APP_SYSTEM_SECURITY_EMAIL_ADDRESS=certs@appwrite.io",
"_APP_EMAIL_SECURITY=",
"_APP_EMAIL_CERTIFICATES=",
"_APP_USAGE_STATS=enabled",
"_APP_LOGGING_PROVIDER=",
"_APP_LOGGING_CONFIG=",
"_APP_USAGE_AGGREGATION_INTERVAL=30",
"_APP_USAGE_TIMESERIES_INTERVAL=30",
"_APP_USAGE_DATABASE_INTERVAL=900",
"_APP_WORKER_PER_CORE=6",
"_APP_CONSOLE_SESSION_ALERTS=disabled",
"_APP_COMPRESSION_ENABLED=enabled",
"_APP_COMPRESSION_MIN_SIZE_BYTES=1024",
"_APP_USAGE_STATS=enabled",
"_APP_USAGE_AGGREGATION_INTERVAL=30",
"_APP_STATS_RESOURCES_INTERVAL=30",
"_APP_LOGGING_PROVIDER=",
"_APP_LOGGING_CONFIG=",
"_APP_LOGGING_CONFIG_REALTIME=",
"_APP_EXPERIMENT_LOGGING_PROVIDER=",
"_APP_EXPERIMENT_LOGGING_CONFIG=",
"_APP_REDIS_HOST=redis",
"_APP_REDIS_PORT=6379",
"_APP_REDIS_USER=",
"_APP_REDIS_PASS=",
"_APP_DB_HOST=mariadb",
"_APP_DB_PORT=3306",
"_APP_DB_ADAPTER=mongodb",
"_APP_DB_HOST=mongodb",
"_APP_DB_PORT=27017",
"_APP_DB_SCHEMA=appwrite",
"_APP_DB_USER=user",
"_APP_DB_PASS=${db_user_pw}",
"_APP_DB_ROOT_PASS=${db_root_pw}",
"_APP_INFLUXDB_HOST=influxdb",
"_APP_INFLUXDB_PORT=8086",
"_APP_STATSD_HOST=telegraf",
"_APP_STATSD_PORT=8125",
"_APP_DATABASE_SHARED_TABLES=",
"_APP_DATABASE_SHARED_NAMESPACE=",
"_APP_DB_ADAPTER_VECTORSDB=",
"_APP_DB_HOST_VECTORSDB=",
"_APP_DB_PORT_VECTORSDB=",
"_APP_DB_SCHEMA_VECTORSDB=",
"_APP_DB_USER_VECTORSDB=",
"_APP_DB_PASS_VECTORSDB=",
"_APP_SMTP_HOST=",
"_APP_SMTP_PORT=",
"_APP_SMTP_SECURE=",
@@ -69,6 +80,7 @@ env = [
"_APP_SMTP_PASSWORD=",
"_APP_SMS_PROVIDER=",
"_APP_SMS_FROM=",
"_APP_SMS_PROJECTS_DENY_LIST=",
"_APP_STORAGE_LIMIT=30000000",
"_APP_STORAGE_PREVIEW_LIMIT=20000000",
"_APP_STORAGE_ANTIVIRUS=disabled",
@@ -96,45 +108,27 @@ env = [
"_APP_STORAGE_WASABI_SECRET=",
"_APP_STORAGE_WASABI_REGION=eu-central-1",
"_APP_STORAGE_WASABI_BUCKET=",
"_APP_FUNCTIONS_SIZE_LIMIT=30000000",
"_APP_COMPUTE_SIZE_LIMIT=30000000",
"_APP_FUNCTIONS_BUILD_SIZE_LIMIT=2000000000",
"_APP_FUNCTIONS_TIMEOUT=900",
"_APP_FUNCTIONS_BUILD_TIMEOUT=900",
"_APP_COMPUTE_BUILD_TIMEOUT=900",
"_APP_FUNCTIONS_CONTAINERS=10",
"_APP_FUNCTIONS_CPUS=0",
"_APP_COMPUTE_CPUS=0",
"_APP_FUNCTIONS_MEMORY=0",
"_APP_COMPUTE_MEMORY=0",
"_APP_FUNCTIONS_MEMORY_SWAP=0",
"_APP_FUNCTIONS_RUNTIMES=node-16.0,php-8.0,python-3.9,ruby-3.0",
"_APP_EXECUTOR_SECRET=${executor_secret}",
"_APP_EXECUTOR_HOST=http://exc1/v1",
"_APP_EXECUTOR_RUNTIME_NETWORK=appwrite_runtimes",
"_APP_FUNCTIONS_ENVS=node-16.0,php-7.4,python-3.9,ruby-3.0",
"_APP_FUNCTIONS_INACTIVE_THRESHOLD=60",
"_APP_COMPUTE_INACTIVE_THRESHOLD=60",
"DOCKERHUB_PULL_USERNAME=",
"DOCKERHUB_PULL_PASSWORD=",
"DOCKERHUB_PULL_EMAIL=",
"OPEN_RUNTIMES_NETWORK=appwrite_runtimes",
"_APP_FUNCTIONS_RUNTIMES_NETWORK=dokploy-network",
"_APP_COMPUTE_MAINTENANCE_INTERVAL=3600",
"_APP_COMPUTE_RUNTIMES_NETWORK=dokploy-network",
"_APP_FUNCTIONS_TIMEOUT=900",
"_APP_FUNCTIONS_CREATION_ABUSE_LIMIT=5000",
"_APP_FUNCTIONS_RUNTIMES=node-22,python-3.12,php-8.3,ruby-3.3,dart-3.5,go-1.23,rust-1.83,bun-1.1,deno-1.46,java-21.0,dotnet-8.0",
"_APP_SITES_TIMEOUT=900",
"_APP_SITES_RUNTIMES=static-1,node-22",
"_APP_EXECUTOR_SECRET=${executor_secret}",
"_APP_EXECUTOR_HOST=http://openruntimes-executor/v1",
"_APP_EXECUTOR_IMAGES=openruntimes/node:v5-22,openruntimes/python:v5-3.12,openruntimes/php:v5-8.3,openruntimes/static:v5-1",
"_APP_OPEN_RUNTIMES_NFT=enabled",
"_APP_BROWSER_HOST=http://appwrite-browser:3000/v1",
"_APP_WORKER_SCREENSHOTS_ROUTER=http://appwrite",
"_APP_DOCKER_HUB_USERNAME=",
"_APP_DOCKER_HUB_PASSWORD=",
"_APP_FUNCTIONS_MAINTENANCE_INTERVAL=3600",
"_APP_COMPUTE_MAINTENANCE_INTERVAL=3600",
"_APP_SITES_TIMEOUT=900",
"_APP_SITES_RUNTIMES=static-1,node-22,flutter-3.29",
"_APP_VCS_GITHUB_APP_NAME=",
"_APP_VCS_GITHUB_PRIVATE_KEY=",
"_APP_VCS_GITHUB_APP_ID=",
"_APP_VCS_GITHUB_CLIENT_ID=",
"_APP_VCS_GITHUB_CLIENT_SECRET=",
"_APP_VCS_GITHUB_WEBHOOK_SECRET=",
"_APP_MAINTENANCE_INTERVAL=86400",
"_APP_MAINTENANCE_DELAY=0",
"_APP_MAINTENANCE_START_TIME=00:00",
"_APP_MAINTENANCE_RETENTION_CACHE=2592000",
"_APP_MAINTENANCE_RETENTION_EXECUTION=1209600",
@@ -143,14 +137,67 @@ env = [
"_APP_MAINTENANCE_RETENTION_ABUSE=86400",
"_APP_MAINTENANCE_RETENTION_USAGE_HOURLY=8640000",
"_APP_MAINTENANCE_RETENTION_SCHEDULES=86400",
"_APP_INTERVAL_DOMAIN_VERIFICATION=120",
"_APP_INTERVAL_CLEANUP_STALE_EXECUTIONS=300",
"_APP_GRAPHQL_INTROSPECTION=enabled",
"_APP_GRAPHQL_MAX_BATCH_SIZE=10",
"_APP_GRAPHQL_MAX_COMPLEXITY=250",
"_APP_GRAPHQL_MAX_DEPTH=3",
"_APP_GRAPHQL_MAX_DEPTH=4",
"_APP_WEBHOOK_MAX_FAILED_ATTEMPTS=10",
"_APP_VCS_GITHUB_APP_NAME=",
"_APP_VCS_GITHUB_PRIVATE_KEY=",
"_APP_VCS_GITHUB_APP_ID=",
"_APP_VCS_GITHUB_CLIENT_ID=",
"_APP_VCS_GITHUB_CLIENT_SECRET=",
"_APP_VCS_GITHUB_WEBHOOK_SECRET=",
"_APP_MIGRATION_HOST=appwrite",
"_APP_MIGRATIONS_FIREBASE_CLIENT_ID=",
"_APP_MIGRATIONS_FIREBASE_CLIENT_SECRET=",
"_APP_ASSISTANT_OPENAI_API_KEY=",
]
mounts = []
[[config.mounts]]
filePath = "mongo-init.js"
content = """// mongo-init.js
// Switch to the admin database
const adminDb = db.getSiblingDB('admin');
// Get username and password from environment variables
const username = process.env.MONGO_INITDB_USERNAME;
const password = process.env.MONGO_INITDB_PASSWORD;
const database = process.env.MONGO_INITDB_DATABASE;
// Create the user
adminDb.createUser({
user: username,
pwd: password,
roles: [
{ role: 'readWrite', db: database }
]
});
"""
[[config.mounts]]
filePath = "mongo-entrypoint.sh"
content = """#!/bin/bash
set -e
# Fix keyfile permissions if mounted from volume
KEYFILE_PATH="/data/keyfile/mongo-keyfile"
if [ ! -f "$KEYFILE_PATH" ]; then
echo "Generating random MongoDB keyfile..."
mkdir -p /data/keyfile
openssl rand -base64 756 > "$KEYFILE_PATH"
fi
chmod 400 "$KEYFILE_PATH"
chown mongodb:mongodb "$KEYFILE_PATH" 2>/dev/null || chown 999:999 "$KEYFILE_PATH"
# Use MongoDB's standard entrypoint with our command
exec docker-entrypoint.sh mongod --replSet rs0 --bind_ip_all --auth --keyFile "$KEYFILE_PATH"
"""
[[config.domains]]
serviceName = "appwrite"

View File

@@ -0,0 +1,16 @@
{
"id": "aptabase",
"name": "Aptabase",
"version": "v1.0.0",
"description": "Aptabase is a self-hosted web analytics platform that lets you track website traffic and user behavior.",
"logo": "aptabase.svg",
"links": {
"github": "https://github.com/aptabase/aptabase",
"website": "https://aptabase.com/",
"docs": "https://github.com/aptabase/aptabase/blob/main/README.md"
},
"tags": [
"analytics",
"self-hosted"
]
}

View File

@@ -0,0 +1,17 @@
{
"id": "arangodb",
"name": "ArangoDB",
"version": "latest",
"description": "ArangoDB is a native multi-model database with flexible data models for documents, graphs, and key-values. Build high performance applications using a convenient SQL-like query language or JavaScript extensions.",
"logo": "logo.png",
"links": {
"github": "https://github.com/arangodb/arangodb",
"website": "https://www.arangodb.com/",
"docs": "https://www.arangodb.com/docs/"
},
"tags": [
"database",
"graph-database",
"nosql"
]
}

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="1000" height="1000"><g clip-path="url(#SvgjsClipPath1152)"><rect width="1000" height="1000" fill="#000000"></rect><g transform="matrix(3.401360544217687,0,0,3.401360544217687,250.00000000000003,265.30612244897964)"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="147" height="138" viewBox="0 0 147 138"><image width="147" height="138" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJMAAACKCAYAAACuPHhGAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAZgSURBVHgB7Z3rddNAEIVHVBA6MB1AB04H6QCnAuiAQwehgogOoALUAXSAO0g6MBqzCvip1+zundX9zvEJIfkRS1efVrM760oCu91u0355FELGUVdVda//eCWEGMEwETMYJmIGw0TMYJiIGQwTMYNhImYwTMQMhomYwTARMxgmYgbDRMxgmIgZDBMxg2EiZjBMxAyGiZjBMBEzGCZiBsNEzGCYiBkMEzGDYSJmMEzEDIaJmMEwETMYJmIGw0TMYJiIGQwTMYNhImZUUgi73W7VfvktvnhuX2+qqnqWAijJTB/EHzft66MUQhFmClb60b5W4o9i7FSKmd6LzyApxdjJvZlaK+nJ+Cl+w6QUYacSzHQnvoOkFGGnEsykT3Ar8Y97O7k2U9hueiVl4N5Ors1UkJU6nlszvRanuDVTYVbquAnvyyVuzVSglTq2rZ3eiENcmqlQK3WsvNrJpZkKtlJH09rpVpzhzkyFW6lj3b7PtTjDnZkWYKUOd3ZyZaaFWKnDnZ283ebey7L4JI5wE6Zwla5lWbiykyczubpKDXHzvl2EaaFW6nBjJy9mWtpY6RgXdoIvDThtFIjBbVsqaAQYD2Za6ljpGPjjAG0mWukEXTy3FVDQzUQrHQJ9PGDNRCtdBNZOyGailc4Du7QX0ky00lVgGw9QzUQrXQa28QDOTLTSICDthGgmWqkfSDtBmcn5BhSpgbMTmplQN6D4JnjA2QnGTOBW0tajR8FbuQBlJyQzrQUzSHUoEn4VPKDshGQm1EaBfcU5bN2jf+ONYAFjJwgzATcKdFaScLK+CB4wdoIwE7qVum9op+tkNxOwlZrjCVVwO91JZrKbCdhKZ1c2Alfos294kdVMwFbaXloiG2zVCB7ZN7zIfZtDnTr5PPPnuci6F3q2MIFbqb72C8FajeDxNmdbVE4zebXS2N9LTbbjmiVMyFaSgfNwwU6/BI9sTZu5zITaVNmMrNUgTrEoWeyUvDQQrpofgsmoxfrARUzltkrctJnDTKhjpboa2fUBXMRUkh/npGYqyUodtNM/UpsJdaxUVxN70YKdOHaShGYCbxSYdQWX/N7GkNJMqGOlZu7BBp5iUZId9yRhClfuRjCxukWhFjGT1Z1SmQnVSr1TJ0MBnmJRkoxVo4+ZwMcT91ZhUkp8Wh1DCjMVb6WOYKetYBL9PEQNE/hYKVaxEbWIuQk1sWjENhNyq3esxspa/q7JRiRq40G0MIFbqY41fgCfYvkQ004xzYRspdiP8Q+CaaeobVFRwhSstBZM6thPNeBTLNHsFMtMqBtQKKmKi7VgEs1O5nUm8A0okn6GW3ss9DisBY8oTZsxzKTNgCvBJPWUB+oUSxQ7xTATalNllibFJdnJ1Ezgn1SZyxKoZQJzO5maiVY6T3tcngRzJaapnczMRCtdBdlOGzHCzEzIVmpf76qM282ArxM3s7aJmcCt1FSZ9y0Cn2Ix2/DCxEzAVlKir+MZwhLsNNtM4FaqEYKkBDt9F0xWFkt7Z5uJVhoO+ErM2bMDs8xEK40DfJ347MaDube5rJtL9YA6a486xaLMWjY0OUwhxW8Fk9m9cLEo2U5zzIS8+A3VSh3If9/k8zppAA4+kMy+6+wQgKdYlEkt5VPNhDxWQh6T/A9qEVOZZKfRZgJvqnRhJQW8iKmMttMUMyGPlZCv9gPAp1iU0ed5lJkcfH4uVJGyj2CnJ8FllJ3GmgnZSnBFyj7Au1iUURteDDYTrRQH8CdjZfBxHWMmWikC4EVMZfB5H2QmWikuDuz0esiasKFmQrZS4zlIigM7DWo86DWTAytNqtaiEVZgPAomgxoPhpgJ2UrbEoIU+Ca4W/EMaou6GibwbXEUL1MnvTgoYvZueNFnpiQba07EfBtBAB7EsZ0uholWSo93O10zE/K2OFvBfvqZw4PgctVO18K0EVzclwMuEezUCC4X7XQ2TOCNAkpxt7gjkN/fRTudrTOBty/p1Mm9FA7wVjzK2brTiZloJRjQ7bQ5/s8TM9FKOLTn4qfgdgCdrGo9MJMDK6F3nViD/H5PNrw4MBO4lZJuboqAg3XiB3Z6MROthIeDIqba6a775sVM4FZy03VijQM7vdwx9mbiExwuDtaJv7SU781EK2HjYE3Z3k6vQqpWgsvixkrHgH+gtLK3UwVeaVVcr++2wsE68eYPiYOoQetKl74AAAAASUVORK5CYII="></image></svg></g></g><defs><clipPath id="SvgjsClipPath1152"><rect width="1000" height="1000" x="0" y="0" rx="350" ry="350"></rect></clipPath></defs></svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -0,0 +1,102 @@
version: "3.8"
# Arche — AI workspace platform that spawns per-user OpenCode containers
# via a Docker socket proxy.
#
# PRE-REQUISITES (run once on the VPS before deploying):
# mkdir -p /opt/arche/kb-content /opt/arche/kb-config /opt/arche/users
#
# Optional (only needed to seed the Knowledge Base):
# git init --bare --initial-branch=main /opt/arche/kb-content
# git init --bare --initial-branch=main /opt/arche/kb-config
#
# POST-DEPLOY (set in Dokploy → Environment, then redeploy):
# 1. Deploy this template once. Dokploy auto-creates a network for the
# compose stack.
# 2. SSH into the host and find the network name:
# docker network ls --format '{{.Name}}' | grep arche
# It looks like `<stack-name>_default` or similar.
# 3. Add the env var OPENCODE_NETWORK=<that-network-name> and redeploy.
# Without it, spawned user workspaces will fail to start.
#
# IMAGE ARCHITECTURE:
# Default tags target linux/amd64. For ARM64 hosts (Apple Silicon,
# Ampere, Graviton), override both images to the `-arm64` variants in
# Dokploy → Environment:
# ARCHE_WEB_IMAGE=ghcr.io/peaberry-studio/arche/web:latest-arm64
# ARCHE_WORKSPACE_IMAGE=ghcr.io/peaberry-studio/arche/workspace:latest-arm64
services:
web:
image: ${ARCHE_WEB_IMAGE:-ghcr.io/peaberry-studio/arche/web:latest}
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
docker-socket-proxy:
condition: service_started
environment:
ARCHE_DOMAIN: ${ARCHE_DOMAIN}
DATABASE_URL: postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/arche?schema=public
ARCHE_SESSION_PEPPER: ${ARCHE_SESSION_PEPPER}
ARCHE_ENCRYPTION_KEY: ${ARCHE_ENCRYPTION_KEY}
ARCHE_INTERNAL_TOKEN: ${ARCHE_INTERNAL_TOKEN}
ARCHE_GATEWAY_TOKEN_SECRET: ${ARCHE_GATEWAY_TOKEN_SECRET}
ARCHE_CONNECTOR_OAUTH_STATE_SECRET: ${ARCHE_CONNECTOR_OAUTH_STATE_SECRET}
ARCHE_GATEWAY_TOKEN_TTL_SECONDS: "86400"
ARCHE_GATEWAY_BASE_URL: http://web:3000
ARCHE_PUBLIC_BASE_URL: https://${ARCHE_DOMAIN}
ARCHE_SESSION_TTL_DAYS: "7"
ARCHE_COOKIE_SECURE: "true"
ARCHE_SEED_ADMIN_EMAIL: ${ARCHE_SEED_ADMIN_EMAIL}
ARCHE_SEED_ADMIN_PASSWORD: ${ARCHE_SEED_ADMIN_PASSWORD}
ARCHE_SEED_ADMIN_SLUG: ${ARCHE_SEED_ADMIN_SLUG:-admin}
CONTAINER_PROXY_HOST: docker-socket-proxy
CONTAINER_PROXY_PORT: "2375"
OPENCODE_IMAGE: ${ARCHE_WORKSPACE_IMAGE:-ghcr.io/peaberry-studio/arche/workspace:latest}
OPENCODE_NETWORK: ${OPENCODE_NETWORK}
KB_CONTENT_HOST_PATH: /opt/arche/kb-content
KB_CONFIG_HOST_PATH: /opt/arche/kb-config
ARCHE_USERS_PATH: /opt/arche/users
expose:
- "3000"
volumes:
- /opt/arche/kb-content:/kb-content
- /opt/arche/kb-config:/kb-config
- /opt/arche/users:/opt/arche/users
postgres:
image: postgres:16
restart: unless-stopped
environment:
POSTGRES_DB: arche
POSTGRES_USER: postgres
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
docker-socket-proxy:
image: ghcr.io/tecnativa/docker-socket-proxy:master
restart: unless-stopped
environment:
CONTAINERS: 1
NETWORKS: 1
IMAGES: 1
INFO: 1
POST: 1
VOLUMES: 1
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
volumes:
postgres_data:

View File

@@ -0,0 +1,19 @@
{
"id": "arche",
"name": "Arche",
"version": "latest",
"description": "Arche is a self-hosted AI workspace platform that spawns per-user OpenCode coding containers backed by a shared Knowledge Base. Requires the `arche-internal` external Docker network and `/opt/arche/{kb-content,kb-config,users}` directories on the host before deploy. Images are linux/amd64 by default; override `ARCHE_WEB_IMAGE` and `ARCHE_WORKSPACE_IMAGE` to the `-arm64` tag variants for ARM64 hosts.",
"logo": "arche.svg",
"links": {
"github": "https://github.com/peaberry-studio/arche",
"website": "https://github.com/peaberry-studio/arche",
"docs": "https://github.com/peaberry-studio/arche#readme"
},
"tags": [
"ai",
"coding",
"workspace",
"self-hosted",
"llm"
]
}

View File

@@ -0,0 +1,33 @@
[variables]
main_domain = "${domain}"
postgres_password = "${password:32}"
session_pepper = "${base64:32}"
encryption_key = "${base64:32}"
internal_token = "${base64:32}"
gateway_token_secret = "${base64:32}"
connector_oauth_state_secret = "${base64:32}"
seed_admin_email = "${email}"
seed_admin_password = "${password:16}"
[config]
env = [
"ARCHE_DOMAIN=${main_domain}",
"POSTGRES_PASSWORD=${postgres_password}",
"ARCHE_SESSION_PEPPER=${session_pepper}",
"ARCHE_ENCRYPTION_KEY=${encryption_key}",
"ARCHE_INTERNAL_TOKEN=${internal_token}",
"ARCHE_GATEWAY_TOKEN_SECRET=${gateway_token_secret}",
"ARCHE_CONNECTOR_OAUTH_STATE_SECRET=${connector_oauth_state_secret}",
"ARCHE_SEED_ADMIN_EMAIL=${seed_admin_email}",
"ARCHE_SEED_ADMIN_PASSWORD=${seed_admin_password}",
"ARCHE_SEED_ADMIN_SLUG=admin",
"ARCHE_WEB_IMAGE=ghcr.io/peaberry-studio/arche/web:latest",
"ARCHE_WORKSPACE_IMAGE=ghcr.io/peaberry-studio/arche/workspace:latest",
"OPENCODE_NETWORK=",
]
mounts = []
[[config.domains]]
serviceName = "web"
port = 3000
host = "${main_domain}"

View File

@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128">
<rect width="128" height="128" rx="28" fill="#101828"/>
<circle cx="64" cy="64" r="34" fill="#38bdf8" opacity="0.92"/>
<text x="64" y="74" text-anchor="middle" font-family="Arial, sans-serif" font-size="30" font-weight="700" fill="#ffffff">A</text>
</svg>

After

Width:  |  Height:  |  Size: 325 B

View File

@@ -0,0 +1,16 @@
services:
archivebox:
image: archivebox/archivebox:latest
restart: unless-stopped
command: server --quick-init 0.0.0.0:8000
environment:
ALLOWED_HOSTS: ${ALLOWED_HOSTS}
PUBLIC_INDEX: ${PUBLIC_INDEX}
PUBLIC_SNAPSHOTS: ${PUBLIC_SNAPSHOTS}
volumes:
- archivebox_data:/data
ports:
- "8000"
volumes:
archivebox_data:

View File

@@ -0,0 +1,17 @@
{
"id": "archivebox",
"name": "ArchiveBox",
"version": "latest",
"description": "ArchiveBox is a self-hosted internet archiving solution for saving websites, media, and documents.",
"logo": "archivebox.svg",
"links": {
"github": "https://github.com/ArchiveBox/ArchiveBox",
"website": "https://archivebox.io/",
"docs": "https://docs.archivebox.io/"
},
"tags": [
"archive",
"bookmarks",
"web"
]
}

View File

@@ -0,0 +1,15 @@
[variables]
main_domain = "${domain}"
[config]
mounts = []
[[config.domains]]
serviceName = "archivebox"
port = 8000
host = "${main_domain}"
[config.env]
ALLOWED_HOSTS = "*"
PUBLIC_INDEX = "True"
PUBLIC_SNAPSHOTS = "True"

View File

@@ -0,0 +1,17 @@
{
"id": "argilla",
"name": "Argilla",
"version": "latest",
"description": "Argilla is a robust platform designed to help engineers and data scientists streamline the management of machine learning data workflows. It simplifies tasks like data labeling, annotation, and quality control.",
"logo": "logo.svg",
"links": {
"github": "https://github.com/argilla-io/argilla",
"website": "https://www.argilla.io/",
"docs": "https://docs.argilla.io/"
},
"tags": [
"machine-learning",
"data-labeling",
"ai"
]
}

View File

@@ -0,0 +1,17 @@
{
"id": "audiobookshelf",
"name": "Audiobookshelf",
"version": "2.19.4",
"description": "Audiobookshelf is a self-hosted server designed to manage and play your audiobooks and podcasts. It works best when you have an organized directory structure.",
"logo": "logo.png",
"links": {
"github": "https://github.com/advplyr/audiobookshelf",
"website": "https://www.audiobookshelf.org",
"docs": "https://www.audiobookshelf.org/docs"
},
"tags": [
"media",
"audiobooks",
"podcasts"
]
}

View File

@@ -0,0 +1,21 @@
{
"id": "authelia",
"name": "Authelia",
"version": "latest",
"description": "The Single Sign-On Multi-Factor portal for web apps. An open-source authentication and authorization server providing 2FA and SSO via web portal.",
"logo": "authelia.png",
"links": {
"github": "https://github.com/authelia/authelia",
"website": "https://www.authelia.com/",
"docs": "https://www.authelia.com/overview/prologue/introduction/"
},
"tags": [
"authentication",
"authorization",
"2fa",
"sso",
"security",
"reverse-proxy",
"ldap"
]
}

View File

@@ -0,0 +1,21 @@
{
"id": "authentik",
"name": "Authentik",
"version": "2025.6.3",
"description": "Authentik is an open-source Identity Provider for authentication and authorization. It provides a comprehensive solution for managing user authentication, authorization, and identity federation with support for SAML, OAuth2, OIDC, and more.",
"links": {
"github": "https://github.com/goauthentik/authentik",
"website": "https://goauthentik.io/",
"docs": "https://goauthentik.io/docs/"
},
"logo": "authentik.svg",
"tags": [
"authentication",
"identity",
"sso",
"oidc",
"saml",
"oauth2",
"self-hosted"
]
}

View File

@@ -0,0 +1,17 @@
{
"id": "authorizer",
"name": "Authorizer",
"version": "1.4.4",
"description": "Authorizer is a powerful tool designed to simplify the process of user authentication and authorization in your applications. It allows you to build secure apps 10x faster with its low code tool and low-cost deployment.",
"logo": "logo.png",
"links": {
"github": "https://github.com/authorizerdev/authorizer",
"website": "https://authorizer.dev",
"docs": "https://docs.authorizer.dev/"
},
"tags": [
"authentication",
"authorization",
"security"
]
}

View File

@@ -1,6 +1,6 @@
services:
autobase-console:
image: autobase/console:2.5.2
image: autobase/console:2.7.2
restart: unless-stopped
ports:
- "80"
@@ -10,8 +10,10 @@ services:
- PG_CONSOLE_AUTHORIZATION_TOKEN=${PG_CONSOLE_AUTHORIZATION_TOKEN}
volumes:
- console_postgres:/var/lib/postgresql
- dbdesk_studio_data:/opt/dbdesk-studio
- /var/run/docker.sock:/var/run/docker.sock
- /tmp/ansible:/tmp/ansible
volumes:
console_postgres:
dbdesk_studio_data:

View File

@@ -0,0 +1,19 @@
{
"id": "autobase",
"name": "Autobase",
"version": "2.7.2",
"description": "Autobase for PostgreSQL® is an open-source alternative to cloud-managed databases (self-hosted DBaaS).",
"links": {
"github": "https://github.com/vitabaks/autobase",
"website": "https://autobase.tech/",
"docs": "https://autobase.tech/docs"
},
"logo": "autobase.svg",
"tags": [
"database",
"postgres",
"automation",
"self-hosted",
"dbaas"
]
}

View File

@@ -0,0 +1,17 @@
{
"id": "automatisch",
"name": "Automatisch",
"version": "2.0",
"description": "Automatisch is a powerful, self-hosted workflow automation tool designed for connecting your apps and automating repetitive tasks. With Automatisch, you can create workflows to sync data, send notifications, and perform various actions seamlessly across different services.",
"logo": "logo.png",
"links": {
"github": "https://github.com/automatisch/automatisch",
"website": "https://automatisch.io/docs",
"docs": "https://automatisch.io/docs"
},
"tags": [
"automation",
"workflow",
"integration"
]
}

View File

@@ -0,0 +1,20 @@
{
"id": "azuracast",
"name": "AzuraCast",
"version": "latest",
"description": "AzuraCast is a self-hosted, all-in-one web radio management suite. Easily manage your online radio stations with a powerful web interface.",
"logo": "azuracast.png",
"links": {
"github": "https://github.com/AzuraCast/AzuraCast",
"website": "https://www.azuracast.com/",
"docs": "https://docs.azuracast.com/"
},
"tags": [
"radio",
"streaming",
"media",
"broadcasting",
"music",
"entertainment"
]
}

View File

@@ -0,0 +1,17 @@
{
"id": "babybuddy",
"name": "BabyBuddy",
"version": "2.7.0",
"description": "BabyBuddy is a comprehensive, user-friendly platform designed to help parents and caregivers manage essential details about their child's growth and development. It provides tools for tracking feedings, sleep schedules, diaper changes, and milestones.",
"logo": "logo.png",
"links": {
"github": "https://github.com/babybuddy/babybuddy",
"website": "https://babybuddy.app",
"docs": "https://docs.babybuddy.app"
},
"tags": [
"parenting",
"tracking",
"family"
]
}

View File

@@ -0,0 +1,15 @@
{
"id": "backrest",
"name": "Backrest",
"version": "1.6.0",
"description": "Backrest is a web-based backup solution powered by restic, offering an intuitive WebUI for easy repository management, snapshot browsing, and file restoration. It runs in the background, automating snapshot scheduling and repository maintenance. Built with Go, Backrest is a lightweight standalone binary with restic as its only dependency. It provides a secure and user-friendly way to manage backups while still allowing direct access to the restic CLI for advanced operations.",
"links": {
"github": "https://github.com/garethgeorge/backrest",
"website": "https://garethgeorge.github.io/backrest",
"docs": "https://garethgeorge.github.io/backrest/introduction/getting-started"
},
"logo": "backrest.svg",
"tags": [
"backup"
]
}

View File

@@ -0,0 +1,18 @@
{
"id": "baikal",
"name": "Baikal",
"version": "nginx-php8.2",
"description": "Baikal is a lightweight, self-hosted CalDAV and CardDAV server that enables users to manage calendars and contacts efficiently. It provides a simple and effective solution for syncing and sharing events, tasks, and address books across multiple devices.",
"logo": "logo.png",
"links": {
"website": "https://sabre.io/baikal/",
"github": "https://sabre.io/baikal/",
"docs": "https://sabre.io/baikal/install/"
},
"tags": [
"calendar",
"contacts",
"caldav",
"carddav"
]
}

View File

@@ -0,0 +1,17 @@
{
"id": "barrage",
"name": "Barrage",
"version": "0.3.0",
"description": "Barrage is a minimalistic Deluge WebUI app with full mobile support. It features a responsive mobile-first design, allowing you to manage your torrents with ease from any device.",
"logo": "logo.png",
"links": {
"github": "https://github.com/maulik9898/barrage",
"website": "https://github.com/maulik9898/barrage",
"docs": "https://github.com/maulik9898/barrage/blob/main/README.md"
},
"tags": [
"torrents",
"deluge",
"mobile"
]
}

View File

@@ -0,0 +1,15 @@
{
"id": "baserow",
"name": "Baserow",
"version": "1.25.2",
"description": "Baserow is an open source database management tool that allows you to create and manage databases.",
"logo": "baserow.webp",
"links": {
"github": "https://github.com/Baserow/baserow",
"website": "https://baserow.io/",
"docs": "https://baserow.io/docs/index"
},
"tags": [
"database"
]
}

View File

@@ -0,0 +1,17 @@
{
"id": "bazarr",
"name": "Bazarr",
"version": "latest",
"description": "Bazarr is a companion application to Sonarr and Radarr that manages and downloads subtitles based on your requirements.",
"logo": "logo.png",
"links": {
"github": "https://github.com/morpheus65535/bazarr",
"website": "https://www.bazarr.media/",
"docs": "https://www.bazarr.media/docs"
},
"tags": [
"subtitles",
"sonarr",
"radarr"
]
}

View File

@@ -0,0 +1,18 @@
{
"id": "bentopdf",
"name": "BentoPDF",
"version": "latest",
"description": "BentoPDF is a lightweight PDF conversion microservice that exposes a simple HTTP API for generating PDFs.",
"logo": "image.png",
"links": {
"github": "https://github.com/bentopdf/bentopdf",
"website": "https://bentopdf.com/",
"docs": "https://github.com/bentopdf/bentopdf#readme"
},
"tags": [
"pdf",
"converter",
"api",
"utility"
]
}

View File

@@ -0,0 +1,17 @@
{
"id": "beszel",
"name": "Beszel",
"version": "0.10.2",
"description": "A lightweight server monitoring hub with historical data, docker stats, and alerts.",
"logo": "logo.svg",
"links": {
"github": "https://github.com/henrygd/beszel",
"website": "https://beszel.dev",
"docs": "https://beszel.dev/guide/getting-started"
},
"tags": [
"monitoring",
"docker",
"alerts"
]
}

View File

@@ -0,0 +1,20 @@
{
"id": "bigcapital",
"name": "BigCapital",
"version": "latest",
"description": "BigCapital is a great open source alternative to QuickBooks. A comprehensive accounting and financial management system for businesses.",
"logo": "logo.svg",
"links": {
"github": "https://github.com/bigcapitalhq/bigcapital",
"website": "https://bigcapital.app/",
"docs": "https://github.com/bigcapitalhq/bigcapital"
},
"tags": [
"accounting",
"finance",
"bookkeeping",
"quickbooks",
"erp",
"business"
]
}

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_2" data-name="Layer 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<defs>
<style>
.cls-1 {
fill: #7267ef;
stroke-width: 0px;
}
</style>
</defs>
<path class="cls-1" d="m384,35H53v367h75v75h156c96.65,0,175-78.35,175-175V110h-75V35Zm0,266.98c0,55.23-44.77,100-100,100h-156V110.02h256v191.96Z"/>
<rect class="cls-1" x="153" y="160" width="100" height="20"/>
<rect class="cls-1" x="153" y="295" width="75" height="20"/>
<rect class="cls-1" x="153" y="205" width="180" height="20"/>
<rect class="cls-1" x="153" y="250" width="140" height="20"/>
</svg>

After

Width:  |  Height:  |  Size: 663 B

View File

@@ -0,0 +1,130 @@
version: "3.8"
services:
billmora-app:
image: ghcr.io/billmora/billmora:latest
restart: always
environment:
- APP_NAME=${APP_NAME}
- APP_ENV=${APP_ENV}
- APP_KEY=${APP_KEY}
- APP_URL=${APP_URL}
- DB_CONNECTION=${DB_CONNECTION}
- DB_HOST=${DB_HOST}
- DB_PORT=${DB_PORT}
- DB_DATABASE=${DB_DATABASE}
- DB_USERNAME=${DB_USERNAME}
- DB_PASSWORD=${DB_PASSWORD}
- REDIS_HOST=${REDIS_HOST}
- REDIS_PASSWORD=${REDIS_PASSWORD}
- REDIS_PORT=${REDIS_PORT}
- SESSION_DRIVER=${SESSION_DRIVER}
- CACHE_STORE=${CACHE_STORE}
- QUEUE_CONNECTION=${QUEUE_CONNECTION}
- AUTORUN_ENABLED=true
- AUTORUN_LARAVEL_MIGRATION=true
- AUTORUN_LARAVEL_MIGRATION_FORCE=true
- AUTORUN_LARAVEL_MIGRATION_SEED=true
- AUTORUN_LARAVEL_STORAGE_LINK=true
volumes:
- billmora-storage:/var/www/html/storage
depends_on:
billmora-db:
condition: service_healthy
billmora-redis:
condition: service_healthy
billmora-worker:
image: ghcr.io/billmora/billmora:latest
restart: always
command: ["php", "artisan", "queue:work", "--sleep=3", "--tries=3", "--max-time=3600"]
environment:
- APP_NAME=${APP_NAME}
- APP_ENV=${APP_ENV}
- APP_KEY=${APP_KEY}
- APP_URL=${APP_URL}
- DB_CONNECTION=${DB_CONNECTION}
- DB_HOST=${DB_HOST}
- DB_PORT=${DB_PORT}
- DB_DATABASE=${DB_DATABASE}
- DB_USERNAME=${DB_USERNAME}
- DB_PASSWORD=${DB_PASSWORD}
- REDIS_HOST=${REDIS_HOST}
- REDIS_PASSWORD=${REDIS_PASSWORD}
- REDIS_PORT=${REDIS_PORT}
- SESSION_DRIVER=${SESSION_DRIVER}
- CACHE_STORE=${CACHE_STORE}
- QUEUE_CONNECTION=${QUEUE_CONNECTION}
- AUTORUN_ENABLED=false
volumes:
- billmora-storage:/var/www/html/storage
depends_on:
billmora-db:
condition: service_healthy
billmora-redis:
condition: service_healthy
billmora-scheduler:
image: ghcr.io/billmora/billmora:latest
restart: always
command: ["/bin/sh", "-c", "while true; do php artisan schedule:run >> /dev/null 2>&1; sleep 60; done"]
environment:
- APP_NAME=${APP_NAME}
- APP_ENV=${APP_ENV}
- APP_KEY=${APP_KEY}
- APP_URL=${APP_URL}
- DB_CONNECTION=${DB_CONNECTION}
- DB_HOST=${DB_HOST}
- DB_PORT=${DB_PORT}
- DB_DATABASE=${DB_DATABASE}
- DB_USERNAME=${DB_USERNAME}
- DB_PASSWORD=${DB_PASSWORD}
- REDIS_HOST=${REDIS_HOST}
- REDIS_PASSWORD=${REDIS_PASSWORD}
- REDIS_PORT=${REDIS_PORT}
- SESSION_DRIVER=${SESSION_DRIVER}
- CACHE_STORE=${CACHE_STORE}
- QUEUE_CONNECTION=${QUEUE_CONNECTION}
- AUTORUN_ENABLED=false
volumes:
- billmora-storage:/var/www/html/storage
depends_on:
billmora-db:
condition: service_healthy
billmora-redis:
condition: service_healthy
billmora-db:
image: mariadb:11
restart: always
environment:
- MARIADB_DATABASE=${DB_DATABASE}
- MARIADB_USER=${DB_USERNAME}
- MARIADB_PASSWORD=${DB_PASSWORD}
- MARIADB_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
volumes:
- billmora-db-data:/var/lib/mysql
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
billmora-redis:
image: redis:7-alpine
restart: always
command: redis-server --requirepass ${REDIS_PASSWORD}
volumes:
- billmora-redis-data:/data
healthcheck:
test: ["CMD", "redis-cli", "--no-auth-warning", "-a", "${REDIS_PASSWORD}", "ping"]
interval: 10s
timeout: 3s
retries: 5
start_period: 10s
volumes:
billmora-storage:
billmora-db-data:
billmora-redis-data:

View File

@@ -0,0 +1,18 @@
{
"id": "billmora",
"name": "Billmora",
"version": "latest",
"description": "Billmora (Billing Management, Operation, and Recurring Automation) is a free, open-source platform for hosting providers to manage clients, invoicing, and server provisioning.",
"logo": "billmora.svg",
"links": {
"website": "https://billmora.com",
"github": "https://github.com/Billmora/billmora",
"docs": "https://billmora.com/docs/introduction"
},
"tags": [
"laravel",
"billing",
"hosting",
"automation"
]
}

View File

@@ -0,0 +1,31 @@
[variables]
APP_KEY = "base64:${base64:32}"
APP_URL = "https://${domain}"
DB_PASSWORD = "${password:16}"
DB_ROOT_PASSWORD = "${password:16}"
REDIS_PASSWORD = "${password:16}"
[config]
[[config.domains]]
serviceName = "billmora-app"
port = 8080
host = "${domain}"
[config.env]
APP_NAME = "Billmora"
APP_ENV = "production"
APP_KEY = "${APP_KEY}"
APP_URL = "${APP_URL}"
DB_CONNECTION = "mariadb"
DB_HOST = "billmora-db"
DB_PORT = "3306"
DB_DATABASE = "billmora"
DB_USERNAME = "billmora"
DB_PASSWORD = "${DB_PASSWORD}"
DB_ROOT_PASSWORD = "${DB_ROOT_PASSWORD}"
REDIS_HOST = "billmora-redis"
REDIS_PASSWORD = "${REDIS_PASSWORD}"
REDIS_PORT = "6379"
SESSION_DRIVER = "redis"
CACHE_STORE = "redis"
QUEUE_CONNECTION = "redis"

View File

@@ -0,0 +1,17 @@
{
"id": "blender",
"name": "Blender",
"version": "latest",
"description": "Blender is a free and open-source 3D creation suite. It supports the entire 3D pipeline—modeling, rigging, animation, simulation, rendering, compositing and motion tracking, video editing and 2D animation pipeline.",
"logo": "blender.svg",
"links": {
"github": "https://github.com/linuxserver/docker-blender",
"website": "https://www.blender.org/",
"docs": "https://docs.blender.org/"
},
"tags": [
"3d",
"rendering",
"animation"
]
}

View File

@@ -0,0 +1,18 @@
{
"id": "blinko",
"name": "Blinko",
"version": "latest",
"description": "Blinko is a modern web application for managing and organizing your digital content and workflows.",
"logo": "blinko.svg",
"links": {
"github": "https://github.com/blinkospace/blinko",
"website": "https://blinko.space/",
"docs": "https://docs.blinko.space/"
},
"tags": [
"productivity",
"organization",
"workflow",
"nextjs"
]
}

View File

@@ -0,0 +1,18 @@
{
"id": "bluesky-pds",
"name": "Bluesky PDS",
"version": "0.4.182",
"description": "Bluesky PDS is a personal data server for Bluesky.",
"logo": "bluesky-pds.svg",
"links": {
"github": "https://github.com/bluesky-social/pds",
"website": "https://bsky.social/about",
"docs": "https://github.com/bluesky-social/pds"
},
"tags": [
"bluesky",
"pds",
"data",
"server"
]
}

View File

@@ -0,0 +1,20 @@
{
"id": "bolt.diy",
"name": "bolt.diy",
"version": "latest",
"description": "Prompt, run, edit, and deploy full-stack web applications using any LLM you want!",
"logo": "logo.jpg",
"links": {
"github": "https://github.com/stackblitz-labs/bolt.diy",
"website": "https://stackblitz-labs.github.io/bolt.diy/",
"docs": "https://stackblitz-labs.github.io/bolt.diy/"
},
"tags": [
"ai",
"self-hosted",
"development",
"chatbot",
"ide",
"llm"
]
}

View File

@@ -0,0 +1,18 @@
{
"id": "booklore",
"name": "Booklore",
"version": "latest",
"description": "Booklore is an application for managing and serving book-related data, backed by a MariaDB database.",
"logo": "image.png",
"links": {
"github": "https://github.com/booklore-app/BookLore",
"website": "https://github.com/booklore-app/BookLore",
"docs": "https://github.com/booklore-app/BookLore/tree/develop/docs"
},
"tags": [
"books",
"library",
"database",
"mariadb"
]
}

View File

@@ -0,0 +1,16 @@
{
"id": "bookstack",
"name": "BookStack",
"version": "24.12.1",
"description": "BookStack is a self-hosted platform for creating beautiful, feature-rich documentation sites.",
"logo": "logo.svg",
"links": {
"github": "https://github.com/BookStackApp/BookStack",
"website": "https://www.bookstackapp.com",
"docs": "https://www.bookstackapp.com/docs"
},
"tags": [
"documentation",
"self-hosted"
]
}

View File

@@ -0,0 +1,18 @@
{
"id": "borgitory",
"name": "Borgitory",
"version": "latest",
"description": "A web interface for managing BorgBackup archives. Allows browsing, mounting (via FUSE), and handling backup repositories.",
"logo": "image.png",
"links": {
"github": "https://github.com/mlapaglia/borgitory",
"website": "https://github.com/mlapaglia/borgitory",
"docs": "https://github.com/mlapaglia/borgitory"
},
"tags": [
"backup",
"borg",
"archive",
"self-hosted"
]
}

View File

@@ -0,0 +1,16 @@
{
"id": "botpress",
"name": "Botpress",
"version": "latest",
"description": "Botpress is a platform for building conversational AI agents. It provides a simple and effective solution for building conversational AI agents from anywhere.",
"logo": "logo.png",
"links": {
"github": "https://github.com/botpress/botpress",
"website": "https://botpress.com",
"docs": "https://botpress.com/docs"
},
"tags": [
"ai",
"self-hosted"
]
}

View File

@@ -0,0 +1,16 @@
{
"id": "browserless",
"name": "Browserless",
"version": "2.23.0",
"description": "Browserless allows remote clients to connect and execute headless work, all inside of docker. It supports the standard, unforked Puppeteer and Playwright libraries, as well offering REST-based APIs for common actions like data collection, PDF generation and more.",
"logo": "browserless.svg",
"links": {
"github": "https://github.com/browserless/browserless",
"website": "https://www.browserless.io/",
"docs": "https://docs.browserless.io/"
},
"tags": [
"browser",
"automation"
]
}

View File

@@ -0,0 +1,19 @@
{
"id": "budget-board",
"name": "Budget Board",
"version": "release",
"description": "Self-hosted budgeting app with a web UI and a server backed by PostgreSQL.",
"logo": "image.png",
"links": {
"github": "https://github.com/teelur/budget-board",
"website": "https://budgetboard.net/",
"docs": "https://budgetboard.net/"
},
"tags": [
"finance",
"postgres",
"self-hosted",
"docker",
"compose"
]
}

View File

@@ -0,0 +1,18 @@
{
"id": "budibase",
"name": "Budibase",
"version": "3.23.47",
"description": "Budibase is an open-source low-code platform that saves engineers 100s of hours building forms, portals, and approval apps, securely.",
"logo": "budibase.svg",
"links": {
"github": "https://github.com/Budibase/budibase",
"website": "https://budibase.com/",
"docs": "https://docs.budibase.com/docs/"
},
"tags": [
"database",
"low-code",
"nocode",
"applications"
]
}

View File

@@ -0,0 +1,17 @@
{
"id": "bugsink",
"name": "Bugsink",
"version": "latest",
"description": "Bugsink is a self-hosted Error Tracker. Built to self-host; Sentry-SDK compatible; Scalable and reliable",
"logo": "bugsink.png",
"links": {
"github": "https://github.com/bugsink/bugsink/",
"website": "https://www.bugsink.com/",
"docs": "https://www.bugsink.com/docs/"
},
"tags": [
"hosting",
"self-hosted",
"development"
]
}

View File

@@ -0,0 +1,16 @@
{
"id": "bytebase",
"name": "Bytebase",
"version": "latest",
"description": "Bytebase is a database management tool that allows you to manage your databases with ease. It provides a simple and effective solution for managing your databases from anywhere.",
"logo": "image.png",
"links": {
"github": "https://github.com/bytebase/bytebase",
"website": "https://www.bytebase.com",
"docs": "https://www.bytebase.com/docs"
},
"tags": [
"database",
"self-hosted"
]
}

View File

@@ -0,0 +1,16 @@
{
"id": "bytestash",
"name": "ByteStash",
"version": "latest",
"description": "ByteStash is a self-hosted web application designed to store, organise, and manage your code snippets efficiently. With support for creating, editing, and filtering snippets, ByteStash helps you keep track of your code in one secure place.",
"logo": "logo.png",
"links": {
"github": "https://github.com/jordan-dalby/ByteStash",
"website": "https://github.com/jordan-dalby/ByteStash",
"docs": "https://github.com/jordan-dalby/ByteStash"
},
"tags": [
"file-storage",
"self-hosted"
]
}

View File

@@ -0,0 +1,16 @@
{
"id": "calcom",
"name": "Calcom",
"version": "v2.7.6",
"description": "Calcom is a open source alternative to Calendly that allows to create scheduling and booking services.",
"links": {
"github": "https://github.com/calcom/cal.com",
"website": "https://cal.com/",
"docs": "https://cal.com/docs"
},
"logo": "calcom.jpg",
"tags": [
"scheduling",
"booking"
]
}

View File

@@ -0,0 +1,18 @@
{
"id": "calibre-web",
"name": "Calibre-Web",
"version": "latest",
"description": "Calibre-Web is a web app providing a clean interface for browsing, reading, and managing your eBooks library using an existing Calibre database.",
"logo": "image.png",
"links": {
"github": "https://github.com/janeczku/calibre-web",
"website": "https://github.com/janeczku/calibre-web",
"docs": "https://github.com/janeczku/calibre-web/wiki"
},
"tags": [
"ebooks",
"media",
"library",
"self-hosted"
]
}

View File

@@ -0,0 +1,16 @@
{
"id": "calibre",
"name": "Calibre",
"version": "7.26.0",
"description": "Calibre is a comprehensive e-book management tool designed to organize, convert, and read your e-book collection. It supports most of the major e-book formats and is compatible with various e-book reader devices.",
"logo": "logo.png",
"links": {
"github": "https://github.com/kovidgoyal/calibre",
"website": "https://calibre-ebook.com/",
"docs": "https://manual.calibre-ebook.com/"
},
"tags": [
"Documents",
"E-Commerce"
]
}

View File

@@ -0,0 +1,19 @@
{
"id": "capso",
"name": "Cap.so",
"version": "latest",
"description": "Cap.so is a platform for web and desktop applications with MySQL and S3 storage. It provides a complete development environment with database and file storage capabilities.",
"links": {
"github": "https://github.com/CapSoftware/Cap",
"website": "https://cap.so/",
"docs": "https://cap.so/docs/"
},
"logo": "capso.png",
"tags": [
"web",
"s3",
"mysql",
"development",
"self-hosted"
]
}

View File

@@ -0,0 +1,18 @@
{
"id": "carbone",
"name": "Carbone",
"version": "4.25.5",
"description": "Carbone is a high-performance, self-hosted document generation engine. It allows you to generate reports, invoices, and documents in various formats (e.g., PDF, DOCX, XLSX) using JSON data and template-based rendering.",
"logo": "logo.png",
"links": {
"github": "https://github.com/carboneio/carbone",
"website": "https://carbone.io/",
"docs": "https://carbone.io/documentation/design/overview/getting-started.html"
},
"tags": [
"Document Generation",
"Automation",
"Reporting",
"Productivity"
]
}

View File

@@ -0,0 +1,23 @@
{
"id": "casdoor",
"name": "Casdoor",
"version": "latest",
"description": "An open-source UI-first Identity and Access Management (IAM) / Single-Sign-On (SSO) platform with web UI supporting OAuth 2.0, OIDC, SAML, CAS, LDAP, SCIM, WebAuthn, TOTP, MFA, and more.",
"logo": "casdoor.png",
"links": {
"github": "https://github.com/casdoor/casdoor",
"website": "https://casdoor.org/",
"docs": "https://casdoor.org/docs/overview"
},
"tags": [
"authentication",
"authorization",
"oauth2",
"oidc",
"sso",
"saml",
"identity-management",
"access-management",
"security"
]
}

View File

@@ -0,0 +1,17 @@
{
"id": "changedetection",
"name": "Change Detection",
"version": "0.49",
"description": "Changedetection.io is an intelligent tool designed to monitor changes on websites. Perfect for smart shoppers, data journalists, research engineers, data scientists, and security researchers.",
"logo": "logo.png",
"links": {
"github": "https://github.com/dgtlmoon/changedetection.io",
"website": "https://changedetection.io",
"docs": "https://github.com/dgtlmoon/changedetection.io/wiki"
},
"tags": [
"Monitoring",
"Data",
"Notifications"
]
}

View File

@@ -0,0 +1,29 @@
version: "3.8"
services:
chatto:
image: ghcr.io/chattocorp/chatto:0.3.8
restart: unless-stopped
expose:
- "4000"
environment:
CHATTO_WEBSERVER_URL: https://${CHATTO_HOST}
CHATTO_WEBSERVER_PORT: "4000"
CHATTO_WEBSERVER_COOKIE_SIGNING_SECRET: ${CHATTO_COOKIE_SECRET}
CHATTO_CORE_SECRET_KEY: ${CHATTO_CORE_SECRET}
CHATTO_CORE_ASSETS_SIGNING_SECRET: ${CHATTO_ASSETS_SECRET}
CHATTO_NATS_EMBEDDED_ENABLED: true
CHATTO_NATS_EMBEDDED_DATA_DIR: /data
CHATTO_OWNERS_EMAILS: ${CHATTO_OWNER_EMAIL}
CHATTO_SMTP_ENABLED: ${CHATTO_SMTP_ENABLED:-false}
CHATTO_SMTP_HOST: ${CHATTO_SMTP_HOST:-}
CHATTO_SMTP_PORT: ${CHATTO_SMTP_PORT:-587}
CHATTO_SMTP_TLS: ${CHATTO_SMTP_TLS:-mandatory}
CHATTO_SMTP_USERNAME: ${CHATTO_SMTP_USERNAME:-}
CHATTO_SMTP_PASSWORD: ${CHATTO_SMTP_PASSWORD:-}
CHATTO_SMTP_FROM: ${CHATTO_SMTP_FROM:-}
volumes:
- chatto-data:/data
volumes:
chatto-data:

BIN
blueprints/chatto/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

View File

@@ -0,0 +1,18 @@
{
"id": "chatto",
"name": "Chatto (single binary)",
"version": "0.3.8",
"description": "A fully-featured real-time chat application for teams and communities. This template deploys the single Chatto binary with embedded NATS. Note: email/password registration requires SMTP to be configured after deployment; voice/video calls are not included in the single-binary setup.",
"logo": "logo.png",
"links": {
"github": "https://github.com/chattocorp/chatto",
"website": "https://chatto.run",
"docs": "https://docs.chatto.run"
},
"tags": [
"chat",
"communication",
"messaging",
"self-hosted"
]
}

View File

@@ -0,0 +1,21 @@
[variables]
main_domain = "${domain}"
cookie_secret = "${hash:64}"
core_secret = "${hash:64}"
assets_secret = "${hash:64}"
owner_email = "${email}"
[config]
env = [
"CHATTO_HOST=${main_domain}",
"CHATTO_COOKIE_SECRET=${cookie_secret}",
"CHATTO_CORE_SECRET=${core_secret}",
"CHATTO_ASSETS_SECRET=${assets_secret}",
"CHATTO_OWNER_EMAIL=${owner_email}",
]
mounts = []
[[config.domains]]
serviceName = "chatto"
port = 4000
host = "${main_domain}"

Some files were not shown because too many files have changed in this diff Show More