簡単に短縮URLサービスを構築するためのテンプレートです。
日本語用です。
- URL Shortener
- Custom ID
- Punycode
- Ban IPs & Alias & Domains & Words
- SSL & Redirect
- Captcha
- Supports parameters & hashes
- URL Shortener API
*API Referenceはこちら。
以下の手順を踏むことで簡単に短縮リンクサービスを構築することができます。
説明は省きます。
| Name | Version |
|---|---|
| Ubuntu | v22.04 |
| Name | Version |
|---|---|
| Git | v2.43.x |
| Node.js | v22.15.x |
| NPM | v10.9.x |
| PM2 | v6.0.x |
| Nginx | v1.24.x |
| Certbot | v2.9.x |
git clone https://github.com/otoneko1102/shorturl-service.git以下の例のように作成します。
# Example of backend/.env
PORT=3000
DOMAIN="example.com"
DATABASE_PATH="../lib/database.db"
BAN_SCORE=10
API_KEY="XXXXXX"
# Example of frontend/.env
PUBLIC_SERVICE_NAME="URL Shortener"
PUBLIC_SERVICE_DESCRIPTION="シンプルで高速な短縮URLサービス"
以下のコマンドを順に実行します。
pm2の --name はオプションです。
cd shorturl-service
cd frontend
npm install
npm run build
cd ..
cd backend
npm install
npm run build
pm2 start dist/server.js --name shorturl-service自宅サーバーやレンタルサーバーで動かすための設定です。
%DOMAIN%, %PORT% を実際のものに置き換えてください。
/etc/nginx/sites-available/%DOMAIN% を編集します。
以下は一例です。
例ではwww付きをwww無しにリダイレクトさせていますが、不必要なら削除してください。
nano /etc/nginx/sites-available/%DOMAIN%以下のコードをペーストして保存します。
Certbotなどで証明書を取得していない場合は該当箇所をコメントアウトしてください。
server {
listen 80;
listen [::]:80;
server_name %DOMAIN$ www.%DOMAIN%;
location /.well-known/acme-challenge/ {
root /var/www/html;
allow all;
}
location / {
return 301 https://%DOMAIN%$request_uri;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name www.%DOMAIN%;
ssl_certificate /etc/letsencrypt/live/%DOMAIN%/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/%DOMAIN%/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
return 301 https://%DOMAIN%$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name %DOMAIN%;
root /var/www/shorturl-service/frontend/build;
index index.html;
ssl_certificate /etc/letsencrypt/live/%DOMAIN%/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/%DOMAIN%/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location /api/ {
proxy_pass http://localhost:%PORT%;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location / {
try_files $uri $uri/ @backend;
}
location @backend {
proxy_pass http://localhost:%PORT%;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
sudo ln -s /etc/nginx/sites-available/%DOMAIN% /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginxsudo certbot --nginx -d %DOMAIN% -d www.%DOMAIN%
sudo nginx -t
sudo systemctl restart nginx// Example of backend/lib/bannedDomains.js
const isStrict = false; // true: Exact match / false: Partial match
const bannedDomains = [
"example.com"
];
/**
* e.g. isStrict
*
* true: Matches with "example.com"
* false: Matches with "example.com", "foo.example.com", "bar.foo.example.com"
*/
export { bannedDomains, isStrict };// Example of backend/lib/bannedAlias.js
const bannedAlias = [
"index"
];
export { bannedAlias };// Example of backend/lib/bannedWords.js
const bannedWords = [
"example"
];
export { bannedWords };