---
title: "Deploy carnet de combat"
description: "Training log for grapplers: calendar, competitions, stats and photo gallery"
category: "Other"
url: https://railway.com/deploy/carnet-de-combat
---

# Deploy carnet de combat

Training log for grapplers: calendar, competitions, stats and photo gallery

**[Deploy carnet de combat on Railway](https://railway.com/template/carnet-de-combat)**

Machine-readable deploy manifest (JSON, validated by TemplateCI): https://railway.com/deploy/carnet-de-combat/manifest.json

- **Creator:** isma's Projects
- **Category:** Other

## Template content

### Postgres https://devicons.railway.app/i/postgresql.svg

- **Image:** ghcr.io/railwayapp-templates/postgres-ssl:18

### carnet-de-combat

- **Source:** https://github.com/ismavld/carnet-de-combat
- **Public domain:** Yes

### function-bun

- **Image:** ghcr.io/railwayapp/function-bun:1.4.4
- **Start command:** `./run.sh Ly8gaW5kZXgudHN4IChCdW4gcnVudGltZSkg4oCUIHNlcnZpY2UgImZ1bmN0aW9uLWJ1biIgc3VyIFJhaWx3YXkuCi8vIENvcGllIGRlIHLDqWbDqXJlbmNlIGR1IGNvZGUgY29sbMOpIGRhbnMgbCdvbmdsZXQgIlNvdXJjZSBDb2RlIiBkZSBsYSBmdW5jdGlvbiA6Ci8vIHRvdXRlIG1vZGlmaWNhdGlvbiBpY2kgZG9pdCDDqnRyZSByZWNvcGnDqWUgbMOgLWJhcyAoY2UgZmljaGllciBuJ2VzdCBwYXMgZMOpcGxvecOpKS4KLy8KLy8gUsO0bGUgOiByZWNldm9pciB1bmUgZGVtYW5kZSBkJ2Vudm9pIGRlcHVpcyBsJ2FwcCBQSFAgKGF1dGhlbnRpZmnDqWUgcGFyIHVuIHNlY3JldAovLyBwYXJ0YWfDqSkgZXQgbCdlbnZveWVyIHZpYSBsJ0FQSSBSZXNlbmQgYXZlYyBsZSBib24gdGVtcGxhdGUuIExhIGZ1bmN0aW9uIG5lCi8vIGNvbm5hw650IG5pIGxhIGJhc2UgbmkgbGVzIGpldG9ucyA6IGVsbGUgc2UgY29udGVudGUgZCdlbnZveWVyLgovLwovLyBHYXJkZS1mb3VzIGFudGkgInJlbGFpcyBvdXZlcnQiIDogc2V1bHMgNCB0eXBlcyBzb250IGFjY2VwdMOpcywgbCdleHDDqWRpdGV1ciBlc3QKLy8gZml4w6kgaWNpIHBhciB0eXBlIChqYW1haXMgZm91cm5pIHBhciBsJ2FwcGVsYW50KSwgZXQgbGVzIHZhcmlhYmxlcyBhdHRlbmR1ZXMKLy8gc29udCBsaXN0w6llcyBwYXIgdHlwZSAobGVzIGF1dHJlcyBzb250IGlnbm9yw6llcykuCi8vCi8vIFZhcmlhYmxlcyBSYWlsd2F5IG7DqWNlc3NhaXJlcyA6Ci8vICAgUkVTRU5EX0FQSV9LRVksIE1BSUxfU0VDUkVULAovLyAgIFRFTVBMQVRFX1ZBTElEQVRFX0lELCBURU1QTEFURV9SRVNFVF9JRCwKLy8gICBURU1QTEFURV9DSEFOR0VNQUlMX0lELCBURU1QTEFURV9DSEFOR0VNQUlMX0FMRVJUX0lECmltcG9ydCB7IEhvbm8gfSBmcm9tICJob25vQDQiOwoKdHlwZSBNYWlsVHlwZSA9ICJ2YWxpZGF0ZSIgfCAicmVzZXQiIHwgImNoYW5nZW1haWwiIHwgImNoYW5nZW1haWwtYWxlcnQiOwoKY29uc3QgTUFJTFM6IFJlY29yZDxNYWlsVHlwZSwgeyBmcm9tOiBzdHJpbmc7IHN1YmplY3Q6IHN0cmluZzsgdGVtcGxhdGU6IHN0cmluZzsgdmFyczogc3RyaW5nW10gfT4gPSB7CiAgdmFsaWRhdGU6IHsKICAgIGZyb206ICJDYXJuZXQgZGUgQ29tYmF0IDxjYy12YWxpZGF0ZUBpc21hZWwtdmlsbGFsZGVhLmZyPiIsCiAgICBzdWJqZWN0OiAiQ29uZmlybWUgdG9uIGNvbXB0ZSBDYXJuZXQgZGUgQ29tYmF0IiwKICAgIHRlbXBsYXRlOiAiVEVNUExBVEVfVkFMSURBVEVfSUQiLAogICAgdmFyczogWyJQU0VVRE8iLCAiQ09ORklSTV9VUkwiXSwKICB9LAogIHJlc2V0OiB7CiAgICBmcm9tOiAiQ2FybmV0IGRlIENvbWJhdCA8Y2MtcmVzZXRAaXNtYWVsLXZpbGxhbGRlYS5mcj4iLAogICAgc3ViamVjdDogIkNoYW5nZSB0b24gbW90IGRlIHBhc3NlIiwKICAgIHRlbXBsYXRlOiAiVEVNUExBVEVfUkVTRVRfSUQiLAogICAgdmFyczogWyJQU0VVRE8iLCAiUkVTRVRfVVJMIl0sCiAgfSwKICBjaGFuZ2VtYWlsOiB7CiAgICBmcm9tOiAiQ2FybmV0IGRlIENvbWJhdCA8Y2MtY2hhbmdlbWFpbEBpc21hZWwtdmlsbGFsZGVhLmZyPiIsCiAgICBzdWJqZWN0OiAiQ29uZmlybWUgdGEgbm91dmVsbGUgYWRyZXNzZSBlbWFpbCIsCiAgICB0ZW1wbGF0ZTogIlRFTVBMQVRFX0NIQU5HRU1BSUxfSUQiLAogICAgdmFyczogWyJQU0VVRE8iLCAiTkVXX0VNQUlMIiwgIkNPTkZJUk1fVVJMIl0sCiAgfSwKICAiY2hhbmdlbWFpbC1hbGVydCI6IHsKICAgIGZyb206ICJDYXJuZXQgZGUgQ29tYmF0IDxjYy1jaGFuZ2VtYWlsQGlzbWFlbC12aWxsYWxkZWEuZnI+IiwKICAgIHN1YmplY3Q6ICJUb24gYWRyZXNzZSBlbWFpbCBhIMOpdMOpIGNoYW5nw6llIiwKICAgIHRlbXBsYXRlOiAiVEVNUExBVEVfQ0hBTkdFTUFJTF9BTEVSVF9JRCIsCiAgICB2YXJzOiBbIlBTRVVETyIsICJORVdfRU1BSUxfTUFTS0VEIl0sCiAgfSwKfTsKCmNvbnN0IGVudiA9IChrOiBzdHJpbmcpID0+IChpbXBvcnQubWV0YS5lbnZba10gPz8gIiIpLnRyaW0oKTsKCi8vIENvbXBhcmFpc29uIGVuIHRlbXBzIGNvbnN0YW50IGR1IHNlY3JldCAow6l2aXRlIGRlIGxlIGRldmluZXIgb2N0ZXQgcGFyIG9jdGV0KS4KZnVuY3Rpb24gc2FmZUVxdWFsKGE6IHN0cmluZywgYjogc3RyaW5nKTogYm9vbGVhbiB7CiAgY29uc3QgeCA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShhKTsKICBjb25zdCB5ID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGIpOwogIGlmICh4Lmxlbmd0aCAhPT0geS5sZW5ndGggfHwgeC5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTsKICBsZXQgZGlmZiA9IDA7CiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKSBkaWZmIHw9IHhbaV0gXiB5W2ldOwogIHJldHVybiBkaWZmID09PSAwOwp9Cgpjb25zdCBpc0VtYWlsID0gKHM6IHVua25vd24pOiBzIGlzIHN0cmluZyA9PgogIHR5cGVvZiBzID09PSAic3RyaW5nIiAmJiBzLmxlbmd0aCA8PSAyNTQgJiYgL15bXlxzQDw+LDsiXStAW15cc0A8Piw7Il0rXC5bXlxzQDw+LDsiXSskLy50ZXN0KHMpOwoKY29uc3QgYXBwID0gbmV3IEhvbm8oKTsKCmFwcC5nZXQoIi9hcGkvaGVhbHRoIiwgKGMpID0+IGMuanNvbih7IHN0YXR1czogIm9rIiB9KSk7CgphcHAucG9zdCgiL3NlbmQiLCBhc3luYyAoYykgPT4gewogIGNvbnN0IHNlY3JldCA9IGVudigiTUFJTF9TRUNSRVQiKTsKICBjb25zdCBhdXRoID0gYy5yZXEuaGVhZGVyKCJhdXRob3JpemF0aW9uIikgPz8gIiI7CiAgaWYgKCFzZWNyZXQgfHwgIXNhZmVFcXVhbChhdXRoLCBgQmVhcmVyICR7c2VjcmV0fWApKSB7CiAgICByZXR1cm4gYy5qc29uKHsgZXJyb3I6ICJ1bmF1dGhvcml6ZWQiIH0sIDQwMSk7CiAgfQoKICBsZXQgYm9keTogYW55OwogIHRyeSB7CiAgICBib2R5ID0gYXdhaXQgYy5yZXEuanNvbigpOwogIH0gY2F0Y2ggewogICAgcmV0dXJuIGMuanNvbih7IGVycm9yOiAiaW52YWxpZF9qc29uIiB9LCA0MDApOwogIH0KCiAgY29uc3QgdHlwZSA9IGJvZHk/LnR5cGUgYXMgTWFpbFR5cGU7CiAgY29uc3QgbWFpbCA9IE1BSUxTW3R5cGVdOwogIGlmICghbWFpbCkgcmV0dXJuIGMuanNvbih7IGVycm9yOiAidW5rbm93bl90eXBlIiB9LCA0MDApOwogIGlmICghaXNFbWFpbChib2R5Py50bykpIHJldHVybiBjLmpzb24oeyBlcnJvcjogImludmFsaWRfdG8iIH0sIDQwMCk7CgogIGNvbnN0IHRlbXBsYXRlSWQgPSBlbnYobWFpbC50ZW1wbGF0ZSk7CiAgY29uc3QgYXBpS2V5ID0gZW52KCJSRVNFTkRfQVBJX0tFWSIpOwogIGlmICghdGVtcGxhdGVJZCB8fCAhYXBpS2V5KSByZXR1cm4gYy5qc29uKHsgZXJyb3I6ICJub3RfY29uZmlndXJlZCIsIG1pc3Npbmc6ICFhcGlLZXkgPyAiUkVTRU5EX0FQSV9LRVkiIDogbWFpbC50ZW1wbGF0ZSB9LCA1MDApOwoKICBjb25zdCB2YXJpYWJsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTsKICBmb3IgKGNvbnN0IGsgb2YgbWFpbC52YXJzKSB7CiAgICBjb25zdCB2ID0gYm9keT8udmFyaWFibGVzPy5ba107CiAgICBpZiAodHlwZW9mIHYgIT09ICJzdHJpbmciIHx8IHYgPT09ICIiIHx8IHYubGVuZ3RoID4gMjAwMCkgewogICAgICByZXR1cm4gYy5qc29uKHsgZXJyb3I6ICJpbnZhbGlkX3ZhcmlhYmxlIiwgdmFyaWFibGU6IGsgfSwgNDAwKTsKICAgIH0KICAgIHZhcmlhYmxlc1trXSA9IHY7CiAgfQoKICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgiaHR0cHM6Ly9hcGkucmVzZW5kLmNvbS9lbWFpbHMiLCB7CiAgICBtZXRob2Q6ICJQT1NUIiwKICAgIGhlYWRlcnM6IHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2FwaUtleX1gLCAiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24iIH0sCiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7CiAgICAgIGZyb206IG1haWwuZnJvbSwKICAgICAgdG86IFtib2R5LnRvXSwKICAgICAgc3ViamVjdDogbWFpbC5zdWJqZWN0LAogICAgICB0ZW1wbGF0ZTogeyBpZDogdGVtcGxhdGVJZCwgdmFyaWFibGVzIH0sCiAgICB9KSwKICB9KTsKICBjb25zdCBvdXQgPSBhd2FpdCByZXMuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpOwogIGlmICghcmVzLm9rKSB7CiAgICBjb25zb2xlLmVycm9yKCJSZXNlbmQgZXJyb3IiLCByZXMuc3RhdHVzLCBKU09OLnN0cmluZ2lmeShvdXQpKTsKICAgIHJldHVybiBjLmpzb24oeyBlcnJvcjogInJlc2VuZF9mYWlsZWQiLCBzdGF0dXM6IHJlcy5zdGF0dXMgfSwgNTAyKTsKICB9CiAgY29uc29sZS5sb2coYHNlbnQgJHt0eXBlfSBpZD0ke291dD8uaWR9YCk7CiAgcmV0dXJuIGMuanNvbih7IG9rOiB0cnVlLCBpZDogb3V0Py5pZCA/PyBudWxsIH0pOwp9KTsKCkJ1bi5zZXJ2ZSh7CiAgLy8gIjo6IiA9IMOpY291dGUgZW4gSVB2NCBFVCBJUHY2IDogbsOpY2Vzc2FpcmUgcG91ciBsZSByw6lzZWF1IHByaXbDqSBSYWlsd2F5CiAgLy8gKGZ1bmN0aW9uLWJ1bi5yYWlsd2F5LmludGVybmFsIG5lIHLDqXBvbmQgcXUnZW4gSVB2NikuCiAgaG9zdG5hbWU6ICI6OiIsCiAgcG9ydDogTnVtYmVyKGltcG9ydC5tZXRhLmVudi5QT1JUID8/IDMwMDApLAogIGZldGNoOiBhcHAuZmV0Y2gsCn0pOwo=`
- **Public domain:** Yes

## Buckets

- **Galerie**

## Documentation

# Deploy and Host Carnet de Combat with Railway

Carnet de Combat is a personal training log for grapplers (BJJ, judo, grappling): a daily training calendar, a shared competition catalogue with your own fights and medals, performance stats, and a private photo gallery. Multi-user, installable on the phone home screen.

## About Hosting Carnet de Combat

Carnet de Combat is a PHP 8.2 / Apache app built from a Dockerfile, backed by PostgreSQL. On first boot the container creates the schema and runs the migrations by itself — there is no manual setup step. Photos go to a Railway Bucket (S3-compatible) through presigned URLs, and transactional emails (account confirmation, password reset, email change) are sent by a small Bun function that calls the Resend API. Sessions live in Postgres, so they survive redeploys.

## Common Use Cases

- Log every training day (training / rest / competition) with duration, intensity and notes
- Record competition fights in real time and track wins/losses by submission or points, plus medals
- Keep a private photo gallery of competitions and trainings (1 GB per member)

## Dependencies for Carnet de Combat Hosting

- PostgreSQL (included in the template)
- A Railway Bucket for the photo gallery (included in the template)
- A Resend account with a verified sending domain and 4 published email templates

### Deployment Dependencies

- Resend: https://resend.com
- Railway Buckets: https://docs.railway.com/reference/buckets

### Implementation Details

The first account created on a fresh install becomes the administrator. Default admin login on a fresh database: `admin` / `demo1234` — change it right away from the profile page.

## Why Deploy Carnet de Combat on Railway?

Railway is a singular platform to deploy your infrastructure stack. Railway will host your infrastructure so you don't have to deal with configuration, while allowing you to vertically and horizontally scale it.

By deploying Carnet de Combat on Railway, you are one step closer to supporting a complete full-stack application with minimal burden. Host your servers, databases, AI agents, and more on Railway.


## Similar templates

- [Rocky Linux](https://railway.com/deploy/rocky-linux) — Hosted Rocky Linux 9 workspace with SSH and persistent storage. 🚀
- [Foundry Virtual Tabletop](https://railway.com/deploy/X5tR6G) — A Self-Hosted & Modern Roleplaying Platform
- [Letta Code Remote](https://railway.com/deploy/letta-code-remote) — Run a Letta Code agent 24/7. No inbound ports, just deploy.

Open this page in a browser: https://railway.com/deploy/carnet-de-combat
