├── .env.example ├── .github └── workflows │ ├── embedded-build-package.yml │ ├── publish-beta.yml │ └── publish-release.yml ├── .gitignore ├── FUNDING.yml ├── README.md └── docker-compose.yml /.env.example: -------------------------------------------------------------------------------- 1 | ###> Econumo app ### 2 | 3 | # Enable or disable registration in Econumo. 4 | ECONUMO_ALLOW_REGISTRATION=true 5 | 6 | # Automatically connect registered users to enable sharing of budgets and accounts with each other. 7 | # Setting this to false will prevent users from sharing budgets and accounts. 8 | ECONUMO_CONNECT_USERS=true 9 | 10 | # Configure MAILER_DSN to receive emails for the password recovery: 11 | # MAILER_DSN=smtp://user:pass@smtp.example.com:25 12 | 13 | # Uncomment this if you use multi currencies: 14 | # Check for more details: https://econumo.com/docs/self-hosting/multi-currency/ 15 | # ECONUMO_CURRENCY_BASE=USD 16 | 17 | # To enable the System API (api/v1/system/) uncomment the following string (its disabled by default): 18 | # Check for more details: https://econumo.com/docs/api/ 19 | # ECONUMO_SYSTEM_API_KEY=REPLACE_WITH_RANDOM_STRING 20 | ###< Econumo app ### 21 | 22 | 23 | ###> Security options ### 24 | APP_ENV=prod 25 | APP_SECRET=REPLACE_WITH_RANDOM_STRING 26 | 27 | # The steps below are not mandatory to run Econumo; 28 | # however, it is recommended to change the default passphrase before deploying to production and to regenerate the keys. 29 | # To regenerate keys: 30 | # 1. Replace the passphrase 31 | #JWT_PASSPHRASE=d78eedcb16c13bd949ede5d1b8b910cd 32 | # 2. Create `jwt` folder and uncomment the mount to `/var/www/config/jwt/` in your docker-compose.yml 33 | # 3. Use `docker-compose exec -uwww-data econumo bin/console lexik:jwt:generate-keypair --overwrite` command to regenerate keys 34 | 35 | # Alternatively, you can use the following environment variables with paths or actual values: 36 | #JWT_SECRET_KEY=%kernel.project_dir%/config/jwt/private.pem 37 | #JWT_PUBLIC_KEY=%kernel.project_dir%/config/jwt/public.pem 38 | ###< Security options ### 39 | -------------------------------------------------------------------------------- /.github/workflows/embedded-build-package.yml: -------------------------------------------------------------------------------- 1 | on: 2 | workflow_call: 3 | inputs: 4 | REGISTRY: 5 | required: true 6 | type: string 7 | default: 'docker.io' 8 | IMAGE_NAME: 9 | required: true 10 | type: string 11 | IMAGE_TAGS: 12 | required: true 13 | type: string 14 | description: 'Comma-separated list of tags (e.g., "latest,1.0.0,1.0")' 15 | secrets: 16 | DOCKER_USERNAME: 17 | required: true 18 | DOCKER_PASSWORD: 19 | required: true 20 | BUILD_USER_TOKEN: 21 | required: true 22 | 23 | jobs: 24 | build-package: 25 | runs-on: ubuntu-latest 26 | permissions: 27 | contents: read 28 | packages: write 29 | 30 | steps: 31 | - name: Checkout Build Configurations Repository 32 | uses: actions/checkout@v4 33 | with: 34 | repository: econumo/build-configuration 35 | ref: main 36 | token: ${{ secrets.BUILD_USER_TOKEN }} 37 | path: build 38 | 39 | - name: Checkout Backend Repository 40 | uses: actions/checkout@v4 41 | with: 42 | repository: econumo/econumo-backend 43 | ref: main 44 | token: ${{ secrets.BUILD_USER_TOKEN }} 45 | path: backend 46 | 47 | - name: Checkout Frontend Repository 48 | uses: actions/checkout@v4 49 | with: 50 | repository: econumo/econumo-ce-frontend 51 | ref: main 52 | token: ${{ secrets.BUILD_USER_TOKEN }} 53 | path: frontend 54 | 55 | - name: Clean Unnecessary Folders 56 | run: | 57 | rm -rf frontend/.git 58 | rm -rf backend/.git 59 | rm -rf build/.git 60 | 61 | - name: Set Up QEMU 62 | uses: docker/setup-qemu-action@v2 63 | with: 64 | platforms: all 65 | 66 | - name: Log in to Docker Registry 67 | uses: docker/login-action@v2 68 | with: 69 | username: ${{ secrets.DOCKER_USERNAME }} 70 | password: ${{ secrets.DOCKER_PASSWORD }} 71 | registry: ${{ inputs.REGISTRY }} 72 | 73 | - name: Set up Docker Buildx 74 | uses: docker/setup-buildx-action@v3 75 | with: 76 | install: true 77 | 78 | - name: Prepare Docker Image Tags 79 | id: prep 80 | run: | 81 | TAGS="" 82 | IFS=',' read -ra TAG_ARRAY <<< "${{ inputs.IMAGE_TAGS }}" 83 | for tag in "${TAG_ARRAY[@]}"; do 84 | IMAGE_TAG="${{ inputs.REGISTRY }}/${{ inputs.IMAGE_NAME }}:${tag}" 85 | if [ -n "$TAGS" ]; then 86 | TAGS="${TAGS}," 87 | fi 88 | TAGS="${TAGS}${IMAGE_TAG}" 89 | done 90 | echo "tags=${TAGS}" >> $GITHUB_OUTPUT 91 | 92 | - name: Build and Push Multi-Arch Docker Image 93 | uses: docker/build-push-action@v3 94 | with: 95 | context: . 96 | push: true 97 | pull: true 98 | file: build/docker/app/Dockerfile 99 | tags: ${{ steps.prep.outputs.tags }} 100 | cache-from: type=registry,ref=${{ inputs.REGISTRY }}/${{ inputs.IMAGE_NAME }}:beta 101 | cache-to: type=inline 102 | platforms: linux/amd64,linux/arm64 103 | -------------------------------------------------------------------------------- /.github/workflows/publish-beta.yml: -------------------------------------------------------------------------------- 1 | name: Publish Beta 2 | 3 | on: 4 | workflow_dispatch: 5 | workflow_call: 6 | secrets: 7 | BUILD_USER_TOKEN: 8 | required: true 9 | repository_dispatch: 10 | types: [distribute-beta] 11 | 12 | concurrency: 13 | group: 'docker-publish-beta' 14 | cancel-in-progress: true 15 | 16 | jobs: 17 | publish-beta: 18 | uses: ./.github/workflows/embedded-build-package.yml 19 | with: 20 | REGISTRY: 'docker.io' 21 | IMAGE_NAME: 'econumo/econumo-ce' 22 | IMAGE_TAGS: 'beta' 23 | secrets: 24 | DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} 25 | DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} 26 | BUILD_USER_TOKEN: ${{ secrets.BUILD_USER_TOKEN }} 27 | -------------------------------------------------------------------------------- /.github/workflows/publish-release.yml: -------------------------------------------------------------------------------- 1 | name: Publish Release 2 | 3 | on: 4 | release: 5 | types: [published] 6 | 7 | workflow_dispatch: 8 | inputs: 9 | version: 10 | description: 'Tag to publish (e.g., v1.2.3 or beta)' 11 | required: true 12 | 13 | concurrency: 14 | group: 'docker-publish-release' 15 | cancel-in-progress: true 16 | 17 | jobs: 18 | set-version: 19 | runs-on: ubuntu-latest 20 | outputs: 21 | version: ${{ steps.set-version.outputs.version }} 22 | steps: 23 | - name: Determine Version 24 | id: set-version 25 | run: | 26 | if [[ "${{ github.event_name }}" == "workflow_dispatch" && "${{ github.event.inputs.version }}" != "" ]]; then 27 | echo "version=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT 28 | echo "Triggered manually with version: ${{ github.event.inputs.version }}" 29 | elif [[ "${{ github.event_name }}" == "release" ]]; then 30 | echo "version=${{ github.event.release.tag_name }}" >> $GITHUB_OUTPUT 31 | echo "Triggered by release with tag: ${{ github.event.release.tag_name }}" 32 | else 33 | echo "version=" >> $GITHUB_OUTPUT 34 | echo "No valid version provided. Skipping publish-release job." 35 | fi 36 | 37 | - name: Info 38 | run: | 39 | echo "Event name: ${{ github.event_name }}" 40 | echo "Release tag: ${{ github.event.release.tag_name }}" 41 | echo "Is release?: ${{ github.event_name == 'release' }}" 42 | 43 | publish-release: 44 | needs: set-version 45 | if: ${{ needs.set-version.outputs.version != '' }} 46 | uses: ./.github/workflows/embedded-build-package.yml 47 | with: 48 | REGISTRY: 'docker.io' 49 | IMAGE_NAME: 'econumo/econumo-ce' 50 | IMAGE_TAGS: "${{ needs.set-version.outputs.version }},latest,beta" 51 | secrets: 52 | DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} 53 | DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} 54 | BUILD_USER_TOKEN: ${{ secrets.BUILD_USER_TOKEN }} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .DS_Store 3 | .env -------------------------------------------------------------------------------- /FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: econumo 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | 4 | 5 |

