# yaml-language-server: $schema=https://schema.zeabur.app/template.json
apiVersion: zeabur.com/v1
kind: Template
metadata:
    name: Outline
spec:
    description: |
        The fastest knowledge base for growing teams. A self-hosted, open-source wiki and documentation tool with real-time collaboration and Markdown support.
    coverImage: https://raw.githubusercontent.com/outline/outline/main/public/images/icon-512.png
    icon: https://raw.githubusercontent.com/outline/outline/main/public/images/icon-512.png
    variables:
        - key: PUBLIC_DOMAIN
          type: DOMAIN
          name: Domain
          description: What domain do you want to bind to?
    tags:
        - Wiki
        - Knowledge Base
        - Documentation
        - Open Source
    readme: "# Outline\n\n[Outline](https://www.getoutline.com) is a fast, collaborative, open-source knowledge base and wiki for growing teams. This template deploys Outline together with PostgreSQL and Redis, using **local file storage** (no S3/MinIO required).\n\n## ⚠️ You must configure an authentication provider\n\nOutline has **no username/password login**. Sign-in only works through an SSO provider (OIDC, Google, Slack, GitHub, etc.). The email magic-link only works for users who already exist, so **the very first admin account must be created via SSO**. After deploying, set one of the following on the `outline` service and restart it:\n\n> \U0001F4A1 **The first person to sign in automatically becomes the administrator** — there is no separate admin setup. Just make sure you are the first to log in.\n\n### Option A — Generic OIDC (Authentik / Logto / Keycloak / Zitadel …)\nSet these env vars on the `outline` service:\n- `OIDC_CLIENT_ID`\n- `OIDC_CLIENT_SECRET`\n- `OIDC_AUTH_URI`\n- `OIDC_TOKEN_URI`\n- `OIDC_USERINFO_URI`\n\nRedirect / callback URL to register with your provider:\n`https://YOUR_DOMAIN/auth/oidc.callback`\n\n### Option B — Google\nCreate an OAuth client in Google Cloud Console and set:\n- `GOOGLE_CLIENT_ID`\n- `GOOGLE_CLIENT_SECRET`\n\nRedirect URL: `https://YOUR_DOMAIN/auth/google.callback`\n\n## Notes\n\n- `SECRET_KEY` and `UTILS_SECRET` are auto-generated on first boot and persisted to the data volume — don't change them or existing encrypted data becomes unreadable.\n- To enable email invites, configure the `SMTP_*` variables.\n- Uploads are stored on the persistent volume at `/var/lib/outline/data`.\n\n## Links & License\n\n- Website: https://www.getoutline.com\n- Source: https://github.com/outline/outline\n- License: [BSL 1.1](https://github.com/outline/outline/blob/main/LICENSE) — this template only packages the official `outlinewiki/outline` image for Zeabur.\n"
    services:
        - name: postgres
          icon: https://raw.githubusercontent.com/zeabur/service-icons/main/marketplace/postgresql.svg
          template: PREBUILT_V2
          spec:
            id: postgres
            source:
                image: postgres:16-alpine
            ports:
                - id: database
                  port: 5432
                  type: TCP
            volumes:
                - id: data
                  dir: /var/lib/postgresql/data
            instructions:
                - title: PostgreSQL connection string
                  content: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${PORT_FORWARDED_HOSTNAME}:${DATABASE_PORT_FORWARDED_PORT}/${POSTGRES_DB}
            env:
                POSTGRES_CONNECTION_STRING:
                    default: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${PORT_FORWARDED_HOSTNAME}:${DATABASE_PORT_FORWARDED_PORT}/${POSTGRES_DB}
                    expose: true
                POSTGRES_CONNECTION_STRING_INTERNAL:
                    default: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${CONTAINER_HOSTNAME}:5432/${POSTGRES_DB}
                    expose: true
                POSTGRES_DB:
                    default: outline
                POSTGRES_PASSWORD:
                    default: ${PASSWORD}
                POSTGRES_USER:
                    default: outline
            healthCheck:
                type: TCP
                port: database
        - name: redis
          icon: https://raw.githubusercontent.com/zeabur/service-icons/main/marketplace/redis.svg
          template: PREBUILT_V2
          spec:
            id: redis
            source:
                image: redis:7.4-alpine
                command:
                    - redis-server
                    - --requirepass
                    - ${REDIS_PASSWORD}
            ports:
                - id: database
                  port: 6379
                  type: TCP
            volumes:
                - id: data
                  dir: /data
            env:
                REDIS_CONNECTION_STRING_INTERNAL:
                    default: redis://:${REDIS_PASSWORD}@${CONTAINER_HOSTNAME}:6379
                    expose: true
                REDIS_PASSWORD:
                    default: ${PASSWORD}
                    expose: true
            healthCheck:
                type: TCP
                port: database
        - name: outline
          icon: https://raw.githubusercontent.com/outline/outline/main/public/images/icon-512.png
          template: PREBUILT_V2
          spec:
            id: outline
            source:
                image: outlinewiki/outline:1.9.2
                command:
                    - /bin/sh
                    - -c
                    - /opt/startup.sh
            ports:
                - id: web
                  port: 3000
                  type: HTTP
            volumes:
                - id: data
                  dir: /var/lib/outline/data
            instructions:
                - title: Application URL
                  content: ${ZEABUR_WEB_URL}
                - title: OIDC / Google callback URL
                  content: https://${ZEABUR_WEB_DOMAIN}/auth/oidc.callback
            env:
                DATABASE_URL:
                    default: ${POSTGRES_CONNECTION_STRING_INTERNAL}
                DEFAULT_LANGUAGE:
                    default: en_US
                FILE_STORAGE:
                    default: local
                FILE_STORAGE_LOCAL_ROOT_DIR:
                    default: /var/lib/outline/data
                FILE_STORAGE_UPLOAD_MAX_SIZE:
                    default: "262144000"
                FORCE_HTTPS:
                    default: "true"
                GOOGLE_CLIENT_ID:
                    default: ""
                GOOGLE_CLIENT_SECRET:
                    default: ""
                NODE_ENV:
                    default: production
                OIDC_AUTH_URI:
                    default: ""
                OIDC_CLIENT_ID:
                    default: ""
                OIDC_CLIENT_SECRET:
                    default: ""
                OIDC_DISPLAY_NAME:
                    default: OpenID Connect
                OIDC_SCOPES:
                    default: openid profile email
                OIDC_TOKEN_URI:
                    default: ""
                OIDC_USERINFO_URI:
                    default: ""
                OIDC_USERNAME_CLAIM:
                    default: preferred_username
                PGSSLMODE:
                    default: disable
                PORT:
                    default: "3000"
                RATE_LIMITER_ENABLED:
                    default: "true"
                REDIS_URL:
                    default: ${REDIS_CONNECTION_STRING_INTERNAL}
                SMTP_FROM_EMAIL:
                    default: ""
                SMTP_HOST:
                    default: ""
                SMTP_PASSWORD:
                    default: ""
                SMTP_PORT:
                    default: ""
                SMTP_USERNAME:
                    default: ""
                URL:
                    default: https://${ZEABUR_WEB_DOMAIN}
            configs:
                - path: /opt/startup.sh
                  template: |
                    #!/bin/sh
                    set -e
                    cd /opt/outline
                    SECRET_FILE=/var/lib/outline/data/.zeabur-secrets
                    if [ ! -f "$SECRET_FILE" ]; then
                      {
                        echo "SECRET_KEY=$(node -e "console.log(require('crypto').randomBytes(32).toString('hex'))")"
                        echo "UTILS_SECRET=$(node -e "console.log(require('crypto').randomBytes(32).toString('hex'))")"
                      } > "$SECRET_FILE"
                    fi
                    set -a
                    . "$SECRET_FILE"
                    set +a
                    echo "Running database migrations..."
                    ./node_modules/.bin/sequelize db:migrate --env=production-ssl-disabled
                    echo "Starting Outline..."
                    exec node build/server/index.js
                  permission: 493
                  envsubst: false
          domainKey: PUBLIC_DOMAIN
