[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-8526":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":19,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":22,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":35,"readmeContent":36,"aiSummary":37,"trendingCount":16,"starSnapshotCount":16,"syncStatus":38,"lastSyncTime":39,"discoverSource":40},8526,"freenom","luolongfei\u002Ffreenom","luolongfei","Freenom 域名自动续期。Freenom domain name renews automatically.","",null,"PHP",3329,1590,24,76,0,1,4,3,31.61,"MIT License",false,"main",true,[26,27,28,29,5,30,31,32,33,34],"auto-renewal","bot","docker","domain","php","php8","renew","telegram","telegram-bot","2026-06-12 02:01:54","\u003Cdiv align=\"center\">\n\n![freenom logo](https:\u002F\u002Fs1.ax1x.com\u002F2022\u002F03\u002F10\u002FbhzMG9.png)\n\n\u003Ch3>Freenom: automated renewal for Freenom domains\u003C\u002Fh3>\n\n[![PHP version](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fphp-%3E=8.1-brightgreen.svg?style=for-the-badge)](https:\u002F\u002Fsecure.php.net\u002F)\n[![Docker pulls](https:\u002F\u002Fimg.shields.io\u002Fdocker\u002Fpulls\u002Fluolongfei\u002Ffreenom.svg?style=for-the-badge)](https:\u002F\u002Fhub.docker.com\u002Fr\u002Fluolongfei\u002Ffreenom)\n[![GitHub stars](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002Fluolongfei\u002Ffreenom?color=brightgreen&style=for-the-badge)](https:\u002F\u002Fgithub.com\u002Fluolongfei\u002Ffreenom\u002Fstargazers)\n[![MIT license](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-MIT-brightgreen.svg?style=for-the-badge)](https:\u002F\u002Fgithub.com\u002Fluolongfei\u002Ffreenom\u002Fblob\u002Fmain\u002FLICENSE)\n\nDocumentation: English | [中文版](.\u002FREADME_ZH.md)\nChangelog: [CHANGELOG.md](.\u002FCHANGELOG.md)\n\u003C\u002Fdiv>\n\n[📢 Announcement](#-announcement)\n\n[📃 Why This Exists](#-why-this-exists)\n\n[🍭 What Notifications Look Like](#-what-notifications-look-like)\n\n[🎁 Before You Start](#-before-you-start)\n\n[📪 Configure Notifications](#-configure-notifications) (Email \u002F Telegram Bot \u002F WeCom \u002F ServerChan \u002F Bark \u002F Pushplus)\n\n[⛵ Docker Compose Deployment](#-docker-compose-deployment)\n\n[🐳 Docker Deployment](#-docker-deployment) (recommended, and usually the simplest option)\n\n[🧊 Heroku Deployment](#-heroku-deployment)\n\n[🚈 Railway Deployment](#-railway-deployment)\n\n[📦 Koyeb Deployment](#-koyeb-deployment) (a good fit if you do not have your own server)\n\n[🧪 Mogenius Deployment](#-mogenius-deployment) (no longer viable)\n\n[☁ Cloud Function Deployment](#-cloud-function-deployment) (no longer actively supported)\n\n[🚧 Deploy from Source](#-deploy-from-source)\n\n[📋 Donation List](#-donation-list)\n\n[❤ Support the Project](#-support-the-project)\n\n[🪓 A Personal Note](#-a-personal-note)\n\n[🌚 Author](#-author)\n\n[💖 All Contributors](#-all-contributors)\n\n[📝 TODO List](#-todo-list)\n\n[🍅 Other Language Ports](#-other-language-ports)\n\n[🎉 Acknowledgements](#-acknowledgements)\n\n[🥝 License](#-license)\n\n### 📢 Announcement\n\n- Community members created a Telegram group called `Freenom Renewal Bureau` for discussion, testing, and feedback. You can join directly here: [https:\u002F\u002Ft.me\u002Ffreenom_auto_renew](https:\u002F\u002Ft.me\u002Ffreenom_auto_renew)\n\n### 📃 Why This Exists\n\nFreenom is the only provider I know of that offers free top-level domains, but those domains have to be renewed every year, and only one year at a time. I had a pile of domains registered at different times, and renewing them manually got old fast, so I wrote this script to automate the whole thing.\n\n### 🍭 What Notifications Look Like\n\nThe script sends a notification whether renewal succeeds, fails, or crashes. Renewal-related notifications also include details like how many days remain before an unrenewed domain expires. The screenshot below shows the email version of that message.\n\n\u003Ca href=\"https:\u002F\u002Fs4.ax1x.com\u002F2022\u002F02\u002F26\u002FbZrtz9.png\">\u003Cimg src=\"https:\u002F\u002Fs4.ax1x.com\u002F2022\u002F02\u002F26\u002FbZrtz9.png\" alt=\"Example notification email\" border=\"0\" width=\"95%\" height=\"100%\" \u002F>\u003C\u002Fa>\n\n### 🎁 Before You Start\n\n- A VPS or server. Any box will do, although `Debian` is the easiest path. If you deploy without Docker, you need `PHP 8.1` or newer. If you do not have a server, the hosted options later in this README may be a better fit.\n- A sender mailbox, if you want email notifications. The script knows how to auto-configure `Gmail`, `QQ Mail`, `163 Mail`, and `Outlook`. If you want to use another provider or your own mail server, check the email-related comments in [`.env.example`](.\u002F.env.example).\n- A recipient mailbox, if you want to receive email notifications.\n- Both mailbox fields are optional because the project also supports `Telegram Bot`, `WeCom`, `ServerChan`, `Bark`, and `Pushplus`. You only need `MAIL_USERNAME`, `MAIL_PASSWORD`, and `TO` if you choose email notifications.\n- A little patience.\n\n### 📪 Configure Notifications\n\nThis project supports `Email`, `Telegram Bot`, `WeCom`, `ServerChan`, `Bark`, and `Pushplus`. Pick one and configure only that path. If you are on iOS, `Bark` is usually the cleanest option. For most other users, use whichever channel you are already comfortable with. I generally do not recommend `ServerChan`: the daily message cap is restrictive, and some content is hidden behind its paid tier. The same basic setup effort usually goes further with `WeCom`, and those notifications show up directly in the standard WeChat client.\n\n*Jump straight to a section:*\n\n[Email Notifications](#email-notifications)\n\n[Telegram Bot](#telegram-bot)\n\n[WeCom](#wecom)\n\n[ServerChan](#serverchan)\n\n[Bark](#bark)\n\n[Pushplus](#pushplus)\n\n#### Email Notifications\n\nThis section covers `Gmail`, `QQ Mail`, and `163 Mail`. Only read the provider you actually use. `QQ Mail` and `163 Mail` both use your mailbox plus an authorization code. `Gmail` now effectively means your mailbox plus an app password.\n\n*(Click to expand or collapse each provider.)*\n\n\u003Cdetails>\n    \u003Csummary>Gmail\u003C\u002Fsummary>\n\u003Cbr>\n\n*If you use multiple Gmail accounts, open the settings page in a private or incognito window first. That makes it much easier to land on the right account.*\n\n1. In `Settings > Forwarding and POP\u002FIMAP`, enable:\n\n- `Enable POP for all mail`\n- `Enable IMAP`\n\n![gmail Configuration 01](https:\u002F\u002Fs2.ax1x.com\u002F2020\u002F02\u002F01\u002F1GDsMR.png \"gmail Configuration 01\")\n\nThen save the change.\n\n2. Turn on 2-Step Verification.\n\nOfficial guide: [Turn on 2-Step Verification](https:\u002F\u002Fsupport.google.com\u002Faccounts\u002Fanswer\u002F185839?hl=en)\n\n3. Create an app password for this script.\n\nOfficial guide: [Sign in with App Passwords](https:\u002F\u002Fsupport.google.com\u002Fmail\u002Fanswer\u002F185833?hl=en)\n\n**Gmail no longer supports \"less secure app\" logins. Use your account plus an app password.**\n\n***\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n    \u003Csummary>QQ Mail\u003C\u002Fsummary>\n\u003Cbr>\n\nIn `Settings > Accounts > POP3\u002FIMAP\u002FSMTP\u002FExchange\u002FCardDAV\u002FCalDAV Service`, enable `POP3\u002FSMTP Service`.\n\nQQ Mail will ask you to send an SMS to Tencent. After that, it will display an authorization code. Use your mailbox account plus that authorization code to sign in, and keep the code for your `.env` configuration.\n\n***\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n    \u003Csummary>163 Mail\u003C\u002Fsummary>\n\u003Cbr>\n\nIn `Settings > POP3\u002FSMTP\u002FIMAP`, enable both `POP3\u002FSMTP Service` and `IMAP\u002FSMTP Service`, then save the change.\n\nNext, open the `Client Authorization Password` section and generate an authorization code. The UI may look different from the screenshot in the Chinese README depending on whether you have already created one. Like QQ Mail, 163 Mail may also require an SMS step before it will issue the code.\n\nIf the recipient does not see messages from a 163 mailbox, check the spam folder first.\n\n***\n\n\u003C\u002Fdetails>\n\nAfter that, set `MAIL_USERNAME` and `MAIL_PASSWORD` to your mailbox and password or token, set `TO` to the mailbox that should receive notifications, and set `MAIL_ENABLE=1` in `.env`.\n\nIf you do not want email notifications at all, set `MAIL_ENABLE=0` in the root `.env` file.\n\n*That is it for email notifications.*\n\n#### Telegram Bot\n\nFor the full Telegram Bot setup flow, see the wiki: [Telegram Bot](https:\u002F\u002Fgithub.com\u002Fluolongfei\u002Ffreenom\u002Fwiki\u002FTelegram-Bot)\n\n#### WeCom\n\nFor the full WeCom setup flow, see the wiki: [WeCom](https:\u002F\u002Fgithub.com\u002Fluolongfei\u002Ffreenom\u002Fwiki\u002F%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1)\n\n#### ServerChan\n\nFor the full ServerChan setup flow, see the wiki: [ServerChan](https:\u002F\u002Fgithub.com\u002Fluolongfei\u002Ffreenom\u002Fwiki\u002FServer-%E9%85%B1)\n\n#### Bark\n\nFor the full Bark setup flow, see the wiki: [Bark](https:\u002F\u002Fgithub.com\u002Fluolongfei\u002Ffreenom\u002Fwiki\u002FBark-%E9%80%81%E4%BF%A1)\n\n#### Pushplus\n\n`Pushplus` is also supported. Set `PUSHPLUS_KEY` to your token in `.env`, then set `PUSHPLUS_ENABLE=1` to turn it on. If Pushplus is the only channel you want to use, leave the other notification methods disabled.\n\n***\n\n*That covers notifications. Next up are the supported deployment options. Docker is still the path I recommend for most people because it removes nearly all environment drift.*\n\n***\n\n### ⛵ Docker Compose Deployment\n\n**Note:** this path is currently marked beta and only supports `amd64`. If you are on `arm` or another architecture, wait for a later update. If you need a server, one option is [cheap US VPS](https:\u002F\u002Fgo.llfapp.com\u002Fcc).\n\n#### 1. Install Docker and Docker Compose\n\nDebian \u002F Ubuntu (recommended)\n\n```shell\napt-get update -y;\napt-get install -y wget vim git make;\nwget -qO- get.docker.com | bash;\nsystemctl start docker;\nsudo systemctl enable docker.service;\nsudo systemctl enable containerd.service;\ndocker version;\nDOCKER_COMPOSE_VER=2.24.3;\nDOCKER_CONFIG=\u002Fusr\u002Flocal\u002Flib\u002Fdocker;\nmkdir -p $DOCKER_CONFIG\u002Fcli-plugins;\ncurl -SL https:\u002F\u002Fgithub.com\u002Fdocker\u002Fcompose\u002Freleases\u002Fdownload\u002Fv${DOCKER_COMPOSE_VER}\u002Fdocker-compose-linux-x86_64 -o $DOCKER_CONFIG\u002Fcli-plugins\u002Fdocker-compose;\nsudo chmod +x \u002Fusr\u002Flocal\u002Flib\u002Fdocker\u002Fcli-plugins\u002Fdocker-compose;\ndocker compose version;\n```\n\nCentOS\n\n```shell\nyum update -y;\nyum install -y wget vim make;\nwget -qO- get.docker.com | bash;\nsystemctl start docker;\nsudo systemctl enable docker.service;\nsudo systemctl enable containerd.service;\ndocker version;\nDOCKER_COMPOSE_VER=2.24.3;\nDOCKER_CONFIG=\u002Fusr\u002Flocal\u002Flib\u002Fdocker;\nmkdir -p $DOCKER_CONFIG\u002Fcli-plugins;\ncurl -SL https:\u002F\u002Fgithub.com\u002Fdocker\u002Fcompose\u002Freleases\u002Fdownload\u002Fv${DOCKER_COMPOSE_VER}\u002Fdocker-compose-linux-x86_64 -o $DOCKER_CONFIG\u002Fcli-plugins\u002Fdocker-compose;\nsudo chmod +x \u002Fusr\u002Flocal\u002Flib\u002Fdocker\u002Fcli-plugins\u002Fdocker-compose;\ndocker compose version;\n```\n\n#### 2. Clone the Repository\n\n```shell\ngit clone https:\u002F\u002Fgithub.com\u002Fluolongfei\u002Ffreenom.git && cd freenom\n```\n\n#### 3. Configure the Project\n\n##### 3.1 Get a Wit.ai Token\n\n1. Open [https:\u002F\u002Fwit.ai](https:\u002F\u002Fwit.ai).\n2. Sign in with Facebook or create an account with email only.\n3. Go to [https:\u002F\u002Fwit.ai\u002Fapps](https:\u002F\u002Fwit.ai\u002Fapps) and create a new app.\n4. Choose `English` as the language, pick any name you want, set the app to `Private`, and create it.\n5. Open `Management > Settings` (`https:\u002F\u002Fwit.ai\u002Fapps\u002F\u003CApp ID>\u002Fsettings`).\n6. Copy the `Client Access Token` and put it in `.env` as `WIT_AI_KEY='your Client Access Token'`.\n\n##### 3.2 Edit `.env`\n\nReplace the sample values in `.env` with your own configuration. If you are upgrading from an older release, you can also copy your previous `.env` into the new project root and let the script update it for you. Field-by-field explanations live in [`.env.example`](.\u002F.env.example).\n\n```shell\ncp .env.example .env;\nvim .env;\n```\n\nWhen you are done, save and quit.\n\n#### 4. Start the Stack\n\nRun these commands from the directory that contains `docker-compose.yml`.\n\n```shell\nmake up\n```\n\nThat is the whole startup flow. Use `make logs` if you want to tail the live logs.\n\n##### 4.1 Common Commands\n\nStart the stack or update to the latest version\n\n```shell\nmake up\n```\n\nStop the stack\n\n```shell\nmake down\n```\n\nView live logs\n\n```shell\nmake logs\n```\n\nClean up disk space used by containers\n\n```shell\nmake clear\n```\n\nRestart the containers\n\n```shell\nmake restart\n```\n\n*That is the end of the Docker Compose section.*\n\n### 🐳 Docker Deployment\n\n*If you have your own server, this is the deployment mode I recommend most.*\n\nDocker Hub: [https:\u002F\u002Fhub.docker.com\u002Fr\u002Fluolongfei\u002Ffreenom](https:\u002F\u002Fhub.docker.com\u002Fr\u002Fluolongfei\u002Ffreenom)\n\nThe image supports `linux\u002Famd64`, `linux\u002Farm64`, `linux\u002Fppc64le`, `linux\u002Fs390x`, `linux\u002F386`, `linux\u002Farm\u002Fv7`, and `linux\u002Farm\u002Fv6`, so it should work on most VPS platforms as well as NAS devices and Raspberry Pi-class hardware.\n\n#### 1. Install Docker\n\n##### 1.1 Log in as `root` and run the one-line installer\n\nUpdate packages and install the basic tools first. Pick the command that matches your OS.\n\nDebian \u002F Ubuntu\n\n```shell\napt-get update && apt-get install -y wget vim make\n```\n\nCentOS\n\n```shell\nyum update && yum install -y wget vim make\n```\n\nThen install Docker:\n\n```shell\nwget -qO- get.docker.com | bash\n```\n\nNotes:\n\n- Use a KVM-based VPS. OpenVZ does not support Docker installation.\n- CentOS 8 is not supported by this installer script.\n- For anything more advanced, use the [official Docker installation guide](https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Finstall\u002F).\n\n##### 1.2 Start and enable Docker\n\nStart the Docker service\n\n```shell\nsystemctl start docker\n```\n\nCheck Docker status\n\n```shell\nsystemctl status docker\n```\n\nEnable Docker at boot\n\n```shell\nsystemctl enable docker\n```\n\n#### 2. Run the Container\n\n##### 2.1 Create and start the container\n\nBasic command:\n\n```shell\ndocker run -d --name freenom --restart always -v $(pwd):\u002Fconf -v $(pwd)\u002Flogs:\u002Fapp\u002Flogs luolongfei\u002Ffreenom\n```\n\nIf you want to set a custom run time:\n\n```shell\ndocker run -d --name freenom --restart always -v $(pwd):\u002Fconf -v $(pwd)\u002Flogs:\u002Fapp\u002Flogs -e RUN_AT=\"11:24\" luolongfei\u002Ffreenom\n```\n\nThat command is identical except for `-e RUN_AT=\"11:24\"`, which tells the container to run the renewal task every day at `11:24` China Standard Time (Beijing time). `RUN_AT` also accepts cron-style expressions. For example, `-e RUN_AT=\"9 11 * * *\"` means `11:09` China Standard Time every day. If you want to run less often than daily, change the cron expression accordingly.\n\n**I do not recommend setting a custom schedule unless you have a real reason to do it. If a large number of users all pick the same timestamp, everyone ends up hitting Freenom at once and service quality gets worse for everybody. If you leave `RUN_AT` unset, the container automatically chooses a random time between 06:00 and 23:00 China Standard Time, and it re-rolls that time on each restart.**\n\n\u003Cdetails>\n    \u003Csummary>Click to see what the Docker flags mean\u003C\u002Fsummary>\n\u003Cbr>\n\n| Flag | Meaning |\n| :--- | :--- |\n| `docker run` | Starts a new container |\n| `-d` | Runs the container in the background and prints the container ID |\n| `--name` | Gives the container a stable name so you can start, stop, and remove it later |\n| `--restart` | Sets the restart policy; `always` means Docker starts the container again when the Docker service comes back |\n| `-v` | Mounts a volume. The path after the colon is the container path, and the path before the colon is the host path. Only absolute host paths are supported. `$(pwd)` means the current directory. On Windows, use `${PWD}` instead. |\n| `-e` | Sets an environment variable inside the container |\n| `luolongfei\u002Ffreenom` | The full image name pulled from Docker Hub |\n\n\u003C\u002Fdetails>\n\nAfter the container starts, run `ls -a` in the current directory and you should see a `.env` file plus a `logs` directory. `logs` stores runtime logs, and `.env` is the configuration file. Edit `.env`, replace the sample values with your own, save it, and restart the container. If the config is valid, you should start receiving notifications quickly.\n\n\u003Cdetails>\n    \u003Csummary>Click to see what some `.env` variables mean\u003C\u002Fsummary>\n\u003Cbr>\n\n| Variable | Meaning | Default | Required | Notes |\n| :--- | :--- | :---: | :---: | :--- |\n| `FREENOM_USERNAME` | Freenom account email | - | Yes | Only email-based Freenom logins are supported. If you currently sign in through a third-party social account, bind an email inside the Freenom dashboard first. |\n| `FREENOM_PASSWORD` | Freenom password | - | Yes | Some special characters may need escaping. See the comments in `.env`. |\n| `MULTIPLE_ACCOUNTS` | Multiple-account support | - | No | Format must be `\u003Caccount1>@\u003Cpassword1>\\|\u003Caccount2>@\u003Cpassword2>\\|\u003Caccount3>@\u003Cpassword3>`. Do not remove the angle brackets. If this is set, `FREENOM_USERNAME` and `FREENOM_PASSWORD` become optional. |\n| `MAIL_USERNAME` | Sender mailbox account | - | No | Supports `Gmail`, `QQ Mail`, `163 Mail`, and `Outlook`. |\n| `MAIL_PASSWORD` | Sender mailbox password | - | No | Use a Gmail app password, or the authorization code from QQ Mail \u002F 163 Mail. |\n| `TO` | Recipient mailbox | - | No | The mailbox that receives the notification emails sent by the script. |\n| `MAIL_ENABLE` | Enable email notifications | `0` | No | `1` enables email notifications. `0` disables them. If enabled, `MAIL_USERNAME`, `MAIL_PASSWORD`, and `TO` all become required. |\n| `TELEGRAM_CHAT_ID` | Your `chat_id` | - | No | Send `\u002Fstart` to `@userinfobot` to retrieve it. |\n| `TELEGRAM_BOT_TOKEN` | Your Telegram bot token | - | No | |\n| `TELEGRAM_BOT_ENABLE` | Enable Telegram Bot notifications | `0` | No | `1` enables Telegram notifications. If enabled, `TELEGRAM_CHAT_ID` and `TELEGRAM_BOT_TOKEN` are required. |\n| `NOTICE_FREQ` | Notification frequency | `1` | No | `0` only when a renewal operation happens. `1` on every run. |\n| `NEZHA_SERVER` | Nezha probe server IP or domain | - | No | |\n| `NEZHA_PORT` | Nezha probe server port | - | No | |\n| `NEZHA_KEY` | Nezha client key | - | No | |\n| `NEZHA_TLS` | Enable SSL\u002FTLS for Nezha | - | No | `1` enables TLS. `0` disables it. |\n\n**For the full set of variables, see the comments in [`.env.example`](.\u002F.env.example).**\n\n\u003C\u002Fdetails>\n\n> How do I know whether my config is correct?\n>\n> After you save `.env`, run `docker restart freenom`, wait about five seconds, then run `docker logs freenom`. If the output includes a success message, your configuration is in good shape. If you have not configured email yet, disable mail delivery first.\n\n> How do I upgrade to the latest version or redeploy from scratch?\n>\n> From the directory that contains `.env`, delete the existing container with `docker rm -f freenom`, remove the old image with `docker rmi -f luolongfei\u002Ffreenom`, and run the `docker run` command again. That redeploys the latest image. If the new release changes `.env`, the program will update the file and migrate your existing settings automatically.\n\nOne-line upgrade command:\n\n```shell\ndocker rm -f freenom && docker rmi -f luolongfei\u002Ffreenom && docker run -d --name freenom --restart always -v $(pwd):\u002Fconf -v $(pwd)\u002Flogs:\u002Fapp\u002Flogs luolongfei\u002Ffreenom\n```\n\n##### 2.2 Common container management commands\n\nShow container status and size\n\n```shell\ndocker ps -as\n```\n\nShow container logs\n\n```shell\ndocker logs freenom\n```\n\nRestart the container\n\n```shell\ndocker restart freenom\n```\n\nStop the container\n\n```shell\ndocker stop freenom\n```\n\nRemove the container\n\n```shell\ndocker rm -f freenom\n```\n\nShow container CPU and memory usage\n\n```shell\ndocker stats --no-stream\n```\n\nShow Docker version details\n\n```shell\ndocker version\n```\n\nRestart Docker itself (not just the container)\n\n```shell\nsystemctl restart docker\n```\n\n*That wraps up the container deployment section.*\n\n***\n\n### 🧊 Heroku Deployment\n\n**Heroku ended its free tier on November 28, 2022, so this route is effectively dead. Official announcement: [https:\u002F\u002Fblog.heroku.com\u002Fnext-chapter](https:\u002F\u002Fblog.heroku.com\u002Fnext-chapter)**\n\nIf you still want the historical deployment guide, it lives in the wiki: [Deploy via Heroku](https:\u002F\u002Fgithub.com\u002Fluolongfei\u002Ffreenom\u002Fwiki\u002F%E9%80%9A%E8%BF%87-Heroku-%E9%83%A8%E7%BD%B2)\n\n***\n\n### 🚈 Railway Deployment\n\n*Railway's pricing changes often. Whether it is a good long-running deployment target depends on the plan you are on and the current billing rules, so check the official docs before you deploy: [Railway pricing](https:\u002F\u002Fdocs.railway.com\u002Fpricing), [Railway plans](https:\u002F\u002Fdocs.railway.com\u002Freference\u002Fpricing\u002Fplans).*\n\nThe step-by-step Railway guide is in the wiki: [Deploy via Railway](https:\u002F\u002Fgithub.com\u002Fluolongfei\u002Ffreenom\u002Fwiki\u002F%E9%80%9A%E8%BF%87-Railway-%E9%83%A8%E7%BD%B2)\n\n***\n\n### 📦 Koyeb Deployment\n\n*If you do not have your own server, Koyeb can still be a reasonable option. Free allowances and whether a card is required can change with Koyeb's plan policy, so check the current pricing before you deploy: [Koyeb pricing](https:\u002F\u002Fwww.koyeb.com\u002Fpricing\u002F).*\n\nThe step-by-step Koyeb guide is in the wiki: [Deploy via Koyeb](https:\u002F\u002Fgithub.com\u002Fluolongfei\u002Ffreenom\u002Fwiki\u002F%E9%80%9A%E8%BF%87-Koyeb-%E9%83%A8%E7%BD%B2)\n\nAfter you read that guide and you are comfortable with the setup, you can try the one-click deploy link here:\n\n[Deploy on Koyeb](https:\u002F\u002Fapp.koyeb.com\u002Fdeploy?type=docker&name=freenom&ports=80;http;\u002F&env[FF_TOKEN]=20190214&env[SHOW_SERVER_INFO]=1&env[MOSAIC_SENSITIVE_INFO]=1&env[FREENOM_USERNAME]=&env[FREENOM_PASSWORD]=&env[MULTIPLE_ACCOUNTS]=&env[MAX_REQUEST_RETRY_COUNT]=200&env[TELEGRAM_CHAT_ID]=&env[TELEGRAM_BOT_TOKEN]=&env[TELEGRAM_BOT_ENABLE]=0&env[NEZHA_SERVER]=[OPTION]%20Nezha%20server&env[NEZHA_PORT]=[OPTION]%20Nezha%20port&env[NEZHA_KEY]=[OPTION]%20Nezha%20key&env[NEZHA_TLS]=[OPTION]%20Enable%20tls&image=docker.io\u002Fluolongfei\u002Ffreenom:koyeb)\n\n***\n\n### 🧪 Mogenius Deployment\n\nMogenius removed its free plan, so this option is no longer usable. Background: [discussion #208](https:\u002F\u002Fgithub.com\u002Fluolongfei\u002Ffreenom\u002Fdiscussions\u002F208)\n\n***\n\n### ☁ Cloud Function Deployment\n\nAll cloud-function targets use the same ZIP package, which was prepared for cross-platform compatibility:\n[https:\u002F\u002Fgithub.com\u002Fluolongfei\u002Ffreenom\u002Freleases\u002Fdownload\u002Fv0.5.1\u002Ffreenom_scf.zip](https:\u002F\u002Fgithub.com\u002Fluolongfei\u002Ffreenom\u002Freleases\u002Fdownload\u002Fv0.5.1\u002Ffreenom_scf.zip)\n\nCloud-function deployment is no longer actively maintained, so this historical package remains the reference artifact for this path.\n\nAfter downloading it, place the ZIP anywhere convenient on your machine. The deployment flow for each provider uploads that ZIP directly.\n\nThis deployment style is no longer actively supported because the major platforms have moved to paid pricing, but the old wiki pages are still here if you need them:\n\n- [Deploy via Tencent Cloud Functions](https:\u002F\u002Fgithub.com\u002Fluolongfei\u002Ffreenom\u002Fwiki\u002F%E9%80%9A%E8%BF%87%E8%85%BE%E8%AE%AF%E4%BA%91%E5%87%BD%E6%95%B0%E9%83%A8%E7%BD%B2)\n- [Deploy via Alibaba Cloud Functions](https:\u002F\u002Fgithub.com\u002Fluolongfei\u002Ffreenom\u002Fwiki\u002F%E9%80%9A%E8%BF%87%E9%98%BF%E9%87%8C%E4%BA%91%E5%87%BD%E6%95%B0%E9%83%A8%E7%BD%B2)\n- [Deploy via Huawei Cloud Functions](https:\u002F\u002Fgithub.com\u002Fluolongfei\u002Ffreenom\u002Fwiki\u002F%E9%80%9A%E8%BF%87%E5%8D%8E%E4%B8%BA%E4%BA%91%E5%87%BD%E6%95%B0%E9%83%A8%E7%BD%B2)\n\n***\n\n### 🚧 Deploy from Source\n\nThe source-based deployment guide lives in the wiki: [Deploy from Source](https:\u002F\u002Fgithub.com\u002Fluolongfei\u002Ffreenom\u002Fwiki\u002F%E7%9B%B4%E6%8E%A5%E6%8B%89%E5%8F%96%E6%BA%90%E7%A0%81%E9%83%A8%E7%BD%B2)\n\n***\n\nIf you run into a bug, please open an [issue](https:\u002F\u002Fgithub.com\u002Fluolongfei\u002Ffreenom\u002Fissues) and follow the template so the problem is easy to reproduce. If Freenom changes its algorithm and breaks the project, open an issue and let me know. I maintain this repository for the long haul, and stars are always appreciated.\n\n### 📋 Donation List\n\nHuge thanks to [these supporters](https:\u002F\u002Fgithub.com\u002Fluolongfei\u002Ffreenom\u002Fwiki\u002FDonation-List) for backing the project.\n\n### ❤ Support the Project\n\nIf this project saves you time, consider supporting it. Support makes it much easier to keep maintaining and improving the codebase.\n\n[![ko-fi](https:\u002F\u002Fko-fi.com\u002Fimg\u002Fgithubbutton_sm.svg)](https:\u002F\u002Fko-fi.com\u002FX7X8CA7S1)\n\nPayPal: [https:\u002F\u002Fwww.paypal.me\u002Fmybsdc](https:\u002F\u002Fwww.paypal.me\u002Fmybsdc)\n\n> Every time you spend money, you're casting a vote for the kind of world you want. -- Anna Lappe\n\n![Every time you spend your money, you are voting for the world you want.](https:\u002F\u002Fs2.ax1x.com\u002F2020\u002F01\u002F31\u002F13P8cF.jpg)\n\nIf you leave a message with your donation, it will be shown on the [Donation List](https:\u002F\u002Fgithub.com\u002Fluolongfei\u002Ffreenom\u002Fwiki\u002FDonation-List).\n\n**Every `star` and every donation helps keep this project alive. Thank you to everyone who has supported it. Recommending the project to other people helps too. The more people use it, the easier it is to justify spending time on updates.**\n\n### 🪓 A Personal Note\n\nBelieve in the future. Stay rational.\n\n> Taking things seriously is how we participate in society, and how we change it. -- Li Zhi\n\n### 🌚 Author\n\n- Main program and framework: [@luolongfei](https:\u002F\u002Fgithub.com\u002Fluolongfei)\n- English documentation: [@肖阿姨](#)\n\n### 💖 All Contributors\n\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fluolongfei\u002Ffreenom\u002Fgraphs\u002Fcontributors\">\n  \u003Cimg alt=\"All Contributors\" src=\"https:\u002F\u002Fcontrib.rocks\u002Fimage?repo=luolongfei\u002Ffreenom\" \u002F>\n\u003C\u002Fa>\n\n[@anjumrafidofficial](https:\u002F\u002Fgithub.com\u002Fanjumrafidofficial)\n\n### 📝 TODO List\n\n- Add an interactive installer so users do not have to edit config files by hand\n- Support automatic upgrades\n- Merge multi-account renewal results into a single notification\n\n### 🍅 Other Language Ports\n\n- [https:\u002F\u002Fgithub.com\u002FPencilNavigator\u002FFreenom-Workers](https:\u002F\u002Fgithub.com\u002FPencilNavigator\u002FFreenom-Workers) (JavaScript)\n- [https:\u002F\u002Fgithub.com\u002FOreomeow\u002Ffreenom-py](https:\u002F\u002Fgithub.com\u002FOreomeow\u002Ffreenom-py) (Python)\n\n*(If you have another implementation in a different language, feel free to open a PR and add it to this list.)*\n\n### 🎉 Acknowledgements\n\n- This project depends on third-party libraries such as [PHPMailer](https:\u002F\u002Fgithub.com\u002FPHPMailer\u002FPHPMailer\u002F) and [guzzle](https:\u002F\u002Fgithub.com\u002Fguzzle\u002Fguzzle).\n- Some of the Docker-related documentation was informed by [this article](https:\u002F\u002Fteddysun.com\u002F569.html).\n- [@anjumrafidofficial](https:\u002F\u002Fgithub.com\u002Fanjumrafidofficial) improved the English mail content.\n\n### 🥝 License\n\n[MIT](https:\u002F\u002Fopensource.org\u002Flicenses\u002Fmit-license.php)\n","该项目是一个用于Freenom域名自动续期的工具。它通过PHP编写，支持多种通知方式包括电邮、Telegram Bot等，确保用户能够及时收到续期成功或失败的通知。项目还提供了Docker镜像以简化部署过程，使得即使是没有服务器经验的用户也能轻松上手。适用于拥有多个Freenom免费域名并希望自动化管理这些域名续期过程的场景。",2,"2026-06-11 03:18:26","top_language"]