6 | 7 |

8 | A getting started guide to self-hosting Econumo CE 9 |

10 | 11 | --- 12 | 13 | ### Prerequisites 14 | 15 | - **[Docker](https://docs.docker.com/engine/install/)** and **[Docker Compose](https://docs.docker.com/compose/install/)** must be installed on your machine. 16 | - At least **256 MB of RAM** is recommended. 17 | 18 | ### Quick start 19 | 20 | 1. Clone this repository: 21 | 22 | ```console 23 | $ git clone --single-branch https://github.com/econumo/econumo-ce econumo 24 | Cloning into 'econumo'... 25 | remote: Enumerating objects: 13, done. 26 | remote: Counting objects: 100% (10/10), done. 27 | remote: Compressing objects: 100% (9/9), done. 28 | remote: Total 13 (delta 0), reused 7 (delta 0), pack-reused 3 (from 1) 29 | Receiving objects: 100% (13/13), done. 30 | 31 | $ cd econumo 32 | 33 | $ ls -1 34 | README.md 35 | docker-compose.yml 36 | .env.example 37 | ``` 38 | 39 | 2. Create and configure your [environment](https://docs.docker.com/compose/environment-variables/) file: 40 | 41 | ```console 42 | $ cp .env.example .env 43 | ``` 44 | 45 | 3. Start the services with Docker Compose: 46 | 47 | ```console 48 | $ docker-compose up -d 49 | ``` 50 | 51 | 4. Visit your instance at `http://localhost:8181` and create the first user. 52 | 53 | > [!NOTE] 54 | > Please note that **it may take up to 90 seconds for the initial run**. When you see `nginx entered RUNNING` state in the logs, it means Econumo is ready. 55 | > 56 | > If you're interested, you can find the `Dockerfile` and `entrypoint.sh` script in the [repository](https://github.com/econumo/build-configuration). 57 | 58 | 59 | ### Next steps 60 | 61 | After installation, you may need to complete additional configuration. Please refer to the following guides: 62 | 63 | - [How to configure multi-currency support](https://econumo.com/docs/self-hosting/multi-currency/) (Econumo comes preloaded with **USD** only). 64 | - [How to configure backups](https://econumo.com/docs/self-hosting/backups/). 65 | - [Useful CLI commands](https://econumo.com/docs/self-hosting/cli-commands/). 66 | - [How to debug Econumo](https://econumo.com/docs/self-hosting/debug/). 67 | - [Econumo API](https://econumo.com/docs/api/). 68 | - [User Guide](https://econumo.com/docs/user-guide/). 69 | 70 | For more information please see our [documentation](https://econumo.com/docs/). 71 | 72 | ### Contact 73 | 74 | - For release announcements, please check [GitHub Releases](https://github.com/econumo/econumo-ce/releases) or [Econumo Website](https://econumo.com/tags/release/). 75 | - For questions, issue reporting, or advice, please use [GitHub Discussions](https://github.com/orgs/econumo/discussions). 76 | 77 | 78 | --- 79 | > [!NOTE] 80 | > Econumo CE is funded by our `GitHub Sponsors` and `Econumo` (cloud) subscribers. 81 | > 82 | > If you know someone who might [find Econumo useful](https://econumo.com/), we'd appreciate if you'd let them know. -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | services: 2 | econumo: 3 | image: econumo/econumo-ce:latest 4 | env_file: 5 | - .env 6 | ports: 7 | - "8181:80" 8 | volumes: 9 | - db:/var/www/var/db 10 | #- ./jwt:/var/www/config/jwt 11 | restart: unless-stopped 12 | 13 | # Example of the healthcheck 14 | # healthcheck: 15 | # test: ["CMD", "curl", "-f", "http://localhost/_/health-check"] 16 | # interval: 1m30s 17 | # timeout: 10s 18 | # retries: 12 19 | # start_period: 60s 20 | # start_interval: 5s 21 | 22 | volumes: 23 | db: 24 | --------------------------------------------------------------------------------