{"id":13473876,"url":"https://github.com/brotandgames/ciao","last_synced_at":"2026-02-24T12:00:59.054Z","repository":{"id":38555148,"uuid":"197053097","full_name":"brotandgames/ciao","owner":"brotandgames","description":"HTTP checks \u0026 tests (private \u0026 public) monitoring - check the status of your URL","archived":false,"fork":false,"pushed_at":"2026-02-23T16:58:02.000Z","size":3082,"stargazers_count":1930,"open_issues_count":2,"forks_count":105,"subscribers_count":16,"default_branch":"master","last_synced_at":"2026-02-23T22:35:38.167Z","etag":null,"topics":["alerting","application-monitoring","http","monitoring","prometheus","uptime","website-monitor"],"latest_commit_sha":null,"homepage":"https://brotandgames.com/ciao/","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/brotandgames.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-07-15T18:39:05.000Z","updated_at":"2026-02-23T16:58:06.000Z","dependencies_parsed_at":"2024-01-03T02:24:49.457Z","dependency_job_id":"16e81757-bd9d-44e2-81f1-1c0e2150b351","html_url":"https://github.com/brotandgames/ciao","commit_stats":{"total_commits":314,"total_committers":12,"mean_commits":"26.166666666666668","dds":"0.35031847133757965","last_synced_commit":"d384be9de595b8efa113cc650217f783cb6a44ca"},"previous_names":[],"tags_count":56,"template":false,"template_full_name":null,"purl":"pkg:github/brotandgames/ciao","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brotandgames%2Fciao","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brotandgames%2Fciao/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brotandgames%2Fciao/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brotandgames%2Fciao/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/brotandgames","download_url":"https://codeload.github.com/brotandgames/ciao/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brotandgames%2Fciao/sbom","scorecard":{"id":254589,"data":{"date":"2025-08-11","repo":{"name":"github.com/brotandgames/ciao","commit":"63a79aa41caa9a1d149e07623448fcd679cfafca"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.3,"checks":[{"name":"Maintained","score":5,"reason":"4 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 5","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/25 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/docker.yml:1","Warn: no topLevel permission defined: .github/workflows/main.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docker.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/brotandgames/ciao/docker.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docker.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/brotandgames/ciao/docker.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/brotandgames/ciao/main.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/brotandgames/ciao/main.yml/master?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:2","Warn: containerImage not pinned by hash: Dockerfile:67: pin your Docker image by updating ruby:3.3.7-slim to ruby:3.3.7-slim@sha256:696f37b3cd55288b5127850e3eeae67dd20595ab77a6724f7bb05baa8c6b4878","Warn: npmCommand not pinned by hash: Dockerfile:9-25","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 third-party GitHubAction dependencies pinned","Info:   0 out of   2 containerImage dependencies pinned","Info:   0 out of   1 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/docker.yml:9"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 7 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":6,"reason":"4 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-vfm5-rmrh-j26v","Warn: Project is vulnerable to: GHSA-vc8w-jr9v-vj7f","Warn: Project is vulnerable to: GHSA-353f-x4gh-cqq8","Warn: Project is vulnerable to: GHSA-mqcp-p2hv-vw6x"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-17T09:20:03.908Z","repository_id":38555148,"created_at":"2025-08-17T09:20:03.908Z","updated_at":"2025-08-17T09:20:03.908Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29781197,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-24T10:45:18.109Z","status":"ssl_error","status_checked_at":"2026-02-24T10:45:09.911Z","response_time":75,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["alerting","application-monitoring","http","monitoring","prometheus","uptime","website-monitor"],"created_at":"2024-07-31T16:01:07.634Z","updated_at":"2026-02-24T12:00:59.013Z","avatar_url":"https://github.com/brotandgames.png","language":"Ruby","funding_links":[],"categories":["Ruby","Install from Source","Opensource","prometheus","Open Source Rails Apps"],"sub_categories":["Monitoring","Articles"],"readme":"# ciao\n\n[![Latest release](https://img.shields.io/github/release/brotandgames/ciao.svg)](https://github.com/brotandgames/ciao/releases/latest)\n[![Docker pulls](https://img.shields.io/docker/pulls/brotandgames/ciao.svg)](https://store.docker.com/community/images/brotandgames/ciao)\n[![Website link](https://brotandgames.com/assets/ciao-link-website.svg)](https://brotandgames.com/ciao/)\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/brotandgames/ciao/master/LICENSE)\n[![Build Status](https://github.com/brotandgames/ciao/actions/workflows/main.yml/badge.svg)](https://github.com/brotandgames/ciao/actions/)\n\n**[ciao](https://www.brotandgames.com/ciao/)** checks HTTP(S) URL endpoints for a HTTP status code (or errors on the lower TCP stack) and sends a notification on status change via E-Mail or Webhooks.\n\nIt uses Cron syntax to schedule the checks and comes along with a Web UI and a RESTful JSON API.\n\n![ciao Checks overview](https://brotandgames.com/assets/ciao-checks.png \"ciao Checks overview\")\n*You can find more screenshots on the [Homepage](https://www.brotandgames.com/ciao/).*\n\n**ciao** (/tʃaʊ/) - **c**heck **i**n **a**nd **o**ut - borrowed from Italian *ciao* for greeting someone.\n\n*Motivation:* create an open source web application for checking URL statuses with an UI and a REST API which is easy to install and maintain (no external dependencies like Databases, Caches etc.) in public and private environments.\n\nFollow [@brotandgames](https://www.twitter.com/brotandgames) on Twitter to get the latest News like Releases. Use [#ciaohttp](https://twitter.com/hashtag/ciaohttp) Hashtag for ciao related stuff.\n\n## Quickstart\n\n```sh\ndocker run --name ciao -p 8090:3000 brotandgames/ciao\n```\n\nOpen http://localhost:8090 in your webbrowser.\n\n## Features\n\n* Check HTTP/S endpoints in an interval\n* Use Cron syntax like `* * * * *` (every minute), `*/15 * * * *` (every 15 minutes), `@hourly` or `@daily` etc.\n* Keep track of status changes (since version 1.8.0)\n* Check TLS certificate expiration once a day and get a notification if it expires in less than 30 days (since version 1.9.0)\n* Web UI\n* [RESTful JSON API](#rest-api)\n* Get a notification on status change via [E-Mail](smtp_configuration.md) eg. Gmail, Sendgrid, MailChimp etc. (optional)\n* Get a notification on status change via [Webhooks](webhook_configuration.md) eg. Rocket.Chat, Slack etc. (optional)\n* Configuration via ENVIRONMENT variables (suitable for most runtimes)\n* Expose Prometheus Metrics endpoint `/metrics` with information to digest by tools like Grafana (optional)\n* Protect with HTTP Basic auth on application basis (optional, only recommended in combination with TLS)\n* Instructions for [installing](#install)/[deploying](#deploy) in/to different Platforms\n* [Docker Image](#via-docker-image)\n* [Helm Chart](#via-helm)\n* [Terraform Provider](https://github.com/autonubil/terraform-provider-ciao) (Maintainer: [@autonubil](https://github.com/autonubil))\n\n\n## Configuration\n\nciao is configured via ENVIRONMENT variables following the [12-factor app methodology](https://12factor.net/config).\n\n- `SECRET_KEY_BASE` will be auto-generated if you omit it\n- Time zone is configurable per `TIME_ZONE` variable (default: `UTC`) eg. `TIME_ZONE=\"Vienna\"` - you can find all possible values by executing `docker run --rm brotandgames/ciao rake time:zones` (since version 1.2.0)\n- Check [SMTP Configuration](smtp_configuration.md) for all possible configuration variables, notes and example configurations for Gmail, Sendgrid etc.\n- Check [Webhook Configuration](webhook_configuration.md) for instructions how to send (webhook) notifications to RocketChat, Slack etc. (since version 1.4.0)\n- You can enable HTTP Basic auth for ciao by defining `BASIC_AUTH_USERNAME` and `BASIC_AUTH_PASSWORD` eg. `BASIC_AUTH_USERNAME=\"ciao-admin\"` and `BASIC_AUTH_PASSWORD=\"sensitive_password\"` (since version 1.3.0)\n- You can enable a Prometheus Metrics endpoint served under `/metrics` by setting `PROMETHEUS_ENABLED=true` - furthermore you can enable HTTP Basic auth for this endpoint by defining `PROMETHEUS_BASIC_AUTH_USERNAME=\"ciao-metrics\"` and `PROMETHEUS_BASIC_AUTH_PASSWORD=\"sensitive_password\"` (since version 1.5.0)\n- Log level is configurable via `CIAO_LOG_LEVEL` variable (default: `WARN`) - levels: DEBUG, INFO, WARN, ERROR, FATAL (since version 1.7.0)\n\n## Install\n\nYou can install ciao via the official Docker image `brotandgames/ciao` or using Git and installing the dependencies manually.\n\nBy mounting a Docker volume you can avoid loosing data on restart or upgrade.\n\nIMPORTANT: Be sure to enable authentication (eg. HTTP Basic auth) and TLS certificates if you serve ciao publicly.\n\n### Via Docker image\n\n```sh\ndocker run \\\n  --name ciao \\\n  -p 8090:3000 \\\n  -e SECRET_KEY_BASE=\"sensitive_secret_key_base\" \\\n  -e SMTP_ADDRESS=smtp.yourhost.com \\\n  -e SMTP_EMAIL_FROM=\"ciao@yourhost.com\" \\\n  -e SMTP_EMAIL_TO=\"you@yourhost.com\" \\\n  -e SMTP_PORT=587 \\\n  -e SMTP_DOMAIN=smtp.yourhost.com \\\n  -e SMTP_AUTHENTICATION=plain \\\n  -e SMTP_ENABLE_STARTTLS_AUTO=true \\\n  -e SMTP_USERNAME=ciao \\\n  -e SMTP_PASSWORD=\"sensitive_password\" \\\n  -v /opt/ciao/data:/app/db/sqlite \\\n  brotandgames/ciao\n```\n\nOpen localhost:8090 in your webbrowser.\n\n### Via Docker-compose\n\nCreate docker-compose.yml file\n\n```yaml\nversion: \"3\"\nservices:\n  ciao:\n    image: brotandgames/ciao\n    container_name: ciao\n    ports:\n      - '8090:3000'\n    environment:\n      - SECRET_KEY_BASE=sensitive_secret_key_base\n      - SMTP_ADDRESS=smtp.yourhost.com\n      - SMTP_EMAIL_FROM=ciao@yourhost.com\n      - SMTP_EMAIL_TO=you@yourhost.com\n      - SMTP_PORT=587\n      - SMTP_AUTHENTICATION=plain\n      - SMTP_DOMAIN=smtp.yourhost.com\n      - SMTP_ENABLE_STARTTLS_AUTO=true\n      - SMTP_USERNAME=ciao\n      - SMTP_PASSWORD=sensitive_password\n    volumes:\n      - /opt/ciao/data:/app/db/sqlite/\n```\n\nPull and run\n\n```sh\ndocker-compose pull\ndocker-compose up -d\n```\n\nOpen localhost:8090 in the webbrowser.\n\n*Note: if you have problems with environment variables (quoting, spaces etc), take a look at these GitHub issues ([1](https://github.com/brotandgames/ciao/issues/40), [2](https://github.com/docker/compose/issues/2854)) and these Stack Overflow questions ([1](https://stackoverflow.com/questions/53082932/yaml-docker-compose-spaces-quotes), [2](https://stackoverflow.com/questions/41988809/docker-compose-how-to-escape-environment-variables))*.\n\n### Via Git clone\n\n```sh\n# Clone repo\ngit clone https://github.com/brotandgames/ciao\n\ncd ciao\n\n# Install all dependencies (rubygems)\nRAILS_ENV=production bundle install\n\n# Configure\nexport SECRET_KEY_BASE=\"sensitive_secret_key_base\" \\\n  SMTP_ADDRESS=smtp.yourhost.com \\\n  SMTP_EMAIL_FROM=\"ciao@yourhost.com\" \\\n  SMTP_EMAIL_TO=\"you@yourhost.com\" \\\n  SMTP_PORT=587 \\\n  SMTP_DOMAIN=smtp.yourhost.com \\\n  SMTP_AUTHENTICATION=plain \\\n  SMTP_ENABLE_STARTTLS_AUTO=true \\\n  SMTP_USERNAME=ciao \\\n  SMTP_PASSWORD=\"sensitive_password\"\n\n# Precompile assets\nrails assets:precompile\n\n# Run start script - basically this is check SECRET_KEY_BASE, database init/migrate and rails server\nRAILS_ENV=production ./start.sh\n```\n\nOpen localhost:3000 in the webbrowser.\n\n## REST API\n\n**GET /checks.json**\n\nShow collection (array) of all checks\n\n```sh\ncurl -X GET -H \"Content-type: application/json\" /checks.json\n```\n\n**GET /checks/\u003c:id\u003e.json**\n\nShow a specific check\n\n```sh\ncurl -X GET -H \"Content-type: application/json\" /checks/\u003c:id\u003e.json\n```\n\n**POST /checks.json**\n\nCreate a check\n\n```sh\ncurl -X POST -H \"Content-type: application/json\" /checks.json \\\n  -d '{ \"name\": \"brotandgames.com\", \"active\": true, \"url\": \"https://brotandgames.com\", \"cron\": \"* * * *\"}'\n```\n\n**PATCH/PUT /checks/\u003c:id\u003e.json**\n\nUpdate a check\n\n```sh\ncurl -X PUT -H \"Content-type: application/json\" /checks/\u003c:id\u003e.json \\\n  -d '{ \"name\": \"brotandgames.com\", \"active\": false, \"url\": \"https://brotandgames.com\", \"cron\": \"* * * *\"}'\n```\n\n**DELETE /checks/\u003c:id\u003e.json**\n\nDelete a check\n\n```sh\ncurl -X DELETE -H \"Content-type: application/json\" /checks/\u003c:id\u003e.json\n```\n\n## Backup \u0026 Restore\n\nState is stored in an internal SQLite database located in `db/sqlite/production.sqlite3`.\n\n*Note: Prior to version 1.1.0 the database was located in `db/` (missing sqlite subfolder). From 1.1.0 onwards the location is `db/sqlite/` to enable docker to use a volume.*\n\n### Backup\n\n```sh\ndocker cp ciao:/app/db/sqlite/production.sqlite3 production.sqlite3.backup\n```\n\n### Restore\n\n```sh\ndocker cp production.sqlite3.backup ciao:/app/db/sqlite/production.sqlite3\ndocker restart ciao\n```\n*Prior to version 1.2.0: visit `/checks/admin` and recreate the background jobs for active checks.*\n\n\n## Upgrade\n\n1. [Backup](#backup) the database\n2. Run container with new version\n3. [Restore](#restore) the database\n\n## Deploy\n\nHere you'll find instructions for deploying ciao to different platforms like Kubernetes or Dokku.\n\nBy mounting a Docker or Kubernetes volume you can avoid loosing data on restart or upgrade.\n\nIMPORTANT: Be sure to enable authentication (eg. HTTP Basic auth) and TLS certificates if you serve ciao publicly.\n\n### Kubernetes\n\n#### Via Helm\n\n1. Install ciao via `helm upgrade --install`\n\nQuickstart (without configuring)\n\n```sh\nhelm upgrade --install --namespace ciao ciao https://github.com/brotandgames/ciao/raw/master/helm-chart/ciao-0.5.0.tgz\n```\n\nWith [configuration](#configuration)\n\n```sh\nhelm upgrade --install --namespace ciao ciao https://github.com/brotandgames/ciao/raw/master/helm-chart/ciao-0.5.0.tgz \\\n  --set env.SECRET_KEY_BASE=\"sensitive_secret_key_base\" \\\n  --set env.SMTP_ADDRESS=smtp.yourhost.com \\\n  --set env.SMTP_EMAIL_FROM=\"ciao@yourhost.com\" \\\n  --set env.SMTP_EMAIL_TO=\"you@yourhost.com\" \\\n  --set env.SMTP_PORT=587 \\\n  --set env.SMTP_DOMAIN=smtp.yourhost.com \\\n  --set env.SMTP_AUTHENTICATION=plain \\\n  --set env.SMTP_ENABLE_STARTTLS_AUTO=true \\\n  --set env.SMTP_USERNAME=ciao \\\n  --set env.SMTP_PASSWORD=\"sensitive_password\"\n```\n\n#### Via kubectl\n\nThe following code snippet will create a Kubernetes\n\n* Namespace `ciao`,\n* Secret `ciao`,\n* Deployment `ciao` and\n* Service `ciao`.\n\n`kubectl apply -f k8s.yaml`\n\n```yaml\n# k8s.yaml\napiVersion: v1\nkind: Namespace\nmetadata:\n  name: ciao\n---\napiVersion: v1\nkind: Secret\nmetadata:\n  name: ciao\n  namespace: ciao\ndata:\n  # all values should be base64 encoded\n  # so some_secret would be c29tZV9zZWNyZXQ=\n  SECRET_KEY_BASE: some_secret\n  SMTP_ADDRESS: smtp_address\n  SMTP_EMAIL_FROM: noreply@somedomain.com\n  SMTP_EMAIL_TO: monitoring@somedomain.com\n  SMTP_PORT: 465\n  SMTP_DOMAIN: mail.somedomain.com\n  SMTP_AUTHENTICATION: plain\n  SMTP_ENABLE_STARTTLS_AUTO: true\n  SMTP_USERNAME: smtp_some_username\n  SMTP_PASSWORD: smtp_some_password\n  SMTP_SSL: true\n  BASIC_AUTH_USERNAME: auth_some_username\n  BASIC_AUTH_PASSWORD: auth_some_password\n---\napiVersion: apps/v1beta1\nkind: Deployment\nmetadata:\n  name: ciao\n  namespace: ciao\nspec:\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        app: ciao\n    spec:\n      containers:\n      - image: brotandgames/ciao:latest\n        imagePullPolicy: IfNotPresent\n        name: ciao\n        volumeMounts: # Emit if you do not have persistent volumes\n        - mountPath: /app/db/sqlite/\n          name: persistent-volume\n          subPath: ciao\n        ports:\n        - containerPort: 3000\n        resources:\n          requests:\n            memory: 256Mi\n            cpu: 200m\n          limits:\n            memory: 512Mi\n            cpu: 400m\n        envFrom:\n        - secretRef:\n            name: ciao\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: ciao\n  namespace: ciao\nspec:\n  ports:\n    - port: 80\n      targetPort: 3000\n      protocol: TCP\n  type: ClusterIP\n  selector:\n    app: ciao\n```\n\n### Dokku\n\n1. Create app\n\n```sh\ndokku apps:create ciao\n```\n\n2. Configure\n\n```sh\ndokku config:set --no-restart ciao \\\n  SECRET_KEY_BASE=\"sensitive_secret_key_base\" \\\n  SMTP_ADDRESS=smtp.yourhost.com \\\n  SMTP_EMAIL_FROM=\"ciao@yourhost.com\" \\\n  SMTP_EMAIL_TO=\"you@yourhost.com\" \\\n  SMTP_PORT=587 \\\n  SMTP_DOMAIN=smtp.yourhost.com \\\n  SMTP_AUTHENTICATION=plain \\\n  SMTP_ENABLE_STARTTLS_AUTO=true \\\n  SMTP_USERNAME=ciao \\\n  SMTP_PASSWORD=\"sensitive_password\"\n```\n\n3. Deploy ciao using your deployment method eg. [Dockerfile Deployment](http://dokku.viewdocs.io/dokku/deployment/methods/dockerfiles/), [Docker Image Deployment](http://dokku.viewdocs.io/dokku/deployment/methods/images/) etc.\n\n4. Protect your ciao instance by enabling HTTP Basic auth (using [dokku-http-auth](https://github.com/dokku/dokku-http-auth)) and installing Lets Encrypt certificates via [dokku-letsencrypt](https://github.com/dokku/dokku-letsencrypt).\n\n\n## Contributing\n\nWe encourage you to contribute to this project in whatever way you like!\n\nReport bugs/feature requests in the [issues](https://github.com/brotandgames/ciao/issues/new/choose) section.\n\nWhen contributing to this repository, please first discuss the change you wish to make via issue with the owners of this repository before making a change.\n\n## Versioning\n\n[Semantic Versioning 2.x](https://semver.org/)\n\nIn a nutshell:\n\n\u003e Given a version number MAJOR.MINOR.PATCH, increment the:\n\u003e\n\u003e 1. MAJOR version when you make incompatible API changes,\n\u003e 2. MINOR version when you add functionality in a backwards-compatible manner, and\n\u003e 3. PATCH version when you make backwards-compatible bug fixes.\n\u003e\n\u003e Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format.\n\n## License\n\nciao is released under the [MIT License](https://opensource.org/licenses/MIT).\n\n## Guestbook\n\nWhy not reinvent the [guestbook](guestbook.md)?\n\n## Maintainer\n\nhttps://github.com/brotandgames\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrotandgames%2Fciao","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbrotandgames%2Fciao","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrotandgames%2Fciao/lists"}