diff --git a/.do/deploy.template.yaml b/.do/deploy.template.yaml new file mode 100644 index 0000000..9e5eeba --- /dev/null +++ b/.do/deploy.template.yaml @@ -0,0 +1,10 @@ +spec: + name: suri + static_sites: + - name: suri + build_command: npm run build + output_dir: build + github: + repo: {{owner}}/{{repo}}} + branch: main + deploy_on_push: true diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..176a458 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9c9b501 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +# npm +/node_modules + +# Suri +/build diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..3231767 --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +MIT License + +Copyright (c) 2024 Justin Stayton + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..3edb366 --- /dev/null +++ b/README.md @@ -0,0 +1,100 @@ +

+ Suri +

+ +

+ Your own short links as an easily deployed static site on DigitalOcean +

+ +You're viewing a template repository tailored for deploying Suri to +[DigitalOcean](https://www.digitalocean.com/). Head over to +[the main repository](https://github.com/surishortlink/suri) to learn more about +Suri, including additional deployment options. + +## Setup: Step By Step + +_**Note:** This is going to seem more complicated than it should be, but it's +the only way to launch with a pre-configured setup that's also connected to your +GitHub repository for auto-deployment. If you know of a more straight-forward +way, please reach out!_ + +1. Hit the "Use this template" button above and then "Create a new repository". + Fill in the required details to create a new repository based on this one. + **You must set the visibility to "Public"!** +2. Change line 8 of [.do/deploy.template.yaml](.do/deploy.template.yaml), + replacing `{{owner}}` and `{{repo}}` in `repo` with the values for your new + repository. +3. On the [DigitalOcean Control Panel](https://cloud.digitalocean.com/), head to + [create a new app](https://cloud.digitalocean.com/apps/new). +4. Connect your GitHub account or edit existing permissions to grant access to + your new repository. **Don't hit "Next" after arriving back at + DigitalOcean!** +5. Open the following URL, again replacing `{{owner}}` and `{{repo}}` with the + values for your new repository: + [https://cloud.digitalocean.com/apps/new?repo=https://github.com/{{owner}}/{{repo}}/tree/main](https://cloud.digitalocean.com/apps/new?repo=https://github.com/{{owner}}/{{repo}}/tree/main) +6. Hit "Skip to Review", as everything should already be set appropriately. Then + hit "Create Resources" to begin the initial build and deploy. + +### Auto-Deploy + +Any commits to the `main` branch of your new repository will trigger a new build +and deploy. You can change this by going to the "Settings" of the `suri` +component and editing the "Branch" and "Autodeploy" options. + +### Custom Domain + +To use a custom domain, follow DigitalOcean's guide: +[How to Manage Domains in App Platform](https://docs.digitalocean.com/products/app-platform/how-to/manage-domains/). + +## How It Works + +### Manage Links + +At the heart of Suri is the [`links.json`](src/links.json) file, located in the +`src` directory, where you manage your links. All of the template repositories +include this file seeded with a few examples: + +```json +{ + "/": "https://www.youtube.com/watch?v=CsHiG-43Fzg", + "1": "https://fee.org/articles/the-use-of-knowledge-in-society/", + "gh": "https://github.com/surishortlink/suri" +} +``` + +It couldn't be simpler: the key is the "short link" path that gets redirected, +and the value is the target URL. Keys can be as short or as long as you want, +using whatever mixture of characters you want. `/` is a special entry for +redirecting the root path. + +### Build Static Site + +Suri ships with a `suri` executable file that generates the static site from the +`links.json` file. The static site is output to a directory named `build`. + +All of the template repositories are configured with a `build` script that +invokes this executable, making the command you run simple: + +```bash +npm run build +``` + +When you make a change to the `links.json` file, simply re-run this command to +re-generate the static site, which can then be re-deployed. This template +repository is configured to do this automatically. + +### Config + +Configuration is handled through the [`suri.config.json`](suri.config.json) file +in the root directory. There is only one option at this point: + +| Option | Description | Type | Default | +| ------ | ------------------------------------------------------------------ | ------- | ------- | +| `js` | Whether to redirect with JavaScript instead of a `` refresh. | Boolean | `false` | + +### Public Directory + +Finally, any files in the `public` directory will be copied over to the `build` +directory without modification when the static site is built. This can be useful +for files like `favicon.ico` or `robots.txt` (that said, Suri provides sensible +defaults for both). diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..52234f5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,31 @@ +{ + "name": "@surishortlink/deploy-digitalocean", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@surishortlink/deploy-digitalocean", + "version": "1.0.0", + "license": "MIT", + "devDependencies": { + "@surishortlink/suri": "^1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@surishortlink/suri": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@surishortlink/suri/-/suri-1.0.0.tgz", + "integrity": "sha512-iPp4OaZviA7HQqbOfhEMk6cRP7yl7+NDiuGEPBLS4SRF5+iNFJRwmPACBJ9TvHMZDH6Jus0XQsRnq6JBIPpFqw==", + "dev": true, + "bin": { + "suri": "bin/suri.js" + }, + "engines": { + "node": ">=18" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..dae7510 --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "@surishortlink/deploy-digitalocean", + "version": "1.0.0", + "private": true, + "type": "module", + "description": "A template repository tailored for deploying Suri to DigitalOcean", + "homepage": "https://github.com/surishortlink/suri-deploy-digitalocean#readme", + "bugs": "https://github.com/surishortlink/suri-deploy-digitalocean/issues", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/surishortlink/suri-deploy-digitalocean.git" + }, + "scripts": { + "build": "suri" + }, + "devDependencies": { + "@surishortlink/suri": "^1" + }, + "engines": { + "node": ">=18" + } +} diff --git a/src/links.json b/src/links.json new file mode 100644 index 0000000..fcb8fc9 --- /dev/null +++ b/src/links.json @@ -0,0 +1,5 @@ +{ + "/": "https://www.youtube.com/watch?v=CsHiG-43Fzg", + "1": "https://fee.org/articles/the-use-of-knowledge-in-society/", + "gh": "https://github.com/surishortlink/suri" +} diff --git a/suri.config.json b/suri.config.json new file mode 100644 index 0000000..d8351c5 --- /dev/null +++ b/suri.config.json @@ -0,0 +1,3 @@ +{ + "js": false +}