Project won't deploy
samson
HOBBYOP

a year ago

Hello guys,
I'm completely new to this hosting stuff and I'm trying to host a discord bot that I used to start locally from VS Studio before.
I hooked up my github and try to deploy the container.

Id: 24415e1c-9ff5-4133-b834-05af53c29590

Build suceeds but deploy crashes with following message:

Unhandled exception. System.TypeLoadException: Could not load type System.Runtime.CompilerServices.NullableContextAttribute from assembly System.Runtime, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a. at System.ModuleHandle.ResolveType(QCallModule module, Int32 typeToken, IntPtr* typeInstArgs, Int32 typeInstCount, IntPtr* methodInstArgs, Int32 methodInstCount, ObjectHandleOnStack type) at System.ModuleHandle.ResolveTypeHandle(Int32 typeToken, RuntimeTypeHandle[] typeInstantiationContext, RuntimeTypeHandle[] methodInstantiationContext) at System.Reflection.RuntimeModule.ResolveType(Int32 metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) at System.Reflection.CustomAttribute.FilterCustomAttributeRecord(MetadataToken caCtorToken, MetadataImport&amp; scope, RuntimeModule decoratedModule, MetadataToken decoratedToken, RuntimeType attributeFilterType, Boolean mustBeInheritable, ListBuilder`1&amp; derivedAttributes, RuntimeType&amp; attributeType, IRuntimeMethodInfo&amp; ctorWithParameters, Boolean&amp; isVarArg) at System.Reflection.CustomAttribute.IsCustomAttributeDefined(RuntimeModule decoratedModule, Int32 decoratedMetadataToken, RuntimeType attributeFilterType, Int32 attributeCtorToken, Boolean mustBeInheritable) at System.Reflection.CustomAttribute.IsDefined(RuntimeType type, RuntimeType caType, Boolean inherit) at System.Diagnostics.StackTrace.ToString(TraceFormat traceFormat, StringBuilder sb) at System.Diagnostics.StackTrace.ToString(TraceFormat traceFormat) at System.Exception.get_StackTrace() at System.Exception.ToString() at Program.Main(String[] args) in /app/SubBot/Program.cs:line 44 at Program.<main>(String[] args)

Solved

118 Replies

samson
HOBBYOP

a year ago

Project won't deploy


Are you using nixpacks or a Dockerfile?


It looks like you are running a .NET 8.0 project on the wrong version (.NET 6.0?)


samson
HOBBYOP

a year ago

I do have a docker file but I saw it building with nix packs


samson
HOBBYOP

a year ago

That's the build log.

Region: europe-west4]

Using Nixpacks

context: rpk8-2czM
╔═════════════════════ Nixpacks v1.34.1 ═════════════════════╗
║ setup │ dotnet-sdk_8 ║
║────────────────────────────────────────────────────────────║
║ install │ dotnet restore ║
║────────────────────────────────────────────────────────────║
║ build │ dotnet publish --no-restore -c Release -o out ║
║────────────────────────────────────────────────────────────║
║ start │ ./out/SubBot ║
╚════════════════════════════════════════════════════════════╝
[internal] load build definition from Dockerfile
[internal] load build definition from Dockerfile ✔ 0ms
[internal] load build definition from Dockerfile
[internal] load build definition from Dockerfile ✔ 10ms
[internal] load metadata for ghcr.io/railwayapp/nixpacks:ubuntu-1741046653
[internal] load metadata for ghcr.io/railwayapp/nixpacks:ubuntu-1741046653 ✔ 149ms
[internal] load .dockerignore
[internal] load .dockerignore
[internal] load .dockerignore ✔ 0ms
[internal] load .dockerignore
[internal] load .dockerignore ✔ 11ms
[internal] load build context ✔ 0ms
[internal] load build context
[internal] load build context ✔ 637ms
[3/9] COPY .nixpacks/nixpkgs-5148520bfab61f99fd25fb9ff7bfbb50dad3c9db.nix .nixpacks/nixpkgs-5148520bfab61f99fd25fb9ff7bfbb50dad3c9db.nix ✔ 0ms – CACHED
[4/9] RUN nix-env -if .nixpacks/nixpkgs-5148520bfab61f99fd25fb9ff7bfbb50dad3c9db.nix && nix-collect-garbage -d ✔ 0ms – CACHED
[5/9] COPY . /app/.
[5/9] COPY . /app/. ✔ 154ms
[6/9] RUN dotnet restore

Welcome to .NET 8.0!

SDK Version: 8.0.100-preview.5.23303.2


set the ENV NIXPACKSCSHARPSDK_VERSION=8.0.311


It shouldnt use Nixpacks if you have a dockerfile though


This is my Dockerfile, make sure its in your base directory (of your github repo)

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /app

# Copy and restore dependencies
COPY . .
RUN dotnet restore

# Publish the application
RUN dotnet publish -c Release -o /out

# Use a lightweight runtime image
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY --from=build /out .

# Set the entry point
ENTRYPOINT ["dotnet", "Discord Bot.dll"]

samson
HOBBYOP

a year ago

This is mine:

`# Build-Phase mit SDK
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["SubBot/SubBot.csproj", "SubBot/"]
COPY . .
WORKDIR "/src/SubBot"
RUN dotnet publish "SubBot.csproj" -c Release -r linux-x64 --self-contained true -o /app/publish /p:PublishSingleFile=true /p:PublishTrimmed=false

Minimaler Runtime-Container – ohne dotnet runtime

FROM debian:bullseye-slim AS final
WORKDIR /app
COPY --from=build /app/publish .
RUN chmod +x SubBot
ENTRYPOINT ["./SubBot"]`

1363935138869940700


samson
HOBBYOP

a year ago

and it lies here

1363935162437599500


Is that the base directory for your repo? For mine, I have the Dockerfile in the solution directory.

1363935578369819000


samson
HOBBYOP

a year ago

This is at the top

1363935798352810200


samson
HOBBYOP

a year ago

should i place it there?


Yes, that is the git repo's base directory since it has the .git folder in it


samson
HOBBYOP

a year ago

Sorry, i feel utterly dumb asking this questions…



samson
HOBBYOP

a year ago

now im getting this error:
✕ [build 6/6] RUN dotnet publish "SubBot.csproj" -c Release -r linux-x64 --self-contained true -o /app/publish /p:PublishSingleFile=true /p:PublishTrimmed=false
process "/bin/sh -c dotnet publish \"SubBot.csproj\" -c Release -r linux-x64 --self-contained true -o /app/publish /p:PublishSingleFile=true /p:PublishTrimmed=false" did not complete successfully: exit code: 145


samson
HOBBYOP

a year ago

`The command could not be loaded, possibly because:

  • You intended to execute a .NET application:
    The application 'publish' does not exist.

  • You intended to execute a .NET SDK command:
    A compatible .NET SDK was not found.
    Requested SDK version: 8.0.100
    global.json file: /src/SubBot/global.json
    Installed SDKs:
    Install the [8.0.100] .NET SDK or update [/src/SubBot/global.json] to match an installed SDK.
    Learn about SDK resolution:
    https://aka.ms/dotnet/sdk-not-found`


I believe you just need to change all of the SubBot.csproj instances with ./SubBot.csproj


Since you moved the Dockerfile to a different directory


samson
HOBBYOP

a year ago

in my dockerfile aight?



should look like that

1363937355127456000


samson
HOBBYOP

a year ago

i changed my dockerfile to this self containing thing. should i try yours and change the names obviously?


Wait sorry it should be ./SubBot/SubBot.csproj




FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /app

# Copy and restore dependencies
COPY . .
RUN dotnet restore

# Publish the application
RUN dotnet publish -c Release -o /out

# Use a lightweight runtime image
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY --from=build /out .

# Set the entry point
ENTRYPOINT ["dotnet", "Discord Bot.dll"]

This is a pretty bare bones one


# See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.

# This stage is used when running from VS in fast mode (Default for Debug configuration)
FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base
USER $APP_UID
WORKDIR /app


# This stage is used to build the service project
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["Whispbot.csproj", "."]
RUN dotnet restore "./Whispbot.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "./Whispbot.csproj" -c $BUILD_CONFIGURATION -o /app/build

# This stage is used to publish the service project to be copied to the final stage
FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "./Whispbot.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false

# This stage is used in production or when running from VS in regular mode (Default when not using the Debug configuration)
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Whispbot.dll"]

This is the official visual studio one


I have my project and solution in the same directory so you would have to change the stuff around slightly


samson
HOBBYOP

a year ago

oh boi


samson
HOBBYOP

a year ago

then im trying that offical one


When I created my newest project, I set it up to use the dockerfile by default


samson
HOBBYOP

a year ago

on railway?


On visual studio


I dont think you can change it now


But ill generate a dockerfile for you


samson
HOBBYOP

a year ago

`# See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.

This stage is used when running from VS in fast mode (Default for Debug configuration)

FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base
USER $APP_UID
WORKDIR /app

This stage is used to build the service project

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILDCONFIGURATION=Release WORKDIR /src COPY ["SubBot/SubBot.csproj", "SubBot/"] RUN dotnet restore "SubBot/SubBot.csproj" COPY . . WORKDIR "/src/SubBot" RUN dotnet build "./SubBot.csproj" -c $BUILDCONFIGURATION -o /app/build

This stage is used to publish the service project to be copied to the final stage

FROM build AS publish
ARG BUILDCONFIGURATION=Release RUN dotnet publish "./SubBot.csproj" -c $BUILDCONFIGURATION -o /app/publish /p:UseAppHost=false

This stage is used in production or when running from VS in regular mode (Default when not using the Debug configuration)

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["./SubBot", "SubBot.dll"]`

i haave this now


I would assume that would work if you change the RUN dotnet line to have "./SubBot/SubBot.csproj" and the entrypoint to be ["dotnet", "SubBot.dll"]


samson
HOBBYOP

a year ago

why dotnet?



samson
HOBBYOP

a year ago

```# See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.

This stage is used when running from VS in fast mode (Default for Debug configuration)

FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base
USER $APP_UID
WORKDIR /app

This stage is used to build the service project

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILDCONFIGURATION=Release WORKDIR /src COPY ["SubBot/SubBot.csproj", "SubBot/"] RUN dotnet restore "SubBot/SubBot.csproj" COPY . . WORKDIR "/src/SubBot" RUN dotnet build "./SubBot/SubBot.csproj" -c $BUILDCONFIGURATION -o /app/build

This stage is used to publish the service project to be copied to the final stage

FROM build AS publish
ARG BUILDCONFIGURATION=Release RUN dotnet publish "./SubBot/SubBot.csproj" -c $BUILDCONFIGURATION -o /app/publish /p:UseAppHost=false

This stage is used in production or when running from VS in regular mode (Default when not using the Debug configuration)

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "SubBot.dll"]```

looks like this now


Its the CLI for c#


That looks correct


samson
HOBBYOP

a year ago

pushing it.


samson
HOBBYOP

a year ago

i mean i have no clue what those lines excatly do 😄 so yea…


samson
HOBBYOP

a year ago

The command could not be loaded, possibly because:

  • You intended to execute a .NET application:
    The application 'build' does not exist.

  • You intended to execute a .NET SDK command:
    A compatible .NET SDK was not found.

Requested SDK version: 8.0.100
global.json file: /src/SubBot/global.json

Installed SDKs:

Install the [8.0.100] .NET SDK or update [/src/SubBot/global.json] to match an installed SDK.

Learn about SDK resolution:
https://aka.ms/dotnet/sdk-not-found


samson
HOBBYOP

a year ago

should i remove the global.json?



its interfering with it


samson
HOBBYOP

a year ago

`MSBUILD : error MSB1009: Project file does not exist.
Switch: ./SubBot/SubBot.csproj
✕ [build 7/7] RUN dotnet build "./SubBot/SubBot.csproj" -c Release -o /app/build
process "/bin/sh -c dotnet build \"./SubBot/SubBot.csproj\" -c $BUILD_CONFIGURATION -o /app/build" did not complete successfully: exit code: 1

Dockerfile:16

14 | COPY . .
15 | WORKDIR "/src/SubBot"
16 | >>> RUN dotnet build "./SubBot/SubBot.csproj" -c $BUILD_CONFIGURATION -o /app/build
17 |

18 | # This stage is used to publish the service project to be copied to the final stage

ERROR: failed to solve: process "/bin/sh -c dotnet build \"./SubBot/SubBot.csproj\" -c $BUILD_CONFIGURATION -o /app/build" did not complete successfully: exit code: 1`

<:KEKW:947842215005286460>

oh boi i guess its a path thing


uhhhhhhhhhhhhhhhhh


samson
HOBBYOP

a year ago

yea 😄


Oh okay im stupid


samson
HOBBYOP

a year ago

No


samson
HOBBYOP

a year ago

IM stupid!


RUN dotnet build "SubBot.csproj"



I told you to change that one


samson
HOBBYOP

a year ago

publish aswell?


and the same with publish


samson
HOBBYOP

a year ago

yea


samson
HOBBYOP

a year ago

it's taking longer now


samson
HOBBYOP

a year ago

ahh


samson
HOBBYOP

a year ago

its active but crashed


samson
HOBBYOP

a year ago

The configuration file 'appsettings.json' was not found and is not optional. The expected physical path was '/app/appsettings.json'.

need to replace the config logic with the enviroment logic from raailway for tokens i guess


Or you can put it in a volume


But for tokens definitely use ENV


samson
HOBBYOP

a year ago

Do i place them into the service variables or shared variables?


service unless you are using the token across multiple services which is unlikely (e.g. you have a main bot and an seperate API service)


if you arent planning on using ENVs on more than one service then use the service variables


samson
HOBBYOP

a year ago

nah its just a simple bot for registering substitute players.
i need to connect a database now.
That was the reason to try railway because i didnt want to host a db myself locally


samson
HOBBYOP

a year ago

Do you have a .net bot with dsharpplus as well?


i created a custom discord api wrapper package for my bots


i dont use any packages


samson
HOBBYOP

a year ago

Ah, okay nice.
And if I read thatr correctly i log to Console.WriteLine(); to see it in Railway?



samson
HOBBYOP

a year ago

ah and your were a huuuuuuuuge help!!!


samson
HOBBYOP

a year ago

Thank you so much!




samson
HOBBYOP

a year ago

Best thing that could happen



samson
HOBBYOP

a year ago

is it possible to run an sql file to fill a database here?


ive never tried it


you could probably use an external program like tableplus to run SQL queries on the database


samson
HOBBYOP

a year ago

Ah yea, i can connect to the db from my computer and run it there. im using heidisql


samson
HOBBYOP

a year ago

that should work


yeah that should work


the database should have a public and a private url


use public to connect to it externally and the private to connect to it on your main program when running on railway (to save on egress costs)


samson
HOBBYOP

a year ago

postgresql://postgres:@metro.proxy.rlwy.net:42005/railway

Like this?



that should be the public one


samson
HOBBYOP

a year ago

the internal one is just a variable

${{ Postgres.DATABASE_URL }}



samson
HOBBYOP

a year ago

oops i just saw i used mysql back then 😄
Reviving the bot atm 😄


samson
HOBBYOP

a year ago

_connectionString = enviroment.mysql.DATABASE_URL; MySqlConnection connection = new MySqlConnection(_connectionString); try { await connection.OpenAsync(); Console.WriteLine("Die Verbindung zur HL-Datenbank wurde erfolgreich geöffnet."); return connection; } catch (Exception ex) { Console.WriteLine("Fehler beim Öffnen der Verbindung zur HL-Datenbank: " + ex.Message); return new MySqlConnection(); }

that would be my guess to connect internally


Yes, Is environment a custom class or?


it should be

Environment.GetEnvironmentVariable("DATABASE_URL")

samson
HOBBYOP

a year ago

ah yeas. i meant that 😄


samson
HOBBYOP

a year ago

do i have to insert the databse variables into my service variables or are they "gobally" by default?


you would have to insert them


${{MySql.DATABASE_URL}}



samson
HOBBYOP

a year ago

ahhh now i see the connection

1363948659426857200


samson
HOBBYOP

a year ago

Thank you!!!

1363950063730167800


samson
HOBBYOP

a year ago

How do you debug your bot when its running on railway?
Is it the old write logs, deploy and repeat thing? 😄



samson
HOBBYOP

a year ago

love that <:KEKW:947842215005286460>


samson
HOBBYOP

a year ago

im used to it


samson
HOBBYOP

a year ago

oh bro thanks again



a year ago

relatable


a year ago

looks like we’re good to call this solved?



a year ago

!s


Status changed to Solved adam 11 months ago


Loading...