Files
linumiq-invoice/deploy/README.md
T
Gerhard Scheikl 9557a3b335 deploy: split into dev/prod with separate Shopify configs and containers
- shopify.app.toml -> shopify.app.dev.toml (domain: invoice-app-dev.linumiq.com)
- New shopify.app.prod.toml will be created via shopify app config link --config prod
- docker-compose split into deploy/docker-compose.{dev,prod}.yml with distinct
  container names (linumiq-invoice-{dev,prod}), images, env files and bind mounts
- Caddyfile snippet maps both subdomains to their respective containers
- .env.{dev,prod}.example templates committed in deploy/
- deploy/README.md documents the layout and day-to-day workflow
2026-05-08 21:41:22 +02:00

3.0 KiB

Deployment

Two independent deployments share the same codebase and Docker image build:

env container backend domain install target partner-dashboard app shopify config
dev linumiq-invoice-dev invoice-app-dev.linumiq.com linumiq-dev.myshopify.com linumiq-invoice-dev shopify.app.dev.toml
prod linumiq-invoice-prod invoice-app.linumiq.com 5aiizq-ti.myshopify.com (= shop.linumiq.com) linumiq-invoice (prod) shopify.app.prod.toml

Server layout (root server)

/docker/linumiq-invoice/
├── git/                       # checkout of this repo (git pull here)
├── dev/
│   ├── docker-compose.yml     # symlink → ../git/deploy/docker-compose.dev.yml
│   ├── .env.dev               # secrets (NOT in git)
│   └── data/                  # bind-mounted SQLite + cached assets
└── prod/
    ├── docker-compose.yml     # symlink → ../git/deploy/docker-compose.prod.yml
    ├── .env.prod              # secrets (NOT in git)
    └── data/                  # bind-mounted SQLite + cached assets

Both containers attach to the external caddy_net Docker network. Caddy reverse-proxies each subdomain to the correct container by name (see Caddyfile.snippet).

First-time setup on the server

sudo mkdir -p /docker/linumiq-invoice/{git,dev/data,prod/data}
sudo chown -R "$USER" /docker/linumiq-invoice

cd /docker/linumiq-invoice
git clone git@git.linumiq.com:LinumIQ/linumiq-invoice.git git

# DEV
cd /docker/linumiq-invoice/dev
ln -s ../git/deploy/docker-compose.dev.yml docker-compose.yml
cp ../git/deploy/.env.dev.example .env.dev   # then edit secrets
docker compose up -d --build

# PROD
cd /docker/linumiq-invoice/prod
ln -s ../git/deploy/docker-compose.prod.yml docker-compose.yml
cp ../git/deploy/.env.prod.example .env.prod   # then edit secrets
docker compose up -d --build

Append Caddyfile.snippet to your Caddy config and docker exec caddy caddy reload --config /etc/caddy/Caddyfile.

Day-to-day redeploy

cd /docker/linumiq-invoice/git && git pull
cd /docker/linumiq-invoice/dev  && docker compose up -d --build   # update dev
cd /docker/linumiq-invoice/prod && docker compose up -d --build   # update prod

Run only the env you want to update.

Pushing config / extension changes to Shopify

From your dev machine (after git pull to keep configs in sync):

# DEV  → linumiq-dev.myshopify.com
npx shopify app config use shopify.app.dev.toml
npx shopify app deploy --allow-updates

# PROD → shop.linumiq.com
npx shopify app config use shopify.app.prod.toml
npx shopify app deploy --allow-updates

The currently selected config is stored in .shopify/project.json (gitignored), so each developer machine remembers its own choice.