Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9de737b21b | ||
|
|
85b07df702 | ||
|
|
77779f87a3 | ||
|
|
cc1a169fdd | ||
|
|
4f1ae3752e | ||
|
|
f96da34bf5 | ||
|
|
1e1cbf30d1 | ||
|
|
ab3c139ee7 | ||
|
|
3fd61bd12c | ||
|
|
05ce6581f5 | ||
|
|
50997d94d1 | ||
|
|
6de2978e97 | ||
|
|
adbdbcdd4f | ||
|
|
ff481a7f0d | ||
|
|
20576fc810 | ||
|
|
fb86d2c496 | ||
|
|
e273dcad95 | ||
|
|
ab902e17b9 | ||
|
|
3d995322db | ||
|
|
f088a3214b | ||
|
|
79042376f1 | ||
|
|
a63d67bcae | ||
|
|
a43cf890f3 | ||
|
|
dc59349116 | ||
|
|
2b62d182a8 | ||
|
|
be3c7f2d1d | ||
|
|
f5552b557c | ||
|
|
e4ffe271e0 | ||
|
|
dd8ef5b3c8 | ||
|
|
4757c59da3 | ||
|
|
0438165d43 | ||
|
|
7528f73265 | ||
|
|
37dc848e71 | ||
|
|
76049e3628 | ||
|
|
726a8c6bc9 | ||
|
|
54eccbe32b | ||
|
|
b23e3320f0 | ||
|
|
be933bdc54 | ||
|
|
32da868c01 | ||
|
|
efea22e1f0 | ||
|
|
40aa695a73 | ||
|
|
4367e2a42a | ||
|
|
87ab908a32 | ||
|
|
a9740da9cb | ||
|
|
b4efed26a0 | ||
|
|
0e84b284d8 | ||
|
|
4c36b7d6ca | ||
|
|
7c540d158a | ||
|
|
a00b179ddf | ||
|
|
6e1aece2e7 | ||
|
|
eb41d83963 | ||
|
|
385906aa4c | ||
|
|
640abda5d8 | ||
|
|
9e4da9c806 | ||
|
|
f3c1060443 | ||
|
|
c0ff3ca788 | ||
|
|
dcc456d18b | ||
|
|
b7f7c9ffb8 | ||
|
|
30ecc96168 | ||
|
|
c59fbf0f36 | ||
|
|
0aad2a0231 | ||
|
|
aa48af7856 | ||
|
|
abd316fd6e | ||
|
|
f78cc8d51f | ||
|
|
7834542c9c | ||
|
|
5905579eab | ||
|
|
f569d1379c | ||
|
|
3205b672c4 | ||
|
|
0fd2456a2a | ||
|
|
b4ebb8d9c5 | ||
|
|
daae16de16 | ||
|
|
88bff5f2a0 | ||
|
|
bba48c0a57 | ||
|
|
7efe2226ff | ||
|
|
8ec4ad1d9c | ||
|
|
3ec51b85bf | ||
|
|
a91730e582 | ||
|
|
b56d2b6d8c | ||
|
|
c697f54b53 | ||
|
|
e66cad204d | ||
|
|
3fcc9f2b93 | ||
|
|
d58cc15c54 | ||
|
|
ac07aa2ed8 | ||
|
|
46dc5b9be3 | ||
|
|
2e1fb3b3a9 | ||
|
|
1d70294310 | ||
|
|
60796a9084 | ||
|
|
3e8b431031 | ||
|
|
47daea92f8 | ||
|
|
758cf1d873 | ||
|
|
1e21b7e785 |
@@ -8,7 +8,6 @@ Key components:
|
||||
|
||||
- **Blueprints**: Self-contained templates with `docker-compose.yml` (service definitions) and `template.toml` (Dokploy-specific configuration for domains, env vars, mounts).
|
||||
- **meta.json**: Centralized index of all templates, aggregated from blueprint metadata. Entries include `id`, `name`, `version`, `description`, `logo`, `links`, and `tags`.
|
||||
- **app/**: Vite-based React frontend for local preview/development (runs at http://localhost:5173). Copies blueprints and meta.json to dist during build.
|
||||
- **Scripts**: Node.js tools in root and `build-scripts/` for maintaining `meta.json` (deduplication, sorting, validation).
|
||||
|
||||
Data flow: New templates added to `blueprints/` → Metadata updated in `meta.json` → Processing scripts ensure consistency → App builds include static blueprints/meta for preview.
|
||||
@@ -22,7 +21,6 @@ The "why": Enables rapid, standardized deployment of 200+ OSS apps on Dokploy wi
|
||||
- `docker-compose.yml`: Standard Docker Compose v3.8. Avoid `ports`, `container_name`, `networks`—Dokploy handles isolation via internal networks.
|
||||
- `template.toml`: Defines variables (e.g., `${domain}`), domains (service:port → host), env vars, and mounts. Use helpers like `${password:32}`, `${uuid}`, `${jwt:secret_var}`.
|
||||
- `logo.svg/png`: Service icon, referenced in `meta.json`.
|
||||
- `app/vite.config.ts`: Configures build to copy `blueprints/*` and `meta.json` to dist root for static serving.
|
||||
- `dedupe-and-sort-meta.js`: Standalone script—reads `meta.json`, removes duplicate `id`s (keeps first), sorts by `id` (case-insensitive), creates timestamped backup.
|
||||
- `build-scripts/process-meta.js`: Advanced processor with CLI options (`--verbose`, `--no-backup`, `--input`/`--output`), JSON schema validation (required: `id`, `name`, `version`, `description`, `links.github`, `logo`, `tags` array).
|
||||
|
||||
@@ -39,14 +37,7 @@ Exemplary blueprint: `blueprints/ghost/`—`docker-compose.yml` exposes port 236
|
||||
- Run `node dedupe-and-sort-meta.js --backup` to validate/sort.
|
||||
- Commit; PR triggers Dokploy preview (base64 import for testing).
|
||||
|
||||
2. **Local Development**:
|
||||
|
||||
- App: `cd app && pnpm install && pnpm dev` (Vite dev server).
|
||||
- Meta processing: `npm run process-meta` or `make process-meta` (uses Makefile targets: `validate`, `check`, `build`).
|
||||
- Build app: `cd app && pnpm build`—copies blueprints/meta to `dist/` for static hosting.
|
||||
- Test template: Use PR preview URL or local Dokploy instance; import base64 from template card.
|
||||
|
||||
3. **CI/CD**:
|
||||
2. **CI/CD**:
|
||||
- `.github/workflows/validate-meta.yml` (if present): Runs validation on push/PR—fails on duplicates, invalid JSON, missing fields.
|
||||
- Integrate processing: Add `npm run process-meta` to build steps; use `--no-backup` in CI.
|
||||
|
||||
@@ -64,10 +55,10 @@ No tests in repo—focus on manual validation via scripts and Dokploy deploys. D
|
||||
- JWT helper: `${jwt:secret_var:payload_var}` for auth tokens; payload as JSON string with `exp: ${timestamps:YYYY-MM-DDTHH:mm:ssZ}`.
|
||||
- **Meta.json**: Entries as JSON objects; tags array of lowercase strings (e.g., ["monitoring", "database"]); links object with `github`, `website`, `docs`.
|
||||
- **No Networks**: Rely on Dokploy's isolated deployments—avoid explicit `networks:`.
|
||||
- **Versions**: Pin images to specific versions in `docker-compose.yml` (e.g., `ghost:5.82.0-alpine`); match in `meta.json.version`.
|
||||
- **Versions**: Pin images to specific versions in `docker-compose.yml` (e.g., `ghost:5.82.0-alpine`); match in `meta.json.version`. **NEVER use `latest` tag**—it can break templates when upstream images change unexpectedly.
|
||||
- **Logos**: SVG preferred; size ~128x128; file name in `meta.json.logo` (e.g., "ghost.svg").
|
||||
|
||||
Cross-component: No runtime communication—templates independent. App consumes static blueprints/meta for UI rendering (e.g., search, cards via React components in `app/src/`).
|
||||
Cross-component: Templates are independent and ship as static blueprints/meta.
|
||||
|
||||
## Integration Points
|
||||
|
||||
|
||||
@@ -6,12 +6,13 @@ New PR of [Template Name]
|
||||
|
||||
Before submitting this PR, please make sure that:
|
||||
|
||||
- [ ] I have read the suggestions in the README.md file https://github.com/Dokploy/templates?tab=readme-ov-file#general-suggestions-when-creating-a-template
|
||||
- [ ] I have read the suggestions in the README.md file https://github.com/Dokploy/templates?tab=readme-ov-file#general-requirements-when-creating-a-template
|
||||
- [ ] I have tested the template in my instance, so the maintainers don't spend time trying to figure out what's wrong.
|
||||
- [ ] I have added tests that demonstrate that my correction works or that my new feature works.
|
||||
|
||||
## Issues related (if applicable)
|
||||
|
||||
Close automatically the related issues using the keywords: `closes #ISSUE_NUMBER`, `fixes #ISSUE_NUMBER`, `resolves #ISSUE_NUMBER`
|
||||
Close automatically the related issues using the keywords: `closes #ISSUE_NUMBER`
|
||||
|
||||
Example: `closes #123`
|
||||
|
||||
## Screenshots or Videos
|
||||
@@ -5,7 +5,9 @@ on:
|
||||
workflows: [Build Preview Deployment]
|
||||
types:
|
||||
- completed
|
||||
|
||||
pull_request:
|
||||
branches:
|
||||
- canary
|
||||
permissions:
|
||||
actions: read
|
||||
deployments: write
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
name: Validate Docker Compose Files
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- canary
|
||||
paths:
|
||||
- 'blueprints/**/docker-compose.yml'
|
||||
- 'blueprints/**/template.toml'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
validate-docker-compose:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Set up Docker Compose
|
||||
run: docker compose version
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20.16.0
|
||||
|
||||
- name: Set up pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
version: 8
|
||||
|
||||
- name: Install dependencies
|
||||
run: cd build-scripts && pnpm install
|
||||
|
||||
- name: Detect changed blueprints
|
||||
id: changed
|
||||
run: |
|
||||
BASE_SHA=$(git merge-base HEAD origin/${{ github.base_ref }})
|
||||
|
||||
# Obtener todos los blueprints que tienen cambios (en docker-compose.yml o template.toml)
|
||||
CHANGED_BLUEPRINTS=$(git diff --name-only --diff-filter=ACMRT $BASE_SHA HEAD | \
|
||||
grep -E 'blueprints/[^/]+/(docker-compose\.yml|template\.toml)$' | \
|
||||
sed 's|blueprints/\([^/]*\)/.*|\1|' | \
|
||||
sort -u)
|
||||
|
||||
echo "Changed blueprints:"
|
||||
echo "$CHANGED_BLUEPRINTS" | while read blueprint; do
|
||||
[ -n "$blueprint" ] && echo " - $blueprint"
|
||||
done
|
||||
|
||||
# Guardar lista de blueprints (una por línea)
|
||||
echo "blueprints<<EOF" >> $GITHUB_OUTPUT
|
||||
echo "$CHANGED_BLUEPRINTS" >> $GITHUB_OUTPUT
|
||||
echo "EOF" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Validate blueprints
|
||||
run: |
|
||||
BLUEPRINTS="${{ steps.changed.outputs.blueprints }}"
|
||||
|
||||
if [ -z "$BLUEPRINTS" ] || [ "$BLUEPRINTS" = "" ]; then
|
||||
echo "ℹ️ No blueprints changed, skipping validation"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
ERROR=0
|
||||
|
||||
# Convertir a array para evitar problemas con subshells
|
||||
mapfile -t BLUEPRINT_ARRAY <<< "$BLUEPRINTS"
|
||||
|
||||
# Iterar sobre cada blueprint
|
||||
for blueprint in "${BLUEPRINT_ARRAY[@]}"; do
|
||||
[ -z "$blueprint" ] && continue
|
||||
|
||||
BLUEPRINT_PATH="blueprints/$blueprint"
|
||||
COMPOSE_FILE="$BLUEPRINT_PATH/docker-compose.yml"
|
||||
TOML_FILE="$BLUEPRINT_PATH/template.toml"
|
||||
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "📦 Validating: $blueprint"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
|
||||
# 1. Validar best practices de docker-compose.yml
|
||||
if [ ! -f "$COMPOSE_FILE" ]; then
|
||||
echo "⚠️ WARNING: docker-compose.yml not found"
|
||||
ERROR=1
|
||||
continue
|
||||
fi
|
||||
echo "🔍 Validating docker-compose.yml best practices..."
|
||||
if ! (cd build-scripts && pnpm exec tsx validate-docker-compose.ts --file "../$COMPOSE_FILE" --verbose); then
|
||||
ERROR=1
|
||||
continue
|
||||
fi
|
||||
|
||||
# 3. Validar template.toml
|
||||
if [ -f "$TOML_FILE" ]; then
|
||||
echo "🔍 Validating template.toml..."
|
||||
if ! (cd build-scripts && pnpm exec tsx validate-template.ts --dir "../$BLUEPRINT_PATH" --verbose); then
|
||||
ERROR=1
|
||||
continue
|
||||
fi
|
||||
else
|
||||
echo "⚠️ WARNING: template.toml not found"
|
||||
ERROR=1
|
||||
continue
|
||||
fi
|
||||
|
||||
echo "✅ All validations passed for $blueprint"
|
||||
done
|
||||
|
||||
if [ $ERROR -eq 1 ]; then
|
||||
echo ""
|
||||
echo "❌ Validation failed for one or more blueprints"
|
||||
exit 1
|
||||
else
|
||||
echo ""
|
||||
echo "✅ All blueprints validated successfully"
|
||||
fi
|
||||
@@ -2,10 +2,10 @@ name: Validate and Process Meta.json
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main, master, develop]
|
||||
branches: [canary]
|
||||
paths: ["meta.json"]
|
||||
pull_request:
|
||||
branches: [main, master]
|
||||
branches: [canary]
|
||||
paths: ["meta.json"]
|
||||
workflow_dispatch:
|
||||
|
||||
|
||||
@@ -3,10 +3,10 @@ name: Validate Blueprints Structure and Meta
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
- canary
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- canary
|
||||
|
||||
jobs:
|
||||
validate:
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
node_modules
|
||||
@@ -0,0 +1,212 @@
|
||||
# AGENTS.md: AI Collaboration Guide
|
||||
|
||||
This document provides essential context for AI models interacting with this project. Adhering to these guidelines will ensure consistency and maintain code quality.
|
||||
|
||||
## 1. Project Overview & Purpose
|
||||
|
||||
- **Primary Goal:** This is the official repository for Dokploy Open Source Templates, maintaining Docker Compose templates for deploying 200+ open-source applications via Dokploy (a self-hosted PaaS alternative to Heroku). The project enables rapid, standardized deployment of OSS applications without manual configuration.
|
||||
- **Business Domain:** Self-hosted Platform as a Service (PaaS), DevOps tooling, containerized application deployment, and open-source software distribution.
|
||||
|
||||
## 2. Core Technologies & Stack
|
||||
|
||||
- **Languages:** JavaScript (Node.js), TypeScript (React frontend), YAML (Docker Compose), TOML (template configuration), JSON (metadata), Shell (build scripts).
|
||||
- **Frameworks & Runtimes:** Node.js runtime, Vite 5.x (for React 19.x frontend), Docker Compose v3.8+, React Router 7.x.
|
||||
- **Databases:** No direct database usage in core project (templates may include various databases like PostgreSQL, MySQL, Redis, etc.).
|
||||
- **Key Libraries/Dependencies:**
|
||||
- **Core:** `nodemon` for development, custom Node.js scripts for meta processing.
|
||||
- **Frontend:** `fuse.js` (fuzzy search), `zustand` (state management), `@iarna/toml` (TOML parsing), `shadcn/ui` components, `@radix-ui` primitives, `@codemirror` (code editor), `react-router-dom`, `tailwindcss`.
|
||||
- **Build:** `vite-plugin-static-copy` for copying blueprints to dist.
|
||||
- **Platforms:** Linux (primary), Docker containers, Dokploy PaaS, Web browsers (for frontend preview), Cloudflare Pages (for PR previews).
|
||||
- **Package Manager:** npm for root project, pnpm for frontend (`app/` directory).
|
||||
|
||||
## 3. Architectural Patterns
|
||||
|
||||
- **Overall Architecture:** Template collection and management system with decentralized blueprint architecture. Each blueprint is a self-contained Docker Compose application with Dokploy-specific configuration.
|
||||
- **Directory Structure Philosophy:**
|
||||
- `/blueprints`: Contains all deployable application templates, each as a subdirectory with `docker-compose.yml`, `template.toml`, and logo files. Each blueprint is independent with no shared state.
|
||||
- `/app`: Vite + React + TypeScript frontend for local preview and development.
|
||||
- `/src/components`: React components (UI components in `/ui` subdirectory using shadcn/ui).
|
||||
- `/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.
|
||||
- `/.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`).
|
||||
- **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
|
||||
|
||||
- **Formatting:** JavaScript follows standard conventions with 2-space indentation. TypeScript in frontend uses ESLint configuration. YAML uses 2-space indentation. TOML files use standard formatting.
|
||||
- **Naming Conventions:**
|
||||
- Variables, functions: camelCase (`myVariable`, `myFunction`)
|
||||
- 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`)
|
||||
- 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.
|
||||
- **Frontend:** Component-based React architecture with hooks for logic separation. Zustand for centralized state management. Custom hooks encapsulate complex logic (e.g., `useFuseSearch` for search functionality).
|
||||
- **Common Patterns & Idioms:**
|
||||
- **Metaprogramming:** Minimal use of advanced JavaScript features in scripts, focusing on simple, maintainable code.
|
||||
- **Memory Management:** Relies on Node.js garbage collection and React's automatic memory management.
|
||||
- **Polymorphism:** Uses JavaScript prototype-based objects and functional programming patterns. React components use composition over inheritance.
|
||||
- **Type Safety:**
|
||||
- Backend scripts: JavaScript with JSDoc comments for documentation.
|
||||
- Frontend: TypeScript with strict type checking enabled.
|
||||
- **Concurrency:**
|
||||
- Backend: Synchronous processing model for meta.json operations.
|
||||
- Frontend: React's concurrent rendering, `useDeferredValue` for debouncing, `useEffect` for async operations.
|
||||
- **State Management:** Zustand store pattern with selectors for optimal re-renders. URL params synced with search state via React Router.
|
||||
- **Error Handling:**
|
||||
- Backend: Node.js error-first callback pattern and try-catch blocks. Scripts validate JSON structure and fail fast on errors.
|
||||
- Frontend: Error boundaries for React components, try-catch for async operations, user-friendly error messages via toast notifications.
|
||||
|
||||
## 5. Key Files & Entrypoints
|
||||
|
||||
- **Main Entrypoints:**
|
||||
- **Backend:** `dedupe-and-sort-meta.js` - Primary script for processing meta.json file.
|
||||
- **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/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/build-preview.yml` - Builds preview deployments for PRs.
|
||||
- `.github/workflows/deploy-preview.yml` - Deploys previews to Cloudflare Pages.
|
||||
|
||||
## 6. Development & Testing Workflow
|
||||
|
||||
- **Local Development Environment:**
|
||||
- **Install dependencies**
|
||||
|
||||
```bash
|
||||
# Root project
|
||||
npm install
|
||||
|
||||
# Frontend (uses pnpm)
|
||||
cd app && pnpm install
|
||||
```
|
||||
|
||||
- **Process meta.json** (CRITICAL: Run after ANY meta.json edits)
|
||||
```bash
|
||||
npm run process-meta
|
||||
# or
|
||||
make process-meta
|
||||
# or
|
||||
node dedupe-and-sort-meta.js
|
||||
```
|
||||
- **Validate without modifying**
|
||||
```bash
|
||||
npm run validate-meta
|
||||
# or
|
||||
make validate
|
||||
```
|
||||
- **Quick check for duplicates/sort status**
|
||||
```bash
|
||||
make check
|
||||
```
|
||||
- **Clean backup files**
|
||||
```bash
|
||||
make clean
|
||||
```
|
||||
- **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
|
||||
- **Testing:** No formal unit testing framework. Validation occurs through:
|
||||
- Script-based validation of meta.json structure and schema
|
||||
- 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 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.
|
||||
|
||||
## 7. Specific Instructions for AI Collaboration
|
||||
|
||||
- **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.
|
||||
- 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).
|
||||
- **Docker Compose Conventions (CRITICAL):**
|
||||
|
||||
- **Version:** MUST be `3.8`
|
||||
- **NEVER include:** `ports` (use `expose` only), `container_name`, `networks` (Dokploy handles isolation)
|
||||
- **ALWAYS include:** `restart: unless-stopped` or `restart: always`, persistent volumes
|
||||
- **Service naming:** MUST match blueprint folder name exactly
|
||||
- **Example:**
|
||||
```yaml
|
||||
version: "3.8"
|
||||
services:
|
||||
ghost:
|
||||
image: ghost:6-alpine
|
||||
restart: always
|
||||
volumes:
|
||||
- ghost:/var/lib/ghost/content
|
||||
volumes:
|
||||
ghost:
|
||||
```
|
||||
|
||||
- **template.toml Conventions:**
|
||||
|
||||
- **Variables:** Define in `[variables]` section, use helpers for secrets
|
||||
- **Domains:** `[[config.domains]]` with `serviceName`, `port`, `host` (path optional)
|
||||
- **Env:** Array of strings: `env = ["KEY=VALUE", "DB_PASSWORD=${db_pass}"]`
|
||||
- **Available helpers:** `${domain}`, `${password:length}`, `${base64:length}`, `${hash:length}`, `${uuid}`, `${randomPort}`, `${email}`, `${username}`, `${timestamp}`, `${timestamps:datetime}`, `${timestampms:datetime}`, `${jwt:secret_var:payload_var}`
|
||||
- **JWT helper example:** `${jwt:mysecret:mypayload}` with payload containing `exp: ${timestamps:2030-01-01T00:00:00Z}`
|
||||
|
||||
- **meta.json Requirements:**
|
||||
|
||||
- **Required fields:** `id`, `name`, `version`, `description`, `links` (with `github`), `logo`, `tags` (array)
|
||||
- **Tags:** Lowercase strings (e.g., `["monitoring", "database"]`)
|
||||
- **Version:** MUST match Docker image version in docker-compose.yml
|
||||
- **Logo:** Filename only (e.g., `"ghost.jpeg"`), file must exist in blueprint folder
|
||||
|
||||
- **Frontend Development:**
|
||||
|
||||
- Use TypeScript with strict type checking
|
||||
- Follow React hooks patterns, avoid class components
|
||||
- Use Zustand selectors for state access to optimize re-renders
|
||||
- Fuse.js searches across `name`, `description`, `tags`, `id` fields
|
||||
- Use shadcn/ui components for consistency
|
||||
- Sync URL params with search state via React Router
|
||||
|
||||
- **Security:**
|
||||
|
||||
- Be mindful of security when handling template configurations
|
||||
- NEVER hardcode secrets in templates - use Dokploy's variable system with helpers
|
||||
- Pin Docker images to specific versions to avoid supply chain attacks
|
||||
- Validate user input in frontend before processing
|
||||
|
||||
- **Dependencies:**
|
||||
|
||||
- When adding new templates, ensure Docker images are pinned to specific versions
|
||||
- Update meta.json with exact version matching Docker Compose image version
|
||||
- For frontend dependencies: Use `pnpm add <package>` in `app/` directory
|
||||
- For root dependencies: Use `npm install <package>` in root directory
|
||||
|
||||
- **Commit Messages:** Follow conventional commit patterns (e.g., `feat:`, `fix:`, `docs:`, `chore:`).
|
||||
|
||||
- **Common Pitfalls to Avoid:**
|
||||
1. Forgetting to process meta.json after editing (CI will fail)
|
||||
2. Template ID mismatch between meta.json and folder name
|
||||
3. Including `ports`, `container_name`, or `networks` in docker-compose.yml
|
||||
4. Using object syntax for env vars in template.toml (must be array of strings)
|
||||
5. Logo file missing or filename mismatch in meta.json
|
||||
6. Version mismatch between meta.json and docker-compose.yml image tag
|
||||
@@ -148,7 +148,6 @@ Use these in `${}` for dynamic values:
|
||||
|
||||
- Omit explicit ports; let Dokploy handle exposure.
|
||||
- Use persistent volumes for data (e.g., databases).
|
||||
- Set `restart: unless-stopped` for services.
|
||||
|
||||
- **Template.toml**:
|
||||
|
||||
|
||||
@@ -170,7 +170,7 @@ We have a few helpers that are very common when creating a template, these are:
|
||||
|
||||
|
||||
|
||||
## General Suggestions when creating a template
|
||||
## General Requirements when creating a template
|
||||
|
||||
- Don't use this way in your docker compose 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.
|
||||
use the command `node dedupe-and-sort-meta.js` to deduplicate and sort the meta.json file.
|
||||
|
||||
@@ -10,6 +10,7 @@ serviceName = "ackee"
|
||||
port = 3000
|
||||
host = "${domain}"
|
||||
|
||||
|
||||
[config.env]
|
||||
ACKEE_USERNAME = "${ACKEE_USERNAME}"
|
||||
ACKEE_PASSWORD = "${ACKEE_PASSWORD}"
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
# Example: Any-Sync-Bundle with embedded MongoDB and Redis (all-in-one image)
|
||||
#
|
||||
# Usage:
|
||||
# docker compose -f compose.aio.yml up -d
|
||||
#
|
||||
# The bundle image already contains MongoDB and Redis. Only the bundle service is required
|
||||
|
||||
services:
|
||||
any-sync-bundle:
|
||||
image: ghcr.io/grishy/any-sync-bundle:latest
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "33010:33010"
|
||||
- "33020:33020/udp"
|
||||
volumes:
|
||||
- ./data:/data
|
||||
environment:
|
||||
# Advertise addresses clients should use. Replace with your server hostname/IP.
|
||||
ANY_SYNC_BUNDLE_INIT_EXTERNAL_ADDRS: "192.168.100.9"
|
||||
|
After Width: | Height: | Size: 50 KiB |
@@ -0,0 +1,4 @@
|
||||
[config]
|
||||
domains = []
|
||||
mounts = []
|
||||
env = []
|
||||
@@ -0,0 +1,3 @@
|
||||
<svg width="600" height="530" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M135.72 44.03C202.216 93.951 273.74 195.17 300 249.49c26.262-54.316 97.782-155.54 164.28-205.46C512.26 8.009 590-19.862 590 68.825c0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.38-3.69-10.832-3.708-7.896-.017-2.936-1.193.516-3.707 7.896-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.45-163.25-81.433C20.15 217.613 9.997 86.535 9.997 68.825c0-88.687 77.742-60.816 125.72-24.795z" fill="#1185fe"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 665 B |
@@ -0,0 +1,48 @@
|
||||
services:
|
||||
pds:
|
||||
image: 'ghcr.io/bluesky-social/pds:0.4.182'
|
||||
volumes:
|
||||
- pds-data:/pds
|
||||
environment:
|
||||
- SERVICE_URL_PDS_3000
|
||||
- PDS_HOSTNAME
|
||||
- PDS_JWT_SECRET
|
||||
- PDS_ADMIN_PASSWORD
|
||||
- 'PDS_ADMIN_EMAIL=${PDS_ADMIN_EMAIL}'
|
||||
- PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX
|
||||
- 'PDS_DATA_DIRECTORY=${PDS_DATA_DIRECTORY:-/pds}'
|
||||
- 'PDS_BLOBSTORE_DISK_LOCATION=${PDS_DATA_DIRECTORY:-/pds}/blocks'
|
||||
- 'PDS_BLOB_UPLOAD_LIMIT=${PDS_BLOB_UPLOAD_LIMIT:-104857600}'
|
||||
- 'PDS_DID_PLC_URL=${PDS_DID_PLC_URL:-https://plc.directory}'
|
||||
- 'PDS_EMAIL_FROM_ADDRESS=${PDS_EMAIL_FROM_ADDRESS}'
|
||||
- 'PDS_EMAIL_SMTP_URL=${PDS_EMAIL_SMTP_URL}'
|
||||
- 'PDS_BSKY_APP_VIEW_URL=${PDS_BSKY_APP_VIEW_URL:-https://api.bsky.app}'
|
||||
- 'PDS_BSKY_APP_VIEW_DID=${PDS_BSKY_APP_VIEW_DID:-did:web:api.bsky.app}'
|
||||
- 'PDS_REPORT_SERVICE_URL=${PDS_REPORT_SERVICE_URL:-https://mod.bsky.app/xrpc/com.atproto.moderation.createReport}'
|
||||
- 'PDS_REPORT_SERVICE_DID=${PDS_REPORT_SERVICE_DID:-did:plc:ar7c4by46qjdydhdevvrndac}'
|
||||
- 'PDS_CRAWLERS=${PDS_CRAWLERS:-https://bsky.network}'
|
||||
- 'LOG_ENABLED=${LOG_ENABLED:-true}'
|
||||
command: |
|
||||
sh -c '
|
||||
set -euo pipefail
|
||||
echo "Installing required packages and pdsadmin..."
|
||||
apk add --no-cache openssl curl bash jq coreutils gnupg util-linux-misc >/dev/null
|
||||
curl -o /usr/local/bin/pdsadmin.sh https://raw.githubusercontent.com/bluesky-social/pds/main/pdsadmin.sh
|
||||
chmod 700 /usr/local/bin/pdsadmin.sh
|
||||
ln -sf /usr/local/bin/pdsadmin.sh /usr/local/bin/pdsadmin
|
||||
echo "Creating an empty pds.env file so pdsadmin works..."
|
||||
touch /pds/pds.env
|
||||
echo "Launching PDS, enjoy!..."
|
||||
exec node --enable-source-maps index.js
|
||||
'
|
||||
healthcheck:
|
||||
test:
|
||||
- CMD
|
||||
- wget
|
||||
- '--spider'
|
||||
- 'http://127.0.0.1:3000/xrpc/_health'
|
||||
interval: 5s
|
||||
timeout: 10s
|
||||
retries: 10
|
||||
volumes:
|
||||
pds-data:
|
||||
@@ -0,0 +1,36 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
admin_password = "${password:32}"
|
||||
jwt_secret = "${jwt:32}"
|
||||
rotation_key = "${jwt:32}"
|
||||
data_directory = "/pds"
|
||||
blob_upload_limit = "104857600"
|
||||
log_enabled = "true"
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
env = [
|
||||
"PDS_ADMIN_PASSWORD=${admin_password}",
|
||||
"PDS_HOSTNAME=${main_domain}",
|
||||
"PDS_JWT_SECRET=${jwt_secret}",
|
||||
"PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX=${rotation_key}",
|
||||
"PDS_ADMIN_EMAIL=",
|
||||
"PDS_EMAIL_FROM_ADDRESS=",
|
||||
"PDS_EMAIL_SMTP_URL=",
|
||||
"PDS_DATA_DIRECTORY=${data_directory}",
|
||||
"PDS_BLOBSTORE_DISK_LOCATION=${data_directory}/blocks",
|
||||
"PDS_BLOB_UPLOAD_LIMIT=${blob_upload_limit}",
|
||||
"PDS_DID_PLC_URL=https://plc.directory",
|
||||
"PDS_BSKY_APP_VIEW_URL=https://api.bsky.app",
|
||||
"PDS_BSKY_APP_VIEW_DID=did:web:api.bsky.app",
|
||||
"PDS_REPORT_SERVICE_URL=https://mod.bsky.app/xrpc/com.atproto.moderation.createReport",
|
||||
"PDS_REPORT_SERVICE_DID=did:plc:ar7c4by46qjdydhdevvrndac",
|
||||
"PDS_CRAWLERS=https://bsky.network",
|
||||
"LOG_ENABLED=${log_enabled}"
|
||||
]
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "pds"
|
||||
port = 3000
|
||||
host = "${main_domain}"
|
||||
path = "/"
|
||||
@@ -182,9 +182,6 @@ services:
|
||||
labels:
|
||||
- com.centurylinklabs.watchtower.enable=false
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
minio_data:
|
||||
|
||||
@@ -4,8 +4,6 @@ x-base-config: &base-config
|
||||
image: chatwoot/chatwoot:v4.0.3
|
||||
volumes:
|
||||
- chatwoot-storage:/app/storage
|
||||
networks:
|
||||
- dokploy-network
|
||||
environment:
|
||||
- FRONTEND_URL=${FRONTEND_URL}
|
||||
- SECRET_KEY_BASE=${SECRET_KEY_BASE}
|
||||
@@ -63,10 +61,6 @@ services:
|
||||
volumes:
|
||||
- chatwoot-redis-data:/data
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
chatwoot-storage:
|
||||
chatwoot-postgres-data:
|
||||
|
||||
|
After Width: | Height: | Size: 12 KiB |
@@ -0,0 +1,81 @@
|
||||
services:
|
||||
chirpstack:
|
||||
image: chirpstack/chirpstack:4
|
||||
command: -c /etc/chirpstack
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ../files/chirpstack:/etc/chirpstack
|
||||
ports:
|
||||
- 8080
|
||||
environment:
|
||||
- MQTT_BROKER_HOST=mosquitto
|
||||
- REDIS_HOST=redis
|
||||
- POSTGRESQL_HOST=postgres
|
||||
depends_on:
|
||||
- postgres
|
||||
- mosquitto
|
||||
- redis
|
||||
|
||||
chirpstack-gateway-bridge:
|
||||
image: chirpstack/chirpstack-gateway-bridge:4
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ../files/chirpstack-gateway-bridge:/etc/chirpstack-gateway-bridge
|
||||
ports:
|
||||
- 1700/udp
|
||||
environment:
|
||||
- INTEGRATION__MQTT__EVENT_TOPIC_TEMPLATE=eu868/gateway/{{ .GatewayID }}/event/{{ .EventType }}
|
||||
- INTEGRATION__MQTT__STATE_TOPIC_TEMPLATE=eu868/gateway/{{ .GatewayID }}/state/{{ .StateType }}
|
||||
- INTEGRATION__MQTT__COMMAND_TOPIC_TEMPLATE=eu868/gateway/{{ .GatewayID }}/command/#
|
||||
depends_on:
|
||||
- mosquitto
|
||||
|
||||
chirpstack-gateway-bridge-basicstation:
|
||||
image: chirpstack/chirpstack-gateway-bridge:4
|
||||
command: -c /etc/chirpstack-gateway-bridge/chirpstack-gateway-bridge-basicstation-eu868.toml
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ../files/chirpstack-gateway-bridge:/etc/chirpstack-gateway-bridge
|
||||
ports:
|
||||
- 3001
|
||||
depends_on:
|
||||
- mosquitto
|
||||
|
||||
chirpstack-rest-api:
|
||||
image: chirpstack/chirpstack-rest-api:4
|
||||
restart: unless-stopped
|
||||
command: --server chirpstack:8080 --bind 0.0.0.0:8090 --insecure
|
||||
ports:
|
||||
- 8090
|
||||
depends_on:
|
||||
- chirpstack
|
||||
|
||||
postgres:
|
||||
image: postgres:14-alpine
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- postgresqldata:/var/lib/postgresql/data
|
||||
- ../files/postgresql/initdb:/docker-entrypoint-initdb.d
|
||||
environment:
|
||||
- POSTGRES_USER=chirpstack
|
||||
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
|
||||
- POSTGRES_DB=chirpstack
|
||||
|
||||
redis:
|
||||
image: redis:7-alpine
|
||||
restart: unless-stopped
|
||||
command: redis-server --save 300 1 --save 60 100 --appendonly no
|
||||
volumes:
|
||||
- redisdata:/data
|
||||
|
||||
mosquitto:
|
||||
image: eclipse-mosquitto:2
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ../files/mosquitto/config/:/mosquitto/config/
|
||||
ports:
|
||||
- 1883
|
||||
|
||||
volumes:
|
||||
postgresqldata:
|
||||
redisdata:
|
||||
@@ -7,8 +7,6 @@ services:
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- db:/var/lib/matrix-conduit/
|
||||
networks:
|
||||
- dokploy-network
|
||||
environment:
|
||||
CONDUIT_SERVER_NAME: ${MATRIX_SUBDOMAIN}
|
||||
CONDUIT_DATABASE_PATH: /var/lib/matrix-conduit/
|
||||
@@ -25,7 +23,3 @@ services:
|
||||
CONDUIT_CONFIG: '' # Ignore this
|
||||
volumes:
|
||||
db:
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
@@ -45,10 +45,6 @@ services:
|
||||
PUBLISH_COMMANDS: "true"
|
||||
SUPER: ${SUPER_USERS}
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
tickets-mysql-data:
|
||||
tickets-app-data:
|
||||
@@ -34,10 +34,6 @@ services:
|
||||
volumes:
|
||||
- redis_docmost_data:/data
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
docmost:
|
||||
db_docmost_data:
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
services:
|
||||
dokploy-monitoring:
|
||||
image: dokploy/monitoring:canary
|
||||
restart: unless-stopped
|
||||
env_file:
|
||||
- .env
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
- monitoring-data:/app/data
|
||||
volumes:
|
||||
monitoring-data: {}
|
||||
@@ -0,0 +1,21 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="128" height="128">
|
||||
<!-- Background circle -->
|
||||
<circle cx="50" cy="50" r="48" fill="#E6522C" stroke="#CC4A1F" stroke-width="2"/>
|
||||
|
||||
<!-- Prometheus flame icon adapted for monitoring -->
|
||||
<path d="M50 15 L60 35 L80 35 L65 48 L72 68 L50 55 L28 68 L35 48 L20 35 L40 35 Z"
|
||||
fill="#FFF" opacity="0.95"/>
|
||||
|
||||
<!-- Graph/Chart lines representing monitoring -->
|
||||
<path d="M 20 75 L 30 65 L 40 70 L 50 60 L 60 65 L 70 55 L 80 60"
|
||||
stroke="#FFF" stroke-width="3" fill="none" stroke-linecap="round" opacity="0.8"/>
|
||||
|
||||
<!-- Data points on the graph -->
|
||||
<circle cx="20" cy="75" r="2.5" fill="#FFF"/>
|
||||
<circle cx="30" cy="65" r="2.5" fill="#FFF"/>
|
||||
<circle cx="40" cy="70" r="2.5" fill="#FFF"/>
|
||||
<circle cx="50" cy="60" r="2.5" fill="#FFF"/>
|
||||
<circle cx="60" cy="65" r="2.5" fill="#FFF"/>
|
||||
<circle cx="70" cy="55" r="2.5" fill="#FFF"/>
|
||||
<circle cx="80" cy="60" r="2.5" fill="#FFF"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 979 B |
@@ -0,0 +1,17 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
monitoring_token = "${password:32}"
|
||||
callback_url = "http://dokploy:3000/api/trpc/notification.receiveNotification"
|
||||
server_type = "Dokploy"
|
||||
refresh_rate = "30"
|
||||
retention_days = "7"
|
||||
cpu_threshold = "80"
|
||||
memory_threshold = "85"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "dokploy-monitoring"
|
||||
port = 3001
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
METRICS_CONFIG = "{\"server\":{\"refreshRate\":${refresh_rate},\"port\":3001,\"type\":\"${server_type}\",\"token\":\"${monitoring_token}\",\"urlCallback\":\"${callback_url}\",\"retentionDays\":${retention_days},\"cronJob\":\"0 0 * * *\",\"thresholds\":{\"cpu\":${cpu_threshold},\"memory\":${memory_threshold}},\"prometheus\":{\"enabled\":true}},\"containers\":{\"refreshRate\":${refresh_rate},\"services\":{\"include\":[],\"exclude\":[]}}}"
|
||||
@@ -51,9 +51,5 @@ services:
|
||||
DRAWIO_GITLAB_SECRET: ${DRAWIO_GITLAB_SECRET}
|
||||
DRAWIO_GITLAB_URL: ${DRAWIO_GITLAB_URL}
|
||||
DRAWIO_CLOUD_CONVERT_APIKEY: ${DRAWIO_CLOUD_CONVERT_APIKEY}
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
fonts_volume:
|
||||
@@ -1,18 +1,25 @@
|
||||
services:
|
||||
enshrouded:
|
||||
image: sknnr/enshrouded-dedicated-server:latest
|
||||
image: mornedhels/enshrouded-server:latest
|
||||
container_name: enshrouded
|
||||
hostname: enshrouded
|
||||
restart: unless-stopped
|
||||
stop_grace_period: 90s
|
||||
ports:
|
||||
- "15637:15637/udp"
|
||||
- "27015:27015/udp"
|
||||
volumes:
|
||||
- enshrouded-persistent-data:/opt/enshrouded
|
||||
# only add ntsync device if your kernel supports it (6.14 or newer)
|
||||
# devices:
|
||||
# - /dev/ntsync:/dev/ntsync
|
||||
environment:
|
||||
- SERVER_NAME=${SERVER_NAME}
|
||||
- SERVER_PASSWORD=${SERVER_PASSWORD}
|
||||
- PORT=15637
|
||||
- SERVER_SLOTS=6
|
||||
- SERVER_IP=0.0.0.0
|
||||
volumes:
|
||||
- enshrouded-persistent-data:/home/steam/enshrouded/savegame
|
||||
- SERVER_SLOT_COUNT=6
|
||||
- UPDATE_CRON=0 3 * * *
|
||||
- PUID=4711
|
||||
- PGID=4711
|
||||
|
||||
volumes:
|
||||
enshrouded-persistent-data:
|
||||
@@ -47,11 +47,6 @@ services:
|
||||
volumes:
|
||||
- evolution-redis-data:/data
|
||||
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
evolution-instances:
|
||||
evolution-postgres-data:
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
excalidraw:
|
||||
restart: unless-stopped
|
||||
image: excalidraw/excalidraw:latest
|
||||
healthcheck:
|
||||
test:
|
||||
|
||||
@@ -124,15 +124,6 @@ services:
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 10
|
||||
networks:
|
||||
- backend
|
||||
- dokploy-network
|
||||
|
||||
networks:
|
||||
backend:
|
||||
driver: bridge
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
nuq_pg_data:
|
||||
@@ -0,0 +1,206 @@
|
||||
services:
|
||||
dashboard:
|
||||
image: fonoster/dashboard:0.15.15
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- 3030
|
||||
environment:
|
||||
- SERVER_DASHBOARD_SESSION_SECRET=${SERVER_DASHBOARD_SESSION_SECRET}
|
||||
|
||||
apiserver:
|
||||
image: fonoster/apiserver:0.15.15
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
- APISERVER_APP_URL=${APISERVER_APP_URL}
|
||||
- APISERVER_ASTERISK_ARI_PROXY_URL=${APISERVER_ASTERISK_ARI_PROXY_URL}
|
||||
- APISERVER_ASTERISK_ARI_SECRET=${APISERVER_ASTERISK_ARI_SECRET}
|
||||
- APISERVER_ASTERISK_ARI_USERNAME=${APISERVER_ASTERISK_ARI_USERNAME}
|
||||
- APISERVER_AUTHZ_SERVICE_ENABLED=${APISERVER_AUTHZ_SERVICE_ENABLED}
|
||||
- APISERVER_AUTHZ_SERVICE_HOST=${APISERVER_AUTHZ_SERVICE_HOST}
|
||||
- APISERVER_AUTHZ_SERVICE_METHODS=${APISERVER_AUTHZ_SERVICE_METHODS}
|
||||
- APISERVER_AUTHZ_SERVICE_PORT=${APISERVER_AUTHZ_SERVICE_PORT}
|
||||
- APISERVER_CLOAK_ENCRYPTION_KEY=${APISERVER_CLOAK_ENCRYPTION_KEY}
|
||||
- APISERVER_DATABASE_URL=${APISERVER_DATABASE_URL}
|
||||
- APISERVER_IDENTITY_DATABASE_URL=${APISERVER_IDENTITY_DATABASE_URL}
|
||||
- APISERVER_IDENTITY_ISSUER=${APISERVER_IDENTITY_ISSUER}
|
||||
- APISERVER_IDENTITY_CONTACT_VERIFICATION_REQUIRED=${APISERVER_IDENTITY_CONTACT_VERIFICATION_REQUIRED}
|
||||
- APISERVER_IDENTITY_TWO_FACTOR_AUTHENTICATION_REQUIRED=${APISERVER_IDENTITY_TWO_FACTOR_AUTHENTICATION_REQUIRED}
|
||||
- APISERVER_IDENTITY_WORKSPACE_INVITE_EXPIRATION=${APISERVER_IDENTITY_WORKSPACE_INVITE_EXPIRATION}
|
||||
- APISERVER_IDENTITY_WORKSPACE_INVITE_FAIL_URL=${APISERVER_IDENTITY_WORKSPACE_INVITE_FAIL_URL}
|
||||
- APISERVER_IDENTITY_WORKSPACE_INVITE_URL=${APISERVER_IDENTITY_WORKSPACE_INVITE_URL}
|
||||
- APISERVER_IDENTITY_OAUTH2_GITHUB_CLIENT_ID=${APISERVER_IDENTITY_OAUTH2_GITHUB_CLIENT_ID}
|
||||
- APISERVER_IDENTITY_OAUTH2_GITHUB_CLIENT_SECRET=${APISERVER_IDENTITY_OAUTH2_GITHUB_CLIENT_SECRET}
|
||||
- APISERVER_IDENTITY_OAUTH2_GITHUB_ENABLED=${APISERVER_IDENTITY_OAUTH2_GITHUB_ENABLED}
|
||||
- APISERVER_INFLUXDB_INIT_ORG=${APISERVER_INFLUXDB_INIT_ORG}
|
||||
- APISERVER_INFLUXDB_INIT_PASSWORD=${APISERVER_INFLUXDB_INIT_PASSWORD}
|
||||
- APISERVER_INFLUXDB_INIT_TOKEN=${APISERVER_INFLUXDB_INIT_TOKEN}
|
||||
- APISERVER_INFLUXDB_INIT_USERNAME=${APISERVER_INFLUXDB_INIT_USERNAME}
|
||||
- APISERVER_INFLUXDB_URL=${APISERVER_INFLUXDB_URL}
|
||||
- APISERVER_LOGS_FORMAT=${APISERVER_LOGS_FORMAT}
|
||||
- APISERVER_LOGS_LEVEL=${APISERVER_LOGS_LEVEL}
|
||||
- APISERVER_LOGS_TRANSPORT=${APISERVER_LOGS_TRANSPORT}
|
||||
- APISERVER_NATS_URL=${APISERVER_NATS_URL}
|
||||
- APISERVER_OWNER_EMAIL=${APISERVER_OWNER_EMAIL}
|
||||
- APISERVER_OWNER_NAME=${APISERVER_OWNER_NAME}
|
||||
- APISERVER_OWNER_PASSWORD=${APISERVER_OWNER_PASSWORD}
|
||||
- APISERVER_ROOT_DOMAIN=${APISERVER_ROOT_DOMAIN}
|
||||
- APISERVER_SMTP_AUTH_PASS=${APISERVER_SMTP_AUTH_PASS}
|
||||
- APISERVER_SMTP_AUTH_USER=${APISERVER_SMTP_AUTH_USER}
|
||||
- APISERVER_SMTP_HOST=${APISERVER_SMTP_HOST}
|
||||
- APISERVER_SMTP_PORT=${APISERVER_SMTP_PORT}
|
||||
- APISERVER_SMTP_SECURE=${APISERVER_SMTP_SECURE}
|
||||
- APISERVER_SMTP_SENDER=${APISERVER_SMTP_SENDER}
|
||||
- APISERVER_SIGNALING_SERVER=${APISERVER_SIGNALING_SERVER}
|
||||
- APISERVER_TWILIO_ACCOUNT_SID=${APISERVER_TWILIO_ACCOUNT_SID}
|
||||
- APISERVER_TWILIO_AUTH_TOKEN=${APISERVER_TWILIO_AUTH_TOKEN}
|
||||
- APISERVER_TWILIO_PHONE_NUMBER=${APISERVER_TWILIO_PHONE_NUMBER}
|
||||
expose:
|
||||
- 50051
|
||||
volumes:
|
||||
- ../files/config/keys:/opt/fonoster/keys:ro
|
||||
- ../files/config/integrations.json:/opt/fonoster/integrations.json:ro
|
||||
|
||||
autopilot:
|
||||
image: fonoster/autopilot:0.15.15
|
||||
restart: unless-stopped
|
||||
expose:
|
||||
- 50061
|
||||
environment:
|
||||
- AUTOPILOT_AWS_S3_ACCESS_KEY_ID=${AUTOPILOT_AWS_S3_ACCESS_KEY_ID}
|
||||
- AUTOPILOT_AWS_S3_ENDPOINT=${AUTOPILOT_AWS_S3_ENDPOINT}
|
||||
- AUTOPILOT_AWS_S3_REGION=${AUTOPILOT_AWS_S3_REGION}
|
||||
- AUTOPILOT_AWS_S3_SECRET_ACCESS_KEY=${AUTOPILOT_AWS_S3_SECRET_ACCESS_KEY}
|
||||
- AUTOPILOT_CONVERSATION_PROVIDER=${AUTOPILOT_CONVERSATION_PROVIDER}
|
||||
- AUTOPILOT_KNOWLEDGE_BASE_ENABLED=${AUTOPILOT_KNOWLEDGE_BASE_ENABLED}
|
||||
- AUTOPILOT_LOGS_FORMAT=${AUTOPILOT_LOGS_FORMAT}
|
||||
- AUTOPILOT_LOGS_LEVEL=${AUTOPILOT_LOGS_LEVEL}
|
||||
- AUTOPILOT_LOGS_TRANSPORT=${AUTOPILOT_LOGS_TRANSPORT}
|
||||
- AUTOPILOT_OPENAI_API_KEY=${AUTOPILOT_OPENAI_API_KEY}
|
||||
- AUTOPILOT_UNSTRUCTURED_API_KEY=${AUTOPILOT_UNSTRUCTURED_API_KEY}
|
||||
- AUTOPILOT_UNSTRUCTURED_API_URL=${AUTOPILOT_UNSTRUCTURED_API_URL}
|
||||
volumes:
|
||||
- ../files/config/integrations.json:/opt/fonoster/integrations.json:ro
|
||||
|
||||
routr:
|
||||
image: fonoster/routr-one:2.13.13
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
DATABASE_URL: ${ROUTR_DATABASE_URL}
|
||||
EXTERNAL_ADDRS: ${ROUTR_EXTERNAL_ADDRS}
|
||||
LOGS_FORMAT: ${ROUTR_LOGS_FORMAT}
|
||||
LOGS_LEVEL: ${ROUTR_LOGS_LEVEL}
|
||||
LOGS_TRANSPORT: ${ROUTR_LOGS_TRANSPORT}
|
||||
NATS_PUBLISHER_ENABLED: "true"
|
||||
NATS_PUBLISHER_URL: ${ROUTR_NATS_PUBLISHER_URL}
|
||||
RTPENGINE_HOST: ${ROUTR_RTPENGINE_HOST}
|
||||
START_INTERNAL_DB: "false"
|
||||
CONNECT_VERIFIER_PUBLIC_KEY_PATH: /etc/routr/keys/public.pem
|
||||
expose:
|
||||
- 51907
|
||||
- 51908
|
||||
ports:
|
||||
- 5060:5060/udp
|
||||
- 5060-5063:5060-5063
|
||||
volumes:
|
||||
- ../files/config/keys/public.pem:/etc/routr/keys/public.pem
|
||||
|
||||
# RTPEngine uses a range of ports to handle RTP traffic. Because exposing a large range of ports
|
||||
# is not possible in Docker, we need to use network_mode: host.
|
||||
#
|
||||
# Unfortunately, network_mode: host is not supported for Windows or Mac.
|
||||
# In those cases, we need to use a different approach.
|
||||
#
|
||||
# By default we are opening a small range of ports (10000-10100) to handle RTP traffic.
|
||||
# However, this is not enough for production environments.
|
||||
#
|
||||
# We recommend that when using Linux you use network_mode: host and remove the ports section.
|
||||
rtpengine:
|
||||
image: fonoster/rtpengine:0.3.17
|
||||
restart: unless-stopped
|
||||
platform: linux/x86_64
|
||||
ports:
|
||||
- 10000-10100:10000-10100/udp
|
||||
- 8080:8080
|
||||
environment:
|
||||
PORT_MAX: ${RTPENGINE_PORT_MAX}
|
||||
PORT_MIN: ${RTPENGINE_PORT_MIN}
|
||||
PUBLIC_IP: ${RTPENGINE_PUBLIC_IP}
|
||||
|
||||
asterisk:
|
||||
image: fonoster/asterisk:20
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
ARI_PROXY_URL: ${ASTERISK_ARI_PROXY_URL}
|
||||
ARI_SECRET: ${ASTERISK_ARI_SECRET}
|
||||
ARI_USERNAME: ${ASTERISK_ARI_USERNAME}
|
||||
CODECS: ${ASTERISK_CODECS}
|
||||
DTMF_MODE: ${ASTERISK_DTMF_MODE}
|
||||
RTP_PORT_END: ${ASTERISK_RTP_PORT_END}
|
||||
RTP_PORT_START: ${ASTERISK_RTP_PORT_START}
|
||||
SIPPROXY_HOST: ${ASTERISK_SIPPROXY_HOST}
|
||||
SIPPROXY_PORT: ${ASTERISK_SIPPROXY_PORT}
|
||||
SIPPROXY_SECRET: ${ASTERISK_SIPPROXY_SECRET}
|
||||
SIPPROXY_USERNAME: ${ASTERISK_SIPPROXY_USERNAME}
|
||||
expose:
|
||||
- 6060
|
||||
|
||||
postgres:
|
||||
image: postgres:16.10-alpine3.22
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
PGTZ: UTC
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
POSTGRES_USER: ${POSTGRES_USER}
|
||||
POSTGRES_DB: ${POSTGRES_DB}
|
||||
TZ: UTC
|
||||
expose:
|
||||
- 5432
|
||||
volumes:
|
||||
- db:/var/lib/postgresql/data
|
||||
- ../files/config/init-db.sh:/docker-entrypoint-initdb.d/init-db.sh:ro
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
|
||||
interval: 5s
|
||||
timeout: 5s
|
||||
retries: 10
|
||||
|
||||
influxdb:
|
||||
image: influxdb:2.7
|
||||
restart: unless-stopped
|
||||
expose:
|
||||
- 8086
|
||||
environment:
|
||||
DOCKER_INFLUXDB_INIT_ADMIN_TOKEN: ${INFLUXDB_INIT_TOKEN}
|
||||
DOCKER_INFLUXDB_INIT_BUCKET: calls
|
||||
DOCKER_INFLUXDB_INIT_MODE: setup
|
||||
DOCKER_INFLUXDB_INIT_ORG: ${INFLUXDB_INIT_ORG}
|
||||
DOCKER_INFLUXDB_INIT_PASSWORD: ${INFLUXDB_INIT_PASSWORD}
|
||||
DOCKER_INFLUXDB_INIT_USERNAME: ${INFLUXDB_INIT_USERNAME}
|
||||
volumes:
|
||||
- influxdb:/var/lib/influxdb2
|
||||
|
||||
nats:
|
||||
image: nats:2.11.8
|
||||
restart: unless-stopped
|
||||
expose:
|
||||
- 4222
|
||||
|
||||
envoy:
|
||||
image: envoyproxy/envoy:v1.35.0
|
||||
restart: unless-stopped
|
||||
command: ["/usr/local/bin/envoy", "-c", "/etc/envoy/envoy.yaml"]
|
||||
volumes:
|
||||
- ../files/config:/etc/envoy:ro
|
||||
ports:
|
||||
- 8449:8449
|
||||
|
||||
volumes:
|
||||
db:
|
||||
influxdb:
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
<svg width="248" height="51" viewBox="0 0 248 51" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M64.3464 41.1284V10.7243H85.4972V16.8908H71.5429V23.4427H83.0399V29.1381H71.5429V41.1284H64.3464Z" fill="#053204"/>
|
||||
<path d="M98.4011 41.5567C96.441 41.5567 94.6858 41.2426 93.1353 40.6146C91.6141 39.9865 90.3269 39.13 89.2737 38.0452C88.2206 36.9604 87.4161 35.7185 86.8603 34.3196C86.3337 32.9207 86.0704 31.4505 86.0704 29.9089C86.0704 28.3387 86.3337 26.8542 86.8603 25.4553C87.4161 24.0564 88.2206 22.8146 89.2737 21.7297C90.3269 20.6449 91.6141 19.7884 93.1353 19.1604C94.6858 18.5323 96.441 18.2183 98.4011 18.2183C100.361 18.2183 102.102 18.5323 103.623 19.1604C105.144 19.7884 106.431 20.6449 107.484 21.7297C108.538 22.8146 109.342 24.0564 109.898 25.4553C110.454 26.8542 110.732 28.3387 110.732 29.9089C110.732 31.4505 110.454 32.9207 109.898 34.3196C109.342 35.7185 108.538 36.9604 107.484 38.0452C106.431 39.13 105.144 39.9865 103.623 40.6146C102.102 41.2426 100.361 41.5567 98.4011 41.5567ZM93.2669 29.9089C93.2669 31.0794 93.4863 32.1071 93.9252 32.9921C94.3932 33.8771 95.0076 34.5623 95.7682 35.0476C96.5288 35.5329 97.4064 35.7756 98.4011 35.7756C99.3664 35.7756 100.229 35.5329 100.99 35.0476C101.78 34.5337 102.394 33.8343 102.833 32.9493C103.272 32.0643 103.491 31.0508 103.491 29.9089C103.491 28.7384 103.272 27.7106 102.833 26.8256C102.394 25.9406 101.78 25.2555 100.99 24.7702C100.229 24.2848 99.3664 24.0422 98.4011 24.0422C97.4064 24.0422 96.5288 24.2848 95.7682 24.7702C95.0076 25.2555 94.3932 25.9406 93.9252 26.8256C93.4863 27.7106 93.2669 28.7384 93.2669 29.9089Z" fill="#053204"/>
|
||||
<path d="M136.418 41.1284H129.397V28.4957C129.397 27.0112 129.104 25.9406 128.519 25.284C127.963 24.5989 127.217 24.2563 126.281 24.2563C125.638 24.2563 124.979 24.4276 124.306 24.7702C123.634 25.1127 123.019 25.5838 122.463 26.1833C121.937 26.7828 121.527 27.468 121.235 28.2388V41.1284H114.214V18.6465H120.533V22.4149C121.118 21.5299 121.849 20.7734 122.727 20.1453C123.604 19.5172 124.614 19.0462 125.755 18.7322C126.895 18.3896 128.139 18.2183 129.484 18.2183C130.976 18.2183 132.176 18.4895 133.083 19.0319C134.019 19.5458 134.721 20.2309 135.189 21.0874C135.686 21.9439 136.008 22.8717 136.154 23.8709C136.33 24.8415 136.418 25.7979 136.418 26.74V41.1284Z" fill="#053204"/>
|
||||
<path d="M152.053 41.5567C150.093 41.5567 148.338 41.2426 146.787 40.6146C145.266 39.9865 143.979 39.13 142.926 38.0452C141.872 36.9604 141.068 35.7185 140.512 34.3196C139.985 32.9207 139.722 31.4505 139.722 29.9089C139.722 28.3387 139.985 26.8542 140.512 25.4553C141.068 24.0564 141.872 22.8146 142.926 21.7297C143.979 20.6449 145.266 19.7884 146.787 19.1604C148.338 18.5323 150.093 18.2183 152.053 18.2183C154.013 18.2183 155.753 18.5323 157.275 19.1604C158.796 19.7884 160.083 20.6449 161.136 21.7297C162.189 22.8146 162.994 24.0564 163.55 25.4553C164.106 26.8542 164.383 28.3387 164.383 29.9089C164.383 31.4505 164.106 32.9207 163.55 34.3196C162.994 35.7185 162.189 36.9604 161.136 38.0452C160.083 39.13 158.796 39.9865 157.275 40.6146C155.753 41.2426 154.013 41.5567 152.053 41.5567ZM146.919 29.9089C146.919 31.0794 147.138 32.1071 147.577 32.9921C148.045 33.8771 148.659 34.5623 149.42 35.0476C150.181 35.5329 151.058 35.7756 152.053 35.7756C153.018 35.7756 153.881 35.5329 154.642 35.0476C155.432 34.5337 156.046 33.8343 156.485 32.9493C156.924 32.0643 157.143 31.0508 157.143 29.9089C157.143 28.7384 156.924 27.7106 156.485 26.8256C156.046 25.9406 155.432 25.2555 154.642 24.7702C153.881 24.2848 153.018 24.0422 152.053 24.0422C151.058 24.0422 150.181 24.2848 149.42 24.7702C148.659 25.2555 148.045 25.9406 147.577 26.8256C147.138 27.7106 146.919 28.7384 146.919 29.9089Z" fill="#053204"/>
|
||||
<path d="M176.686 41.5567C174.726 41.5567 172.809 41.2426 170.937 40.6146C169.065 39.9865 167.485 39.0587 166.198 37.8311L168.612 33.506C170.016 34.5052 171.376 35.2617 172.692 35.7756C174.038 36.2895 175.296 36.5464 176.466 36.5464C177.373 36.5464 178.075 36.4037 178.573 36.1182C179.07 35.8327 179.319 35.3902 179.319 34.7907C179.319 34.3624 179.172 34.0341 178.88 33.8057C178.587 33.5488 178.134 33.3204 177.519 33.1206C176.934 32.9207 176.203 32.7066 175.325 32.4782C173.57 31.9073 172.107 31.3506 170.937 30.8082C169.767 30.2657 168.889 29.6091 168.304 28.8383C167.719 28.039 167.427 27.0112 167.427 25.7551C167.427 24.242 167.807 22.9288 168.568 21.8154C169.357 20.6734 170.469 19.7884 171.903 19.1604C173.336 18.5323 175.047 18.2183 177.037 18.2183C178.616 18.2183 180.152 18.4609 181.644 18.9463C183.165 19.4316 184.584 20.2452 185.901 21.3872L183.18 25.6694C181.864 24.7844 180.693 24.1421 179.67 23.7424C178.646 23.3427 177.651 23.1429 176.686 23.1429C176.188 23.1429 175.735 23.2 175.325 23.3142C174.916 23.4284 174.579 23.6282 174.316 23.9137C174.082 24.1706 173.965 24.5132 173.965 24.9414C173.965 25.3697 174.082 25.7123 174.316 25.9692C174.579 26.2261 174.974 26.4545 175.501 26.6544C176.057 26.8256 176.744 27.0398 177.563 27.2967C179.465 27.8391 181.045 28.3958 182.302 28.9668C183.56 29.5092 184.497 30.1944 185.111 31.0223C185.754 31.8216 186.076 32.8922 186.076 34.234C186.076 36.5179 185.228 38.3164 183.531 39.6296C181.864 40.9143 179.582 41.5567 176.686 41.5567Z" fill="#053204"/>
|
||||
<path d="M204.426 39.9294C203.782 40.1863 203.066 40.4433 202.276 40.7002C201.515 40.9571 200.711 41.157 199.862 41.2997C199.014 41.471 198.18 41.5567 197.361 41.5567C196.191 41.5567 195.108 41.3711 194.114 41C193.148 40.6003 192.373 39.9579 191.788 39.0729C191.232 38.1879 190.954 37.0175 190.954 35.5615V23.8281H188.014V18.6465H190.954V11.4951H197.975V18.6465H202.671V23.8281H197.975V33.2062C197.975 33.9485 198.165 34.4909 198.546 34.8335C198.926 35.1475 199.409 35.3045 199.994 35.3045C200.491 35.3045 201.018 35.2189 201.574 35.0476C202.159 34.8763 202.656 34.6908 203.066 34.4909L204.426 39.9294Z" fill="#053204"/>
|
||||
<path d="M217.919 41.5567C215.959 41.5567 214.218 41.2569 212.697 40.6574C211.176 40.0293 209.874 39.1871 208.791 38.1308C207.738 37.0745 206.934 35.8612 206.378 34.4909C205.822 33.092 205.544 31.6361 205.544 30.123C205.544 27.9533 206.027 25.9835 206.992 24.2135C207.987 22.4149 209.406 20.9732 211.249 19.8884C213.092 18.775 215.315 18.2183 217.919 18.2183C220.522 18.2183 222.731 18.7607 224.545 19.8455C226.388 20.9304 227.792 22.3578 228.757 24.1278C229.723 25.8693 230.205 27.7677 230.205 29.8232C230.205 30.2229 230.176 30.6226 230.118 31.0223C230.088 31.3934 230.059 31.7217 230.03 32.0072H213.004C213.092 33.0064 213.37 33.8486 213.838 34.5337C214.335 35.2189 214.964 35.747 215.725 36.1182C216.485 36.4608 217.29 36.632 218.138 36.632C219.191 36.632 220.171 36.3894 221.078 35.9041C222.014 35.4187 222.658 34.7621 223.009 33.9342L228.977 35.5615C228.392 36.732 227.558 37.774 226.476 38.6875C225.422 39.5725 224.164 40.272 222.702 40.7859C221.268 41.2997 219.674 41.5567 217.919 41.5567ZM212.828 27.8106H222.833C222.716 26.8685 222.438 26.0548 222 25.3697C221.561 24.656 220.976 24.1135 220.244 23.7424C219.513 23.3427 218.709 23.1429 217.831 23.1429C216.924 23.1429 216.105 23.3427 215.374 23.7424C214.671 24.1135 214.101 24.656 213.662 25.3697C213.223 26.0548 212.945 26.8685 212.828 27.8106Z" fill="#053204"/>
|
||||
<path d="M248 24.5132C246.303 24.5132 244.767 24.7844 243.392 25.3268C242.018 25.8407 241.023 26.6115 240.409 27.6393V41.1284H233.388V18.6465H239.838V23.1857C240.628 21.6726 241.652 20.4879 242.91 19.6314C244.168 18.775 245.484 18.3325 246.859 18.3039C247.181 18.3039 247.415 18.3039 247.561 18.3039C247.737 18.3039 247.883 18.3182 248 18.3467V24.5132Z" fill="#053204"/>
|
||||
<path d="M48.2593 23.9108C48.2593 10.7052 37.4561 0 24.1297 0C10.8032 0 0 10.7052 0 23.9108V50.9404H22.556C36.7516 50.9404 48.2593 39.537 48.2593 25.4702V23.9108Z" fill="#39E19E"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 7.5 KiB |
@@ -0,0 +1,331 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
|
||||
# Critical: Set these to your host machine's IP address
|
||||
# For cloud deployments, use the public IP of your server
|
||||
# For local deployments, use your local machine's IP
|
||||
host_ip = "CHANGE_ME_TO_HOST_IP"
|
||||
|
||||
# Secrets - auto-generated strong passwords
|
||||
dashboard_session_secret = "${password:64}"
|
||||
ari_secret = "${password:32}"
|
||||
asterisk_ari_secret = "${password:32}"
|
||||
asterisk_sipproxy_secret = "${password:32}"
|
||||
postgres_password = "${password:32}"
|
||||
influxdb_password = "${password:32}"
|
||||
influxdb_token = "${password:64}"
|
||||
cloak_encryption_key = "${base64:32}"
|
||||
|
||||
# Database credentials
|
||||
postgres_user = "postgres"
|
||||
postgres_db_fonoster = "fonoster"
|
||||
postgres_db_identity = "fnidentity"
|
||||
postgres_db_routr = "routr"
|
||||
|
||||
# API Server Configuration
|
||||
api_server_app_url = "https://${main_domain}"
|
||||
api_server_root_domain = "${main_domain}"
|
||||
api_server_owner_email = "admin@${main_domain}"
|
||||
api_server_owner_name = "Admin User"
|
||||
api_server_owner_password = "${password:32}"
|
||||
|
||||
# InfluxDB Configuration
|
||||
influxdb_init_org = "fonoster"
|
||||
influxdb_init_username = "influxdb"
|
||||
|
||||
# Asterisk Configuration
|
||||
asterisk_codecs = "g722,ulaw,alaw"
|
||||
asterisk_dtmf_mode = "auto_info"
|
||||
asterisk_rtp_port_start = "10000"
|
||||
asterisk_rtp_port_end = "20000"
|
||||
asterisk_sipproxy_port = "5060"
|
||||
asterisk_sipproxy_username = "voice"
|
||||
|
||||
# RTP Engine Configuration
|
||||
rtpengine_port_min = "10000"
|
||||
rtpengine_port_max = "20000"
|
||||
|
||||
# Routr Configuration
|
||||
routr_nats_publisher_url = "nats://nats:4222"
|
||||
|
||||
# Logging Configuration
|
||||
logs_format = "json"
|
||||
logs_level = "verbose"
|
||||
logs_transport = "none"
|
||||
|
||||
[config]
|
||||
env = [
|
||||
# Dashboard
|
||||
"SERVER_DASHBOARD_SESSION_SECRET=${dashboard_session_secret}",
|
||||
|
||||
# API Server - Core
|
||||
"APISERVER_APP_URL=${api_server_app_url}",
|
||||
"APISERVER_ROOT_DOMAIN=${api_server_root_domain}",
|
||||
"APISERVER_OWNER_EMAIL=${api_server_owner_email}",
|
||||
"APISERVER_OWNER_NAME=${api_server_owner_name}",
|
||||
"APISERVER_OWNER_PASSWORD=${api_server_owner_password}",
|
||||
|
||||
# API Server - Database
|
||||
"APISERVER_DATABASE_URL=postgresql://${postgres_user}:${postgres_password}@postgres:5432/${postgres_db_fonoster}",
|
||||
"APISERVER_IDENTITY_DATABASE_URL=postgresql://${postgres_user}:${postgres_password}@postgres:5432/${postgres_db_identity}",
|
||||
|
||||
# API Server - Asterisk ARI
|
||||
"APISERVER_ASTERISK_ARI_PROXY_URL=http://asterisk:8088",
|
||||
"APISERVER_ASTERISK_ARI_SECRET=${ari_secret}",
|
||||
"APISERVER_ASTERISK_ARI_USERNAME=ari",
|
||||
|
||||
# API Server - Identity
|
||||
"APISERVER_IDENTITY_ISSUER=https://${api_server_root_domain}",
|
||||
"APISERVER_IDENTITY_CONTACT_VERIFICATION_REQUIRED=false",
|
||||
"APISERVER_IDENTITY_TWO_FACTOR_AUTHENTICATION_REQUIRED=false",
|
||||
"APISERVER_IDENTITY_WORKSPACE_INVITE_EXPIRATION=1d",
|
||||
"APISERVER_IDENTITY_WORKSPACE_INVITE_FAIL_URL=${api_server_app_url}/invite-fail",
|
||||
"APISERVER_IDENTITY_WORKSPACE_INVITE_URL=https://${api_server_root_domain}:8449/api/identity/accept-invite",
|
||||
"APISERVER_IDENTITY_OAUTH2_GITHUB_CLIENT_ID=",
|
||||
"APISERVER_IDENTITY_OAUTH2_GITHUB_CLIENT_SECRET=",
|
||||
"APISERVER_IDENTITY_OAUTH2_GITHUB_ENABLED=false",
|
||||
|
||||
# API Server - InfluxDB
|
||||
"APISERVER_INFLUXDB_URL=http://influxdb:8086",
|
||||
"APISERVER_INFLUXDB_INIT_ORG=${influxdb_init_org}",
|
||||
"APISERVER_INFLUXDB_INIT_USERNAME=${influxdb_init_username}",
|
||||
"APISERVER_INFLUXDB_INIT_PASSWORD=${influxdb_password}",
|
||||
"APISERVER_INFLUXDB_INIT_TOKEN=${influxdb_token}",
|
||||
|
||||
# API Server - NATS
|
||||
"APISERVER_NATS_URL=nats://nats:4222",
|
||||
|
||||
# API Server - Logging
|
||||
"APISERVER_LOGS_FORMAT=${logs_format}",
|
||||
"APISERVER_LOGS_LEVEL=${logs_level}",
|
||||
"APISERVER_LOGS_TRANSPORT=${logs_transport}",
|
||||
|
||||
# API Server - Encryption
|
||||
"APISERVER_CLOAK_ENCRYPTION_KEY=${cloak_encryption_key}",
|
||||
|
||||
# API Server - AuthZ Service (disabled by default)
|
||||
"APISERVER_AUTHZ_SERVICE_ENABLED=false",
|
||||
"APISERVER_AUTHZ_SERVICE_HOST=fnauthz",
|
||||
"APISERVER_AUTHZ_SERVICE_METHODS=/fonoster.calls.v1beta2.Calls/CreateCall,/fonoster.identity.v1beta2.Identity/CreateWorkspace",
|
||||
"APISERVER_AUTHZ_SERVICE_PORT=50071",
|
||||
|
||||
# API Server - SMTP (optional, configure if needed)
|
||||
"APISERVER_SMTP_HOST=your-smtp-server",
|
||||
"APISERVER_SMTP_PORT=587",
|
||||
"APISERVER_SMTP_SECURE=true",
|
||||
"APISERVER_SMTP_AUTH_USER=postmaster@${api_server_root_domain}",
|
||||
"APISERVER_SMTP_AUTH_PASS=secret",
|
||||
"APISERVER_SMTP_SENDER=Fonoster Info <info@${api_server_root_domain}>",
|
||||
|
||||
# API Server - Signaling
|
||||
"APISERVER_SIGNALING_SERVER=ws://${api_server_root_domain}:5062",
|
||||
|
||||
# API Server - Twilio (optional, configure if needed)
|
||||
"APISERVER_TWILIO_ACCOUNT_SID=",
|
||||
"APISERVER_TWILIO_AUTH_TOKEN=",
|
||||
"APISERVER_TWILIO_PHONE_NUMBER=",
|
||||
|
||||
# Autopilot
|
||||
"AUTOPILOT_CONVERSATION_PROVIDER=api",
|
||||
"AUTOPILOT_KNOWLEDGE_BASE_ENABLED=false",
|
||||
"AUTOPILOT_LOGS_FORMAT=${logs_transport}",
|
||||
"AUTOPILOT_LOGS_LEVEL=${logs_level}",
|
||||
"AUTOPILOT_LOGS_TRANSPORT=${logs_transport}",
|
||||
"AUTOPILOT_AWS_S3_ACCESS_KEY_ID=",
|
||||
"AUTOPILOT_AWS_S3_ENDPOINT=",
|
||||
"AUTOPILOT_AWS_S3_REGION=us-east-1",
|
||||
"AUTOPILOT_AWS_S3_SECRET_ACCESS_KEY=",
|
||||
"AUTOPILOT_OPENAI_API_KEY=",
|
||||
"AUTOPILOT_UNSTRUCTURED_API_KEY=",
|
||||
"AUTOPILOT_UNSTRUCTURED_API_URL=",
|
||||
|
||||
# Routr
|
||||
"ROUTR_DATABASE_URL=postgresql://${postgres_user}:${postgres_password}@postgres:5432/${postgres_db_routr}",
|
||||
"ROUTR_EXTERNAL_ADDRS=${host_ip}",
|
||||
"ROUTR_RTPENGINE_HOST=rtpengine",
|
||||
"ROUTR_NATS_PUBLISHER_URL=${routr_nats_publisher_url}",
|
||||
"ROUTR_LOGS_FORMAT=${logs_transport}",
|
||||
"ROUTR_LOGS_LEVEL=${logs_level}",
|
||||
"ROUTR_LOGS_TRANSPORT=${logs_transport}",
|
||||
|
||||
# Asterisk
|
||||
"ASTERISK_ARI_PROXY_URL=http://asterisk:8088",
|
||||
"ASTERISK_ARI_SECRET=${asterisk_ari_secret}",
|
||||
"ASTERISK_ARI_USERNAME=ari",
|
||||
"ASTERISK_CODECS=${asterisk_codecs}",
|
||||
"ASTERISK_DTMF_MODE=${asterisk_dtmf_mode}",
|
||||
"ASTERISK_RTP_PORT_START=${asterisk_rtp_port_start}",
|
||||
"ASTERISK_RTP_PORT_END=${asterisk_rtp_port_end}",
|
||||
"ASTERISK_SIPPROXY_HOST=${host_ip}",
|
||||
"ASTERISK_SIPPROXY_PORT=${asterisk_sipproxy_port}",
|
||||
"ASTERISK_SIPPROXY_SECRET=${asterisk_sipproxy_secret}",
|
||||
"ASTERISK_SIPPROXY_USERNAME=${asterisk_sipproxy_username}",
|
||||
|
||||
# RTP Engine
|
||||
"RTPENGINE_PUBLIC_IP=${host_ip}",
|
||||
"RTPENGINE_PORT_MIN=${rtpengine_port_min}",
|
||||
"RTPENGINE_PORT_MAX=${rtpengine_port_max}",
|
||||
|
||||
# InfluxDB
|
||||
"INFLUXDB_INIT_ORG=${influxdb_init_org}",
|
||||
"INFLUXDB_INIT_USERNAME=${influxdb_init_username}",
|
||||
"INFLUXDB_INIT_PASSWORD=${influxdb_password}",
|
||||
"INFLUXDB_INIT_TOKEN=${influxdb_token}",
|
||||
|
||||
# PostgreSQL
|
||||
"POSTGRES_USER=${postgres_user}",
|
||||
"POSTGRES_PASSWORD=${postgres_password}",
|
||||
"POSTGRES_DB=${postgres_db_fonoster}",
|
||||
]
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "dashboard"
|
||||
port = 3030
|
||||
host = "${main_domain}"
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "config/integrations.json"
|
||||
content = """
|
||||
{
|
||||
"integrations": []
|
||||
}
|
||||
"""
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "config/init-db.sh"
|
||||
content = """#!/bin/bash
|
||||
set -e
|
||||
|
||||
# Create additional databases (ignore error if they already exist)
|
||||
psql -v ON_ERROR_STOP=0 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
|
||||
CREATE DATABASE fnidentity;
|
||||
CREATE DATABASE routr;
|
||||
EOSQL
|
||||
|
||||
# Grant privileges
|
||||
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
|
||||
GRANT ALL PRIVILEGES ON DATABASE fnidentity TO $POSTGRES_USER;
|
||||
GRANT ALL PRIVILEGES ON DATABASE routr TO $POSTGRES_USER;
|
||||
EOSQL
|
||||
"""
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "config/keys/.gitkeep"
|
||||
content = "# Placeholder - RSA keys need to be generated manually after deployment"
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "config/keys/public.pem"
|
||||
content = """-----BEGIN PUBLIC KEY-----
|
||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyVvQZ8v3xq7p8BmXdS3C
|
||||
G9fk654bAbl30tsqq4h9d3N4F11hlue8bGAY=
|
||||
-----END PUBLIC KEY-----
|
||||
"""
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "config/envoy.yaml"
|
||||
content = """
|
||||
# Envoy configuration without tls for development and testing.
|
||||
# Do not use this configuration in production. Please check the docs for examples using tls.
|
||||
static_resources:
|
||||
listeners:
|
||||
- name: listener_http
|
||||
address:
|
||||
socket_address: { address: 0.0.0.0, port_value: 8449 }
|
||||
filter_chains:
|
||||
- filters:
|
||||
- name: envoy.filters.network.http_connection_manager
|
||||
typed_config:
|
||||
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
|
||||
codec_type: auto
|
||||
stat_prefix: ingress_http
|
||||
route_config:
|
||||
name: local_route
|
||||
virtual_hosts:
|
||||
- name: local_service
|
||||
domains: ["*"]
|
||||
routes:
|
||||
- match:
|
||||
prefix: "/api"
|
||||
route:
|
||||
cluster: apiserver-cluster-http
|
||||
timeout: 0s
|
||||
- match:
|
||||
prefix: "/"
|
||||
headers:
|
||||
- name: "content-type"
|
||||
safe_regex_match:
|
||||
google_re2: {}
|
||||
regex: "^(application/grpc|application/grpc-web-text)$"
|
||||
route:
|
||||
cluster: apiserver-cluster
|
||||
timeout: 0s
|
||||
max_stream_duration:
|
||||
grpc_timeout_header_max: 0s
|
||||
- match:
|
||||
prefix: "/"
|
||||
route:
|
||||
cluster: dashboard-cluster
|
||||
timeout: 0s
|
||||
cors:
|
||||
allow_origin_string_match:
|
||||
- prefix: "*"
|
||||
allow_methods: GET, PUT, DELETE, POST, OPTIONS
|
||||
allow_headers: token,accesskeyid,keep-alive,user-agent,cache-control,content-type,content-transfer-encoding,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeout
|
||||
max_age: "1728000"
|
||||
expose_headers: grpc-status,grpc-message
|
||||
http_filters:
|
||||
- name: envoy.filters.http.grpc_web
|
||||
typed_config:
|
||||
"@type": type.googleapis.com/envoy.extensions.filters.http.grpc_web.v3.GrpcWeb
|
||||
- name: envoy.filters.http.cors
|
||||
typed_config:
|
||||
"@type": type.googleapis.com/envoy.extensions.filters.http.cors.v3.Cors
|
||||
- name: envoy.filters.http.router
|
||||
typed_config:
|
||||
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
|
||||
|
||||
clusters:
|
||||
- name: apiserver-cluster
|
||||
type: logical_dns
|
||||
connect_timeout: 20s
|
||||
http2_protocol_options: {}
|
||||
lb_policy: round_robin
|
||||
load_assignment:
|
||||
cluster_name: apiserver-cluster
|
||||
endpoints:
|
||||
- lb_endpoints:
|
||||
- endpoint:
|
||||
address:
|
||||
socket_address:
|
||||
address: apiserver
|
||||
port_value: 50051
|
||||
|
||||
- name: apiserver-cluster-http
|
||||
type: logical_dns
|
||||
connect_timeout: 20s
|
||||
lb_policy: round_robin
|
||||
load_assignment:
|
||||
cluster_name: apiserver-cluster-http
|
||||
endpoints:
|
||||
- lb_endpoints:
|
||||
- endpoint:
|
||||
address:
|
||||
socket_address:
|
||||
address: apiserver
|
||||
port_value: 9876
|
||||
|
||||
- name: dashboard-cluster
|
||||
type: logical_dns
|
||||
connect_timeout: 20s
|
||||
lb_policy: round_robin
|
||||
load_assignment:
|
||||
cluster_name: dashboard-cluster
|
||||
endpoints:
|
||||
- lb_endpoints:
|
||||
- endpoint:
|
||||
address:
|
||||
socket_address:
|
||||
address: dashboard
|
||||
port_value: 3030
|
||||
"""
|
||||
|
||||
@@ -20,7 +20,3 @@ services:
|
||||
volumes:
|
||||
glpi-mysql-data:
|
||||
glpi-www-data:
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
@@ -36,9 +36,5 @@ services:
|
||||
volumes:
|
||||
- pg_hi-events_data:/var/lib/postgresql/data
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
pg_hi-events_data:
|
||||
@@ -96,10 +96,6 @@ services:
|
||||
]
|
||||
restart: always
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
immich-model-cache:
|
||||
immich-postgres:
|
||||
|
||||
@@ -3,7 +3,7 @@ services:
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
image: infisical/infisical:v0.90.1-postgres
|
||||
image: infisical/infisical:v0.135.0-postgres
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- ENCRYPTION_KEY
|
||||
@@ -20,7 +20,6 @@ services:
|
||||
command: npm run migration:latest
|
||||
pull_policy: always
|
||||
|
||||
|
||||
backend:
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
@@ -30,7 +29,7 @@ services:
|
||||
condition: service_started
|
||||
db-migration:
|
||||
condition: service_completed_successfully
|
||||
image: infisical/infisical:v0.90.1-postgres
|
||||
image: infisical/infisical:v0.135.0-postgres
|
||||
pull_policy: always
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
@@ -77,7 +76,5 @@ volumes:
|
||||
pg_infisical_data:
|
||||
redis_infisical_data:
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
|
||||
|
||||
@@ -47,10 +47,6 @@ services:
|
||||
invoiceshelf-postgres:
|
||||
condition: service_healthy
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
invoiceshelf-postgres-data:
|
||||
invoiceshelf-app-data:
|
||||
|
||||
@@ -40,10 +40,6 @@ services:
|
||||
start_period: 30s
|
||||
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
kimai-data:
|
||||
mysql-data:
|
||||
@@ -0,0 +1,23 @@
|
||||
services:
|
||||
kokoro-tts:
|
||||
build:
|
||||
context: https://github.com/remsky/Kokoro-FastAPI.git#master
|
||||
dockerfile: docker/cpu/Dockerfile
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- 8880
|
||||
environment:
|
||||
- MODEL_PATH=/app/models
|
||||
- DEVICE=${DEVICE:-cpu}
|
||||
- HOST=0.0.0.0
|
||||
- PORT=8880
|
||||
volumes:
|
||||
- kokoro-models:/app/models
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8880/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 60s
|
||||
volumes:
|
||||
kokoro-models:
|
||||
@@ -0,0 +1,12 @@
|
||||
<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="64" height="64" rx="12" fill="#3B82F6"/>
|
||||
<path d="M16 24C16 20.6863 18.6863 18 22 18H42C45.3137 18 48 20.6863 48 24V40C48 43.3137 45.3137 46 42 46H22C18.6863 46 16 43.3137 16 40V24Z" fill="white"/>
|
||||
<path d="M24 28H40V32H24V28Z" fill="#3B82F6"/>
|
||||
<path d="M24 34H36V38H24V34Z" fill="#3B82F6"/>
|
||||
<circle cx="32" cy="42" r="2" fill="#3B82F6"/>
|
||||
<path d="M20 22L44 22" stroke="#3B82F6" stroke-width="2" stroke-linecap="round"/>
|
||||
<path d="M20 26L44 26" stroke="#3B82F6" stroke-width="2" stroke-linecap="round"/>
|
||||
<path d="M20 30L44 30" stroke="#3B82F6" stroke-width="2" stroke-linecap="round"/>
|
||||
<path d="M20 34L44 34" stroke="#3B82F6" stroke-width="2" stroke-linecap="round"/>
|
||||
<path d="M20 38L44 38" stroke="#3B82F6" stroke-width="2" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 885 B |
@@ -0,0 +1,72 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
device = "cpu"
|
||||
|
||||
[config]
|
||||
env = [
|
||||
"DEVICE=${device}",
|
||||
"MODEL_PATH=/app/models",
|
||||
"HOST=0.0.0.0",
|
||||
"PORT=8880",
|
||||
"PYTHONUNBUFFERED=1",
|
||||
"UV_SYSTEM_PYTHON=1"
|
||||
]
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "kokoro-tts"
|
||||
port = 8880
|
||||
host = "${main_domain}"
|
||||
path = "/"
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "README.md"
|
||||
content = """# Kokoro TTS FastAPI
|
||||
|
||||
This template provides a Dockerized FastAPI wrapper for the Kokoro-82M text-to-speech model.
|
||||
|
||||
## Features
|
||||
|
||||
- Multi-language support (English, Japanese, Chinese)
|
||||
- OpenAI-compatible speech endpoint
|
||||
- CPU and GPU support
|
||||
- Web interface for monitoring
|
||||
- RESTful API with comprehensive documentation
|
||||
- Streaming audio generation
|
||||
- Word-level timestamps and phonemes
|
||||
|
||||
## Usage
|
||||
|
||||
- **Web Interface**: Access the web UI at `https://${main_domain}/web`
|
||||
- **API Documentation**: Available at `https://${main_domain}/docs`
|
||||
- **Health Check**: Monitor service health at `https://${main_domain}/health`
|
||||
|
||||
## Configuration
|
||||
|
||||
The service runs on port 8880 and supports both CPU and GPU inference.
|
||||
For GPU support, ensure your Dokploy instance has NVIDIA GPU support enabled.
|
||||
|
||||
## API Endpoints
|
||||
|
||||
- `POST /v1/audio/speech` - Generate speech from text (OpenAI compatible)
|
||||
- `POST /dev/captioned_speech` - Generate speech with timestamps
|
||||
- `POST /dev/phonemize` - Convert text to phonemes
|
||||
- `POST /dev/generate_from_phonemes` - Generate audio from phonemes
|
||||
- `GET /health` - Health check endpoint
|
||||
- `GET /docs` - Interactive API documentation
|
||||
- `GET /web` - Web interface
|
||||
|
||||
## Model Information
|
||||
|
||||
- Model: Kokoro-82M
|
||||
- License: Apache-2.0
|
||||
- Repository: https://github.com/remsky/Kokoro-FastAPI
|
||||
- HuggingFace Model: https://huggingface.co/hexgrad/Kokoro-82M
|
||||
|
||||
## Notes
|
||||
|
||||
- This template builds the image from source during deployment
|
||||
- Uses CPU-optimized Dockerfile by default
|
||||
- Initial build may take several minutes due to model download
|
||||
- Ensure sufficient disk space for model storage
|
||||
- For GPU support, change dockerfile path to `docker/gpu/Dockerfile` in docker-compose.yml
|
||||
"""
|
||||
@@ -7,7 +7,7 @@ services:
|
||||
environment:
|
||||
DB_FILENAME: "/var/lib/kutt/data.sqlite"
|
||||
JWT_SECRET: ${JWT_SECRET}
|
||||
DEFAULT_DOMAIN: ${DOMAIN}
|
||||
DEFAULT_DOMAIN: ${DEFAULT_DOMAIN}
|
||||
TRUST_PROXY: ${TRUST_PROXY}
|
||||
DISALLOW_ANONYMOUS_LINKS: ${DISALLOW_ANONYMOUS_LINKS}
|
||||
CUSTOM_DOMAIN_USE_HTTPS: ${CUSTOM_DOMAIN_USE_HTTPS}
|
||||
|
||||
@@ -0,0 +1,110 @@
|
||||
# LibreChat Docker Compose for Dokploy Template
|
||||
# Setting up authentication: "npm run create-user", refer to https://www.librechat.ai/docs/configuration/authentication
|
||||
|
||||
services:
|
||||
librechat:
|
||||
image: ghcr.io/danny-avila/librechat-dev:latest
|
||||
restart: always
|
||||
depends_on:
|
||||
- mongodb
|
||||
- rag_api
|
||||
environment:
|
||||
# Server Configuration
|
||||
- HOST=0.0.0.0
|
||||
- PORT=${PORT:-3080}
|
||||
# Domain Configuration
|
||||
- DOMAIN_CLIENT=${DOMAIN_CLIENT}
|
||||
- DOMAIN_SERVER=${DOMAIN_SERVER}
|
||||
# Database and Search Configuration
|
||||
- MONGO_URI=mongodb://mongodb:27017/LibreChat
|
||||
- MEILI_HOST=http://meilisearch:7700
|
||||
- SEARCH=true
|
||||
- NO_INDEX=true
|
||||
- MEILI_NO_ANALYTICS=true
|
||||
- MEILI_MASTER_KEY=${MEILI_MASTER_KEY}
|
||||
# Security & Sessions
|
||||
- JWT_SECRET=${JWT_SECRET}
|
||||
- JWT_REFRESH_SECRET=${JWT_REFRESH_SECRET}
|
||||
- CREDS_KEY=${CREDS_KEY}
|
||||
- CREDS_IV=${CREDS_IV}
|
||||
- RAG_PORT=${RAG_PORT:-8000}
|
||||
- RAG_API_URL=http://rag_api:${RAG_PORT:-8000}
|
||||
# API Keys and Secrets
|
||||
- OPENAI_API_KEY=${OPENAI_API_KEY}
|
||||
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
|
||||
- OPENROUTER_KEY=${OPENROUTER_KEY}
|
||||
- GOOGLE_KEY=${GOOGLE_KEY}
|
||||
- ENDPOINTS=google,openAI,assistants,azureOpenAI,anthropic
|
||||
# ... Additional Endpoints
|
||||
# UI
|
||||
- APP_TITLE=${APP_TITLE:-LibreChat}
|
||||
- CUSTOM_FOOTER=${CUSTOM_FOOTER:-Made with ❤️ by LibreChat}
|
||||
- ALLOW_EMAIL_LOGIN=${ALLOW_EMAIL_LOGIN:-true}
|
||||
- ALLOW_SOCIAL_LOGIN=${ALLOW_SOCIAL_LOGIN:-false}
|
||||
- ALLOW_REGISTRATION=${ALLOW_REGISTRATION:-false}
|
||||
volumes:
|
||||
- type: bind
|
||||
source: ../files/librechat.yaml
|
||||
target: /app/librechat.yaml
|
||||
- librechat_data:/app/client/public/images
|
||||
- librechat_data:/app/uploads
|
||||
- librechat_data:/app/logs
|
||||
|
||||
mongodb:
|
||||
image: mongo
|
||||
restart: always
|
||||
volumes:
|
||||
- mongo_data:/data/db
|
||||
command: mongod --noauth
|
||||
|
||||
meilisearch:
|
||||
image: getmeili/meilisearch:v1.12.3
|
||||
restart: always
|
||||
environment:
|
||||
- MEILI_HOST=http://meilisearch:7700
|
||||
- MEILI_NO_ANALYTICS=true
|
||||
- MEILI_MASTER_KEY=${MEILI_MASTER_KEY}
|
||||
volumes:
|
||||
- meili_data:/meili_data
|
||||
|
||||
vectordb:
|
||||
image: pgvector/pgvector:0.8.0-pg15-trixie
|
||||
environment:
|
||||
- POSTGRES_DB=${POSTGRES_DB:-mydatabase}
|
||||
- POSTGRES_USER=${POSTGRES_USER:-myuser}
|
||||
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-mypassword}
|
||||
restart: always
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
|
||||
rag_api:
|
||||
image: ghcr.io/danny-avila/librechat-rag-api-dev-lite:latest
|
||||
environment:
|
||||
- DB_HOST=vectordb
|
||||
- VECTOR_DB_TYPE=pgvector
|
||||
- POSTGRES_DB=${POSTGRES_DB:-mydatabase}
|
||||
- POSTGRES_USER=${POSTGRES_USER:-myuser}
|
||||
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-mypassword}
|
||||
- RAG_PORT=${RAG_PORT:-8000}
|
||||
- OPENAI_API_KEY=${OPENAI_API_KEY}
|
||||
- RAG_OPENAI_API_KEY=${RAG_OPENAI_API_KEY}
|
||||
- GOOGLE_KEY=${GOOGLE_KEY}
|
||||
- RAG_GOOGLE_API_KEY=${RAG_GOOGLE_API_KEY}
|
||||
- JWT_SECRET=${JWT_SECRET}
|
||||
- COLLECTION_NAME=${COLLECTION_NAME:-librechat_collection}
|
||||
- CHUNK_SIZE=${CHUNK_SIZE:-1500}
|
||||
- CHUNK_OVERLAP=${CHUNK_OVERLAP:-100}
|
||||
- EMBEDDINGS_PROVIDER=${EMBEDDINGS_PROVIDER:-openai}
|
||||
- EMBEDDINGS_MODEL=${EMBEDDINGS_MODEL:-text-embedding-3-small}
|
||||
- DEBUG_RAG_API=false
|
||||
- DEBUG_PGVECTOR_QUERIES=false
|
||||
- CONSOLE_JSON=false
|
||||
restart: always
|
||||
depends_on:
|
||||
- vectordb
|
||||
|
||||
volumes:
|
||||
mongo_data:
|
||||
meili_data:
|
||||
postgres_data:
|
||||
librechat_data:
|
||||
|
After Width: | Height: | Size: 58 KiB |
@@ -0,0 +1,93 @@
|
||||
[variables]
|
||||
# Domain Configuration
|
||||
main_domain = "${domain}"
|
||||
|
||||
# Security & Authentication
|
||||
jwt_secret = "${password:64}"
|
||||
jwt_refresh_secret = "${password:64}"
|
||||
creds_key = "f34be427ebb29de8d88c107a71546019685ed8b241d8f2ed00c3df97ad2566f0"
|
||||
creds_iv = "e2341419ec3dd3d19b13a1a87fafcbfb"
|
||||
meili_master_key = "${password:32}"
|
||||
|
||||
# Database Configuration
|
||||
mongo_password = "${password:16}"
|
||||
postgresql_password = "${password:16}"
|
||||
|
||||
[config]
|
||||
version = "1.0.0"
|
||||
# Main service domain mapping
|
||||
[[config.domains]]
|
||||
serviceName = "librechat"
|
||||
port = 3080
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
# Basic Configuration
|
||||
HOST="0.0.0.0"
|
||||
PORT="3080"
|
||||
DOMAIN_CLIENT="https://${main_domain}"
|
||||
DOMAIN_SERVER="https://${main_domain}"
|
||||
|
||||
# Search Configuration
|
||||
MEILI_MASTER_KEY="${meili_master_key}"
|
||||
|
||||
# Security
|
||||
JWT_SECRET="${jwt_secret}"
|
||||
JWT_REFRESH_SECRET="${jwt_refresh_secret}"
|
||||
CREDS_KEY="${creds_key}"
|
||||
CREDS_IV="${creds_iv}"
|
||||
|
||||
# API Keys
|
||||
OPENAI_API_KEY=""
|
||||
ANTHROPIC_API_KEY=""
|
||||
GOOGLE_KEY=""
|
||||
OPENROUTER_KEY=""
|
||||
|
||||
# Database
|
||||
POSTGRES_DB="librechat_db"
|
||||
POSTGRES_USER="librechat_user"
|
||||
POSTGRES_PASSWORD="${postgresql_password}"
|
||||
|
||||
# Security & Sessions
|
||||
|
||||
# User Interface
|
||||
APP_TITLE="LibreChat"
|
||||
CUSTOM_FOOTER="Made with ❤️ by LibreChat"
|
||||
ALLOW_EMAIL_LOGIN="true"
|
||||
ALLOW_REGISTRATION="false"
|
||||
ALLOW_SOCIAL_LOGIN="false"
|
||||
|
||||
# RAG
|
||||
RAG_OPENAI_API_KEY=""
|
||||
RAG_GOOGLE_API_KEY=""
|
||||
EMBEDDINGS_PROVIDER="openai"
|
||||
EMBEDDINGS_MODEL="text-embedding-3-small"
|
||||
|
||||
CHUNK_SIZE=1500
|
||||
CHUNK_OVERLAP=100
|
||||
|
||||
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "librechat.yaml"
|
||||
content = """
|
||||
### librechat.yaml configs ###
|
||||
|
||||
version: 1.2.8
|
||||
cache: true
|
||||
endpoints:
|
||||
custom:
|
||||
- name: "OpenRouter"
|
||||
apiKey: "${OPENROUTER_KEY}"
|
||||
baseURL: "https://openrouter.ai/api/v1"
|
||||
models:
|
||||
default: ["meta-llama/llama-3.3-70b-instruct:free"]
|
||||
fetch: true
|
||||
titleConvo: true
|
||||
titleModel: "current_model"
|
||||
summarize: false
|
||||
summaryModel: "current_model"
|
||||
forcePrompt: false
|
||||
dropParams: ["stop"]
|
||||
modelDisplayLabel: "OpenRouter"
|
||||
"""
|
||||
@@ -46,9 +46,6 @@ services:
|
||||
volumes:
|
||||
- redis-data:/data
|
||||
|
||||
networks:
|
||||
libredesk:
|
||||
|
||||
volumes:
|
||||
postgres-data:
|
||||
redis-data:
|
||||
@@ -31,9 +31,6 @@ services:
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
logto-connectors:
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
# https://docs.mage.ai/getting-started/setup#docker-compose
|
||||
#
|
||||
# The default credentials are:
|
||||
# USERNAME: admin@admin.com
|
||||
# PASSWORD: admin
|
||||
|
||||
services:
|
||||
mage-ai:
|
||||
image: mageai/mageai:0.9.78
|
||||
command: mage start ${PROJECT_NAME}
|
||||
environment:
|
||||
USER_CODE_PATH: /home/src/${PROJECT_NAME}
|
||||
ENV: ${ENV}
|
||||
expose:
|
||||
- 6789
|
||||
volumes:
|
||||
- mageai_data:/home/src/
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-s", "-f", "-o", "/dev/null", "http://localhost:6789"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
volumes:
|
||||
mageai_data:
|
||||
@@ -0,0 +1,38 @@
|
||||
<!-- https://github.com/mage-ai/mage-ai/blob/14f0154629b33968535cf3e23bdf5fd1f4fa6957/docs/favicons/logo/m1.svg -->
|
||||
<svg width="1000" height="1000" viewBox="0 0 1000 1000" fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<path
|
||||
d="M458.083 24.2003C484.021 9.22512 515.978 9.22511 541.916 24.2003L891.096 225.8C917.034 240.775 933.012 268.45 933.012 298.401V701.599C933.012 731.55 917.034 759.225 891.096 774.2L541.916 975.8C515.978 990.775 484.021 990.775 458.083 975.8L108.903 774.2C82.9652 759.225 66.9868 731.55 66.9868 701.599V298.401C66.9868 268.45 82.9652 240.775 108.903 225.8L458.083 24.2003Z"
|
||||
fill="black" />
|
||||
<path fill-rule="evenodd" clip-rule="evenodd"
|
||||
d="M503.344 86.6308C498.131 85.8964 492.73 86.8879 488.024 89.6054L150.576 284.431L144.587 274.06L482.036 79.2339C493.152 72.8159 506.847 72.8159 517.964 79.2339L855.412 274.06C866.528 280.478 873.376 292.338 873.376 305.174V694.826C873.376 707.662 866.528 719.523 855.412 725.94L517.964 920.766C506.847 927.184 493.152 927.184 482.036 920.766L144.587 725.94C133.471 719.523 126.623 707.662 126.623 694.826V305.174C126.623 292.338 133.471 280.478 144.587 274.06L150.576 284.431C148.673 285.529 146.959 286.867 145.461 288.392L500 493.086L678.508 390.024L503.344 86.6308ZM522.347 95.5935L849.424 284.431C851.326 285.529 853.041 286.867 854.539 288.392L688.88 384.036L522.347 95.5935ZM138.599 317.15V694.826C138.599 697.022 138.9 699.176 139.473 701.236L305.132 605.593L138.599 317.15ZM145.461 711.607C146.959 713.133 148.673 714.471 150.576 715.569L477.652 904.407L311.12 615.964L145.461 711.607ZM496.655 913.369C501.868 914.104 507.269 913.112 511.976 910.395L849.424 715.569C851.326 714.471 853.041 713.133 854.539 711.607L500 506.914L321.491 609.976L496.655 913.369ZM861.4 682.85V305.174C861.4 302.978 861.099 300.824 860.527 298.764L694.868 394.407L861.4 682.85ZM511.976 500L684.496 400.395L857.016 699.209L511.976 500ZM142.983 300.791L488.024 500L315.503 599.605L142.983 300.791Z"
|
||||
fill="#313131" />
|
||||
<path fill-rule="evenodd" clip-rule="evenodd"
|
||||
d="M503.344 86.6308C498.131 85.8964 492.73 86.8879 488.024 89.6054L150.576 284.431L144.587 274.06L482.036 79.2339C493.152 72.8159 506.847 72.8159 517.964 79.2339L855.412 274.06C866.528 280.478 873.376 292.338 873.376 305.174V694.826C873.376 707.662 866.528 719.523 855.412 725.94L517.964 920.766C506.847 927.184 493.152 927.184 482.036 920.766L144.587 725.94C133.471 719.523 126.623 707.662 126.623 694.826V305.174C126.623 292.338 133.471 280.478 144.587 274.06L150.576 284.431C148.673 285.529 146.959 286.867 145.461 288.392L500 493.086L678.508 390.024L503.344 86.6308ZM522.347 95.5935L849.424 284.431C851.326 285.529 853.041 286.867 854.539 288.392L688.88 384.036L522.347 95.5935ZM138.599 317.15V694.826C138.599 697.022 138.9 699.176 139.473 701.236L305.132 605.593L138.599 317.15ZM145.461 711.607C146.959 713.133 148.673 714.471 150.576 715.569L477.652 904.407L311.12 615.964L145.461 711.607ZM496.655 913.369C501.868 914.104 507.269 913.112 511.976 910.395L849.424 715.569C851.326 714.471 853.041 713.133 854.539 711.607L500 506.914L321.491 609.976L496.655 913.369ZM861.4 682.85V305.174C861.4 302.978 861.099 300.824 860.527 298.764L694.868 394.407L861.4 682.85ZM511.976 500L684.496 400.395L857.016 699.209L511.976 500ZM142.983 300.791L488.024 500L315.503 599.605L142.983 300.791Z"
|
||||
fill="url(#paint0_linear_7285_95)" />
|
||||
<path fill-rule="evenodd" clip-rule="evenodd"
|
||||
d="M503.344 86.6308C498.131 85.8964 492.73 86.8879 488.024 89.6054L150.576 284.431L144.587 274.06L482.036 79.2339C493.152 72.8159 506.847 72.8159 517.964 79.2339L855.412 274.06C866.528 280.478 873.376 292.338 873.376 305.174V694.826C873.376 707.662 866.528 719.523 855.412 725.94L517.964 920.766C506.847 927.184 493.152 927.184 482.036 920.766L144.587 725.94C133.471 719.523 126.623 707.662 126.623 694.826V305.174C126.623 292.338 133.471 280.478 144.587 274.06L150.576 284.431C148.673 285.529 146.959 286.867 145.461 288.392L500 493.086L678.508 390.024L503.344 86.6308ZM522.347 95.5935L849.424 284.431C851.326 285.529 853.041 286.867 854.539 288.392L688.88 384.036L522.347 95.5935ZM138.599 317.15V694.826C138.599 697.022 138.9 699.176 139.473 701.236L305.132 605.593L138.599 317.15ZM145.461 711.607C146.959 713.133 148.673 714.471 150.576 715.569L477.652 904.407L311.12 615.964L145.461 711.607ZM496.655 913.369C501.868 914.104 507.269 913.112 511.976 910.395L849.424 715.569C851.326 714.471 853.041 713.133 854.539 711.607L500 506.914L321.491 609.976L496.655 913.369ZM861.4 682.85V305.174C861.4 302.978 861.099 300.824 860.527 298.764L694.868 394.407L861.4 682.85ZM511.976 500L684.496 400.395L857.016 699.209L511.976 500ZM142.983 300.791L488.024 500L315.503 599.605L142.983 300.791Z"
|
||||
fill="url(#paint1_linear_7285_95)" />
|
||||
<path
|
||||
d="M687.125 317.066L747.006 423.353L699.7 457.186L700.428 543.86V707.764L411.377 712.575H276.062L236.526 617.365L309.05 500.908L395.509 317.066H687.125Z"
|
||||
fill="black" />
|
||||
<path opacity="0.4"
|
||||
d="M578.227 368.959L657.132 368.96L510.123 650.724L431.219 650.724L578.227 368.959Z"
|
||||
fill="white" />
|
||||
<path
|
||||
d="M510.124 368.96L431.66 368.959L284.652 650.724H363.556L431.22 521.037V650.724H510.123V368.961L510.124 368.96Z"
|
||||
fill="white" />
|
||||
<path d="M578.228 368.96H657.131V650.724H578.228V368.96Z" fill="white" />
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear_7285_95" x1="500" y1="74.4204" x2="272.155" y2="925.748"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#00FB82" stop-opacity="0" />
|
||||
<stop offset="1" stop-color="#00FB82" />
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear_7285_95" x1="431.137" y1="500" x2="626.946" y2="191.018"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#1DE4FF" stop-opacity="0.1" />
|
||||
<stop offset="1" stop-color="#0A7BFF" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.8 KiB |
@@ -0,0 +1,11 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "mage-ai"
|
||||
port = 6789
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
PROJECT_NAME = "mage-ai"
|
||||
ENV = "production"
|
||||
@@ -0,0 +1,29 @@
|
||||
services:
|
||||
web:
|
||||
image: githubyumao/mcsmanager-web:latest
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- 23333
|
||||
volumes:
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
- mcsmanager-web-data:/opt/mcsmanager/web/data
|
||||
- mcsmanager-web-logs:/opt/mcsmanager/web/logs
|
||||
daemon:
|
||||
image: githubyumao/mcsmanager-daemon:latest
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- 24444
|
||||
environment:
|
||||
- MCSM_DOCKER_WORKSPACE_PATH=/opt/mcsmanager/daemon/data/InstanceData
|
||||
volumes:
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
- mcsmanager-daemon-data:/opt/mcsmanager/daemon/data
|
||||
- mcsmanager-daemon-logs:/opt/mcsmanager/daemon/logs
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
|
||||
volumes:
|
||||
mcsmanager-web-data:
|
||||
mcsmanager-web-logs:
|
||||
mcsmanager-daemon-data:
|
||||
mcsmanager-daemon-logs:
|
||||
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -0,0 +1,12 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
env = []
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "web"
|
||||
port = 23333
|
||||
host = "${main_domain}"
|
||||
|
||||
@@ -0,0 +1,134 @@
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
migrations:
|
||||
image: mediacms/mediacms:latest
|
||||
volumes:
|
||||
- mediacms_data:/home/mediacms.io/mediacms/media
|
||||
- mediacms_static:/home/mediacms.io/mediacms/staticfiles
|
||||
environment:
|
||||
ENABLE_UWSGI: 'no'
|
||||
ENABLE_NGINX: 'no'
|
||||
ENABLE_CELERY_SHORT: 'no'
|
||||
ENABLE_CELERY_LONG: 'no'
|
||||
ENABLE_CELERY_BEAT: 'no'
|
||||
ENABLE_MIGRATIONS: 'yes'
|
||||
ADMIN_USER: 'admin'
|
||||
ADMIN_EMAIL: 'admin@localhost'
|
||||
ADMIN_PASSWORD: ${ADMIN_PASSWORD}
|
||||
DATABASE_HOST: db
|
||||
DATABASE_PORT: 5432
|
||||
DATABASE_USER: mediacms
|
||||
DATABASE_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
DATABASE_NAME: mediacms
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
REDIS_HOST: redis
|
||||
REDIS_PORT: 6379
|
||||
command: "./deploy/docker/prestart.sh"
|
||||
restart: on-failure
|
||||
depends_on:
|
||||
redis:
|
||||
condition: service_healthy
|
||||
db:
|
||||
condition: service_healthy
|
||||
|
||||
web:
|
||||
image: mediacms/mediacms:latest
|
||||
deploy:
|
||||
replicas: 1
|
||||
ports:
|
||||
- 80
|
||||
volumes:
|
||||
- mediacms_data:/home/mediacms.io/mediacms/media
|
||||
- mediacms_static:/home/mediacms.io/mediacms/staticfiles
|
||||
environment:
|
||||
ENABLE_CELERY_BEAT: 'no'
|
||||
ENABLE_CELERY_SHORT: 'no'
|
||||
ENABLE_CELERY_LONG: 'no'
|
||||
ENABLE_MIGRATIONS: 'no'
|
||||
DATABASE_HOST: db
|
||||
DATABASE_PORT: 5432
|
||||
DATABASE_USER: mediacms
|
||||
DATABASE_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
DATABASE_NAME: mediacms
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
REDIS_HOST: redis
|
||||
REDIS_PORT: 6379
|
||||
depends_on:
|
||||
- migrations
|
||||
|
||||
celery_beat:
|
||||
image: mediacms/mediacms:latest
|
||||
volumes:
|
||||
- mediacms_data:/home/mediacms.io/mediacms/media
|
||||
- mediacms_static:/home/mediacms.io/mediacms/staticfiles
|
||||
environment:
|
||||
ENABLE_UWSGI: 'no'
|
||||
ENABLE_NGINX: 'no'
|
||||
ENABLE_CELERY_SHORT: 'no'
|
||||
ENABLE_CELERY_LONG: 'no'
|
||||
ENABLE_MIGRATIONS: 'no'
|
||||
DATABASE_HOST: db
|
||||
DATABASE_PORT: 5432
|
||||
DATABASE_USER: mediacms
|
||||
DATABASE_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
DATABASE_NAME: mediacms
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
REDIS_HOST: redis
|
||||
REDIS_PORT: 6379
|
||||
depends_on:
|
||||
- redis
|
||||
|
||||
celery_worker:
|
||||
image: mediacms/mediacms:latest
|
||||
deploy:
|
||||
replicas: 1
|
||||
volumes:
|
||||
- mediacms_data:/home/mediacms.io/mediacms/media
|
||||
- mediacms_static:/home/mediacms.io/mediacms/staticfiles
|
||||
environment:
|
||||
ENABLE_UWSGI: 'no'
|
||||
ENABLE_NGINX: 'no'
|
||||
ENABLE_CELERY_BEAT: 'no'
|
||||
ENABLE_MIGRATIONS: 'no'
|
||||
DATABASE_HOST: db
|
||||
DATABASE_PORT: 5432
|
||||
DATABASE_USER: mediacms
|
||||
DATABASE_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
DATABASE_NAME: mediacms
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
REDIS_HOST: redis
|
||||
REDIS_PORT: 6379
|
||||
depends_on:
|
||||
- migrations
|
||||
|
||||
db:
|
||||
image: postgres:17.2-alpine
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data/
|
||||
restart: always
|
||||
environment:
|
||||
POSTGRES_USER: mediacms
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
POSTGRES_DB: mediacms
|
||||
TZ: Europe/London
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
redis:
|
||||
image: "redis:alpine"
|
||||
restart: always
|
||||
healthcheck:
|
||||
test: ["CMD", "redis-cli","ping"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 3
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
||||
mediacms_data:
|
||||
mediacms_static:
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="200" height="64" viewBox="0 0 200 64" xmlns="http://www.w3.org/2000/svg">
|
||||
<text x="0" y="45" font-family="'Helvetica Neue', Helvetica, Arial, sans-serif" font-size="40" font-weight="200" fill="#FFFFFF">Media</text>
|
||||
<text x="105" y="45" font-family="'Helvetica Neue', Helvetica, Arial, sans-serif" font-size="40" font-weight="200" fill="#00C853">CMS</text>
|
||||
</svg>
|
||||
|
||||
|
After Width: | Height: | Size: 419 B |
@@ -0,0 +1,17 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
postgres_password = "${password}"
|
||||
admin_password = "${password}"
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "web"
|
||||
port = 80
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
POSTGRES_PASSWORD = "${postgres_password}"
|
||||
ADMIN_PASSWORD = "${admin_password}"
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
minio:
|
||||
# after RELEASE.2025-04-22T22-12-26Z, minio removed most of the admin UI, if you want to use the admin UI, uncomment the line below
|
||||
# image: minio/minio:RELEASE.2025-04-22T22-12-26Z
|
||||
# if you uncommented the line above, comment the line below
|
||||
image: minio/minio
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
# by default, the MinIO container will use a volume named minio-data
|
||||
# to store its data. This volume is created automatically by Docker.
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
mule:
|
||||
image: yogeshmulecraft/mulece-esb:latest
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "8081"
|
||||
environment:
|
||||
- MULE_VERSION=${MULE_VERSION:-4.9.0}
|
||||
- HTTP_PORT=${HTTP_PORT:-8081}
|
||||
- MULE_HOME=/opt/mule-standalone
|
||||
- MULE_BASE=/opt/mule-standalone
|
||||
- TZ=UTC
|
||||
- MULE_VERBOSE_EXCEPTIONS=true
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "curl -f http://localhost:${HTTP_PORT:-8081}/ || exit 0"]
|
||||
interval: 60s
|
||||
timeout: 20s
|
||||
retries: 5
|
||||
start_period: 120s
|
||||
|
||||
|
After Width: | Height: | Size: 44 KiB |
@@ -0,0 +1,23 @@
|
||||
|
||||
# MuleSoft ESB Deployment Configuration
|
||||
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
timezone = "UTC"
|
||||
mule_version = "4.9.0"
|
||||
http_port = "8081"
|
||||
|
||||
[config]
|
||||
[[config.domains]]
|
||||
serviceName = "mule"
|
||||
port = 8081
|
||||
host = "${main_domain}"
|
||||
path = "/"
|
||||
|
||||
[config.env]
|
||||
MULE_VERSION = "${mule_version}"
|
||||
HTTP_PORT = "${http_port}"
|
||||
MULE_HOME = "/opt/mule-standalone"
|
||||
MULE_BASE = "/opt/mule-standalone"
|
||||
TZ = "${timezone}"
|
||||
MULE_VERBOSE_EXCEPTIONS = "true"
|
||||
@@ -0,0 +1,16 @@
|
||||
services:
|
||||
mumble-server:
|
||||
image: mumblevoip/mumble-server:latest
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- 64738
|
||||
- 64738/udp
|
||||
volumes:
|
||||
- mumble-data:/data
|
||||
environment:
|
||||
- MUMBLE_SUPERUSER_PASSWORD=${SUPERUSER_PASSWORD}
|
||||
- MUMBLE_CONFIG_WELCOMETEXT=${WELCOME_TEXT}
|
||||
- MUMBLE_CONFIG_USERS=${MAX_USERS}
|
||||
|
||||
volumes:
|
||||
mumble-data:
|
||||
|
After Width: | Height: | Size: 2.3 KiB |
@@ -0,0 +1,12 @@
|
||||
[variables]
|
||||
superuser_password = "${password:32}"
|
||||
welcome_text = "Welcome to Mumble Server! Low-latency voice chat."
|
||||
max_users = "50"
|
||||
|
||||
[config]
|
||||
|
||||
[config.env]
|
||||
SUPERUSER_PASSWORD = "${superuser_password}"
|
||||
WELCOME_TEXT = "${welcome_text}"
|
||||
MAX_USERS = "${max_users}"
|
||||
|
||||
@@ -30,7 +30,3 @@ services:
|
||||
volumes:
|
||||
nextcloud_data:
|
||||
nextcloud_db_data:
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
@@ -0,0 +1,184 @@
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:15-alpine
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
POSTGRES_USER: oneuptime
|
||||
POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
|
||||
POSTGRES_DB: oneuptime
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U oneuptime"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
redis:
|
||||
image: redis:7-alpine
|
||||
restart: unless-stopped
|
||||
command: redis-server --requirepass ${REDIS_PASSWORD}
|
||||
environment:
|
||||
REDISCLI_AUTH: ${REDIS_PASSWORD}
|
||||
volumes:
|
||||
- redis_data:/data
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "redis-cli ping"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
clickhouse:
|
||||
image: clickhouse/clickhouse-server:23.8-alpine
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
CLICKHOUSE_DB: oneuptime
|
||||
CLICKHOUSE_USER: default
|
||||
CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD}
|
||||
CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: 1
|
||||
volumes:
|
||||
- clickhouse_data:/var/lib/clickhouse
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "clickhouse-client --query 'SELECT 1'"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
home:
|
||||
image: oneuptime/home:${ONEUPTIME_VERSION}
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
DATABASE_HOST: postgres
|
||||
DATABASE_PORT: 5432
|
||||
DATABASE_USERNAME: oneuptime
|
||||
DATABASE_PASSWORD: ${DATABASE_PASSWORD}
|
||||
DATABASE_NAME: oneuptime
|
||||
REDIS_HOST: redis
|
||||
REDIS_PORT: 6379
|
||||
REDIS_PASSWORD: ${REDIS_PASSWORD}
|
||||
CLICKHOUSE_HOST: clickhouse
|
||||
CLICKHOUSE_PORT: 8123
|
||||
CLICKHOUSE_USER: default
|
||||
CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD}
|
||||
CLICKHOUSE_DATABASE: oneuptime
|
||||
SERVER_URL: http://${ONEUPTIME_HOST}
|
||||
ENCRYPTION_SECRET: ${ENCRYPTION_SECRET}
|
||||
ONEUPTIME_SECRET: ${ONEUPTIME_SECRET}
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
clickhouse:
|
||||
condition: service_healthy
|
||||
|
||||
dashboard:
|
||||
image: oneuptime/dashboard:${ONEUPTIME_VERSION}
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
DATABASE_HOST: postgres
|
||||
DATABASE_PORT: 5432
|
||||
DATABASE_USERNAME: oneuptime
|
||||
DATABASE_PASSWORD: ${DATABASE_PASSWORD}
|
||||
DATABASE_NAME: oneuptime
|
||||
REDIS_HOST: redis
|
||||
REDIS_PORT: 6379
|
||||
REDIS_PASSWORD: ${REDIS_PASSWORD}
|
||||
SERVER_URL: http://${ONEUPTIME_HOST}
|
||||
ONEUPTIME_SECRET: ${ONEUPTIME_SECRET}
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
|
||||
accounts:
|
||||
image: oneuptime/accounts:${ONEUPTIME_VERSION}
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
DATABASE_HOST: postgres
|
||||
DATABASE_PORT: 5432
|
||||
DATABASE_USERNAME: oneuptime
|
||||
DATABASE_PASSWORD: ${DATABASE_PASSWORD}
|
||||
DATABASE_NAME: oneuptime
|
||||
REDIS_HOST: redis
|
||||
REDIS_PORT: 6379
|
||||
REDIS_PASSWORD: ${REDIS_PASSWORD}
|
||||
SERVER_URL: http://${ONEUPTIME_HOST}
|
||||
ONEUPTIME_SECRET: ${ONEUPTIME_SECRET}
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
|
||||
status-page:
|
||||
image: oneuptime/status-page:${ONEUPTIME_VERSION}
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
DATABASE_HOST: postgres
|
||||
DATABASE_PORT: 5432
|
||||
DATABASE_USERNAME: oneuptime
|
||||
DATABASE_PASSWORD: ${DATABASE_PASSWORD}
|
||||
DATABASE_NAME: oneuptime
|
||||
REDIS_HOST: redis
|
||||
REDIS_PORT: 6379
|
||||
REDIS_PASSWORD: ${REDIS_PASSWORD}
|
||||
SERVER_URL: http://${ONEUPTIME_HOST}
|
||||
ONEUPTIME_SECRET: ${ONEUPTIME_SECRET}
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
|
||||
app:
|
||||
image: oneuptime/app:${ONEUPTIME_VERSION}
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
DATABASE_HOST: postgres
|
||||
DATABASE_PORT: 5432
|
||||
DATABASE_USERNAME: oneuptime
|
||||
DATABASE_PASSWORD: ${DATABASE_PASSWORD}
|
||||
DATABASE_NAME: oneuptime
|
||||
REDIS_HOST: redis
|
||||
REDIS_PORT: 6379
|
||||
REDIS_PASSWORD: ${REDIS_PASSWORD}
|
||||
CLICKHOUSE_HOST: clickhouse
|
||||
CLICKHOUSE_PORT: 8123
|
||||
CLICKHOUSE_USER: default
|
||||
CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD}
|
||||
CLICKHOUSE_DATABASE: oneuptime
|
||||
SERVER_URL: http://${ONEUPTIME_HOST}
|
||||
ENCRYPTION_SECRET: ${ENCRYPTION_SECRET}
|
||||
ONEUPTIME_SECRET: ${ONEUPTIME_SECRET}
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
clickhouse:
|
||||
condition: service_healthy
|
||||
|
||||
probe:
|
||||
image: oneuptime/probe:${ONEUPTIME_VERSION}
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
DATABASE_HOST: postgres
|
||||
DATABASE_PORT: 5432
|
||||
DATABASE_USERNAME: oneuptime
|
||||
DATABASE_PASSWORD: ${DATABASE_PASSWORD}
|
||||
DATABASE_NAME: oneuptime
|
||||
SERVER_URL: http://${ONEUPTIME_HOST}
|
||||
ONEUPTIME_URL: http://${ONEUPTIME_HOST}
|
||||
ONEUPTIME_SECRET: ${ONEUPTIME_SECRET}
|
||||
PROBE_KEY: ${PROBE_KEY}
|
||||
PROBE_NAME: ${PROBE_NAME}
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
||||
redis_data:
|
||||
clickhouse_data:
|
||||
@@ -0,0 +1,25 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512">
|
||||
<defs>
|
||||
<linearGradient id="gradient" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#4F46E5;stop-opacity:1" />
|
||||
<stop offset="100%" style="stop-color:#7C3AED;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<!-- Background circle -->
|
||||
<circle cx="256" cy="256" r="240" fill="url(#gradient)"/>
|
||||
<!-- Uptime arrow/chart icon -->
|
||||
<g fill="white">
|
||||
<!-- Base line -->
|
||||
<rect x="120" y="340" width="272" height="12" rx="6"/>
|
||||
<!-- Vertical bars representing uptime -->
|
||||
<rect x="140" y="260" width="40" height="80" rx="8"/>
|
||||
<rect x="200" y="200" width="40" height="140" rx="8"/>
|
||||
<rect x="260" y="160" width="40" height="180" rx="8"/>
|
||||
<rect x="320" y="140" width="40" height="200" rx="8"/>
|
||||
<!-- Up arrow -->
|
||||
<path d="M 380 180 L 420 200 L 420 240 L 400 240 L 400 280 L 360 280 L 360 240 L 340 240 L 340 200 Z" opacity="0.9"/>
|
||||
</g>
|
||||
<!-- Check/tick mark overlay -->
|
||||
<circle cx="380" cy="150" r="45" fill="#10B981"/>
|
||||
<path d="M 360 150 L 375 165 L 400 140" stroke="white" stroke-width="8" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1,30 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
oneuptime_version = "release"
|
||||
database_password = "${password:32}"
|
||||
redis_password = "${password:32}"
|
||||
clickhouse_password = "${password:32}"
|
||||
encryption_secret = "${password:64}"
|
||||
oneuptime_secret = "${password:64}"
|
||||
probe_key = "${password:32}"
|
||||
probe_name = "Dokploy Probe"
|
||||
|
||||
|
||||
[config]
|
||||
env = [
|
||||
"ONEUPTIME_HOST=${main_domain}",
|
||||
"ONEUPTIME_VERSION=${oneuptime_version}",
|
||||
"DATABASE_PASSWORD=${database_password}",
|
||||
"REDIS_PASSWORD=${redis_password}",
|
||||
"CLICKHOUSE_PASSWORD=${clickhouse_password}",
|
||||
"ENCRYPTION_SECRET=${encryption_secret}",
|
||||
"ONEUPTIME_SECRET=${oneuptime_secret}",
|
||||
"PROBE_KEY=${probe_key}",
|
||||
"PROBE_NAME=${probe_name}",
|
||||
]
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "home"
|
||||
port = 3002
|
||||
host = "${main_domain}"
|
||||
@@ -0,0 +1,26 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
openinary:
|
||||
image: openinary/openinary:${IMAGE_TAG:-latest}
|
||||
pull_policy: always
|
||||
restart: unless-stopped
|
||||
expose:
|
||||
- 3000
|
||||
environment:
|
||||
NODE_ENV: production
|
||||
MODE: fullstack
|
||||
NEXT_PUBLIC_API_BASE_URL: ${NEXT_PUBLIC_API_BASE_URL:-/api}
|
||||
BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET}
|
||||
BETTER_AUTH_URL: ${BETTER_AUTH_URL}
|
||||
ALLOWED_ORIGIN: ${ALLOWED_ORIGIN:-http://${domain}}
|
||||
DOCKER_CONTAINER: "true"
|
||||
volumes:
|
||||
- cache-data:/app/apps/api/cache
|
||||
- public-files:/app/apps/api/public
|
||||
- db-data:/app/data
|
||||
- db-data:/app/web-standalone/data
|
||||
|
||||
volumes:
|
||||
cache-data:
|
||||
public-files:
|
||||
db-data:
|
||||
@@ -0,0 +1,18 @@
|
||||
<svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_58_6)">
|
||||
<path d="M192.271 500.089C140.241 500.089 114.225 500.082 93.2175 493.075C52.5263 479.5 20.5887 447.563 7.01375 406.871C0.00749722 385.864 8.16246e-06 359.848 1.27111e-05 307.818L1.77754e-05 249.889L156.139 249.889L43.5238 297.763L76.9262 319.935L186.19 277.744L134.899 345.614L171.786 355.713L228.426 292.236L232.644 363.725L270.219 363.725L274.503 292.236L331.099 355.713L367.964 345.614L316.739 277.765L425.937 319.935L459.34 297.763L346.746 249.889L500 249.889L500 307.818C500 359.848 499.993 385.864 492.987 406.871C479.411 447.563 447.474 479.5 406.783 493.075C385.775 500.082 359.759 500.089 307.729 500.089L192.271 500.089Z" fill="white"/>
|
||||
<rect y="131.18" width="500" height="233.853" rx="116.927" fill="white"/>
|
||||
<path d="M208.22 500H192.261C150.806 500 125.865 499.993 106.812 496.449L217.075 350.43L208.22 500Z" fill="#FC1F1C"/>
|
||||
<path d="M390.595 496.894C371.87 499.986 347.336 500.001 307.721 500.001H288.855L279.955 350.388L390.595 496.894Z" fill="#FC1F1C"/>
|
||||
<path d="M495.886 395.884C495.081 399.716 494.133 403.318 492.978 406.782C485.413 429.458 472.132 449.402 454.826 464.977L330.492 325.549L495.886 395.884Z" fill="#FC1F1C"/>
|
||||
<path d="M43.5623 463.491C27.0439 448.14 14.3367 428.751 7.00782 406.784C5.73871 402.979 4.68498 399.014 3.83398 394.755L166.543 325.574L43.5623 463.491Z" fill="#FC1F1C"/>
|
||||
<path d="M500.011 307.73C500.011 321.786 499.971 333.944 499.833 344.616L352.172 287.576H500.011V307.73Z" fill="#FC1F1C"/>
|
||||
<path d="M144.952 287.576L0.133167 343.508C0.00882632 333.103 0 321.301 0 307.73V287.576H144.952Z" fill="#FC1F1C"/>
|
||||
<path d="M307.729 0C359.759 0 385.775 0.00692083 406.782 7.0135C447.474 20.5891 479.411 52.526 492.986 93.2174C499.993 114.225 500 140.241 500 192.271V250.2H343.861L456.476 202.326L423.074 180.154L313.81 222.345L365.101 154.475L328.214 144.376L271.574 207.853L267.356 136.364H229.781L225.498 207.853L168.901 144.376L132.036 154.475L183.261 222.324L74.0634 180.154L40.6605 202.326L153.254 250.2H0V192.271C0 140.241 0.00692083 114.225 7.0135 93.2174C20.5891 52.526 52.526 20.5891 93.2174 7.0135C114.225 0.00692083 140.241 0 192.271 0H307.729Z" fill="#FC1F1C"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_58_6">
|
||||
<rect width="500" height="500" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.3 KiB |
@@ -0,0 +1,40 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
image_tag = "latest"
|
||||
better_auth_secret = "${password:64}"
|
||||
better_auth_url = "http://${main_domain}"
|
||||
allowed_origin = "http://${main_domain}"
|
||||
next_public_api_base_url = "/api"
|
||||
|
||||
[config]
|
||||
[[config.domains]]
|
||||
serviceName = "openinary"
|
||||
port = 3000
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
IMAGE_TAG = "${image_tag}"
|
||||
BETTER_AUTH_SECRET = "${better_auth_secret}"
|
||||
BETTER_AUTH_URL = "${better_auth_url}"
|
||||
ALLOWED_ORIGIN = "${allowed_origin}"
|
||||
NEXT_PUBLIC_API_BASE_URL = "${next_public_api_base_url}"
|
||||
|
||||
[[config.mounts]]
|
||||
serviceName = "openinary"
|
||||
volumeName = "cache-data"
|
||||
mountPath = "/app/apps/api/cache"
|
||||
|
||||
[[config.mounts]]
|
||||
serviceName = "openinary"
|
||||
volumeName = "public-files"
|
||||
mountPath = "/app/apps/api/public"
|
||||
|
||||
[[config.mounts]]
|
||||
serviceName = "openinary"
|
||||
volumeName = "db-data"
|
||||
mountPath = "/app/data"
|
||||
|
||||
[[config.mounts]]
|
||||
serviceName = "openinary"
|
||||
volumeName = "db-data"
|
||||
mountPath = "/app/web-standalone/data"
|
||||
@@ -1,8 +1,12 @@
|
||||
x-database: &x-database
|
||||
DATABASE_URL: postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@op-db:5432/${OPENPANEL_POSTGRES_DB}?schema=public
|
||||
DATABASE_URL_DIRECT: postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@op-db:5432/${OPENPANEL_POSTGRES_DB}?schema=public
|
||||
REDIS_URL: redis://default:${SERVICE_PASSWORD_REDIS}@op-kv:6379
|
||||
CLICKHOUSE_URL: ${OPENPANEL_CLICKHOUSE_URL:-http://op-ch:8123/openpanel}
|
||||
x-common: &x-common
|
||||
NODE_ENV: production
|
||||
SELF_HOSTED: "true"
|
||||
API_URL: ${API_URL}
|
||||
DASHBOARD_URL: ${DASHBOARD_URL}
|
||||
DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@op-db:5432/${POSTGRES_DB}?schema=public
|
||||
DATABASE_URL_DIRECT: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@op-db:5432/${POSTGRES_DB}?schema=public
|
||||
REDIS_URL: redis://default:${REDIS_PASSWORD}@op-kv:6379
|
||||
CLICKHOUSE_URL: http://op-ch:8123/openpanel
|
||||
|
||||
services:
|
||||
op-db:
|
||||
@@ -11,44 +15,46 @@ services:
|
||||
volumes:
|
||||
- op-db-data:/var/lib/postgresql/data
|
||||
healthcheck:
|
||||
test: [ 'CMD-SHELL', 'pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}' ]
|
||||
test: ['CMD-SHELL', 'pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}']
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
environment:
|
||||
- POSTGRES_DB=${OPENPANEL_POSTGRES_DB}
|
||||
- POSTGRES_USER=${SERVICE_USER_POSTGRES}
|
||||
- POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRES}
|
||||
- POSTGRES_DB=${POSTGRES_DB}
|
||||
- POSTGRES_USER=${POSTGRES_USER}
|
||||
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
|
||||
|
||||
op-kv:
|
||||
image: redis:7.2.5-alpine
|
||||
restart: always
|
||||
volumes:
|
||||
- op-kv-data:/data
|
||||
command: redis-server --requirepass ${SERVICE_PASSWORD_REDIS} --maxmemory-policy noeviction
|
||||
command: redis-server --requirepass ${REDIS_PASSWORD} --maxmemory-policy noeviction
|
||||
healthcheck:
|
||||
test: [CMD, redis-cli, -a, "${SERVICE_PASSWORD_REDIS}", ping]
|
||||
test: ['CMD', 'redis-cli', '-a', '${REDIS_PASSWORD}', 'ping']
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
op-ch:
|
||||
image: clickhouse/clickhouse-server:24.3.2-alpine
|
||||
image: clickhouse/clickhouse-server:25.10.2.65
|
||||
restart: always
|
||||
volumes:
|
||||
- op-ch-data:/var/lib/clickhouse
|
||||
- op-ch-logs:/var/log/clickhouse-server
|
||||
- ../files/clickhouse/clickhouse-config.xml:/etc/clickhouse-server/config.d/op-config.xml:ro
|
||||
- ../files/clickhouse/clickhouse-user-config.xml:/etc/clickhouse-server/users.d/op-user-config.xml:ro
|
||||
- ../files/clickhouse/init-db.sql:/docker-entrypoint-initdb.d/1_init-db.sql:ro
|
||||
- ../files/clickhouse_config:/etc/clickhouse-server/config.d
|
||||
- ../files/clickhouse_users:/etc/clickhouse-server/users.d
|
||||
- ../files/clickhouse_init:/docker-entrypoint-initdb.d
|
||||
environment:
|
||||
- CLICKHOUSE_SKIP_USER_SETUP=1
|
||||
healthcheck:
|
||||
test: [CMD-SHELL, 'clickhouse-client --query "SELECT 1" -d openpanel']
|
||||
test: ['CMD-SHELL', 'clickhouse-client --query "SELECT 1" -d openpanel']
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
op-api:
|
||||
image: lindesvard/openpanel-api:${OP_API_VERSION:-latest}
|
||||
image: lindesvard/openpanel-api:2.0.0
|
||||
restart: always
|
||||
command: >
|
||||
sh -c "
|
||||
@@ -57,39 +63,28 @@ services:
|
||||
sleep 1
|
||||
done
|
||||
echo 'PostgreSQL is ready'
|
||||
|
||||
|
||||
echo 'Waiting for ClickHouse to be ready...'
|
||||
while ! nc -z op-ch 8123; do
|
||||
sleep 1
|
||||
done
|
||||
echo 'ClickHouse is ready'
|
||||
|
||||
|
||||
echo 'Running migrations...'
|
||||
|
||||
echo '$DATABASE_URL'
|
||||
|
||||
|
||||
CI=true pnpm -r run migrate:deploy
|
||||
|
||||
|
||||
pnpm start
|
||||
"
|
||||
environment:
|
||||
# Common
|
||||
NODE_ENV: production
|
||||
NEXT_PUBLIC_SELF_HOSTED: true
|
||||
# URLs
|
||||
SERVICE_FQDN_OPAPI: /api
|
||||
# Set coolify FQDN domain
|
||||
NEXT_PUBLIC_API_URL: $SERVICE_FQDN_OPAPI
|
||||
NEXT_PUBLIC_DASHBOARD_URL: $SERVICE_FQDN_OPDASHBOARD
|
||||
# Others
|
||||
COOKIE_SECRET: ${SERVICE_BASE64_COOKIESECRET}
|
||||
ALLOW_REGISTRATION: ${OPENPANEL_ALLOW_REGISTRATION:-false}
|
||||
ALLOW_INVITATION: ${OPENPANEL_ALLOW_INVITATION:-true}
|
||||
EMAIL_SENDER: ${OPENPANEL_EMAIL_SENDER}
|
||||
COOKIE_SECRET: ${COOKIE_SECRET}
|
||||
ALLOW_REGISTRATION: ${ALLOW_REGISTRATION}
|
||||
ALLOW_INVITATION: ${ALLOW_INVITATION}
|
||||
EMAIL_SENDER: ${EMAIL_SENDER}
|
||||
RESEND_API_KEY: ${RESEND_API_KEY}
|
||||
<<: *x-database
|
||||
<<: *x-common
|
||||
healthcheck:
|
||||
test: [ "CMD-SHELL", "curl -f http://localhost:3000/healthcheck || exit 1" ]
|
||||
test: ['CMD-SHELL', 'curl -f http://localhost:3000/healthcheck || exit 1']
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
@@ -102,55 +97,35 @@ services:
|
||||
condition: service_healthy
|
||||
|
||||
op-dashboard:
|
||||
image: lindesvard/openpanel-dashboard:${OP_DASHBOARD_VERSION:-latest}
|
||||
image: lindesvard/openpanel-dashboard:2.0.0
|
||||
restart: always
|
||||
depends_on:
|
||||
op-api:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
# Common
|
||||
NODE_ENV: production
|
||||
NEXT_PUBLIC_SELF_HOSTED: true
|
||||
# URLs
|
||||
SERVICE_FQDN_OPDASHBOARD:
|
||||
# Set coolify FQDN domain
|
||||
NEXT_PUBLIC_API_URL: $SERVICE_FQDN_OPAPI
|
||||
NEXT_PUBLIC_DASHBOARD_URL: $SERVICE_FQDN_OPDASHBOARD
|
||||
<<: *x-database
|
||||
<<: *x-common
|
||||
healthcheck:
|
||||
test: [ 'CMD-SHELL', 'curl -f http://localhost:3000/api/healthcheck || exit 1' ]
|
||||
test: ['CMD-SHELL', 'curl -f http://localhost:3000/api/healthcheck || exit 1']
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
op-worker:
|
||||
image: lindesvard/openpanel-worker:${OP_WORKER_VERSION:-latest}
|
||||
image: lindesvard/openpanel-worker:2.0.0
|
||||
restart: always
|
||||
depends_on:
|
||||
op-api:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
# FQDN
|
||||
SERVICE_FQDN_OPBULLBOARD:
|
||||
# Common
|
||||
NODE_ENV=production:
|
||||
NEXT_PUBLIC_SELF_HOSTED: true
|
||||
# Set coolify FQDN domain
|
||||
NEXT_PUBLIC_API_URL: $SERVICE_FQDN_OPAPI
|
||||
<<: *x-database
|
||||
<<: *x-common
|
||||
healthcheck:
|
||||
test: [ 'CMD-SHELL', 'curl -f http://localhost:3000/healthcheck || exit 1' ]
|
||||
test: ['CMD-SHELL', 'curl -f http://localhost:3000/healthcheck || exit 1']
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
deploy:
|
||||
mode: replicated
|
||||
replicas: $OP_WORKER_REPLICAS
|
||||
|
||||
volumes:
|
||||
op-db-data:
|
||||
op-kv-data:
|
||||
op-ch-data:
|
||||
op-ch-logs:
|
||||
op-proxy-data:
|
||||
op-proxy-config:
|
||||
|
||||
@@ -1,82 +1,91 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
api_domain = "${domain}"
|
||||
db_password = "${password}"
|
||||
db_password = "${password:32}"
|
||||
cookie_secret = "${base64:32}"
|
||||
redis_password = "${password}"
|
||||
redis_password = "${password:32}"
|
||||
|
||||
[config]
|
||||
# ClickHouse config files - mounted as directories
|
||||
[[config.mounts]]
|
||||
filePath = "clickhouse/clickhouse-config.xml"
|
||||
filePath = "./clickhouse_config/op-config.xml"
|
||||
content = """
|
||||
<clickhouse>
|
||||
<logger>
|
||||
<level>warning</level>
|
||||
<console>true</console>
|
||||
</logger>
|
||||
<keep_alive_timeout>10</keep_alive_timeout>
|
||||
<!-- Stop all the unnecessary logging -->
|
||||
<query_thread_log remove="remove"/>
|
||||
<query_log remove="remove"/>
|
||||
<text_log remove="remove"/>
|
||||
<trace_log remove="remove"/>
|
||||
<metric_log remove="remove"/>
|
||||
<asynchronous_metric_log remove="remove"/>
|
||||
<session_log remove="remove"/>
|
||||
<part_log remove="remove"/>
|
||||
<listen_host>0.0.0.0</listen_host>
|
||||
<interserver_listen_host>0.0.0.0</interserver_listen_host>
|
||||
<interserver_http_host>opch</interserver_http_host>
|
||||
<!-- Disable cgroup memory observer -->
|
||||
<cgroups_memory_usage_observer_wait_time>0</cgroups_memory_usage_observer_wait_time>
|
||||
<!-- Not used anymore, but kept for backwards compatibility -->
|
||||
<macros>
|
||||
<shard>1</shard>
|
||||
<replica>replica1</replica>
|
||||
<cluster>openpanel_cluster</cluster>
|
||||
</macros>
|
||||
</clickhouse>
|
||||
<clickhouse>
|
||||
<logger>
|
||||
<level>warning</level>
|
||||
<console>true</console>
|
||||
</logger>
|
||||
<keep_alive_timeout>10</keep_alive_timeout>
|
||||
<!-- Stop all the unnecessary logging -->
|
||||
<query_thread_log remove="remove"/>
|
||||
<query_log remove="remove"/>
|
||||
<text_log remove="remove"/>
|
||||
<trace_log remove="remove"/>
|
||||
<metric_log remove="remove"/>
|
||||
<asynchronous_metric_log remove="remove"/>
|
||||
<session_log remove="remove"/>
|
||||
<part_log remove="remove"/>
|
||||
<listen_host>0.0.0.0</listen_host>
|
||||
<interserver_listen_host>0.0.0.0</interserver_listen_host>
|
||||
<interserver_http_host>opch</interserver_http_host>
|
||||
<!-- Disable cgroup memory observer -->
|
||||
<cgroups_memory_usage_observer_wait_time>0</cgroups_memory_usage_observer_wait_time>
|
||||
<!-- Not used anymore, but kept for backwards compatibility -->
|
||||
<macros>
|
||||
<shard>1</shard>
|
||||
<replica>replica1</replica>
|
||||
<cluster>openpanel_cluster</cluster>
|
||||
</macros>
|
||||
</clickhouse>
|
||||
"""
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "clickhouse/clickhouse-user-config.xml"
|
||||
filePath = "./clickhouse_users/op-user-config.xml"
|
||||
content = """
|
||||
<clickhouse>
|
||||
<profiles>
|
||||
<clickhouse>
|
||||
<profiles>
|
||||
<default>
|
||||
<log_queries>0</log_queries>
|
||||
<log_query_threads>0</log_query_threads>
|
||||
</default>
|
||||
</profiles>
|
||||
</clickhouse>
|
||||
</clickhouse>
|
||||
"""
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "clickhouse/init-db.sql"
|
||||
filePath = "./clickhouse_init/1_init-db.sql"
|
||||
content = """
|
||||
CREATE DATABASE IF NOT EXISTS openpanel;
|
||||
"""
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "op-dashboard"
|
||||
port = 3_000
|
||||
port = 3000
|
||||
host = "${main_domain}"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "op-api"
|
||||
port = 3_000
|
||||
host = "${api_domain}"
|
||||
port = 3000
|
||||
host = "${main_domain}"
|
||||
path = "/api"
|
||||
stripPath = true
|
||||
|
||||
[config.env]
|
||||
SERVICE_FQDN_OPDASHBOARD = "http://${main_domain}"
|
||||
SERVICE_FQDN_OPAPI = "http://${api_domain}"
|
||||
OPENPANEL_POSTGRES_DB = "openpanel-db"
|
||||
SERVICE_USER_POSTGRES = "openpanel"
|
||||
SERVICE_PASSWORD_POSTGRES = "${db_password}"
|
||||
SERVICE_PASSWORD_REDIS = "${redis_password}"
|
||||
SERVICE_BASE64_COOKIESECRET = "${cookie_secret}"
|
||||
OP_WORKER_REPLICAS = "1"
|
||||
DASHBOARD_URL = "http://${main_domain}"
|
||||
API_URL = "http://${main_domain}/api"
|
||||
|
||||
# Database configuration
|
||||
POSTGRES_DB = "openpanel"
|
||||
POSTGRES_USER = "openpanel"
|
||||
POSTGRES_PASSWORD = "${db_password}"
|
||||
REDIS_PASSWORD = "${redis_password}"
|
||||
|
||||
# Security
|
||||
COOKIE_SECRET = "${cookie_secret}"
|
||||
|
||||
# Registration settings
|
||||
ALLOW_REGISTRATION = "true"
|
||||
ALLOW_INVITATION = "true"
|
||||
|
||||
# Email configuration (optional - configure for email notifications)
|
||||
EMAIL_SENDER = ""
|
||||
RESEND_API_KEY = ""
|
||||
OPENPANEL_ALLOW_REGISTRATION = "true"
|
||||
OPENPANEL_ALLOW_INVITATION = "true"
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
parseable:
|
||||
image: parseable/parseable:v1.6.0
|
||||
command: parseable local-store
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- parseable-staging:/parseable/staging
|
||||
- parseable-data:/parseable/data
|
||||
environment:
|
||||
- P_ADDR=0.0.0.0:8000
|
||||
- P_USERNAME=${PARSEABLE_USERNAME}
|
||||
- P_PASSWORD=${PARSEABLE_PASSWORD}
|
||||
- P_STAGING_DIR=/parseable/staging
|
||||
- P_FS_DIR=/parseable/data
|
||||
ports:
|
||||
- 8000
|
||||
- 8001
|
||||
- 8002
|
||||
volumes:
|
||||
parseable-staging: {}
|
||||
parseable-data: {}
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
<svg width="273" height="42" viewBox="0 0 273 42" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M35.2135 23.2556L19.1407 39.3284C18.4321 40.037 18.9903 41.2523 19.9879 41.1732C24.2476 40.8406 28.4162 39.0473 31.6743 35.7892C34.9324 32.5311 36.7258 28.3624 37.0583 24.1028C37.1375 23.1012 35.9221 22.543 35.2135 23.2556Z" fill="#3A3A8C"/>
|
||||
<path d="M35.3482 14.717L35.3205 14.6576C34.3704 12.6544 31.7457 12.1675 30.182 13.7352L9.62384 34.2933C8.05615 35.861 8.54309 38.4817 10.5463 39.4318L10.6056 39.4595C11.8091 40.0257 13.2382 39.7525 14.1804 38.8143L34.7029 18.2918C35.6412 17.3535 35.9143 15.9204 35.3482 14.717Z" fill="#3A3A8C"/>
|
||||
<path d="M17.9213 5.96275C18.6299 5.25412 18.0717 4.03877 17.0741 4.11794C12.8144 4.45048 8.64576 6.24383 5.38766 9.50193C2.12956 12.76 0.336226 16.9287 0.0036852 21.1883C-0.0754911 22.1899 1.13985 22.7481 1.84848 22.0355L17.9213 5.96275Z" fill="#3A3A8C"/>
|
||||
<path d="M4.71905 24.6381L2.35962 26.9976C1.4095 27.9477 1.15613 29.3926 1.73016 30.608L1.75391 30.6634C2.69215 32.6547 5.32476 33.11 6.88058 31.5542L9.25586 29.1789C10.5108 27.9239 10.5108 25.8931 9.25586 24.6381C8.00092 23.3832 5.97004 23.3832 4.71509 24.6381H4.71905Z" fill="#3A3A8C"/>
|
||||
<path d="M16.7027 21.7362L27.4429 10.9959C28.9988 9.44012 28.5435 6.81146 26.5522 5.86927L26.4968 5.84551C25.2814 5.27149 23.8365 5.52089 22.8863 6.47496L12.1619 17.1994C10.907 18.4543 10.907 20.4852 12.1619 21.7402C13.4169 22.9951 15.4477 22.9951 16.7027 21.7402V21.7362Z" fill="#00A896"/>
|
||||
<path d="M49.2139 7.77294H55.4609V10.7262C57.4799 8.31529 60.3817 7.28204 63.331 7.28204C70.1204 7.28204 74.4514 12.9907 74.4514 20.0255C74.4514 27.0603 70.0214 32.8679 63.2321 32.8679C60.3778 32.8679 57.5749 31.7356 55.8014 29.5702V39.4593H49.21V7.77294H49.2139ZM67.7134 20.073C67.7134 16.1854 65.2036 13.3826 61.6129 13.3826C58.2677 13.3826 55.7578 16.1379 55.7578 20.073C55.7578 24.008 58.2163 26.7634 61.6129 26.7634C65.2036 26.7634 67.7134 23.9605 67.7134 20.073Z" fill="#3A3A8C"/>
|
||||
<mask id="mask0_694_4489" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="49" y="7" width="26" height="33">
|
||||
<path d="M49.2139 7.77294H55.4609V10.7262C57.4799 8.31529 60.3817 7.28204 63.331 7.28204C70.1204 7.28204 74.4514 12.9907 74.4514 20.0255C74.4514 27.0603 70.0214 32.8679 63.2321 32.8679C60.3778 32.8679 57.5749 31.7356 55.8014 29.5702V39.4593H49.21V7.77294H49.2139ZM67.7134 20.073C67.7134 16.1854 65.2036 13.3826 61.6129 13.3826C58.2677 13.3826 55.7578 16.1379 55.7578 20.073C55.7578 24.008 58.2163 26.7634 61.6129 26.7634C65.2036 26.7634 67.7134 23.9605 67.7134 20.073Z" fill="white"/>
|
||||
</mask>
|
||||
<g mask="url(#mask0_694_4489)">
|
||||
<path d="M281.79 -3.60468H42.8398V53.6556H281.79V-3.60468Z" fill="#3A3A8C"/>
|
||||
</g>
|
||||
<path d="M77.9941 20.073C77.9941 12.9867 82.3251 7.28204 89.1144 7.28204C91.9687 7.28204 95.017 8.41426 96.7906 10.7737V7.77294H103.236V32.373H96.7906V29.4197C95.0685 31.7831 91.9687 32.8639 89.1144 32.8639C82.3251 32.8639 77.9941 27.1553 77.9941 20.073ZM96.6401 20.073C96.6401 16.2329 94.1817 13.3826 90.7851 13.3826C87.3884 13.3826 84.6845 16.2369 84.6845 20.073C84.6845 23.9091 87.2419 26.7634 90.7851 26.7634C94.3282 26.7634 96.6401 24.008 96.6401 20.073Z" fill="#3A3A8C"/>
|
||||
<mask id="mask1_694_4489" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="77" y="7" width="27" height="26">
|
||||
<path d="M77.9941 20.073C77.9941 12.9867 82.3251 7.28204 89.1144 7.28204C91.9687 7.28204 95.017 8.41426 96.7906 10.7737V7.77294H103.236V32.373H96.7906V29.4197C95.0685 31.7831 91.9687 32.8639 89.1144 32.8639C82.3251 32.8639 77.9941 27.1553 77.9941 20.073ZM96.6401 20.073C96.6401 16.2329 94.1817 13.3826 90.7851 13.3826C87.3884 13.3826 84.6845 16.2369 84.6845 20.073C84.6845 23.9091 87.2419 26.7634 90.7851 26.7634C94.3282 26.7634 96.6401 24.008 96.6401 20.073Z" fill="white"/>
|
||||
</mask>
|
||||
<g mask="url(#mask1_694_4489)">
|
||||
<path d="M281.972 -3.64346H43.0225V53.6168H281.972V-3.64346Z" fill="#3A3A8C"/>
|
||||
</g>
|
||||
<path d="M108.252 7.77294H114.744V12.4958C115.433 10.4808 117.943 7.28204 123.355 7.28204V14.4673C117.646 14.4673 114.843 17.0761 114.843 22.9312V32.377H108.252V7.77294Z" fill="#3A3A8C"/>
|
||||
<mask id="mask2_694_4489" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="108" y="7" width="16" height="26">
|
||||
<path d="M108.252 7.7907H114.744V12.5136C115.433 10.4985 117.943 7.2998 123.355 7.2998V14.4851C117.646 14.4851 114.843 17.0939 114.843 22.949V32.3947H108.252V7.7907Z" fill="white"/>
|
||||
</mask>
|
||||
<g mask="url(#mask2_694_4489)">
|
||||
<path d="M281.972 -3.6254H43.0225V53.6349H281.972V-3.6254Z" fill="#3A3A8C"/>
|
||||
</g>
|
||||
<path d="M125.667 29.5187L128.03 24.4514C129.705 25.7301 132.017 27.0603 135.707 27.0603C137.231 27.0603 139.741 26.4704 139.741 24.9938C139.741 23.5171 137.627 23.1727 135.509 22.5829C130.639 21.3042 126.653 19.681 126.653 14.9582C126.653 9.93841 131.574 7.28204 136.197 7.28204C140.232 7.28204 142.789 8.26779 145.35 9.74047L143.137 14.6613C140.726 13.4815 138.462 12.9392 136.3 12.9392C134.776 12.9392 133.347 13.628 133.347 14.6613C133.347 16.0389 135.414 16.4823 137.678 16.9732C141.859 17.959 146.435 19.7761 146.435 24.7958C146.435 30.8489 140.283 32.8639 135.711 32.8639C130.445 32.8639 127.053 30.7974 125.675 29.5187H125.667Z" fill="#3A3A8C"/>
|
||||
<mask id="mask3_694_4489" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="125" y="7" width="22" height="26">
|
||||
<path d="M125.667 29.5187L128.03 24.4514C129.705 25.7301 132.017 27.0603 135.707 27.0603C137.231 27.0603 139.741 26.4704 139.741 24.9938C139.741 23.5171 137.627 23.1727 135.509 22.5829C130.639 21.3042 126.653 19.681 126.653 14.9582C126.653 9.93841 131.574 7.28204 136.197 7.28204C140.232 7.28204 142.789 8.26779 145.35 9.74047L143.137 14.6613C140.726 13.4815 138.462 12.9392 136.3 12.9392C134.776 12.9392 133.347 13.628 133.347 14.6613C133.347 16.0389 135.414 16.4823 137.678 16.9732C141.859 17.959 146.435 19.7761 146.435 24.7958C146.435 30.8489 140.283 32.8639 135.711 32.8639C130.445 32.8639 127.053 30.7974 125.675 29.5187H125.667Z" fill="white"/>
|
||||
</mask>
|
||||
<g mask="url(#mask3_694_4489)">
|
||||
<path d="M281.972 -3.64325H43.0225V53.617H281.972V-3.64325Z" fill="#3A3A8C"/>
|
||||
</g>
|
||||
<path d="M149.63 20.073C149.63 12.9867 155.141 7.28204 162.373 7.28204C169.064 7.28204 174.329 12.9907 174.329 19.974C174.329 21.1537 174.182 22.3374 174.182 22.3374H156.324C157.112 25.7301 159.915 27.3572 163.165 27.3572C165.525 27.3572 167.987 26.6684 169.808 25.4372L172.266 30.16C169.511 31.9811 166.312 32.8639 163.118 32.8639C155.932 32.8639 149.638 28.1885 149.638 20.073H149.63ZM168.129 17.959C167.639 14.8592 165.176 12.7927 162.175 12.7927C159.175 12.7927 156.863 14.8592 156.221 17.959H168.129Z" fill="#3A3A8C"/>
|
||||
<mask id="mask4_694_4489" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="149" y="7" width="26" height="26">
|
||||
<path d="M149.63 20.073C149.63 12.9867 155.141 7.28204 162.373 7.28204C169.064 7.28204 174.329 12.9907 174.329 19.974C174.329 21.1537 174.182 22.3374 174.182 22.3374H156.324C157.112 25.7301 159.915 27.3572 163.165 27.3572C165.525 27.3572 167.987 26.6684 169.808 25.4372L172.266 30.16C169.511 31.9811 166.312 32.8639 163.118 32.8639C155.932 32.8639 149.638 28.1885 149.638 20.073H149.63ZM168.129 17.959C167.639 14.8592 165.176 12.7927 162.175 12.7927C159.175 12.7927 156.863 14.8592 156.221 17.959H168.129Z" fill="white"/>
|
||||
</mask>
|
||||
<g mask="url(#mask4_694_4489)">
|
||||
<path d="M281.972 -3.64346H43.0225V53.6168H281.972V-3.64346Z" fill="#3A3A8C"/>
|
||||
</g>
|
||||
<path d="M177.915 20.073C177.915 12.9867 182.246 7.28204 189.035 7.28204C191.89 7.28204 194.938 8.41426 196.711 10.7737V7.77294H203.156V32.373H196.711V29.4197C194.989 31.7831 191.89 32.8639 189.035 32.8639C182.246 32.8639 177.915 27.1553 177.915 20.073ZM196.561 20.073C196.561 16.2329 194.103 13.3826 190.706 13.3826C187.309 13.3826 184.605 16.2369 184.605 20.073C184.605 23.9091 187.163 26.7634 190.706 26.7634C194.249 26.7634 196.561 24.008 196.561 20.073Z" fill="#3A3A8C"/>
|
||||
<mask id="mask5_694_4489" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="177" y="7" width="27" height="26">
|
||||
<path d="M177.915 20.073C177.915 12.9867 182.246 7.28204 189.035 7.28204C191.89 7.28204 194.938 8.41426 196.711 10.7737V7.77294H203.156V32.373H196.711V29.4197C194.989 31.7831 191.89 32.8639 189.035 32.8639C182.246 32.8639 177.915 27.1553 177.915 20.073ZM196.561 20.073C196.561 16.2329 194.103 13.3826 190.706 13.3826C187.309 13.3826 184.605 16.2369 184.605 20.073C184.605 23.9091 187.163 26.7634 190.706 26.7634C194.249 26.7634 196.561 24.008 196.561 20.073Z" fill="white"/>
|
||||
</mask>
|
||||
<g mask="url(#mask5_694_4489)">
|
||||
<path d="M281.972 -3.64325H43.0225V53.617H281.972V-3.64325Z" fill="#3A3A8C"/>
|
||||
</g>
|
||||
<path d="M214.424 29.4179V32.3712H208.177V0H214.768V10.5304C216.542 8.41644 219.345 7.28422 222.199 7.28422C228.988 7.28422 233.414 12.9928 233.414 20.0751C233.414 27.1575 229.083 32.8661 222.294 32.8661C219.341 32.8661 216.241 31.7853 214.424 29.4219V29.4179ZM226.724 20.0712C226.724 16.2311 224.166 13.3808 220.623 13.3808C217.08 13.3808 214.768 16.2351 214.768 20.0712C214.768 23.9073 217.278 26.7616 220.623 26.7616C224.166 26.7616 226.724 23.9587 226.724 20.0712Z" fill="#3A3A8C"/>
|
||||
<mask id="mask6_694_4489" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="208" y="0" width="26" height="33">
|
||||
<path d="M214.426 29.4179V32.3712H208.179V0H214.77V10.5304C216.544 8.41644 219.347 7.28422 222.201 7.28422C228.99 7.28422 233.416 12.9928 233.416 20.0751C233.416 27.1575 229.085 32.8661 222.296 32.8661C219.343 32.8661 216.243 31.7853 214.426 29.4219V29.4179ZM226.726 20.0712C226.726 16.2311 224.168 13.3808 220.625 13.3808C217.082 13.3808 214.77 16.2351 214.77 20.0712C214.77 23.9073 217.28 26.7616 220.625 26.7616C224.168 26.7616 226.726 23.9587 226.726 20.0712Z" fill="white"/>
|
||||
</mask>
|
||||
<g mask="url(#mask6_694_4489)">
|
||||
<path d="M281.974 -3.64355H43.0244V53.6167H281.974V-3.64355Z" fill="#3A3A8C"/>
|
||||
</g>
|
||||
<path d="M237.694 0H244.286V32.3712H237.694V0Z" fill="#3A3A8C"/>
|
||||
<mask id="mask7_694_4489" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="237" y="0" width="8" height="33">
|
||||
<path d="M237.696 0H244.288V32.3712H237.696V0Z" fill="white"/>
|
||||
</mask>
|
||||
<g mask="url(#mask7_694_4489)">
|
||||
<path d="M281.975 -3.64355H43.0254V53.6167H281.975V-3.64355Z" fill="#3A3A8C"/>
|
||||
</g>
|
||||
<path d="M247.663 19.8271C247.663 12.7408 253.174 7.03613 260.407 7.03613C267.097 7.03613 272.362 12.7447 272.362 19.7281C272.362 20.9078 272.216 22.0915 272.216 22.0915H254.357C255.145 25.4842 257.948 27.1113 261.194 27.1113C263.558 27.1113 266.016 26.4224 267.837 25.1912L270.296 29.9141C267.54 31.7352 264.342 32.618 261.143 32.618C253.958 32.618 247.663 27.9426 247.663 19.8271ZM266.163 17.7131C265.672 14.6133 263.209 12.5468 260.209 12.5468C257.208 12.5468 254.896 14.6133 254.255 17.7131H266.163Z" fill="#3A3A8C"/>
|
||||
<mask id="mask8_694_4489" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="247" y="7" width="26" height="26">
|
||||
<path d="M247.665 19.8266C247.665 12.7403 253.176 7.03564 260.408 7.03564C267.099 7.03564 272.364 12.7443 272.364 19.7276C272.364 20.9073 272.218 22.091 272.218 22.091H254.359C255.147 25.4837 257.95 27.1108 261.196 27.1108C263.56 27.1108 266.018 26.422 267.839 25.1908L270.298 29.9136C267.542 31.7347 264.344 32.6175 261.145 32.6175C253.96 32.6175 247.665 27.9421 247.665 19.8266ZM266.165 17.7126C265.674 14.6128 263.211 12.5463 260.211 12.5463C257.21 12.5463 254.898 14.6128 254.256 17.7126H266.165Z" fill="white"/>
|
||||
</mask>
|
||||
<g mask="url(#mask8_694_4489)">
|
||||
<path d="M281.805 -4.62891H42.8555V52.6314H281.805V-4.62891Z" fill="#3A3A8C"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 11 KiB |
@@ -0,0 +1,16 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
parseable_username = "${username}"
|
||||
parseable_password = "${password:32}"
|
||||
|
||||
[config]
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "parseable"
|
||||
port = 8000
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
PARSEABLE_USERNAME = "${parseable_username}"
|
||||
PARSEABLE_PASSWORD = "${parseable_password}"
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
# =============================================================================
|
||||
# PASSBOLT TEMPLATE - SETUP INSTRUCTIONS
|
||||
# =============================================================================
|
||||
#
|
||||
# After successful deployment, you need to create an admin user:
|
||||
#
|
||||
# 1. Go to your Dokploy dashboard
|
||||
# 2. Navigate to your Passbolt application
|
||||
# 3. Wait for both containers to be healthy - check the "Monitoring" tab
|
||||
# 4. Go to the "General" tab and click "Open Terminal" button
|
||||
# 5. In the terminal, run this command to create admin user:
|
||||
# su -s /bin/bash -c "/usr/share/php/passbolt/bin/cake passbolt register_user -u youremail@example.com -f FirstName -l LastName -r admin" www-data
|
||||
# 6. Replace youremail@example.com, FirstName, LastName with your actual details
|
||||
# 7. The command will output a registration link - copy and paste it in your browser to complete setup
|
||||
#
|
||||
# NOTE: If you change the domain after deployment, you will need to manually
|
||||
# update the PASSBOLT_APP_FULL_BASE_URL environment variable in the "Environment" tab.
|
||||
# =============================================================================
|
||||
|
||||
services:
|
||||
passbolt:
|
||||
image: passbolt/passbolt:latest-ce
|
||||
environment:
|
||||
APP_FULL_BASE_URL: ${PASSBOLT_APP_FULL_BASE_URL}
|
||||
DATASOURCES_DEFAULT_HOST: ${PASSBOLT_DB_HOST}
|
||||
DATASOURCES_DEFAULT_PORT: ${PASSBOLT_DB_PORT}
|
||||
DATASOURCES_DEFAULT_USERNAME: ${PASSBOLT_DB_USER}
|
||||
DATASOURCES_DEFAULT_PASSWORD: ${PASSBOLT_DB_PASSWORD}
|
||||
DATASOURCES_DEFAULT_DATABASE: ${PASSBOLT_DB_NAME}
|
||||
PASSBOLT_PLUGINS_JWT_AUTHENTICATION_ENABLED: ${PASSBOLT_PLUGINS_JWT_AUTHENTICATION_ENABLED}
|
||||
|
||||
EMAIL_DEFAULT_FROM: ${PASSBOLT_EMAIL_FROM}
|
||||
EMAIL_TRANSPORT_DEFAULT_HOST: ${PASSBOLT_EMAIL_HOST}
|
||||
EMAIL_TRANSPORT_DEFAULT_PORT: ${PASSBOLT_EMAIL_PORT}
|
||||
EMAIL_TRANSPORT_DEFAULT_USERNAME: ${PASSBOLT_EMAIL_USER}
|
||||
EMAIL_TRANSPORT_DEFAULT_PASSWORD: ${PASSBOLT_EMAIL_PASS}
|
||||
EMAIL_TRANSPORT_DEFAULT_TLS: ${PASSBOLT_EMAIL_TLS}
|
||||
|
||||
volumes:
|
||||
- gpg_volume:/etc/passbolt/gpg
|
||||
- jwt_volume:/etc/passbolt/jwt
|
||||
|
||||
command:
|
||||
- /usr/bin/wait-for.sh
|
||||
- "-t"
|
||||
- "0"
|
||||
- "${PASSBOLT_DB_HOST}:${PASSBOLT_DB_PORT}"
|
||||
- "--"
|
||||
- /docker-entrypoint.sh
|
||||
|
||||
depends_on:
|
||||
mariadb:
|
||||
condition: service_healthy
|
||||
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://127.0.0.1:80"]
|
||||
interval: 5s
|
||||
timeout: 20s
|
||||
retries: 10
|
||||
|
||||
mariadb:
|
||||
image: mariadb:11
|
||||
environment:
|
||||
MARIADB_ROOT_PASSWORD: ${PASSBOLT_DB_ROOT_PASSWORD}
|
||||
MARIADB_DATABASE: ${PASSBOLT_DB_NAME}
|
||||
MARIADB_USER: ${PASSBOLT_DB_USER}
|
||||
MARIADB_PASSWORD: ${PASSBOLT_DB_PASSWORD}
|
||||
volumes:
|
||||
- passbolt_mariadb_data:/var/lib/mysql
|
||||
healthcheck:
|
||||
test: ["CMD", "mariadb-admin", "ping", "-h", "localhost", "--silent"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
volumes:
|
||||
gpg_volume: {}
|
||||
jwt_volume: {}
|
||||
passbolt_mariadb_data: {}
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg width="800px" height="800px" viewBox="0 -11.5 256 256" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid">
|
||||
<g>
|
||||
<path d="M137.909029,-1.42108547e-14 L138.299882,0.00665661441 L139.385479,0.058225354 C144.798564,0.43000267 149.972107,2.50593255 154.184596,6.06768781 L155.014066,6.79978518 L155.800417,7.55667891 L248.925059,101.10948 C258.253112,110.478741 258.336122,125.115979 249.298721,134.753634 L248.668404,135.402879 L248.021048,136.024321 L151.471312,225.509442 C141.706629,234.563959 126.65745,234.838713 116.794145,226.278968 L116.114553,225.667442 L115.462423,225.035796 L61.5142946,170.873587 C60.7818881,170.138274 60.9019526,168.917458 61.7635739,168.338914 C73.1512822,160.692529 81.4377541,149.275295 85.0279509,136.172686 L85.3712573,134.856884 L85.6961343,133.473353 C85.8493708,132.820775 86.3779379,132.335554 87.020905,132.224445 L87.3027056,132.200334 L127.549722,132.200334 C128.359872,132.200334 129.033672,132.784118 129.173404,133.553966 L129.199992,133.850604 L129.199992,149.478435 C129.199992,154.222094 132.74898,158.145884 137.337533,158.681753 L137.892989,158.729631 L138.467796,158.746239 L158.270185,158.746239 C163.013844,158.746239 166.937634,155.197251 167.473503,150.608698 L167.521381,150.053242 L167.537989,149.478435 L167.537989,133.850604 C167.537989,133.040454 168.121772,132.366654 168.89162,132.226922 L169.188258,132.200334 L176.252894,132.200334 C181.084451,132.200334 185.033328,128.625645 185.564912,123.955751 L185.612136,123.390266 L185.627738,122.82549 L185.627738,112.549656 C185.627738,107.695532 182.030926,103.672904 177.379762,103.131755 L176.816725,103.083698 L176.252894,103.067772 L85.1619068,103.067772 C84.4705096,103.067772 83.8524089,102.636779 83.6133884,101.988011 C78.8618873,89.091124 69.4434357,78.2982105 57.238194,71.6262684 L56.0084501,70.9728855 L54.7717556,70.3523729 C53.8356353,69.8826736 53.5878579,68.6944707 54.1855354,67.8940896 L54.3903594,67.6667163 L119.791162,7.08249617 C124.188153,3.00527816 129.749747,0.573963824 135.555952,0.117913872 L136.661296,0.0393970067 L137.519706,0.00322737148 L137.909029,-1.42108547e-14 Z M28.6493897,93.4974121 C44.4647034,93.4974121 57.2987782,106.077272 57.2987782,121.61201 C57.2987782,137.146744 44.4647015,149.726608 28.6493897,149.726608 C12.8340773,149.726608 0,137.146744 0,121.61201 C0,106.077272 12.8340754,93.4974121 28.6493897,93.4974121 Z" fill="#D40000">
|
||||
</path>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
@@ -0,0 +1,41 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
db_password = "${password:32}"
|
||||
db_root_password = "${password:32}"
|
||||
email_host = "smtp.example.com"
|
||||
email_user = "noreply@example.com"
|
||||
email_pass = "${password:16}"
|
||||
|
||||
[config]
|
||||
[[config.domains]]
|
||||
serviceName = "passbolt"
|
||||
port = 80
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
PASSBOLT_APP_FULL_BASE_URL = "http://${main_domain}"
|
||||
PASSBOLT_DB_HOST = "mariadb"
|
||||
PASSBOLT_DB_PORT = "3306"
|
||||
PASSBOLT_DB_NAME = "passbolt"
|
||||
PASSBOLT_DB_USER = "passbolt"
|
||||
PASSBOLT_DB_PASSWORD = "${db_password}"
|
||||
PASSBOLT_DB_ROOT_PASSWORD = "${db_root_password}"
|
||||
PASSBOLT_PLUGINS_JWT_AUTHENTICATION_ENABLED = "true"
|
||||
PASSBOLT_EMAIL_FROM = "passbolt@${main_domain}"
|
||||
PASSBOLT_EMAIL_HOST = "${email_host}"
|
||||
PASSBOLT_EMAIL_PORT = "587"
|
||||
PASSBOLT_EMAIL_USER = "${email_user}"
|
||||
PASSBOLT_EMAIL_PASS = "${email_pass}"
|
||||
PASSBOLT_EMAIL_TLS = "true"
|
||||
|
||||
[[config.mounts]]
|
||||
volume = "gpg_volume"
|
||||
target = "/etc/passbolt/gpg"
|
||||
|
||||
[[config.mounts]]
|
||||
volume = "jwt_volume"
|
||||
target = "/etc/passbolt/jwt"
|
||||
|
||||
[[config.mounts]]
|
||||
volume = "passbolt_mariadb_data"
|
||||
target = "/var/lib/mysql"
|
||||
@@ -0,0 +1,187 @@
|
||||
name: peerdb-quickstart
|
||||
|
||||
x-minio-config: &minio-config
|
||||
PEERDB_CLICKHOUSE_AWS_CREDENTIALS_AWS_ACCESS_KEY_ID: ${MINIO_ROOT_USER}
|
||||
PEERDB_CLICKHOUSE_AWS_CREDENTIALS_AWS_SECRET_ACCESS_KEY: ${MINIO_ROOT_PASSWORD}
|
||||
MINIO_ROOT_USER: ${MINIO_ROOT_USER}
|
||||
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
|
||||
PEERDB_CLICKHOUSE_AWS_CREDENTIALS_AWS_REGION: ${PEERDB_CLICKHOUSE_AWS_REGION}
|
||||
PEERDB_CLICKHOUSE_AWS_CREDENTIALS_AWS_ENDPOINT_URL_S3: ${PEERDB_CLICKHOUSE_AWS_ENDPOINT_URL_S3}
|
||||
PEERDB_CLICKHOUSE_AWS_S3_BUCKET_NAME: ${PEERDB_CLICKHOUSE_AWS_S3_BUCKET_NAME}
|
||||
|
||||
x-catalog-config: &catalog-config
|
||||
PEERDB_CATALOG_HOST: ${PEERDB_CATALOG_HOST}
|
||||
PEERDB_CATALOG_PORT: ${PEERDB_CATALOG_PORT}
|
||||
PEERDB_CATALOG_USER: ${PEERDB_CATALOG_USER}
|
||||
PEERDB_CATALOG_PASSWORD: ${PEERDB_CATALOG_PASSWORD}
|
||||
PEERDB_CATALOG_DATABASE: ${PEERDB_CATALOG_DATABASE}
|
||||
|
||||
x-flow-worker-env: &flow-worker-env
|
||||
TEMPORAL_HOST_PORT: temporal:7233
|
||||
TEMPORAL_CLIENT_CERT:
|
||||
TEMPORAL_CLIENT_KEY:
|
||||
PEERDB_TEMPORAL_NAMESPACE: default
|
||||
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID:-}
|
||||
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY:-}
|
||||
AWS_REGION: ${AWS_REGION:-}
|
||||
AWS_ENDPOINT: ${AWS_ENDPOINT:-}
|
||||
|
||||
services:
|
||||
catalog:
|
||||
image: postgres:18-alpine@sha256:eca6fb2d91fda290eb8cfb8ba53dd0dcbf3508a08011e30adb039ea7c8e1e9f2
|
||||
command: -c config_file=/etc/postgresql.conf
|
||||
restart: unless-stopped
|
||||
expose:
|
||||
- 5432
|
||||
environment:
|
||||
PGUSER: ${PEERDB_CATALOG_USER}
|
||||
POSTGRES_PASSWORD: ${PEERDB_CATALOG_PASSWORD}
|
||||
POSTGRES_DB: ${PEERDB_CATALOG_DATABASE}
|
||||
POSTGRES_INITDB_ARGS: --locale=C.UTF-8
|
||||
volumes:
|
||||
- pgdata:/var/lib/postgresql/data
|
||||
- ../files/postgresql.conf:/etc/postgresql.conf
|
||||
- ../files/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
|
||||
healthcheck:
|
||||
test: ["CMD", "pg_isready", "-d", "${PEERDB_CATALOG_DATABASE}", "-U", "${PEERDB_CATALOG_USER}"]
|
||||
interval: 10s
|
||||
timeout: 30s
|
||||
retries: 5
|
||||
start_period: 60s
|
||||
|
||||
temporal:
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
catalog:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
DB: postgres12
|
||||
DB_PORT: ${PEERDB_CATALOG_PORT}
|
||||
POSTGRES_USER: ${PEERDB_CATALOG_USER}
|
||||
POSTGRES_PWD: ${PEERDB_CATALOG_PASSWORD}
|
||||
POSTGRES_SEEDS: catalog
|
||||
DYNAMIC_CONFIG_FILE_PATH: config/dynamicconfig/production-sql.yaml
|
||||
image: temporalio/auto-setup:1.29@sha256:5b3502a3b685f9eff1b925af90c57c9e3dbeccbef367cc28a2a9712c63379312
|
||||
expose:
|
||||
- 7233
|
||||
volumes:
|
||||
- ../files/temporal-dynamicconfig:/etc/temporal/config/dynamicconfig
|
||||
|
||||
temporal-admin-tools:
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
- temporal
|
||||
environment:
|
||||
TEMPORAL_ADDRESS: temporal:7233
|
||||
TEMPORAL_CLI_ADDRESS: temporal:7233
|
||||
TEMPORAL_CLI_SHOW_STACKS: 1
|
||||
image: temporalio/admin-tools:1.25.2-tctl-1.18.1-cli-1.1.1@sha256:da0c7a7982b571857173ab8f058e7f139b3054800abb4dcb100445d29a563ee8
|
||||
stdin_open: true
|
||||
tty: true
|
||||
entrypoint: ["sh", "/etc/temporal/entrypoint.sh"]
|
||||
healthcheck:
|
||||
test: ["CMD", "tctl", "workflow", "list"]
|
||||
interval: 10s
|
||||
timeout: 30s
|
||||
retries: 5
|
||||
volumes:
|
||||
- ../files/scripts/mirror-name-search.sh:/etc/temporal/entrypoint.sh
|
||||
|
||||
temporal-ui:
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
- temporal
|
||||
environment:
|
||||
TEMPORAL_ADDRESS: temporal:7233
|
||||
TEMPORAL_CORS_ORIGINS: http://localhost:3000
|
||||
TEMPORAL_CSRF_COOKIE_INSECURE: "true"
|
||||
image: temporalio/ui:2.43.3@sha256:31f0d8c1ed0bfc49c9c20ea9613ee9dd5c52f5f989bacb8a30210f847028e9cd
|
||||
expose:
|
||||
- 8080
|
||||
|
||||
flow-api:
|
||||
image: ghcr.io/peerdb-io/flow-api:stable-v0.35.5
|
||||
restart: unless-stopped
|
||||
expose:
|
||||
- 8112
|
||||
- 8113
|
||||
environment:
|
||||
<<: [*catalog-config, *flow-worker-env, *minio-config]
|
||||
PEERDB_ALLOWED_TARGETS: ${PEERDB_ALLOWED_TARGETS}
|
||||
depends_on:
|
||||
temporal-admin-tools:
|
||||
condition: service_healthy
|
||||
|
||||
flow-snapshot-worker:
|
||||
image: ghcr.io/peerdb-io/flow-snapshot-worker:stable-v0.35.5
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
<<: [*catalog-config, *flow-worker-env, *minio-config]
|
||||
depends_on:
|
||||
temporal-admin-tools:
|
||||
condition: service_healthy
|
||||
|
||||
flow-worker:
|
||||
image: ghcr.io/peerdb-io/flow-worker:stable-v0.35.5
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
<<: [*catalog-config, *flow-worker-env, *minio-config]
|
||||
depends_on:
|
||||
temporal-admin-tools:
|
||||
condition: service_healthy
|
||||
|
||||
peerdb:
|
||||
stop_signal: SIGINT
|
||||
image: ghcr.io/peerdb-io/peerdb-server:stable-v0.35.5
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
<<: *catalog-config
|
||||
PEERDB_PASSWORD: ${PEERDB_PASSWORD}
|
||||
PEERDB_FLOW_SERVER_ADDRESS: ${PEERDB_FLOW_SERVER_ADDRESS}
|
||||
RUST_LOG: info
|
||||
RUST_BACKTRACE: 1
|
||||
expose:
|
||||
- 9900
|
||||
depends_on:
|
||||
catalog:
|
||||
condition: service_healthy
|
||||
|
||||
peerdb-ui:
|
||||
image: ghcr.io/peerdb-io/peerdb-ui:stable-v0.35.5
|
||||
restart: unless-stopped
|
||||
expose:
|
||||
- 3000
|
||||
environment:
|
||||
<<: *catalog-config
|
||||
DATABASE_URL: ${DATABASE_URL}
|
||||
PEERDB_FLOW_SERVER_HTTP: ${PEERDB_FLOW_SERVER_HTTP}
|
||||
NEXTAUTH_SECRET: ${NEXTAUTH_SECRET}
|
||||
NEXTAUTH_URL: ${NEXTAUTH_URL}
|
||||
PEERDB_ALLOWED_TARGETS: ${PEERDB_ALLOWED_TARGETS}
|
||||
PEERDB_CLICKHOUSE_ALLOWED_DOMAINS: ${PEERDB_CLICKHOUSE_ALLOWED_DOMAINS}
|
||||
PEERDB_EXPERIMENTAL_ENABLE_SCRIPTING: ${PEERDB_EXPERIMENTAL_ENABLE_SCRIPTING}
|
||||
depends_on:
|
||||
- flow-api
|
||||
|
||||
minio:
|
||||
image: minio/minio:latest@sha256:14cea493d9a34af32f524e538b8346cf79f3321eff8e708c1e2960462bd8936e
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- minio-data:/data
|
||||
expose:
|
||||
- 9000
|
||||
- 9001
|
||||
environment:
|
||||
<<: *minio-config
|
||||
entrypoint: >
|
||||
/bin/sh -c "
|
||||
minio server /data --console-address=:9001 &
|
||||
sleep 2;
|
||||
mc alias set myminiopeerdb http://minio:9000 $$MINIO_ROOT_USER $$MINIO_ROOT_PASSWORD;
|
||||
mc mb myminiopeerdb/$$PEERDB_CLICKHOUSE_AWS_S3_BUCKET_NAME;
|
||||
wait
|
||||
"
|
||||
|
||||
volumes:
|
||||
pgdata:
|
||||
minio-data:
|
||||
|
After Width: | Height: | Size: 10 KiB |
@@ -0,0 +1,93 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
peerdb_password = "${password:32}"
|
||||
postgres_password = "${password:32}"
|
||||
minio_root_user = "_peerdb_minioadmin"
|
||||
minio_root_password = "${password:32}"
|
||||
nextauth_secret = "${password:32}"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "peerdb-ui"
|
||||
port = 3000
|
||||
host = "${main_domain}"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "minio"
|
||||
port = 9001
|
||||
host = "${main_domain}"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "temporal-ui"
|
||||
port = 8080
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
PEERDB_PASSWORD = "${peerdb_password}"
|
||||
PEERDB_CATALOG_HOST = "catalog"
|
||||
PEERDB_CATALOG_PORT = "5432"
|
||||
PEERDB_CATALOG_USER = "postgres"
|
||||
PEERDB_CATALOG_PASSWORD = "${postgres_password}"
|
||||
PEERDB_CATALOG_DATABASE = "postgres"
|
||||
PEERDB_FLOW_SERVER_ADDRESS = "grpc://flow-api:8112"
|
||||
NEXTAUTH_URL = "http://localhost:3000"
|
||||
NEXTAUTH_SECRET = "${nextauth_secret}"
|
||||
DATABASE_URL = "postgres://postgres:${postgres_password}@catalog:5432/postgres"
|
||||
PEERDB_FLOW_SERVER_HTTP = "http://flow-api:8113"
|
||||
PEERDB_EXPERIMENTAL_ENABLE_SCRIPTING = "true"
|
||||
MINIO_ROOT_USER = "${minio_root_user}"
|
||||
MINIO_ROOT_PASSWORD = "${minio_root_password}"
|
||||
PEERDB_CLICKHOUSE_AWS_REGION = "us-east-1"
|
||||
PEERDB_CLICKHOUSE_AWS_ENDPOINT_URL_S3 = "http://minio:9000"
|
||||
PEERDB_CLICKHOUSE_AWS_S3_BUCKET_NAME = "peerdbbucket"
|
||||
PEERDB_ALLOWED_TARGETS = ""
|
||||
PEERDB_CLICKHOUSE_ALLOWED_DOMAINS = ""
|
||||
AWS_ACCESS_KEY_ID = ""
|
||||
AWS_SECRET_ACCESS_KEY = ""
|
||||
AWS_REGION = ""
|
||||
AWS_ENDPOINT = ""
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "./postgresql.conf"
|
||||
content = """
|
||||
listen_addresses = '*'
|
||||
|
||||
wal_level = logical
|
||||
max_wal_senders = 4
|
||||
max_replication_slots = 4
|
||||
"""
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "./docker-entrypoint-initdb.d/pg-hba-replication.sh"
|
||||
content = """
|
||||
#!/bin/sh
|
||||
echo "host replication $POSTGRES_USER 0.0.0.0/0 trust" >> "$PGDATA/pg_hba.conf"
|
||||
"""
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "./temporal-dynamicconfig/production-sql.yaml"
|
||||
content = """
|
||||
limit.maxIDLength:
|
||||
- value: 255
|
||||
constraints: {}
|
||||
system.forceSearchAttributesCacheRefreshOnRead:
|
||||
- value: false
|
||||
constraints: {}
|
||||
frontend.enableUpdateWorkflowExecution:
|
||||
- value: true
|
||||
"""
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "./scripts/mirror-name-search.sh"
|
||||
content = """
|
||||
#!/bin/sh
|
||||
|
||||
sleep 5
|
||||
|
||||
# Check if MirrorName attribute exists
|
||||
if ! temporal operator search-attribute list | grep -w MirrorName >/dev/null 2>&1; then
|
||||
# If not, create MirrorName attribute
|
||||
temporal operator search-attribute create --name MirrorName --type Text --namespace default
|
||||
fi
|
||||
|
||||
tini -s -- sleep infinity
|
||||
"""
|
||||
@@ -30,9 +30,5 @@ services:
|
||||
DB_HOST: "peppermint-postgres"
|
||||
SECRET: ${SECRET}
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
peppermint-postgres-data:
|
||||
@@ -54,10 +54,6 @@ services:
|
||||
volumes:
|
||||
- postiz-redis-data:/data
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
postiz-postgres-data:
|
||||
postiz-redis-data:
|
||||
|
||||
@@ -9,6 +9,7 @@ services:
|
||||
- "--web.console.templates=/usr/share/prometheus/consoles"
|
||||
- "--web.enable-lifecycle"
|
||||
volumes:
|
||||
- ../files/prometheus.yml:/etc/prometheus/prometheus.yml
|
||||
- prometheus-data:/prometheus
|
||||
volumes:
|
||||
prometheus-data: {}
|
||||
|
||||
@@ -10,7 +10,10 @@ port = 9_090
|
||||
host = "${main_domain}"
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "/etc/prometheus/prometheus.yml"
|
||||
# Note: this relative path is resolved by Dokploy to the file mounted from
|
||||
# ../files/prometheus.yml in docker-compose, and mapped inside the container
|
||||
# to /etc/prometheus/prometheus.yml.
|
||||
filePath = "prometheus.yml"
|
||||
serviceName = "prometheus"
|
||||
content = """
|
||||
# Prometheus Configuration
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
mongo:
|
||||
restart: always
|
||||
image: mongo
|
||||
volumes:
|
||||
- mongo_data:/data/db
|
||||
qux-fe:
|
||||
restart: always
|
||||
image: klausenschaefersinho/quant-ux
|
||||
environment:
|
||||
- QUX_PROXY_URL=http://quant-ux-backend:8080
|
||||
- QUX_AUTH=${QUX_AUTH}
|
||||
- QUX_KEYCLOAK_REALM=${QUX_KEYCLOAK_REALM}
|
||||
- QUX_KEYCLOAK_CLIENT=${QUX_KEYCLOAK_CLIENT}
|
||||
- QUX_KEYCLOAK_URL=${QUX_KEYCLOAK_URL}
|
||||
- QUX_WS_URL=${QUX_WS_URL}
|
||||
links:
|
||||
- mongo
|
||||
- qux-be
|
||||
ports:
|
||||
- 8082
|
||||
depends_on:
|
||||
- qux-be
|
||||
|
||||
qux-be:
|
||||
restart: always
|
||||
image: klausenschaefersinho/quant-ux-backend
|
||||
volumes:
|
||||
- quant_ux_data:/app-data
|
||||
environment:
|
||||
- QUX_HTTP_HOST=${QUX_HTTP_HOST}
|
||||
- QUX_HTTP_PORT=8080
|
||||
- QUX_MONGO_DB_NAME=${QUX_MONGO_DB_NAME}
|
||||
- QUX_MONGO_TABLE_PREFIX=${QUX_MONGO_TABLE_PREFIX}
|
||||
- QUX_MONGO_CONNECTION_STRING=mongodb://quant-ux-mongo:27017
|
||||
- QUX_MAIL_USER=${QUX_MAIL_USER}
|
||||
- QUX_MAIL_PASSWORD=${QUX_MAIL_PASSWORD}
|
||||
- QUX_MAIL_HOST=${QUX_MAIL_HOST}
|
||||
- QUX_JWT_PASSWORD=${QUX_JWT_PASSWORD}
|
||||
- QUX_IMAGE_FOLDER_USER=/app-data/qux-images
|
||||
- QUX_IMAGE_FOLDER_APPS=/app-data/qux-image-apps
|
||||
- TZ=${TZ}
|
||||
- QUX_AUTH_SERVICE=${QUX_AUTH_SERVICE}
|
||||
- QUX_KEYCLOAK_SERVER=${QUX_KEYCLOAK_SERVER}
|
||||
- QUX_KEYCLOAK_REALM=${QUX_KEYCLOAK_REALM}
|
||||
- QUX_USER_ALLOW_SIGNUP=${QUX_USER_ALLOW_SIGNUP}
|
||||
- QUX_USER_ALLOWED_DOMAINS=${QUX_USER_ALLOWED_DOMAINS}
|
||||
depends_on:
|
||||
- mongo
|
||||
|
||||
qux-ws:
|
||||
restart: always
|
||||
image: klausenschaefersinho/quant-ux-websocket
|
||||
environment:
|
||||
- QUX_SERVER=http://quant-ux-backend:8080/
|
||||
- QUX_SERVER_PORT=8086
|
||||
ports:
|
||||
- 8086
|
||||
links:
|
||||
- qux-be
|
||||
depends_on:
|
||||
- qux-be
|
||||
|
||||
volumes:
|
||||
mongo_data:
|
||||
quant_ux_data:
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
<svg width="24" height="24" viewBox="0 0 88 88" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M44 11C61.3021 11 75.4941 24.3155 76.8877 41.2581C81.2234 43.4103 84.888 46.7112 87.4835 50.7627C87.8236 48.5582 88 46.2997 88 44C88 19.6995 68.3005 0 44 0C19.6995 0 0 19.6995 0 44C0 68.3005 19.6995 88 44 88C46.2997 88 48.5582 87.8236 50.7627 87.4835C46.7112 84.888 43.4103 81.2234 41.2581 76.8877C24.3155 75.4941 11 61.3021 11 44C11 25.7746 25.7746 11 44 11Z" fill="white"></path><path d="M66 47.6667C55.8748 47.6667 47.6667 55.8748 47.6667 66C47.6667 76.1252 55.8748 84.3333 66 84.3333H84.3333V66C84.3333 55.8748 76.1252 47.6667 66 47.6667Z" fill="white"></path></svg>
|
||||
|
||||
|
After Width: | Height: | Size: 676 B |
@@ -0,0 +1,50 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
ws_domain = "${domain}"
|
||||
qux_auth = "qux"
|
||||
qux_jwt_password = "${password:64}"
|
||||
qux_mongo_db_name = "quantux"
|
||||
qux_mongo_table_prefix = "quantux"
|
||||
qux_mail_user = "${email}"
|
||||
qux_mail_password = "${password:32}"
|
||||
qux_mail_host = "mail.example.com"
|
||||
qux_timezone = "America/Chicago"
|
||||
qux_auth_service = "qux"
|
||||
qux_user_allow_signup = "true"
|
||||
qux_user_allowed_domains = "*"
|
||||
qux_keycloak_realm = ""
|
||||
qux_keycloak_client = ""
|
||||
qux_keycloak_url = ""
|
||||
qux_keycloak_server = ""
|
||||
|
||||
[config]
|
||||
env = [
|
||||
"QUX_HTTP_HOST=https://${main_domain}",
|
||||
"QUX_AUTH=${qux_auth}",
|
||||
"QUX_JWT_PASSWORD=${qux_jwt_password}",
|
||||
"QUX_MONGO_DB_NAME=${qux_mongo_db_name}",
|
||||
"QUX_MONGO_TABLE_PREFIX=${qux_mongo_table_prefix}",
|
||||
"QUX_MAIL_USER=${qux_mail_user}",
|
||||
"QUX_MAIL_PASSWORD=${qux_mail_password}",
|
||||
"QUX_MAIL_HOST=${qux_mail_host}",
|
||||
"TZ=${qux_timezone}",
|
||||
"QUX_AUTH_SERVICE=${qux_auth_service}",
|
||||
"QUX_KEYCLOAK_SERVER=${qux_keycloak_server}",
|
||||
"QUX_KEYCLOAK_REALM=${qux_keycloak_realm}",
|
||||
"QUX_KEYCLOAK_CLIENT=${qux_keycloak_client}",
|
||||
"QUX_KEYCLOAK_URL=${qux_keycloak_url}",
|
||||
"QUX_USER_ALLOW_SIGNUP=${qux_user_allow_signup}",
|
||||
"QUX_USER_ALLOWED_DOMAINS=${qux_user_allowed_domains}",
|
||||
"QUX_WS_URL=wss://${ws_domain}"
|
||||
]
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "qux-fe"
|
||||
port = 8082
|
||||
host = "${main_domain}"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "qux-ws"
|
||||
port = 8086
|
||||
host = "${ws_domain}"
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:16-alpine
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
environment:
|
||||
POSTGRES_DB: postgres
|
||||
POSTGRES_USER: postgres
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U postgres -d postgres"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
minio:
|
||||
image: minio/minio:latest
|
||||
command: server /data
|
||||
volumes:
|
||||
- minio_data:/data
|
||||
environment:
|
||||
MINIO_ROOT_USER: ${MINIO_ROOT_USER}
|
||||
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
|
||||
|
||||
chrome:
|
||||
image: ghcr.io/browserless/chromium:v2.18.0
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway"
|
||||
environment:
|
||||
TIMEOUT: 10000
|
||||
CONCURRENT: 10
|
||||
TOKEN: ${CHROME_TOKEN}
|
||||
EXIT_ON_HEALTH_FAILURE: "true"
|
||||
PRE_REQUEST_HEALTH_CHECK: "true"
|
||||
|
||||
app:
|
||||
image: amruthpillai/reactive-resume:latest
|
||||
depends_on:
|
||||
- postgres
|
||||
- minio
|
||||
- chrome
|
||||
environment:
|
||||
PORT: 3000
|
||||
NODE_ENV: production
|
||||
PUBLIC_URL: https://${APP_DOMAIN}
|
||||
STORAGE_URL: https://${APP_DOMAIN}/default
|
||||
CHROME_TOKEN: ${CHROME_TOKEN}
|
||||
CHROME_URL: ws://chrome:3000
|
||||
DATABASE_URL: postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/postgres
|
||||
ACCESS_TOKEN_SECRET: ${ACCESS_TOKEN_SECRET}
|
||||
REFRESH_TOKEN_SECRET: ${REFRESH_TOKEN_SECRET}
|
||||
MAIL_FROM: ${MAIL_FROM}
|
||||
STORAGE_ENDPOINT: minio
|
||||
STORAGE_PORT: 9000
|
||||
STORAGE_REGION: us-east-1
|
||||
STORAGE_BUCKET: default
|
||||
STORAGE_ACCESS_KEY: ${MINIO_ROOT_USER}
|
||||
STORAGE_SECRET_KEY: ${MINIO_ROOT_PASSWORD}
|
||||
STORAGE_USE_SSL: "false"
|
||||
STORAGE_SKIP_BUCKET_CHECK: "false"
|
||||
|
||||
|
||||
volumes:
|
||||
minio_data:
|
||||
postgres_data:
|
||||
@@ -0,0 +1,20 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" width="200" height="200">
|
||||
<defs>
|
||||
<linearGradient id="grad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#3b82f6;stop-opacity:1" />
|
||||
<stop offset="100%" style="stop-color:#8b5cf6;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
|
||||
<!-- Background circle -->
|
||||
<circle cx="100" cy="100" r="95" fill="url(#grad)"/>
|
||||
|
||||
<!-- Document icon -->
|
||||
<rect x="60" y="45" width="80" height="110" rx="5" fill="white"/>
|
||||
<rect x="70" y="60" width="60" height="6" rx="3" fill="#3b82f6"/>
|
||||
<rect x="70" y="75" width="60" height="6" rx="3" fill="#3b82f6"/>
|
||||
<rect x="70" y="90" width="45" height="6" rx="3" fill="#8b5cf6"/>
|
||||
<rect x="70" y="105" width="60" height="6" rx="3" fill="#8b5cf6"/>
|
||||
<rect x="70" y="120" width="50" height="6" rx="3" fill="#8b5cf6"/>
|
||||
<rect x="70" y="135" width="40" height="6" rx="3" fill="#8b5cf6"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 937 B |
@@ -0,0 +1,33 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
postgres_password = "${password:32}"
|
||||
minio_user = "minioadmin"
|
||||
minio_password = "${password:32}"
|
||||
chrome_token = "${password:32}"
|
||||
access_token_secret = "${password:64}"
|
||||
refresh_token_secret = "${password:64}"
|
||||
mail_from = "noreply@${main_domain}"
|
||||
|
||||
[config]
|
||||
env = [
|
||||
"APP_DOMAIN=${main_domain}",
|
||||
"POSTGRES_PASSWORD=${postgres_password}",
|
||||
"MINIO_ROOT_USER=${minio_user}",
|
||||
"MINIO_ROOT_PASSWORD=${minio_password}",
|
||||
"CHROME_TOKEN=${chrome_token}",
|
||||
"ACCESS_TOKEN_SECRET=${access_token_secret}",
|
||||
"REFRESH_TOKEN_SECRET=${refresh_token_secret}",
|
||||
"MAIL_FROM=${mail_from}",
|
||||
]
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "app"
|
||||
port = 3000
|
||||
host = "${main_domain}"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "minio"
|
||||
port = 9000
|
||||
host = "${main_domain}"
|
||||
path = "/default"
|
||||
@@ -0,0 +1,45 @@
|
||||
services:
|
||||
rote-backend:
|
||||
image: rabithua/rote-backend:${IMAGE_TAG:-latest}
|
||||
pull_policy: always
|
||||
environment:
|
||||
POSTGRESQL_URL: postgresql://rote:${POSTGRES_PASSWORD}@rote-postgres:5432/rote
|
||||
depends_on:
|
||||
rote-postgres:
|
||||
condition: service_healthy
|
||||
restart: unless-stopped
|
||||
command:
|
||||
[
|
||||
"sh",
|
||||
"-c",
|
||||
"sleep 15 && bun run dist/scripts/runMigrations.js && bun run dist/server.js",
|
||||
]
|
||||
|
||||
rote-frontend:
|
||||
image: rabithua/rote-frontend:${IMAGE_TAG:-latest}
|
||||
pull_policy: always
|
||||
depends_on:
|
||||
- rote-backend
|
||||
environment:
|
||||
# VITE_API_BASE must point to an address that reaches rote-backend (reverse-proxy domain or host IP:port)
|
||||
VITE_API_BASE: ${VITE_API_BASE}
|
||||
restart: unless-stopped
|
||||
|
||||
rote-postgres:
|
||||
image: postgres:17
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
POSTGRES_USER: rote
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
POSTGRES_DB: rote
|
||||
volumes:
|
||||
- rote-postgres-data:/var/lib/postgresql/data
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U rote -d rote"]
|
||||
interval: 5s
|
||||
timeout: 3s
|
||||
retries: 10
|
||||
start_period: 30s
|
||||
|
||||
volumes:
|
||||
rote-postgres-data: {}
|
||||
|
After Width: | Height: | Size: 54 KiB |