Hello, I have a REST API server deployed with fly. I want to create a new record in my Mongo database at a specific time every day, which I assume isn’t possible with something like node-cron
since the api server wouldn’t be running 24/7. So I followed the steps in this guide Crontab with Supercronic · Fly Docs.
Unfortunately I’m not very familiar with Docker files or what Fly does under the hood, so I’ve tried to modify the files so that in theory I could run a specific javascript file everyday:
Dockerfile:
# Latest releases available at https://github.com/aptible/supercronic/releases
ENV SUPERCRONIC_URL=https://github.com/aptible/supercronic/releases/download/v0.2.1/supercronic-linux-amd64 \
SUPERCRONIC=supercronic-linux-amd64 \
SUPERCRONIC_SHA1SUM=d7f4c0886eb85249ad05ed592902fa6865bb9d70
RUN curl -fsSLO "$SUPERCRONIC_URL" \
&& echo "${SUPERCRONIC_SHA1SUM} ${SUPERCRONIC}" | sha1sum -c - \
&& chmod +x "$SUPERCRONIC" \
&& mv "$SUPERCRONIC" "/usr/local/bin/${SUPERCRONIC}" \
&& ln -s "/usr/local/bin/${SUPERCRONIC}" /usr/local/bin/supercronic
# You might need to change this depending on where your crontab is located
COPY crontab crontab
FROM node:17-alpine as build-image
WORKDIR /usr/src/app
COPY package*.json ./
COPY tsconfig.json ./
COPY ./src ./src
RUN npm ci
RUN npx tsc
FROM node:17-alpine
WORKDIR /usr/src/app
COPY package*.json ./
COPY --from=build-image ./usr/src/app/dist ./dist
RUN npm ci --production
COPY . .
EXPOSE 8080
CMD [ "node", "dist/app.js" ]
fly.toml:
app = ""
kill_signal = "SIGINT"
kill_timeout = 5
primary_region = "mia"
processes = []
[build]
[env]
PORT = "8080"
[experimental]
auto_rollback = true
[[services]]
processes = ["app", "web"]
http_checks = []
internal_port = 8080
processes = ["app", "web"]
protocol = "tcp"
script_checks = []
[services.concurrency]
hard_limit = 25
soft_limit = 20
type = "connections"
[[services.ports]]
force_https = true
handlers = ["http"]
port = 80
[[services.ports]]
handlers = ["tls", "http"]
port = 443
[[services.tcp_checks]]
grace_period = "1s"
interval = "15s"
restart_limit = 0
timeout = "2s"
[processes]
# The command below is used to launch a Rails server; be sure to
# replace with the command you're using to launch your server.
web = "node dist/src/scripts/dailyReset.js"
cron = "supercronic /app/crontab"
This causes the deployment to fail at this stage:
Error: failed to fetch an image or build from source: error building: failed to solve with frontend dockerfile.v0: failed to create LLB definition: no build stage in current context
And I first wanted to confirm whether what I’m trying to do was even possible, or if I’d have to create a different app specifically to perform this one scheduled job. Thank you.