# yaml-language-server: $schema=https://schema.zeabur.app/template.json
apiVersion: zeabur.com/v1
kind: Template
metadata:
    name: Guideng
spec:
    description: Self-hosted family location sharing app with a Rust server and React client.
    icon: https://raw.githubusercontent.com/619dev/guideng/main/client/public/assets/guideng-logo.png
    variables:
        - key: GUIDENG_TOKEN
          type: PASSWORD
          name: Shared Token
          description: Shared token for all Guideng clients. Leave empty to let the server generate one on startup.
        - key: GUIDENG_ADMIN_PASSWORD
          type: PASSWORD
          name: Admin Password
          description: Password for the Guideng admin console. Leave empty to let the server generate one on startup.
        - key: GUIDENG_ADMIN_PATH
          type: STRING
          name: Admin Path
          description: URL path for the Guideng admin console.
        - key: GUIDENG_MYSQL_PASSWORD
          type: PASSWORD
          name: MySQL Password
          description: Password shared by the Guideng server and its MySQL database.
        - key: GUIDENG_AMAP_WEB_JS_API_KEY
          type: STRING
          name: AMap Web JS API Key
          description: AMap Web JavaScript API key for the web client.
        - key: GUIDENG_AMAP_WEB_JS_SECURITY_CODE
          type: PASSWORD
          name: AMap Web JS Security Code
          description: AMap Web JavaScript API security code paired with the web key.
        - key: GUIDENG_AMAP_ANDROID_KEY
          type: STRING
          name: AMap Android Key
          description: AMap Android SDK key for future Android app builds.
        - key: GUIDENG_AMAP_IOS_KEY
          type: STRING
          name: AMap iOS Key
          description: AMap iOS SDK key for future iOS app builds.
    tags:
        - Tool
        - Family
        - Location
    readme: |-
        # Guideng

        Guideng is a self-hosted family location sharing app.

        Deploys:

        - `server`: Rust API server, MySQL storage, latest 7 days of tracks, and batched daily track cleanup.
        - `mysql`: MySQL 8 database with persistent storage and automatic schema initialization.
        - `client`: React web client.

        If `GUIDENG_TOKEN` or `GUIDENG_ADMIN_PASSWORD` is empty, the server generates a 128-character random value and writes it to `/data/guideng.log`.

        On the first MySQL startup, the template creates the `devices`, `locations`, and `settings` tables automatically. Existing database volumes and data are not overwritten.
    services:
        - name: server
          icon: https://raw.githubusercontent.com/619dev/guideng/main/client/public/assets/guideng-logo.png
          dependencies:
            - mysql
          template: PREBUILT
          spec:
            id: server
            source:
                image: facilisvelox/guideng-server:latest
            ports:
                - id: http
                  port: 8080
                  type: HTTP
            volumes:
                - id: data
                  dir: /data
            env:
                GUIDENG_ADMIN_PASSWORD:
                    default: ${GUIDENG_ADMIN_PASSWORD}
                GUIDENG_ADMIN_PATH:
                    default: ${GUIDENG_ADMIN_PATH}
                GUIDENG_AMAP_ANDROID_KEY:
                    default: ${GUIDENG_AMAP_ANDROID_KEY}
                GUIDENG_AMAP_IOS_KEY:
                    default: ${GUIDENG_AMAP_IOS_KEY}
                GUIDENG_AMAP_WEB_JS_API_KEY:
                    default: ${GUIDENG_AMAP_WEB_JS_API_KEY}
                GUIDENG_AMAP_WEB_JS_SECURITY_CODE:
                    default: ${GUIDENG_AMAP_WEB_JS_SECURITY_CODE}
                GUIDENG_BIND:
                    default: 0.0.0.0:8080
                GUIDENG_CORS_ORIGINS:
                    default: '*'
                GUIDENG_DATABASE_URL:
                    default: mysql://guideng:${GUIDENG_MYSQL_PASSWORD}@mysql:3306/guideng
                GUIDENG_DB_MAX_CONNECTIONS:
                    default: "5"
                GUIDENG_LOG_PATH:
                    default: /data/guideng.log
                GUIDENG_TOKEN:
                    default: ${GUIDENG_TOKEN}
            healthCheck:
                type: HTTP
                port: http
                http:
                    path: /health
        - name: mysql
          icon: https://raw.githubusercontent.com/zeabur/service-icons/main/marketplace/mysql.svg
          template: PREBUILT
          spec:
            id: mysql
            source:
                image: mysql:8.4
            volumes:
                - id: mysql-data
                  dir: /var/lib/mysql
            env:
                MYSQL_DATABASE:
                    default: guideng
                MYSQL_PASSWORD:
                    default: ${GUIDENG_MYSQL_PASSWORD}
                MYSQL_ROOT_PASSWORD:
                    default: ${GUIDENG_MYSQL_PASSWORD}
                MYSQL_USER:
                    default: guideng
            configs:
                - path: /docker-entrypoint-initdb.d/001-guideng.sql
                  template: |-
                    CREATE TABLE IF NOT EXISTS devices (
                        id CHAR(36) PRIMARY KEY,
                        name VARCHAR(255) NOT NULL,
                        platform TEXT,
                        created_at VARCHAR(35) NOT NULL,
                        updated_at VARCHAR(35) NOT NULL,
                        INDEX idx_devices_updated (updated_at)
                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

                    CREATE TABLE IF NOT EXISTS locations (
                        id BIGINT AUTO_INCREMENT PRIMARY KEY,
                        device_id CHAR(36) NOT NULL,
                        latitude DOUBLE NOT NULL,
                        longitude DOUBLE NOT NULL,
                        accuracy DOUBLE,
                        altitude DOUBLE,
                        heading DOUBLE,
                        speed DOUBLE,
                        battery_level DOUBLE,
                        captured_at VARCHAR(35) NOT NULL,
                        received_at VARCHAR(35) NOT NULL,
                        CONSTRAINT fk_locations_device FOREIGN KEY (device_id)
                            REFERENCES devices(id) ON DELETE CASCADE,
                        INDEX idx_locations_device_received (device_id, received_at, id),
                        INDEX idx_locations_received (received_at)
                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

                    CREATE TABLE IF NOT EXISTS settings (
                        `key` VARCHAR(255) PRIMARY KEY,
                        value TEXT NOT NULL
                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

                    ALTER TABLE devices MODIFY COLUMN platform TEXT NULL;
                  permission: 420
                  envsubst: null
        - name: client
          icon: https://raw.githubusercontent.com/619dev/guideng/main/client/public/assets/guideng-logo.png
          dependencies:
            - server
          template: PREBUILT
          spec:
            id: client
            source:
                image: facilisvelox/guideng-client:latest
            ports:
                - id: http
                  port: 80
                  type: HTTP
