add app path config.
All checks were successful
Deploy / Build (push) Successful in 6m56s

This commit is contained in:
amass 2024-12-01 20:01:13 +08:00
parent 34253a4bf6
commit 03c7a564a1
10 changed files with 31 additions and 41 deletions

View File

@ -37,15 +37,24 @@ jobs:
cat notify.tpl | envsubst | jq -sR . | xargs -0 -I {} curl -H "Content-Type: application/json" -X POST -d '{"type":"text","msg":{} }' https://amass.fun/notify cat notify.tpl | envsubst | jq -sR . | xargs -0 -I {} curl -H "Content-Type: application/json" -X POST -d '{"type":"text","msg":{} }' https://amass.fun/notify
- run: resources/build.sh build - run: resources/build.sh build
- run: resources/build.sh lvgl - run: resources/build.sh lvgl
- name: Copy app wt resources to server - name: copy wt resources to server
uses: appleboy/scp-action@v0.1.7 uses: appleboy/scp-action@v0.1.7
with: with:
host: ${{ vars.YUYUN_SERVER }} host: ${{ vars.YUYUN_SERVER }}
username: ${{ vars.YUYUN_USER }} username: ${{ vars.YUYUN_USER }}
password: ${{ secrets.SERVER_ROOT_PASSWORD }} password: ${{ secrets.SERVER_ROOT_PASSWORD }}
overwrite: true overwrite: true
source: "resources/*.css,resources/*.xml" source: "resources/*.css"
target: /root/Server/amass_blog target: /root/Server/amass_blog
- name: copy wt app to server
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ vars.YUYUN_SERVER }}
username: ${{ vars.YUYUN_USER }}
password: ${{ secrets.SERVER_ROOT_PASSWORD }}
overwrite: true
source: "resources/*.xml"
target: /root/Server
- name: Copy lvgl to server - name: Copy lvgl to server
uses: appleboy/scp-action@v0.1.7 uses: appleboy/scp-action@v0.1.7
with: with:

View File

@ -29,11 +29,11 @@ public:
BUILD_SETTING(uint16_t, Port, 8081); BUILD_SETTING(uint16_t, Port, 8081);
BUILD_SETTING(uint16_t, WtPort, 8082); BUILD_SETTING(uint16_t, WtPort, 8082);
BUILD_SETTING(uint32_t, Threads, std::thread::hardware_concurrency()); BUILD_SETTING(uint32_t, Threads, std::thread::hardware_concurrency());
BUILD_SETTING(std::string, DocumentRoot, "."); BUILD_SETTING(std::string, ApplicationRoot, "."); // 内部配置文件,不应被外部访问
BUILD_SETTING(std::string, DocumentRoot, "."); // 外部可访问的公共文件
BUILD_SETTING(std::string, HomeAssistantAccessToken, ""); BUILD_SETTING(std::string, HomeAssistantAccessToken, "");
BUILD_SETTING(std::string, Live2dModelsRoot, "./live2d");
INITIALIZE_FIELDS(Server, Port, Threads, DocumentRoot); INITIALIZE_FIELDS(Server, Port, Threads, ApplicationRoot, DocumentRoot);
Application(const std::string &path); Application(const std::string &path);
boost::asio::io_context &ioContext(); boost::asio::io_context &ioContext();
int exec(); int exec();

View File

