Skip to content

loczek/tl

Repository files navigation

Build docker images

Overview

TiiinyLink is a link shortener service that is designed to be scalable, highly available and as much vendor agnostic as possible.

Status

Note

The project is still work in progress.

Architecture

Production setup

Prerequisites

  • AWS CLI (setup and working)
  • Cloudflare (DNS API Token)
  • Nomad
  • Docker

Steps

# Initialize infrastructure
$ terraform -chdir=deployment/infra/production apply

# Run nomad script or set NOMAD_ADDR env var
$ . ./scripts/prod/nomad.sh

# Bootstrap nomad acl (save secret token)
$ nomad acl bootstrap

# Initialize nomad variables
$ nomad var put nomad/jobs/server db_password=$(pass projects/tl/prod/postgres/password)
$ nomad var put nomad/jobs/grafana username=$(pass projects/tl/prod/grafana/username) email=$(pass projects/tl/prod/grafana/email) password=$(pass projects/tl/prod/grafana/password)
$ nomad var put nomad/jobs/postgres password=$(pass projects/tl/prod/postgres/password)
$ nomad var put nomad/jobs/traefik acme_email=$(pass projects/tl/prod/acme/email) cf_dns_api_token=$(pass projects/tl/prod/cloudflare/dns_api_token)

# Run nomad plugins
$ nomad job run deployment/plugins/plugin-ebs-controller.nomad.hcl
$ nomad job run deployment/plugins/plugin-ebs-nodes.nomad.hcl

# Create host volumes
$ nomad volume create deployment/volumes/traefik.hcl

# Register CSI EBS volumes
$ ENV="production" ./scripts/volume/postgres-volume.sh
$ ENV="production" ./scripts/volume/prometheus-volume.sh
$ ENV="production" ./scripts/volume/loki-volume.sh
$ ENV="production" ./scripts/volume/tempo-volume.sh

# Run nomad jobs
$ nomad job run deployment/jobs/prometheus.nomad.hcl
$ nomad job run -var="s3_bucket=s3://$(terraform -chdir=deployment/infra/production output -raw loki_bucket_region)/$(terraform -chdir=deployment/infra/production output -raw loki_bucket_name)" deployment/jobs/loki.nomad.hcl
$ nomad job run -var="bucket_name=$(terraform -chdir=deployment/infra/production output -raw tempo_bucket_name)" -var="bucket_endpoint=$(terraform -chdir=deployment/infra/staging output -raw tempo_bucket_endpoint)" deployment/jobs/tempo.nomad.hcl
$ nomad job run deployment/jobs/grafana.nomad.hcl
$ nomad job run deployment/jobs/otel.nomad.hcl
$ nomad job run deployment/jobs/postgres.nomad.hcl
$ nomad job run deployment/jobs/redis.nomad.hcl
$ nomad job run deployment/jobs/traefik.nomad.hcl
$ nomad job run deployment/jobs/website.nomad.hcl
$ nomad job run deployment/jobs/server.nomad.hcl

Staging setup

Steps

# Initialize infrastructure
$ terraform -chdir=deployment/infra/staging apply

# Run nomad script or set NOMAD_ADDR env var
$ . ./scripts/stage/nomad.sh

# Bootstrap nomad acl (save secret token)
$ nomad acl bootstrap

# Initialize nomad variables
$ nomad var put nomad/jobs/server db_password=$(pass projects/tl/stage/postgres/password)
$ nomad var put nomad/jobs/grafana username=$(pass projects/tl/stage/grafana/username) email=$(pass projects/tl/stage/grafana/email) password=$(pass projects/tl/stage/grafana/password)
$ nomad var put nomad/jobs/postgres password=$(pass projects/tl/stage/postgres/password)
$ nomad var put nomad/jobs/traefik acme_email=$(pass projects/tl/stage/acme/email) cf_dns_api_token=$(pass projects/tl/stage/cloudflare/dns_api_token)

# Run nomad plugins
$ nomad job run deployment/plugins/plugin-ebs-controller.nomad.hcl
$ nomad job run deployment/plugins/plugin-ebs-nodes.nomad.hcl

# Create host volumes
$ nomad volume create deployment/volumes/traefik.hcl

# Register CSI EBS volumes
$ ./scripts/volume/postgres-volume.sh
$ ./scripts/volume/prometheus-volume.sh
$ ./scripts/volume/loki-volume.sh
$ ./scripts/volume/tempo-volume.sh

# Run nomad jobs
$ nomad job run deployment/jobs/prometheus.nomad.hcl
$ nomad job run -var="s3_bucket=s3://$(terraform -chdir=deployment/infra/staging output -raw loki_bucket_region)/$(terraform -chdir=deployment/infra/staging output -raw loki_bucket_name)" deployment/jobs/loki.nomad.hcl
$ nomad job run -var="bucket_name=$(terraform -chdir=deployment/infra/staging output -raw tempo_bucket_name)" -var="bucket_endpoint=$(terraform -chdir=deployment/infra/staging output -raw tempo_bucket_endpoint)" deployment/jobs/tempo.nomad.hcl
$ nomad job run -var="domain=grafana.staging.tiiinylink.com" deployment/jobs/grafana.nomad.hcl
$ nomad job run deployment/jobs/otel.nomad.hcl
$ nomad job run deployment/jobs/postgres.nomad.hcl
$ nomad job run deployment/jobs/redis.nomad.hcl
$ nomad job run deployment/jobs/traefik.nomad.hcl
$ nomad job run -var="image=loczek/tl-website:staging" -var="domain=staging.tiiinylink.com" -var="short_domain=staging.tiiiny.link" deployment/jobs/website.nomad.hcl
$ nomad job run -var="short_domain=staging.tiiiny.link" deployment/jobs/server.nomad.hcl

Development Setup

Follow these steps to set up your development environment:

# Clone repo
$ git clone https://github.com/loczek/tl

# Navigate to the project directory
$ cd tl

# Build and start the containers
$ docker compose up --build --watch

About

TiiinyLink is a link shortener service

Topics

Resources

License

Stars

Watchers

Forks

Packages