TiiinyLink is a link shortener service that is designed to be scalable, highly available and as much vendor agnostic as possible.
Note
The project is still work in progress.
- AWS CLI (setup and working)
- Cloudflare (DNS API Token)
- Nomad
- Docker
# 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# 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.hclFollow 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
