Run Tidemark Billing your way.
Use Docker on your own server, or upload a zip to the PHP hosting you already have. Same application either way, free and open source, with your data in a database you control.
Docker
For servers, VPSes and homelabs. One container with the scheduler and a queue worker built in.
- Save the file
Name it
docker-compose.ymland setAPP_URLto the address you will use. - Start it
Run
docker compose up -d. - Create your admin account
Open
/install. To skip the installer, setBILLING_ADMIN_EMAILandBILLING_ADMIN_PASSWORDinstead.
services:
billing:
image: ghcr.io/tidemark-apps/billing:latest
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- billing-data:/data
environment:
APP_URL: https://billing.example.com
volumes:
billing-data:PHP hosting
For ordinary shared hosting and cPanel, with no SSH. It needs PHP 8.3+ with common extensions.
- Upload the zip
Unzip the release and point the domain’s document root at the
public/folder. If your host won’t let you, upload it to the web root as it is: a bundled.htaccessforwards requests and blocks internals. - Open
/installTidemark Billing checks your server, connects your database (SQLite needs no setup), runs the migrations and creates your admin account.
- Add a cron job
In cPanel, under Cron Jobs, run the scheduler every minute. The billing run, reminders and the ticket mailbox depend on it.
- Set up email and payments
Add your SMTP details under Settings → Email, switch on a payment plugin under Plugins and enter its keys under Settings → Payments.
* * * * * php /home/you/billing/artisan schedule:run >> /dev/null 2>&1
Questions
Should I use Docker or the zip?
Either one gives you the same application. Use Docker if you run a server, a VPS or a homelab: it is one container that starts the scheduler and a queue worker for you, updates are a docker compose pull, and everything that changes lives in one volume. Use the zip if you are on ordinary PHP hosting, where you upload files and add one cron job.
What does it need?
PHP 8.3 or newer with the mbstring, openssl, pdo, fileinfo, ctype, tokenizer, xml, curl, bcmath and zip extensions, and one of pdo_sqlite, pdo_mysql or pdo_pgsql. The intl extension is recommended for currency formatting, and sodium is needed for the License Server plugin. The installer checks all of this for you.
Which database should I pick?
SQLite needs no setup and is a fine start for a small business. Choose MySQL, MariaDB or PostgreSQL if you want a separate database server. The Docker repository has a compose file for MariaDB.
What do I back up?
The database, the .env file and the storage folder. With the Docker image, that is the billing-data volume, which holds the SQLite database, .env, uploads, logs and extra plugins.
How do I update?
With Docker, pull the newer image and recreate the container; it applies new migrations when it starts. On PHP hosting, replace the files with the new release, keeping your .env and storage folder, and run php artisan migrate --force. Plugins can be upgraded from a zip in the admin area.
My host has no cron. Can I still run it?
Yes. Admin → Settings → System gives you a secret URL. Call it every minute from any cron service instead.
Something not working? Open an issue on GitHub.
Run it on your own server.
Open source (MIT) and yours to change.