@ -3,12 +3,13 @@
#include "HttpSession.h" #include "HttpSession.h"
#include "ServiceLogic.h" #include "ServiceLogic.h"
#include <boost/url/url_view.hpp> #include <boost/url/url_view.hpp>
#include <format>
Live2dBackend::Live2dBackend() { Live2dBackend::Live2dBackend() {
using namespace Amass; using namespace Amass;
auto application = Singleton<Application>::instance(); auto application = Singleton<Application>::instance();
application->insertUrl("/api/v1/live2d/{path*}", [this, live2dModelsRoot{application->getLive2dModelsRoot()}]( m_live2dModelsRoot = std::format("{}/resources/live2d", application->getDocumentRoot());
HttpSession &session, const Application::Request &request, application->insertUrl("/api/v1/live2d/{path*}", [this](HttpSession &session, const Application::Request &request,
const boost::urls::matches &matches) { const boost::urls::matches &matches) {
using namespace boost::beast; using namespace boost::beast;
boost::urls::url_view view(request.target()); boost::urls::url_view view(request.target());
@ -18,7 +19,7 @@ Live2dBackend::Live2dBackend() {
session.reply(ServiceLogic::badRequest(request, "Illegal request-target")); session.reply(ServiceLogic::badRequest(request, "Illegal request-target"));
return; return;
} }
std::string path = ResponseUtility::pathCat(live2dModelsRoot, matches["path"]); std::string path = ResponseUtility::pathCat(m_live2dModelsRoot, matches["path"]);
if (target.back() == '/') path.append("index.html"); if (target.back() == '/') path.append("index.html");
if (std::filesystem::is_directory(path)) path.append("/index.html"); if (std::filesystem::is_directory(path)) path.append("/index.html");
boost::beast::error_code ec; boost::beast::error_code ec;

View File

@ -1,9 +1,13 @@
#ifndef __LIVE2DBACKEND_H__ #ifndef __LIVE2DBACKEND_H__
#define __LIVE2DBACKEND_H__ #define __LIVE2DBACKEND_H__
#include <string>
class Live2dBackend { class Live2dBackend {
public: public:
Live2dBackend(); Live2dBackend();
private:
std::string m_live2dModelsRoot;
}; };
#endif // __LIVE2DBACKEND_H__ #endif // __LIVE2DBACKEND_H__

View File

@ -64,7 +64,7 @@ int main(int argc, char const *argv[]) {
std::exit(102); std::exit(102);
} }
BOOST_ASSERT_MSG(!application->getServer().empty(), "server.empty() == true"); BOOST_ASSERT_MSG(!application->getServer().empty(), "server.empty() == true");
Database::initialize(std::format("{}/database.sqlite", application->getDocumentRoot())); Database::initialize(std::format("{}/database.sqlite", application->getApplicationRoot()));
auto address = boost::asio::ip::make_address(application->getServer()); auto address = boost::asio::ip::make_address(application->getServer());
auto listener = auto listener =
std::make_shared<Listener>(application->ioContext(), boost::asio::ip::tcp::endpoint{address, application->getPort()}); std::make_shared<Listener>(application->ioContext(), boost::asio::ip::tcp::endpoint{address, application->getPort()});
@ -96,7 +96,7 @@ int main(int argc, char const *argv[]) {
auto udpServer = std::make_shared<UdpServer>(application->ioContext()); auto udpServer = std::make_shared<UdpServer>(application->ioContext());
auto mediaServer = std::make_shared<MediaServer>(554, false); auto mediaServer = std::make_shared<MediaServer>(554, false);
auto webApp = Singleton<WebToolkit::Server>::instance<Construct>(application->getWtPort(), application->getDocumentRoot()); auto webApp = Singleton<WebToolkit::Server>::instance<Construct>(application->getWtPort(), application->getApplicationRoot(), application->getDocumentRoot());
using namespace boost::asio::ip; using namespace boost::asio::ip;
auto proxyAddress = make_address(application->getServer()); auto proxyAddress = make_address(application->getServer());

View File

@ -117,15 +117,15 @@ void Application::handlePathChange(const std::string &path) {
} }
} }
Server::Server(uint16_t port, const std::string &documentRoot) { Server::Server(uint16_t port, const std::string &applicationRoot, const std::string &documentRoot) {
try { try {
std::vector<std::string> args; std::vector<std::string> args;
args.push_back(std::format("--docroot={};/resources", documentRoot)); args.push_back(std::format("--docroot={};/resources", documentRoot));
args.push_back(std::format("--approot={}/resources", documentRoot)); args.push_back(std::format("--approot={}/resources", applicationRoot));
args.push_back(std::format("--http-listen=127.0.0.1:{}", port)); args.push_back(std::format("--http-listen=127.0.0.1:{}", port));
initializeAuthenticationService(); initializeAuthenticationService();
m_server = std::make_unique<Wt::WServer>(std::format("{}/resources", documentRoot), args); m_server = std::make_unique<Wt::WServer>(std::format("{}/resources", applicationRoot), args);
m_server->addEntryPoint(Wt::EntryPointType::Application, m_server->addEntryPoint(Wt::EntryPointType::Application,
std::bind(&Server::createApplication, this, std::placeholders::_1, false)); std::bind(&Server::createApplication, this, std::placeholders::_1, false));
@ -133,7 +133,6 @@ Server::Server(uint16_t port, const std::string &documentRoot) {
std::bind(&Server::createApplication, this, std::placeholders::_1, true), "/wt/app.js"); std::bind(&Server::createApplication, this, std::placeholders::_1, true), "/wt/app.js");
m_server->addResource(std::make_shared<AuthenticationResource>(), "/auth"); m_server->addResource(std::make_shared<AuthenticationResource>(), "/auth");
m_server->addResource(std::make_shared<PlaintextResource>(), "/plaintext"); m_server->addResource(std::make_shared<PlaintextResource>(), "/plaintext");
m_server->addResource(std::make_shared<DbResource>(std::format("{}/database.sqlite", documentRoot)), "/db");
m_server->start(); m_server->start();
} catch (const std::exception &e) { } catch (const std::exception &e) {

View File

@ -51,7 +51,7 @@ public:
const Wt::Auth::PasswordService &passwordService(); const Wt::Auth::PasswordService &passwordService();
protected: protected:
Server(uint16_t port, const std::string &documentRoot); Server(uint16_t port, const std::string &applicationRoot, const std::string &documentRoot);
std::unique_ptr<Wt::WApplication> createApplication(const Wt::WEnvironment &env, bool embedded); std::unique_ptr<Wt::WApplication> createApplication(const Wt::WEnvironment &env, bool embedded);
private: private:

View File

@ -27,23 +27,6 @@ void PlaintextResource::handleRequest(const Wt::Http::Request &request, Wt::Http
response.out() << "Hello, World!"; response.out() << "Hello, World!";
} }
DbResource::DbResource(const std::string &db) {
if (!m_dbStruct) {
m_dbStruct = new DbStruct(db);
}
}
void DbResource::handleRequest(const Wt::Http::Request &request, Wt::Http::Response &response) {
response.setMimeType("application/json");
response.addHeader("Server", "Wt");
Wt::Dbo::Transaction transaction(m_dbStruct->session);
Wt::Dbo::ptr<World> entry = m_dbStruct->session.load<World>(m_dbStruct->rand());
Wt::Dbo::JsonSerializer writer(response.out());
writer.serialize(entry);
}
int DbStruct::rand() { int DbStruct::rand() {
return distribution(rng); return distribution(rng);
} }

View File

@ -55,10 +55,4 @@ public:
void handleRequest(const Wt::Http::Request &request, Wt::Http::Response &response) final; void handleRequest(const Wt::Http::Request &request, Wt::Http::Response &response) final;
}; };
class DbResource : public Wt::WResource {
public:
DbResource(const std::string &db);
void handleRequest(const Wt::Http::Request &request, Wt::Http::Response &response) final;
};
#endif // __RESTFUL_H__ #endif // __RESTFUL_H__

View File

@ -25,7 +25,7 @@ function build() {
# reset # reset
# pkill -9 HttpServer # pkill -9 HttpServer
# cp -r /opt/Libraries/wt-4.11.1/share/Wt/* ./build # cp -r /opt/Libraries/wt-4.11.1/share/Wt/* ./build
# cp -r resources/* build/resources/ # cp -r resources/themes resources/*.css build/resources/
if [ ! -f "${build_path}/CMakeCache.txt" ]; then if [ ! -f "${build_path}/CMakeCache.txt" ]; then
cmake_scan cmake_scan