Verified on Portainer 2.45: an inline/web-editor stack with `build: .` fails with "compose build operation failed: failed to solve: failed to read dockerfile: open …/Dockerfile: no such file or directory". - README + docs/QUICKSTART-PORTAINER: Route 1 = Repository deploy (Portainer clones the repo, so build: . resolves), staged so NocoDB comes up first and the base id/token are added afterwards; Route 2 = web editor with a hand-built image and the build: line removed - docker-compose.allinone.yml header: same correction - validated with: docker compose -f docker-compose.allinone.yml config
5.5 KiB
Quick start on Portainer (click-by-click)
For a fresh machine, no shell needed. Portainer runs the same compose file as the CLI flow — see the README for that version.
Before you start: Portainer must already be up and connected to a Docker endpoint, and its container needs access to the Docker socket (the standard install does). NocoDB needs one free host port — 8080 by default.
One thing to know up front: the monitor's image is built from this repository (build: .). Portainer's Web editor and Upload options have no build context, so they cannot build it:
compose build operation failed: failed to solve: failed to read dockerfile:
open /volume1/@docker/tmp/buildkit-mount…/Dockerfile: no such file or directory
That leaves two routes. Route 1 needs no shell.
Route 1 — deploy from the Git repository (recommended)
-
Stacks → Add stack
-
Name:
carousell-monitor -
Build method: Repository
-
Repository URL:
https://github.com/hoelee/carousell-monitorReference:refs/heads/mainCompose path:docker-compose.allinone.yml -
Environment variables — add:
Variable Value NC_AUTH_JWT_SECREToutput of openssl rand -hex 32TELEGRAM_BOT_TOKENfrom @BotFather TELEGRAM_CHAT_IDfrom @userinfobot NOCODB_PORToptional, default 8080Add
NOCODB_TOKENandNOCODB_BASE_IDtoo if you already have them (e.g. you are reusing an existing NocoDB). On a fresh install you cannot: they do not exist yet. Leave them empty. -
Deploy the stack.
carousell-nocodbcomes up healthy.carousell-monitorwill restart in a short loop loggingNOCODB_TOKEN not set— expected, it needs the values from step 8. Stop that container for now if you prefer a clean list.
2. Create the base and collect the two values
Open http://<your-host>:8080:
- Create the admin account.
- Create a base (
+ New Base) — call itCarousell. - Copy the base id from the URL (
…/nc/base/<BASE_ID>/…). - Avatar (bottom-left) → Account Settings → Tokens → Create token, copy the
nc_pat_…value. It is shown once. - Do not create tables by hand — the monitor does that on start.
3. Hand the values to the monitor
-
Stacks → carousell-monitor → Editor (or Environment variables).
-
Fill in
NOCODB_BASE_IDandNOCODB_TOKEN, then Update the stack. -
Portainer recreates the monitor. Containers → carousell-monitor → Logs should now end with one line:
ready: listings=… settings=… ignored_sellers=… ignored_keywords=… seen=0and the container status should be
healthywithin a couple of minutes.⚠️ Portainer masks secret-looking values typed into its environment panel and stores the mask (
***) with the stack — on a later stack update the container receives***and authentication silently fails. If that happens, put the real values directly in the YAML in the Editor tab instead of the panel.
4. Start using it
In NocoDB, open the base — four tables now exist (Listings, Settings, IgnoredSellers, IgnoredKeywords). Add your first watch to Settings (details), give it a minute, then untick notified on any Listings row to force a test alert into Telegram.
Route 2 — Web editor, with the image built by hand first
Use this when Portainer cannot reach your Git host, or you want a self-contained stack file.
# on the Docker host (or anywhere with access to its daemon)
git clone https://github.com/hoelee/carousell-monitor.git
cd carousell-monitor
docker build -t carousell-monitor:latest .
Then:
- Stacks → Add stack → Web editor, name it
carousell-monitor. - Paste
docker-compose.allinone.ymland remove thebuild: .line from thecarousell-monitorservice — abuild:entry in a web-editor stack can only fail (no Dockerfile in Portainer's stack directory). - Fill in
NC_AUTH_JWT_SECRET,NOCODB_PORT, and the Telegram values. Deploy, then follow §2 and §3 above to add the base id and token.
Updating the code later:
git pull && docker build -t carousell-monitor:latest .
then Update the stack in Portainer.
Everyday maintenance in Portainer
| Task | Where |
|---|---|
| Change a search / filter | NocoDB UI — nothing to redeploy |
| Change credentials or tuning | Stacks → carousell-monitor → Editor → Update the stack |
| Deploy a code change | Route 1: Update the stack (Portainer re-clones). Route 2: git pull && docker build …, then Update the stack |
| See why it is unhealthy | Containers → carousell-monitor → Logs, then Listings / Settings in NocoDB for the real progress |
| Restart | Containers → carousell-monitor → Restart — state is in NocoDB, nothing is lost |
| Back up | Volumes → nocodb-data (all data), or NocoDB's own base export |
| Upgrade NocoDB | edit the image tag in the Editor → Update the stack; back the volume up first |
Notes and limits
- A Repository stack re-clones the repo on every deploy, so the update is always a full fetch of
main. That is fine here (the repo is small) and it means you get fixes by pressing one button. - Portainer deploys standalone compose stacks for this — no Swarm involved.
- GitOps updates (auto-redeploy when the repo changes) work too: enable them in the stack settings after the first deploy.