mirror of
https://github.com/Dokploy/templates.git
synced 2026-11-13 06:14:54 -06:00
Compare commits
3
Commits
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 40 KiB |
@@ -1,95 +0,0 @@
|
||||
# Dokploy blueprint for Brightbean Studio
|
||||
# https://github.com/brightbeanxyz/brightbean-studio
|
||||
#
|
||||
# Stack: Django app (gunicorn) + background-task worker + PostgreSQL 16.
|
||||
# The public edge (Caddy in the upstream compose) is intentionally dropped:
|
||||
# Dokploy's Traefik terminates TLS and routes to `app:8000`.
|
||||
#
|
||||
# Images are built from source on deploy (the project publishes no image yet).
|
||||
# Swap the anchor below to your own fork to deploy your fork:
|
||||
# x-brightbean-repo: &brightbean-repo https://github.com/H54collective/brightbean-studio.git#main
|
||||
|
||||
x-brightbean-repo: &brightbean-repo https://github.com/brightbeanxyz/brightbean-studio.git#main
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:16-alpine
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
POSTGRES_DB: brightbean
|
||||
POSTGRES_USER: postgres
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U postgres -d brightbean"]
|
||||
interval: 5s
|
||||
timeout: 5s
|
||||
retries: 10
|
||||
|
||||
migrate:
|
||||
build:
|
||||
context: *brightbean-repo
|
||||
command: python manage.py migrate --noinput
|
||||
restart: "no"
|
||||
environment:
|
||||
DJANGO_SETTINGS_MODULE: ${DJANGO_SETTINGS_MODULE}
|
||||
SECRET_KEY: ${SECRET_KEY}
|
||||
ENCRYPTION_KEY_SALT: ${ENCRYPTION_KEY_SALT}
|
||||
DATABASE_URL: ${DATABASE_URL}
|
||||
ALLOWED_HOSTS: ${ALLOWED_HOSTS}
|
||||
APP_URL: ${APP_URL}
|
||||
STORAGE_BACKEND: ${STORAGE_BACKEND}
|
||||
MEDIA_ROOT: ${MEDIA_ROOT}
|
||||
SERVE_MEDIA: ${SERVE_MEDIA}
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
|
||||
app:
|
||||
build:
|
||||
context: *brightbean-repo
|
||||
command: gunicorn config.wsgi:application --bind 0.0.0.0:8000 --workers 2 --threads 4
|
||||
restart: unless-stopped
|
||||
expose:
|
||||
- "8000"
|
||||
environment:
|
||||
DJANGO_SETTINGS_MODULE: ${DJANGO_SETTINGS_MODULE}
|
||||
SECRET_KEY: ${SECRET_KEY}
|
||||
ENCRYPTION_KEY_SALT: ${ENCRYPTION_KEY_SALT}
|
||||
DATABASE_URL: ${DATABASE_URL}
|
||||
ALLOWED_HOSTS: ${ALLOWED_HOSTS}
|
||||
APP_URL: ${APP_URL}
|
||||
STORAGE_BACKEND: ${STORAGE_BACKEND}
|
||||
MEDIA_ROOT: ${MEDIA_ROOT}
|
||||
SERVE_MEDIA: ${SERVE_MEDIA}
|
||||
volumes:
|
||||
- media_data:/app/media
|
||||
depends_on:
|
||||
migrate:
|
||||
condition: service_completed_successfully
|
||||
|
||||
worker:
|
||||
build:
|
||||
context: *brightbean-repo
|
||||
command: python manage.py process_tasks
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
DJANGO_SETTINGS_MODULE: ${DJANGO_SETTINGS_MODULE}
|
||||
SECRET_KEY: ${SECRET_KEY}
|
||||
ENCRYPTION_KEY_SALT: ${ENCRYPTION_KEY_SALT}
|
||||
DATABASE_URL: ${DATABASE_URL}
|
||||
ALLOWED_HOSTS: ${ALLOWED_HOSTS}
|
||||
APP_URL: ${APP_URL}
|
||||
STORAGE_BACKEND: ${STORAGE_BACKEND}
|
||||
MEDIA_ROOT: ${MEDIA_ROOT}
|
||||
SERVE_MEDIA: ${SERVE_MEDIA}
|
||||
volumes:
|
||||
- media_data:/app/media
|
||||
depends_on:
|
||||
migrate:
|
||||
condition: service_completed_successfully
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
||||
media_data:
|
||||
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"id": "brightbean-studio",
|
||||
"name": "Brightbean Studio",
|
||||
"version": "latest",
|
||||
"description": "Open-source, self-hostable social media management platform: schedule, publish and manage content across 10+ platforms (Facebook, Instagram, LinkedIn, TikTok, YouTube, Pinterest, Threads, Bluesky, Mastodon, Google Business, DEV.to) from a single dashboard. Free alternative to Buffer, Sendible and SocialPilot.",
|
||||
"logo": "brightbean-studio.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/brightbeanxyz/brightbean-studio",
|
||||
"website": "https://brightbean.xyz/studio/",
|
||||
"docs": "https://github.com/brightbeanxyz/brightbean-studio#readme"
|
||||
},
|
||||
"tags": [
|
||||
"social-media",
|
||||
"django",
|
||||
"self-hosted",
|
||||
"marketing"
|
||||
]
|
||||
}
|
||||
@@ -1,66 +0,0 @@
|
||||
# Dokploy template for Brightbean Studio
|
||||
# - The app is built from source at deploy time (no prebuilt image yet).
|
||||
# - After first deploy, add per-platform credentials (Facebook, LinkedIn,
|
||||
# TikTok, ...) in Django admin: /admin/ -> Platform credentials, or set the
|
||||
# PLATFORM_* env vars on the compose service in Dokploy.
|
||||
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
postgres_password = "${password:32}"
|
||||
secret_key = "${password:50}"
|
||||
encryption_key_salt = "${password:32}"
|
||||
|
||||
[config]
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "app"
|
||||
port = 8000
|
||||
host = "${main_domain}"
|
||||
path = "/"
|
||||
|
||||
[config.env]
|
||||
DJANGO_SETTINGS_MODULE = "config.settings.production"
|
||||
SECRET_KEY = "${secret_key}"
|
||||
ENCRYPTION_KEY_SALT = "${encryption_key_salt}"
|
||||
POSTGRES_PASSWORD = "${postgres_password}"
|
||||
DATABASE_URL = "postgres://postgres:${postgres_password}@postgres:5432/brightbean"
|
||||
ALLOWED_HOSTS = "${main_domain}"
|
||||
APP_URL = "https://${main_domain}"
|
||||
STORAGE_BACKEND = "local"
|
||||
MEDIA_ROOT = "/app/media"
|
||||
SERVE_MEDIA = "true"
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "README.md"
|
||||
content = """
|
||||
# Brightbean Studio (Dokploy template)
|
||||
|
||||
Open-source social media management: schedule, publish and manage content
|
||||
across 10+ platforms from one dashboard (Buffer/Sendible alternative).
|
||||
|
||||
## After deploying
|
||||
|
||||
1. **Admin** — create your superuser once the stack is up:
|
||||
`docker exec -it <app-container> python manage.py createsuperuser`
|
||||
(or open https://<your-domain>/admin/ and use a first-login flow if enabled).
|
||||
2. **Platform credentials** (Facebook, Instagram, LinkedIn, TikTok, YouTube,
|
||||
Pinterest, Threads, Bluesky, Google Business, Mastodon, DEV.to): add them in
|
||||
Django admin under *Platform credentials*, or set the `PLATFORM_*` env vars
|
||||
on this compose service in Dokploy and redeploy.
|
||||
3. **Media storage** — default is local disk on the `media_data` volume
|
||||
(served by Django via SERVE_MEDIA=true at /media/). To move to S3, set
|
||||
`STORAGE_BACKEND=s3` plus `S3_*` vars and set `SERVE_MEDIA=false`.
|
||||
4. **Email** — set `EMAIL_HOST` / `EMAIL_HOST_USER` / `EMAIL_HOST_PASSWORD` /
|
||||
`DEFAULT_FROM_EMAIL` if you want password resets and notifications.
|
||||
5. **Google login** — set `GOOGLE_AUTH_CLIENT_ID` / `GOOGLE_AUTH_CLIENT_SECRET`
|
||||
for Google sign-in.
|
||||
|
||||
## Notes
|
||||
|
||||
- The image is built from source on every deploy (takes a few minutes the
|
||||
first time). The three services share the same Dockerfile, so only the
|
||||
first build pays the full cost.
|
||||
- `migrate` is a one-shot service: it runs Django migrations, then exits.
|
||||
`app` and `worker` wait for it via `service_completed_successfully`.
|
||||
- Traefik (Dokploy) handles TLS; the upstream Caddy edge is not used.
|
||||
"""
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
opentodo:
|
||||
image: ghcr.io/opentodoapp/opentodo:1.4.2
|
||||
image: ghcr.io/opentodoapp/opentodo:0.19.0
|
||||
restart: unless-stopped
|
||||
expose:
|
||||
- 8080
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "opentodo",
|
||||
"name": "OpenTodo",
|
||||
"version": "1.4.2",
|
||||
"version": "0.19.0",
|
||||
"description": "Open-source, local-first task manager. Works offline and syncs every device from one small container.",
|
||||
"logo": "opentodo.svg",
|
||||
"links": {
|
||||
|
||||
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img"><title>OpenTodo</title><!-- OpenTodo brand mark. Part of OpenTodo, AGPL-3.0 (see LICENSE). --><rect width="64" height="64" rx="14" fill="#0f172a"/><g transform="translate(8 8) scale(2)" fill="none" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"><path d="M6 11.5 4.5 13v4.5a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V13L18 11.5" stroke="#ffffff"/><path d="m8 8 4 4 7.5-7.5" stroke="#34d399"/></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img"><title>OpenTodo</title><!-- OpenTodo brand mark. Part of OpenTodo, AGPL-3.0 (see LICENSE). --><rect width="64" height="64" rx="14" fill="#0f172a"/><g transform="translate(8 6) scale(2)" fill="none" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"><path d="M19.73 10.93A8 8 0 1 1 12.7 5.03" stroke="#34d399"/><path d="M8 13l3 3" stroke="#ffffff"/><path d="M11 16l9-9" stroke="#34d399"/></g></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 480 B After Width: | Height: | Size: 484 B |
@@ -1,7 +1,7 @@
|
||||
# the webserver can take a while to start up, so don't be alarmed if it takes a few minutes to get a response
|
||||
services:
|
||||
vaultwarden:
|
||||
image: vaultwarden/server:1.37.5
|
||||
image: vaultwarden/server:1.36.0
|
||||
restart: always
|
||||
environment:
|
||||
DOMAIN: ${DOMAIN}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "vaultwarden",
|
||||
"name": "Vaultwarden",
|
||||
"version": "1.37.5",
|
||||
"version": "1.36.0",
|
||||
"description": "Vaultwarden is a lightweight password manager that works with Bitwarden apps. Self-host it on your own server with Dokploy, which deploys Vaultwarden as a Docker Compose service in a few clicks.",
|
||||
"logo": "vaultwarden.svg",
|
||||
"links": {
|
||||
|
||||
@@ -1,41 +1,30 @@
|
||||
services:
|
||||
zeqqat:
|
||||
image: ghcr.io/zeqqat/zeqqat:${ZEQQAT_VERSION:-0.3.40}
|
||||
image: ghcr.io/zeqqat/zeqqat:0.1.0
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
ZEQQAT_PUBLIC_URL: ${ZEQQAT_PUBLIC_URL:?set ZEQQAT_PUBLIC_URL}
|
||||
ZEQQAT_PUBLIC_URL: ${ZEQQAT_PUBLIC_URL}
|
||||
ZEQQAT_EDITION: self-hosted
|
||||
DATABASE_URL: postgresql://zeqqat:${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD}@postgres:5432/zeqqat
|
||||
BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET:?set BETTER_AUTH_SECRET}
|
||||
ZEQQAT_ENCRYPTION_KEY: ${ZEQQAT_ENCRYPTION_KEY:?set ZEQQAT_ENCRYPTION_KEY}
|
||||
ENABLED_AUTH_PROVIDERS: ${ENABLED_AUTH_PROVIDERS:-password}
|
||||
GITHUB_CLIENT_ID: ${GITHUB_CLIENT_ID:-}
|
||||
GITHUB_CLIENT_SECRET: ${GITHUB_CLIENT_SECRET:-}
|
||||
GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID:-}
|
||||
GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET:-}
|
||||
MAIL_FROM: ${MAIL_FROM:-}
|
||||
RESEND_API_KEY: ${RESEND_API_KEY:-}
|
||||
SMTP_URL: ${SMTP_URL:-}
|
||||
# Anonymous install ping (README, "Anonymous install ping"). 0 turns it off.
|
||||
ZEQQAT_TELEMETRY: ${ZEQQAT_TELEMETRY:-1}
|
||||
DATABASE_URL: postgresql://zeqqat:${POSTGRES_PASSWORD}@postgres:5432/zeqqat
|
||||
BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET}
|
||||
ZEQQAT_ENCRYPTION_KEY: ${ZEQQAT_ENCRYPTION_KEY}
|
||||
ENABLED_AUTH_PROVIDERS: ${ENABLED_AUTH_PROVIDERS}
|
||||
GITHUB_CLIENT_ID: ${GITHUB_CLIENT_ID}
|
||||
GITHUB_CLIENT_SECRET: ${GITHUB_CLIENT_SECRET}
|
||||
GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID}
|
||||
GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET}
|
||||
expose:
|
||||
- "3000"
|
||||
healthcheck:
|
||||
test: ["CMD", "wget", "-qO-", "http://127.0.0.1:3000/api/health"]
|
||||
interval: 30s
|
||||
timeout: 5s
|
||||
retries: 3
|
||||
start_period: 30s
|
||||
|
||||
postgres:
|
||||
image: postgres:17-alpine
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
POSTGRES_USER: zeqqat
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD}
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
POSTGRES_DB: zeqqat
|
||||
volumes:
|
||||
- zeqqat-postgres:/var/lib/postgresql/data
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "zeqqat",
|
||||
"name": "Zeqqat",
|
||||
"version": "0.3.40",
|
||||
"version": "0.1.0",
|
||||
"description": "Give AI agents access to your Dokploy without handing them your API key. Per-tool permissions, team roles and a full log of every call.",
|
||||
"logo": "zeqqat.svg",
|
||||
"links": {
|
||||
|
||||
@@ -15,8 +15,10 @@ ZEQQAT_PUBLIC_URL = "https://${main_domain}"
|
||||
POSTGRES_PASSWORD = "${postgres_password}"
|
||||
BETTER_AUTH_SECRET = "${auth_secret}"
|
||||
ZEQQAT_ENCRYPTION_KEY = "${encryption_key}"
|
||||
# Sign-in is email and password, nothing to set up: the first account you
|
||||
# create owns this Zeqqat. To also offer GitHub or Google, set
|
||||
# ENABLED_AUTH_PROVIDERS (for example password,github) and that provider's
|
||||
# client id and secret, with the callback
|
||||
# https://<your domain>/api/auth/callback/github
|
||||
# Sign-in: create a GitHub OAuth app with the callback URL
|
||||
# https://<your domain>/api/auth/callback/github and paste its keys here.
|
||||
ENABLED_AUTH_PROVIDERS = "github"
|
||||
GITHUB_CLIENT_ID = ""
|
||||
GITHUB_CLIENT_SECRET = ""
|
||||
GOOGLE_CLIENT_ID = ""
|
||||
GOOGLE_CLIENT_SECRET = ""
|
||||
|
||||
Reference in New Issue
Block a user