localization:
    es-ES:
        description: |
            La base de conocimiento más rápida para equipos en crecimiento. Una wiki y herramienta de documentación autoalojada y de código abierto, con colaboración en tiempo real y compatibilidad con Markdown.
        variables:
            - key: PUBLIC_DOMAIN
              type: STRING
              name: Dominio
              description: ¿Qué dominio quieres vincular?
        readme: "# Outline\n\n[Outline](https://www.getoutline.com) es una base de conocimiento y wiki de código abierto, rápida y colaborativa. Esta plantilla despliega Outline junto con PostgreSQL y Redis, usando **almacenamiento local de archivos** (no requiere S3/MinIO).\n\n## ⚠️ Debes configurar un proveedor de autenticación (SSO)\n\nOutline **no tiene inicio de sesión con usuario y contraseña**. Solo funciona mediante SSO (OIDC, Google, Slack, GitHub, etc.). El enlace mágico por correo solo funciona para usuarios ya existentes, por lo que **la primera cuenta de administrador debe crearse vía SSO**. Tras el despliegue, configura una de estas opciones en el servicio `outline` y reinícialo:\n\n> \U0001F4A1 **La primera persona que inicie sesión se convierte automáticamente en administrador** — no hay una configuración de administrador aparte. Solo asegúrate de ser el primero en iniciar sesión.\n\n### Opción A — OIDC genérico (Authentik / Logto / Keycloak / Zitadel…)\nConfigura en el servicio `outline`:\n- `OIDC_CLIENT_ID`\n- `OIDC_CLIENT_SECRET`\n- `OIDC_AUTH_URI`\n- `OIDC_TOKEN_URI`\n- `OIDC_USERINFO_URI`\n\nURL de redirección: `https://TU_DOMINIO/auth/oidc.callback`\n\n### Opción B — Google\nCrea un cliente OAuth en Google Cloud Console y configura:\n- `GOOGLE_CLIENT_ID`\n- `GOOGLE_CLIENT_SECRET`\n\nURL de redirección: `https://TU_DOMINIO/auth/google.callback`\n\n## Notas\n\n- `SECRET_KEY` y `UTILS_SECRET` se generan automáticamente en el primer arranque y se guardan en el volumen de datos; no los cambies o los datos cifrados existentes quedarán ilegibles.\n- Para habilitar invitaciones por correo, configura las variables `SMTP_*`.\n- Los archivos subidos se almacenan en el volumen persistente `/var/lib/outline/data`.\n\n## Enlaces y licencia\n\n- Sitio web: https://www.getoutline.com\n- Código fuente: https://github.com/outline/outline\n- Licencia: [BSL 1.1](https://github.com/outline/outline/blob/main/LICENSE) — esta plantilla solo empaqueta la imagen oficial `outlinewiki/outline` para Zeabur.\n"
    id-ID:
        description: |
            Basis pengetahuan tercepat untuk tim yang berkembang. Wiki dan alat dokumentasi open-source yang bisa dihosting sendiri, dengan kolaborasi real-time dan dukungan Markdown.
        variables:
            - key: PUBLIC_DOMAIN
              type: STRING
              name: Domain
              description: Domain mana yang ingin Anda hubungkan?
        readme: "# Outline\n\n[Outline](https://www.getoutline.com) adalah basis pengetahuan dan wiki open-source yang cepat dan kolaboratif. Template ini men-deploy Outline bersama PostgreSQL dan Redis, menggunakan **penyimpanan file lokal** (tidak perlu S3/MinIO).\n\n## ⚠️ Anda harus mengonfigurasi penyedia autentikasi (SSO)\n\nOutline **tidak memiliki login username/password**. Login hanya bisa melalui SSO (OIDC, Google, Slack, GitHub, dll). Magic link email hanya berlaku untuk pengguna yang sudah ada, jadi **akun admin pertama harus dibuat via SSO**. Setelah deploy, atur salah satu opsi berikut pada service `outline` lalu restart:\n\n> \U0001F4A1 **Orang pertama yang login otomatis menjadi administrator** — tidak ada langkah pengaturan admin terpisah. Pastikan saja Anda yang pertama login.\n\n### Opsi A — OIDC umum (Authentik / Logto / Keycloak / Zitadel…)\nAtur pada service `outline`:\n- `OIDC_CLIENT_ID`\n- `OIDC_CLIENT_SECRET`\n- `OIDC_AUTH_URI`\n- `OIDC_TOKEN_URI`\n- `OIDC_USERINFO_URI`\n\nURL callback: `https://DOMAIN_ANDA/auth/oidc.callback`\n\n### Opsi B — Google\nBuat OAuth client di Google Cloud Console lalu atur:\n- `GOOGLE_CLIENT_ID`\n- `GOOGLE_CLIENT_SECRET`\n\nURL callback: `https://DOMAIN_ANDA/auth/google.callback`\n\n## Catatan\n\n- `SECRET_KEY` dan `UTILS_SECRET` dibuat otomatis saat pertama kali boot dan disimpan ke volume data — jangan diubah atau data terenkripsi yang ada tidak bisa dibaca.\n- Untuk mengaktifkan undangan email, konfigurasikan variabel `SMTP_*`.\n- File unggahan disimpan di volume persisten `/var/lib/outline/data`.\n\n## Tautan & Lisensi\n\n- Situs web: https://www.getoutline.com\n- Sumber: https://github.com/outline/outline\n- Lisensi: [BSL 1.1](https://github.com/outline/outline/blob/main/LICENSE) — template ini hanya mengemas image resmi `outlinewiki/outline` untuk Zeabur.\n"
    ja-JP:
        description: |
            成長するチームのための最速のナレッジベース。セルフホスト可能なオープンソースの Wiki・ドキュメントツールで、リアルタイム共同編集と Markdown に対応。
        variables:
            - key: PUBLIC_DOMAIN
              type: STRING
              name: ドメイン
              description: どのドメインをバインドしますか？
        readme: "# Outline\n\n[Outline](https://www.getoutline.com) は高速で共同編集可能なオープンソースのナレッジベース・Wiki です。このテンプレートは PostgreSQL と Redis も併せてデプロイし、**ローカルファイルストレージ**を使用します（S3/MinIO は不要）。\n\n## ⚠️ 認証プロバイダー（SSO）の設定が必須です\n\nOutline に**ユーザー名／パスワードログインはありません**。SSO（OIDC、Google、Slack、GitHub など）でのみログインできます。Email マジックリンクは既存ユーザーのみ有効なため、**最初の管理者アカウントは必ず SSO で作成**する必要があります。デプロイ後、`outline` サービスに以下のいずれかを設定して再起動してください：\n\n> \U0001F4A1 **最初にログインした人が自動的に管理者になります** —— 別途の管理者設定はありません。自分が最初にログインするようにしてください。\n\n### オプション A — 汎用 OIDC（Authentik / Logto / Keycloak / Zitadel…）\n`outline` サービスに設定：\n- `OIDC_CLIENT_ID`\n- `OIDC_CLIENT_SECRET`\n- `OIDC_AUTH_URI`\n- `OIDC_TOKEN_URI`\n- `OIDC_USERINFO_URI`\n\nコールバック URL：`https://あなたのドメイン/auth/oidc.callback`\n\n### オプション B — Google\nGoogle Cloud Console で OAuth クライアントを作成し設定：\n- `GOOGLE_CLIENT_ID`\n- `GOOGLE_CLIENT_SECRET`\n\nコールバック URL：`https://あなたのドメイン/auth/google.callback`\n\n## 注意事項\n\n- `SECRET_KEY` と `UTILS_SECRET` は初回起動時に自動生成されデータボリュームに保存されます。変更すると既存の暗号化データが読めなくなるため変更しないでください。\n- Email 招待を有効にするには `SMTP_*` を設定してください。\n- アップロードファイルは永続ボリューム `/var/lib/outline/data` に保存されます。\n\n## リンクとライセンス\n\n- 公式サイト：https://www.getoutline.com\n- ソース：https://github.com/outline/outline\n- ライセンス：[BSL 1.1](https://github.com/outline/outline/blob/main/LICENSE) — このテンプレートは公式 `outlinewiki/outline` イメージを Zeabur 用にパッケージするものです。\n"
    zh-CN:
        description: |
            为成长中的团队打造的最快知识库。自托管、开源的 Wiki 与文档工具，支持实时协作与 Markdown。
        variables:
            - key: PUBLIC_DOMAIN
              type: STRING
              name: 域名
              description: 您想要绑定哪个域名？
        readme: "# Outline\n\n[Outline](https://www.getoutline.com) 是一套快速、可协作的开源知识库与 Wiki。此模板会一并部署 PostgreSQL 与 Redis，并使用**本地文件存储**（无需 S3/MinIO）。\n\n## ⚠️ 你必须配置一种登录方式（SSO）\n\nOutline **没有账号密码登录**，只能通过 SSO（OIDC、Google、Slack、GitHub 等）登录。Email 魔术链接仅适用于「已存在」的用户，因此**第一个管理员账号必须通过 SSO 创建**。部署后，请在 `outline` 服务上配置以下其中一种，并重启服务：\n\n> \U0001F4A1 **第一个登录的人会自动成为管理员** —— 没有额外的管理员设置步骤，只要确保你是第一个登录的人即可。\n\n### 方案 A — 通用 OIDC（Authentik / Logto / Keycloak / Zitadel…）\n在 `outline` 服务配置：\n- `OIDC_CLIENT_ID`\n- `OIDC_CLIENT_SECRET`\n- `OIDC_AUTH_URI`\n- `OIDC_TOKEN_URI`\n- `OIDC_USERINFO_URI`\n\n回调地址：`https://你的域名/auth/oidc.callback`\n\n### 方案 B — Google\n在 Google Cloud Console 创建 OAuth 客户端后配置：\n- `GOOGLE_CLIENT_ID`\n- `GOOGLE_CLIENT_SECRET`\n\n回调地址：`https://你的域名/auth/google.callback`\n\n## 注意事项\n\n- `SECRET_KEY` 与 `UTILS_SECRET` 会在首次启动时自动生成并保存到数据卷，请勿更改，否则已有加密数据将无法读取。\n- 若要启用 Email 邀请，请配置 `SMTP_*` 变量。\n- 上传文件存储于持久卷 `/var/lib/outline/data`。\n\n## 链接与许可\n\n- 官方网站：https://www.getoutline.com\n- 源代码：https://github.com/outline/outline\n- 许可证：[BSL 1.1](https://github.com/outline/outline/blob/main/LICENSE) — 本模板仅在 Zeabur 上封装官方 `outlinewiki/outline` 镜像。\n"
    zh-TW:
        description: |
            為成長中的團隊打造的最快知識庫。自架、開源的 Wiki 與文件工具，支援即時協作與 Markdown。
        variables:
            - key: PUBLIC_DOMAIN
              type: STRING
              name: 網域
              description: 您想要綁定哪個網域？
        readme: "# Outline\n\n[Outline](https://www.getoutline.com) 是一套快速、可協作的開源知識庫與 Wiki。此模板會一併部署 PostgreSQL 與 Redis，並使用**本機檔案儲存**（不需要 S3/MinIO）。\n\n## ⚠️ 你必須設定一組登入方式（SSO）\n\nOutline **沒有帳號密碼登入**，只能透過 SSO（OIDC、Google、Slack、GitHub 等）登入。Email 魔術連結僅適用於「已存在」的使用者，因此**第一個管理員帳號一定要透過 SSO 建立**。部署後，請在 `outline` 服務上設定以下其中一種，並重啟服務：\n\n> \U0001F4A1 **第一個登入的人會自動成為管理員** —— 沒有另外的管理員設定步驟，只要確保你是第一個登入的人即可。\n\n### 方案 A — 通用 OIDC（Authentik / Logto / Keycloak / Zitadel…）\n在 `outline` 服務設定：\n- `OIDC_CLIENT_ID`\n- `OIDC_CLIENT_SECRET`\n- `OIDC_AUTH_URI`\n- `OIDC_TOKEN_URI`\n- `OIDC_USERINFO_URI`\n\n回呼網址：`https://你的網域/auth/oidc.callback`\n\n### 方案 B — Google\n在 Google Cloud Console 建立 OAuth 用戶端後設定：\n- `GOOGLE_CLIENT_ID`\n- `GOOGLE_CLIENT_SECRET`\n\n回呼網址：`https://你的網域/auth/google.callback`\n\n## 注意事項\n\n- `SECRET_KEY` 與 `UTILS_SECRET` 會在首次啟動時自動產生並存到資料磁碟區，請勿更改，否則既有加密資料將無法讀取。\n- 若要啟用 Email 邀請，請設定 `SMTP_*` 變數。\n- 上傳檔案儲存於持久磁碟區 `/var/lib/outline/data`。\n\n## 連結與授權\n\n- 官方網站：https://www.getoutline.com\n- 原始碼：https://github.com/outline/outline\n- 授權：[BSL 1.1](https://github.com/outline/outline/blob/main/LICENSE) — 本模板僅在 Zeabur 上封裝官方 `outlinewiki/outline` 映像檔。\n"
