env.js 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. require("dotenv").config();
  2. const { cleanEnv, num, str, bool } = require("envalid");
  3. const { readFileSync } = require("node:fs");
  4. const supportedDBClients = [
  5. "pg",
  6. "pg-native",
  7. "sqlite3",
  8. "better-sqlite3",
  9. "mysql",
  10. "mysql2"
  11. ];
  12. // make sure custom alphabet is not empty
  13. if (process.env.LINK_CUSTOM_ALPHABET === "") {
  14. delete process.env.LINK_CUSTOM_ALPHABET;
  15. }
  16. // make sure jwt secret is not empty
  17. if (process.env.JWT_SECRET === "") {
  18. delete process.env.JWT_SECRET;
  19. }
  20. // if is started with the --production argument, then set NODE_ENV to production
  21. if (process.argv.includes("--production")) {
  22. process.env.NODE_ENV = "production";
  23. }
  24. const spec = {
  25. PORT: num({ default: 3000 }),
  26. SITE_NAME: str({ example: "Kutt", default: "Kutt" }),
  27. DEFAULT_DOMAIN: str({ example: "kutt.it", default: "localhost:3000" }),
  28. LINK_LENGTH: num({ default: 6 }),
  29. LINK_CUSTOM_ALPHABET: str({ default: "abcdefghkmnpqrstuvwxyzABCDEFGHKLMNPQRSTUVWXYZ23456789" }),
  30. TRUST_PROXY: bool({ default: true }),
  31. DB_CLIENT: str({ choices: supportedDBClients, default: "better-sqlite3" }),
  32. DB_FILENAME: str({ default: "db/data" }),
  33. DB_HOST: str({ default: "localhost" }),
  34. DB_PORT: num({ default: 5432 }),
  35. DB_NAME: str({ default: "kutt" }),
  36. DB_USER: str({ default: "postgres" }),
  37. DB_PASSWORD: str({ default: "" }),
  38. DB_SSL: bool({ default: false }),
  39. DB_POOL_MIN: num({ default: 0 }),
  40. DB_POOL_MAX: num({ default: 10 }),
  41. REDIS_ENABLED: bool({ default: false }),
  42. REDIS_HOST: str({ default: "127.0.0.1" }),
  43. REDIS_PORT: num({ default: 6379 }),
  44. REDIS_PASSWORD: str({ default: "" }),
  45. REDIS_DB: num({ default: 0 }),
  46. DISALLOW_ANONYMOUS_LINKS: bool({ default: true }),
  47. DISALLOW_REGISTRATION: bool({ default: true }),
  48. SERVER_IP_ADDRESS: str({ default: "" }),
  49. SERVER_CNAME_ADDRESS: str({ default: "" }),
  50. CUSTOM_DOMAIN_USE_HTTPS: bool({ default: false }),
  51. JWT_SECRET: str({ devDefault: "securekey" }),
  52. MAIL_ENABLED: bool({ default: false }),
  53. MAIL_HOST: str({ default: "" }),
  54. MAIL_PORT: num({ default: 587 }),
  55. MAIL_SECURE: bool({ default: false }),
  56. MAIL_USER: str({ default: "" }),
  57. MAIL_FROM: str({ default: "", example: "Kutt <support@kutt.it>" }),
  58. MAIL_PASSWORD: str({ default: "" }),
  59. ENABLE_RATE_LIMIT: bool({ default: false }),
  60. REPORT_EMAIL: str({ default: "" }),
  61. CONTACT_EMAIL: str({ default: "" }),
  62. NODE_APP_INSTANCE: num({ default: 0 }),
  63. };
  64. for (const key in spec) {
  65. const file_key = key + "_FILE";
  66. if (!(file_key in process.env)) continue;
  67. try {
  68. process.env[key] = readFileSync(process.env[file_key], "utf8").trim();
  69. } catch {
  70. // on error, env_FILE just doesn't get applied.
  71. }
  72. }
  73. const env = cleanEnv(process.env, spec);
  74. module.exports = env;