Cemetery records application for the City of Choteau, Montana. Built on Laravel 11 with multi-cemetery subdomain routing to support Choteau Municipal Cemetery and future Teton County cemeteries.
- Docker Desktop (or Docker Engine + Compose v2)
/etc/hostsentries for local development (see below)
cp .env.example .env
# Edit .env — set DB_PASSWORD at minimumAdd to your /etc/hosts (Windows: C:\Windows\System32\drivers\etc\hosts):
127.0.0.1 choteau.cemetery.test
127.0.0.1 admin.cemetery.test
Add one line per additional cemetery when testing multi-cemetery locally. Alternatively, use dnsmasq to resolve *.cemetery.test automatically — see dnsmasq wildcard setup.
docker compose build
docker compose up -d
docker compose exec app php artisan key:generate
docker compose exec app php artisan migrate
docker compose exec app php artisan db:seedOpen http://choteau.cemetery.test/ — you should see the placeholder page.
| Service | Purpose |
|---|---|
app |
PHP-FPM 8.2 — serves requests and runs Artisan commands |
nginx |
Nginx — wildcard subdomain routing for *.cemetery.test |
db |
MySQL 8.0 — primary datastore |
queue |
PHP-FPM — runs php artisan queue:work for import jobs |
# Dry run (no DB writes)
docker compose exec app php artisan cemetery:import \
--file=/data/City_of_Choteau_02.xls \
--cemetery=choteau \
--dry-run
# Live import
docker compose exec app php artisan cemetery:import \
--file=/data/City_of_Choteau_02.xls \
--cemetery=choteauMount import files in data/ (excluded from git). The compose file mounts this directory into the app container at /data.
| Environment | Pattern |
|---|---|
| Production | {slug}.cemetery.tetonmt.gov |
| Local dev | {slug}.cemetery.test |
The APP_DOMAIN env var controls which base domain is used for subdomain route groups.
AGPL-3.0 — see AGPL.txt and LICENSE.txt.