{"id":36412813,"url":"https://github.com/codbex/codbex-phoebe","last_synced_at":"2026-02-18T09:11:51.807Z","repository":{"id":276305716,"uuid":"923015068","full_name":"codbex/codbex-phoebe","owner":"codbex","description":"codbex Apache Airflow project","archived":false,"fork":false,"pushed_at":"2026-02-09T09:01:58.000Z","size":3186,"stargazers_count":0,"open_issues_count":3,"forks_count":0,"subscribers_count":7,"default_branch":"main","last_synced_at":"2026-02-09T14:08:33.655Z","etag":null,"topics":["platform"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"epl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/codbex.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-01-27T13:55:33.000Z","updated_at":"2026-02-09T08:50:43.000Z","dependencies_parsed_at":"2025-02-07T13:21:03.851Z","dependency_job_id":"29d11b5f-441b-4710-8568-6e40a5f39fb0","html_url":"https://github.com/codbex/codbex-phoebe","commit_stats":null,"previous_names":["codbex/codbex-phoebe"],"tags_count":56,"template":false,"template_full_name":null,"purl":"pkg:github/codbex/codbex-phoebe","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codbex%2Fcodbex-phoebe","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codbex%2Fcodbex-phoebe/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codbex%2Fcodbex-phoebe/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codbex%2Fcodbex-phoebe/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/codbex","download_url":"https://codeload.github.com/codbex/codbex-phoebe/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codbex%2Fcodbex-phoebe/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29574123,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-18T08:38:15.585Z","status":"ssl_error","status_checked_at":"2026-02-18T08:38:14.917Z","response_time":162,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["platform"],"created_at":"2026-01-11T16:54:30.906Z","updated_at":"2026-02-18T09:11:51.795Z","avatar_url":"https://github.com/codbex.png","language":"Java","readme":"# Phoebe by codbex\n\n[![Build Status](https://github.com/codbex/codbex-phoebe/actions/workflows/build.yaml/badge.svg)](https://github.com/codbex/codbex-phoebe/actions/workflows/build.yaml)\n[![Eclipse License](https://img.shields.io/badge/License-EPL%202.0-brightgreen.svg)](https://github.com/codbex/codbex-phoebe/blob/main/LICENSE)\n[![Maven Central](https://img.shields.io/maven-central/v/com.codbex.phoebe/codbex-phoebe-application.svg)](https://central.sonatype.com/namespace/com.codbex.phoebe)\n\nWeb IDE for [Apache Airflow](https://airflow.apache.org/) workflows development.\n\n\u003c!-- TOC --\u003e\n\n* [Phoebe by codbex](#phoebe-by-codbex)\n    * [Description](#description)\n    * [Run steps](#run-steps)\n        * [Start using Docker, SQLite and released image](#start-using-docker-sqlite-and-released-image)\n            * [Start Docker image](#start-docker-image)\n        * [Start using Docker, PostgreSQL and released image](#start-using-docker-postgresql-and-released-image)\n            * [Start PostgreSQL](#start-postgresql)\n            * [Start Docker image](#start-docker-image-1)\n        * [Build the project jar](#build-the-project-jar)\n        * [Start using Docker Compose and local sources](#start-using-docker-compose-and-local-sources)\n        * [Java standalone application](#java-standalone-application)\n            * [Start Airflow](#start-airflow)\n                * [Option 1 - using SQLite](#option-1---using-sqlite)\n                * [Option 2 - using PostgreSQL](#option-2---using-postgresql)\n            * [Start the application](#start-the-application)\n        * [Multi-platform Docker build](#multi-platform-docker-build)\n            * [Spring profiles](#spring-profiles)\n        * [Run unit tests](#run-unit-tests)\n        * [Run integration tests](#run-integration-tests)\n        * [Run all tests](#run-all-tests)\n        * [Format the code](#format-the-code)\n    * [Configurations](#configurations)\n    * [Access the application](#access-the-application)\n\n\u003c!-- TOC --\u003e\n\n## Description\n\nPhoebe is a Web IDE which allows you to write [Apache Airflow](https://airflow.apache.org/) application in an efficient\nway.\n\nIt has the following perspectives:\n\n- Workbench\n  ![workbench](misc/images/workbench.png)\n- Integrated Apache Airflow instance and embedded Apache Airflow Web UI\n  ![airflow-ui](misc/images/airflow-ui.png)\n- Git\n  ![git-perspective](misc/images/git-perspective.png)\n- Database Management\n  ![db-perspective](misc/images/db-perspective.png)\n- Terminal\n  ![terminal](misc/images/terminal.png)\n\nIt also helps you to easily start your work using the defined Apache Airflow starter template.\n\n## Run steps\n\n__Prerequisites:__\n\n- Export the following variables before executing the steps\n  ```shell\n  export GIT_REPO_FOLDER='\u003cpath-to-the-git-repo\u003e'\n  \n  export PHOEBE_CONTAINER_NAME='phoebe'\n  export DEV_IMAGE='codbex-phoebe:dev'\n  export PHOEBE_IMAGE='ghcr.io/codbex/codbex-phoebe:latest'\n  \n  export PHOEBE_AIRFLOW_POSTGRES_USER=\"postgres\"\n  export PHOEBE_AIRFLOW_POSTGRES_PASS=\"postgres\"\n  export PHOEBE_AIRFLOW_POSTGRES_DB=\"postgres\"\n  \n  export AIRFLOW_WORK_DIR=\"$HOME/airflow_work\"\n  export PHOEBE_AIRFLOW_WORK_DIR=\"$AIRFLOW_WORK_DIR\"\n\n  export GITHUB_USERNAME='\u003cyour-github-user\u003e'\n\n  ```\n\n### Start using Docker, SQLite and released image\n\n#### Start Docker image\n\n```shell\ndocker rm -f \"$PHOEBE_CONTAINER_NAME\"\n\ndocker pull \"$PHOEBE_IMAGE\"\n\ndocker run --name \"$PHOEBE_CONTAINER_NAME\"  \\\n    -p 80:80 \\\n    $PHOEBE_IMAGE\n\n```\n\n__Note:__ SQLite is located at path `/opt/airflow/airflow.db`\n\n### Start using Docker, PostgreSQL and released image\n\n#### Start PostgreSQL\n\nThe instance which will be used for Airflow DB or used existing DB instance.\n\n```shell\ndocker rm -f postgres\n\ndocker run --name postgres \\\n  -e POSTGRES_PASSWORD=\"$PHOEBE_AIRFLOW_POSTGRES_PASS\" \\\n  -e POSTGRES_USER=\"$PHOEBE_AIRFLOW_POSTGRES_USER\" \\\n  -e POSTGRES_DB=\"$PHOEBE_AIRFLOW_POSTGRES_DB\" \\\n  -p 5432:5432 \\\n  -d postgres:16\n  \n```\n\n#### Start Docker image\n\n```shell\ndocker rm -f \"$PHOEBE_CONTAINER_NAME\"\n\ndocker pull \"$PHOEBE_IMAGE\"\n\ndocker run --name \"$PHOEBE_CONTAINER_NAME\"  \\\n    -p 80:80 \\\n    -e PHOEBE_AIRFLOW_POSTGRES_USER=\"$PHOEBE_AIRFLOW_POSTGRES_USER\" \\\n    -e PHOEBE_AIRFLOW_POSTGRES_PASS=\"$PHOEBE_AIRFLOW_POSTGRES_PASS\" \\\n    -e PHOEBE_AIRFLOW_POSTGRES_HOST=\"host.docker.internal\" \\\n    -e PHOEBE_AIRFLOW_POSTGRES_DB=\"$PHOEBE_AIRFLOW_POSTGRES_DB\" \\\n    $PHOEBE_IMAGE\n    \n```\n\n---\n\n### Build the project jar\n\n```shell\ncd $GIT_REPO_FOLDER\n\nmvn -T 1C clean install -P quick-build\n\n```\n\n---\n\n### Start using Docker Compose and local sources\n\n__Prerequisites:__ [Build the project jar](#build-the-project-jar)\n\n  ```shell\n  cd \"$GIT_REPO_FOLDER/application\"\n  \n  # cleanup\n  docker rm -f \"$PHOEBE_CONTAINER_NAME\"\n  docker compose down -v\n  \n  # To force rebuild add --build\n  # Needed when you modify something in Dockerfile or in the application\n  docker compose up --build\n  \n  ```\n\n--- \n\n### Java standalone application\n\n#### Start Airflow\n\n##### Option 1 - using SQLite\n\n- Start Airflow locally\n    ```shell\n    cd \"$GIT_REPO_FOLDER\"\n    \n    docker rm -f airflow\n    \n    docker run --name airflow  \\\n       -p 8080:8080 \\\n       -v \"$AIRFLOW_WORK_DIR/dags:/opt/airflow/dags\" \\\n       -v \"$AIRFLOW_WORK_DIR/logs:/opt/airflow/logs\" \\\n       -v \"$AIRFLOW_WORK_DIR/config:/opt/airflow/config\" \\\n       -e AIRFLOW__CORE__LOAD_EXAMPLES=False \\\n       -e _AIRFLOW_DB_MIGRATE=true \\\n       -e AIRFLOW__SCHEDULER__DAG_DIR_LIST_INTERVAL=5 \\\n       -e AIRFLOW__CORE__EXECUTOR=LocalExecutor \\\n       -e AIRFLOW__CORE__SIMPLE_AUTH_MANAGER_ALL_ADMINS=True \\\n       -d apache/airflow:3.0.2 standalone\n    ```\n- Ensure Airflow is started at [http://localhost:8080](http://localhost:8080)\n\n##### Option 2 - using PostgreSQL\n\n- [Start PostgreSQL](#start-postgresql)\n\n- Start Airflow locally\n    ```shell\n    cd \"$GIT_REPO_FOLDER\"\n    \n    docker rm -f airflow\n    \n    docker run --name airflow  \\\n       -p 8080:8080 \\\n       -v \"$AIRFLOW_WORK_DIR/dags:/opt/airflow/dags\" \\\n       -v \"$AIRFLOW_WORK_DIR/logs:/opt/airflow/logs\" \\\n       -v \"$AIRFLOW_WORK_DIR/config:/opt/airflow/config\" \\\n       -e AIRFLOW__CORE__LOAD_EXAMPLES=False \\\n       -e _AIRFLOW_DB_MIGRATE=true \\\n       -e AIRFLOW__SCHEDULER__DAG_DIR_LIST_INTERVAL=5 \\\n       -e AIRFLOW__CORE__EXECUTOR=LocalExecutor \\\n       -e AIRFLOW__CORE__SIMPLE_AUTH_MANAGER_ALL_ADMINS=True \\\n       -e AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=\"postgresql+psycopg2://$PHOEBE_AIRFLOW_POSTGRES_USER:$PHOEBE_AIRFLOW_POSTGRES_PASS@host.docker.internal:5432/$PHOEBE_AIRFLOW_POSTGRES_DB\" \\\n       -d apache/airflow:3.0.2 standalone\n    ```\n- Ensure Airflow is started at [http://localhost:8080](http://localhost:8080)\n\n#### Start the application\n\n- [Build the project jar](#build-the-project-jar)\n\n- Start the application\n    ```shell\n    cd \"$GIT_REPO_FOLDER\"\n  \n    java \\\n        --add-opens=java.base/java.lang=ALL-UNNAMED \\\n        --add-opens=java.base/java.lang.reflect=ALL-UNNAMED \\\n        --add-opens=java.base/java.nio=ALL-UNNAMED \\\n        -jar application/target/*executable*.jar\n  \n    ```\n\n- Start the application **in debug** with debug port `8000`\n    ```shell\n    cd \"$GIT_REPO_FOLDER\"\n  \n    java \\\n        -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 \\\n        --add-opens=java.base/java.lang=ALL-UNNAMED \\\n        --add-opens=java.base/java.lang.reflect=ALL-UNNAMED \\\n        --add-opens=java.base/java.nio=ALL-UNNAMED \\\n        -jar application/target/*executable*.jar\n  \n    ```\n\n---\n\n### Multi-platform Docker build\n\n__Prerequisites:__ [Build the project jar](#build-the-project-jar)\n\n```shell\ncd \"$GIT_REPO_FOLDER/application\"\n\nexport DOCKER_CLI_EXPERIMENTAL=enabled\ndocker buildx create --use\n\n# build image for linux/amd64\ndocker buildx build --platform linux/amd64 -t $DEV_IMAGE --load .\n\n# build image for linux/arm64\ndocker buildx build --platform linux/arm64 -t $DEV_IMAGE --load .\n\n# build images for both platforms\ndocker buildx build --platform=linux/arm64,linux/amd64 -t $DEV_IMAGE -o type=image .\n\n# build multiplatform images and push them to GitHub Container Registry\ndocker login ghcr.io -u \"$GITHUB_USERNAME\"\n\ndocker buildx build \\\n    --platform linux/amd64,linux/arm64 \\\n    -t \"ghcr.io/$GITHUB_USERNAME/$DEV_IMAGE\" \\\n    --push .\n    \n## pull images locally\n\n# linux/amd64\ndocker pull \"ghcr.io/$GITHUB_USERNAME/$DEV_IMAGE\" --platform linux/amd64\n\n# linux/arm64\ndocker pull \"ghcr.io/$GITHUB_USERNAME/$DEV_IMAGE\" --platform linux/arm64\n\n```\n\n#### Spring profiles\n\n- Eclipse Dirigible profiles\n  To activate Eclipse Dirigible, you have to add profiles `common` and `app-default` explicitly.\u003cbr\u003e\n  Example for profile `snowflake`: `SPRING_PROFILES_ACTIVE=common,snowflake,app-default`\n\n---\n\n### Run unit tests\n\n```shell\ncd \"$GIT_REPO_FOLDER\"\nmvn clean install -P unit-tests\n\n```\n\n---\n\n### Run integration tests\n\n```shell\ncd \"$GIT_REPO_FOLDER\"\nmvn clean install -P integration-tests\n\n```\n\n---\n\n### Run all tests\n\n```shell\ncd \"$GIT_REPO_FOLDER\"\nmvn clean install -P tests\n\n```\n\n---\n\n### Format the code\n\n```shell\ncd \"$GIT_REPO_FOLDER\"\nmvn verify -P format\n\n```\n\n---\n\n## Configurations\n\nThe following configurations are available:\n\n| Name                         | Description                                              | Default value           |\n|------------------------------|----------------------------------------------------------|-------------------------|\n| PHOEBE_AIRFLOW_URL           | The URL of the Airflow URL                               | `http://localhost:8080` |\n| PHOEBE_AIRFLOW_WORK_DIR      | Airflow working directory                                | `/opt/airflow`          |\n| PHOEBE_AIRFLOW_POSTGRES_USER | Docker config for Airflow PostgreSQL user                | no default value        |\n| PHOEBE_AIRFLOW_POSTGRES_PASS | Docker config for Airflow PostgreSQL password            | no default value        |\n| PHOEBE_AIRFLOW_POSTGRES_DB   | Docker config for Airflow PostgreSQL DB name             | no default value        |\n| PHOEBE_AIRFLOW_POSTGRES_HOST | Docker config for Airflow PostgreSQL host                | no default value        |\n| DIRIGIBLE_BASIC_USERNAME     | Phoebe admin username. The value must be Base64 encoded. | `YWRtaW4=`              |\n| DIRIGIBLE_BASIC_PASSWORD     | Phoebe admin password. The value must be Base64 encoded. | `YWRtaW4=`              |\n\n__Note__: `PHOEBE_AIRFLOW_POSTGRES_USER`, `PHOEBE_AIRFLOW_POSTGRES_PASS`, `PHOEBE_AIRFLOW_POSTGRES_DB` and\n`PHOEBE_AIRFLOW_POSTGRES_HOST` are optional. If one of them is not provided, SQLite will be used for Airflow DB.\n\nDepending on the use case these configurations could be set in different ways.\n\n- For java standalone application they could be set as environment variables.\n    ```shell\n    export PHOEBE_AIRFLOW_URL='http://localhost:8080'\n    java -jar ...\n    ```\n- For docker run\n    ```shell\n    docker run --name \"$PHOEBE_CONTAINER_NAME\"  \\\n        -p 80:80 \\\n        -e PHOEBE_AIRFLOW_POSTGRES_USER=\"$PHOEBE_AIRFLOW_POSTGRES_USER\" \\\n        -e PHOEBE_AIRFLOW_POSTGRES_PASS=\"$PHOEBE_AIRFLOW_POSTGRES_PASS\" \\\n        -e PHOEBE_AIRFLOW_POSTGRES_HOST=\"host.docker.internal\" \\\n        -e PHOEBE_AIRFLOW_POSTGRES_DB=\"$PHOEBE_AIRFLOW_POSTGRES_DB\" \\\n        $PHOEBE_IMAGE\n  \n    ```\n- When using docker compose they could be set in the `docker-compose.yml` file.\n    ```yaml\n    services:\n      phoebe:\n        environment:\n          PHOEBE_AIRFLOW_POSTGRES_USER: postgres\n          PHOEBE_AIRFLOW_POSTGRES_PASS: postgres\n          PHOEBE_AIRFLOW_POSTGRES_HOST: host.docker.internal\n          PHOEBE_AIRFLOW_POSTGRES_DB: postgres\n    ```\n\n---\n\n## Access the application\n\n- Open URL [http://localhost](http://localhost) in your browser\n- Login with default credentials `admin` / `admin`\n\n--- \n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodbex%2Fcodbex-phoebe","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcodbex%2Fcodbex-phoebe","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodbex%2Fcodbex-phoebe/lists"}